Установка post_id для single.php на основе URL без перенаправления

Я переношу Joomla! базы данных в WordPress, и веб-сайт должен оставаться точным в отношении URL-адресов. Сайт Joomla имеет свои сообщения с расширениями .html, и импортер, который я создал, сопоставляет URL-адрес файла Joomla с именем post_name WordPress как таковым:

joomla-site.com/Title-of-Joomla-Content.html -> WordPress DB :: post_name title-of-joomla-content

Я могу, конечно, получить доступ к готовой публикации на WordPress: wordpress-site.com/Title-of-Joomla-Content

Но мне нужно изменить, как реагирует система permalink. Я не хочу использовать перенаправление (которое отображается в заголовках), поэтому я пытаюсь подключить функцию, которая будет выбирать идентификатор сообщения по-разному, если URL-адрес заканчивается на .html.

Поскольку WordPress только активируется, когда файл не найден, реальные .html-файлы не затрагиваются. Поэтому наличие функции проверки и изменения состояния для любых файлов .html не является проблемой.

Я попытался это сделать:

function custom_redirect() { global $post_id,$wpdb; if (substr($_SERVER['REQUEST_URI'],-5) == '.html') { $check = $wpdb->get_var($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_name=%s AND post_status = 'publish'",substr(basename($_SERVER['REQUEST_URI']),0,-5))); if ($check > 0) $post_id = $check; // Need to set the post ID for the wp_query here. } } if (!is_admin()) add_action( 'init', 'custom_redirect' ); 

Вышеприведенный код правильно правильно определяет идентификатор сообщения, но я не уверен, какую функцию или крючок использовать, чтобы заставить сообщение (single.php) отобразить его.

Я смог использовать следующее для установки идентификатора сообщения для каждого запуска archive.php, но это не влияет на файл single.php, который просто вызывает функцию the_post.

 function force_ID($query) { $query->set('post_id', '96'); } add_action('pre_get_posts','force_ID'); 

У меня есть ощущение, что это может быть что-то простое, как изменение глобального экземпляра $ wp_query, но я не уверен, что это лучший способ сделать это. Использование крючка инициализации, вероятно, слишком велико в порядке выполнения.

Я понял, вот решение для кого-то еще интересно, как сделать что-то вроде этого:

 function force_ID($query) { global $wpdb; if (substr($_SERVER['REQUEST_URI'],-5) == '.html') { $post_id = $wpdb->get_var($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_name=%s AND post_status = 'publish'",substr(basename($_SERVER['REQUEST_URI']),0,-5))); if ($post_id > 0) $query->set('page_id',$post_id); } } add_action('pre_get_posts','force_ID'); 

При рассмотрении файла wp-includes / query.php я заметил, что объект принимает page_id исключительно для выбора идентификатора. Использование post_id работало для циклов архивных сообщений, но page_id работал для одного почтового вызова.