WordPress запускает 404 на странице 2 для пользовательских поисковых запросов

Я изменил свой index.php, чтобы проверить, является ли поисковый запрос автором, и если да, отобразите статьи этого автора. Это работает нормально, но как только вы переходите на страницу 2 результатов, wordpress запускает ошибку 404. Поэтому я думаю, что WordPress не вызывает index.php на http://www.test.com/page/2/?s=my+search+query, и мне также нужно поставить код, который я получил в моем index.php где-то иначе, но где?

Изменить: мой код для пользовательского запроса

$author_res = $wpdb->query("SELECT ID FROM $wpdb->users WHERE display_name LIKE '%".get_search_query()."%' LIMIT 1"); if($author_res > 0) { $author_info = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE display_name LIKE '%".get_search_query()."%' LIMIT 1"); $article_query = new WP_Query('posts_per_page=7&paged=' . $paged.'&author='.$author_info->ID.'&offset='. $offset); if($article_query->have_posts()){ ... 

$ paged и $ offset получают расчетное значение, но это отлично работает. Я думаю, проблема в другом месте, я хотел бы отладить это, но я не знаю, где WordPress решает, запускает ли он 404, и я не знаю, какой php-файл запускается на / page / 2, потому что кажется, что это не index.php

index.php – это шаблон по умолчанию, резервный.

Если мы посмотрим здесь:

http://codex.wordpress.org/Template_Hierarchy

И на диаграмме:

введите описание изображения здесь

Здесь мы видим, что search.php является подходящим шаблоном.

Рассматривали ли вы использование author.php и авторских архивов вместо изменения шаблона поиска? Есть гораздо лучшие способы реализации того, что вы хотите, даже поиск по имени автора, а не получение исправления для вашего исправления. Возможно, новый вопрос под названием «Как искать сообщения через имя автора»,

При загрузке / рендеринге страницы, насколько вам известно, WordPress пытается определить, какая страница запрашивается путем разбора строки запроса и сопоставления с списком шаблонов регулярных выражений. Например, строка запроса /page/2/ будет сопоставлена ​​со страницей # 2 на первой странице, если для параметра page_on_front установлено значение false (это параметр «одна страница или список сообщений»), и имеется достаточное количество что требуется вторая страница. Если этого не происходит, WordPress вместо этого перенаправляется на страницу 404 и возвращает код статуса HTTP 404.

Все это происходит в WP_Query::parse_query() . Посмотрите конкретно на строку 1670, где объект запроса отмечен 404, если была ошибка при выполнении запроса.

Я предполагаю, что в вашем случае первоначальный запрос, автоматически выполняемый WordPress, не соответствует запросу, который вы используете самостоятельно, то есть WordPress ищет сообщения со смещением страницы 2, в то время как вы собираетесь загружать сообщения, соответствующие вашему пользовательскому поисковому запросу.

Я бы сказал, что ваши лучшие варианты обхода этого – 1. убедитесь, что ваш пользовательский запрос запускается в первую очередь независимо от того, что или 2. не позволяет WordPress возвращать 404 в этом конкретном случае.

1. Убедитесь, что ваш пользовательский запрос запущен первым. Это можно сделать, добавив следующий (непроверенный) фрагмент кода в плагин или ваши темы functions.php :

 function my_default_query() { // Conditions required for running your custom query if (is_home() || is && isset($_GET['s'])) { query_posts(array( // your custom query arguments here )); } } add_action('init', 'my_default_query'); 

2. предотвращение возврата WordPress 404. Этого, вероятно, можно добиться, используя фильтр для некоторых значений, вычисленных в WP_Query::parse_query() но их, к сожалению, не очень легко найти и может быть «скрыто» за вызовами функций, выполненными внутри parse_query() . Если вам нужно много работать или не удалось, возможно, вы просто можете изменить значение $is_404 на глобальном объекте WP_Query .

 function my_override_404() { // Conditions required for overriding 404 if (is_home() || is && isset($_GET['s'])) { global $wp_query; $wp_query->is_404 = false; } } add_action('init', 'my_override_404'); 

И, как писал Том Джей Новелл, index.php , вероятно, не является подходящим шаблоном для использования в этом случае и, вероятно, исправит вашу проблему в одиночку. Публикация этого ответа в любом случае, поскольку это может помочь вам / другим подобным ситуациям.