Перенаправление 404 для поиска с нумерацией страниц по шаблону 404
Прежде всего, я хочу прояснить, что я знаю, что такое лучшие практики, когда дело доходит до обработки 404 ошибок. Однако у меня есть конкретный случай, когда мне может понадобиться индивидуальный подход.
Я работаю с газетным сайтом, на котором хранятся архивы более чем за 10 лет, с 150 тысячами + трудолюбивыми фрагментами контента и множеством ссылок, которые все еще просматриваются. Он также пережил много неприятностей: 3 разных CMS до WP, каждая со своей собственной структурой ссылок и неадекватным перенаправлением при каждом изменении. Так что теперь архивы практически "потеряны" с точки зрения SEO.
С более чем 90% -ным содержанием неуместным, показ классических 404-х на самом деле не вариант. Аварийным выходом было перенаправить слова в URL на поисковый запрос (после фильтрации констант) и надеяться на лучшее. В большинстве случаев соответствующий результат отображается вверху, но не всегда. По этой причине я полагаю, что неправильно делать вид, что 404 просто не существует.
Другой подход, о котором я подумал, заключался в следующем: сохранить URL-адрес дословно, отправить статус 404, но использовать шаблон 404 для отображения поискового запроса (WP_query
с параметром 's') на соответствующих словах.
Это имеет преимущество в том, что в сильных матчах (те, которые почти наверняка будут "мне повезет"), я могу принять решение о фактическом перенаправлении 301. Однако это не всегда так: иногда искомая статья очень далеко внизу списка. Тем не менее, это будет работать почти нормально, за исключением того, что по какой-то причине нумерация страниц не работает на 404-х. Так что теперь я думаю, что нужно сделать одну из двух вещей:
Простое решение, если только возможно: каким-то образом заставить работу нумерации страниц на шаблоне 404 - так как я не знаю, почему это не так, я не знаю, можно ли это сделать или как. (Обновление: скорее всего, это потому, что запрос разбивки на страницы var/slug рассматривается как часть поиска)
Сложное решение, если только возможно: используйте сам шаблон поиска. Слаг "search" может быть полностью удален путем подключения правил перезаписи с помощью
$wp_rewrite->search_base = '';
Это теоретически превращает практически любой URL, брошенный в него, в поиск. Огромная проблема заключается в том, что он также делает это для почтовых имен и всего остального, кроме категорий и тегов. Итак, что я получаю из этого, так это: всякий раз, когда есть запрос URL, Wordpress будет искать, если есть соответствие категории, затем тег, а затем будет выполнять поиск. Только после этого он будет искать подходящих авторов, архивы, посты и т. Д. Если бы я только мог каким-то образом подключиться к внутренним правилам WordPress относительно приоритета парсинга URL-адресов и переместить элемент поиска в конец списка, проблема будет решена.
Я должен признать, что я не пробовал никакого реального кода. Я не знаю, с чего начать, я не знаю точно, что искать, и там также, кажется, мало документации для того, что я хочу. Все, что я смог сделать, это слепой тест, как описано выше.
Поэтому вопрос в том, есть ли способ сделать что-либо из перечисленного выше и как.
2 ответа
Простое решение, если только возможно: каким-то образом заставить работу нумерации страниц на шаблоне 404 - так как я не знаю, почему это не так, я не знаю, можно ли это сделать или как.
Трудно сказать, почему нумерация страниц не работает, не видя код для вашего шаблона 404.
Сложное решение, если только возможно: используйте сам шаблон поиска.
Вы можете использовать template_include
Фильтр для изменения шаблона. Вам также придется вручную изменить основной запрос на поисковый запрос:
add_filter('template_include', function($template) {
if(!is_404()) {
return $template;
}
$search_query = new WP_Query(array('s' => get_query_var('name')));
if($search_query->have_posts()) {
// Replace the main query with the search query
global $wp_query;
$wp_query = $search_query;
// Change the response code
status_header(200);
// Use the search template
return get_search_template();
}
return $template;
});
Обратите внимание, что при нормальных обстоятельствах лучший способ изменить основной запрос - это использовать pre_get_posts
фильтр. В этом случае, однако, мы не знаем, является ли это 404, пока не будет выполнен запрос.
Также я пользуюсь status_header
изменить код ответа с 404 на 200, если поиск возвращает результаты. Если все, что вы пытаетесь сделать, - это предоставлять пользователям правильный контент, то, вероятно, код ответа не имеет значения.
В большинстве случаев соответствующий результат отображается вверху, но не всегда
Если вы решите, что хотите просто обработать первый результат поиска, вы можете обновить приведенный выше код для перенаправления:
if($search_query->have_posts()) {
$url = get_permalink( $search_query->posts[0]->ID );
wp_redirect($url);
exit;
}
Обновление: Кроме того, вы можете просто перенаправить запрос на поиск, не беспокоясь об изменении шаблона 404 или загрузке другого шаблона:
if($search_query->have_posts()) {
$url = get_search_link( get_query_var('name') );
wp_redirect($url);
exit;
}
Вы можете настроить свою оригинальную идею:
В большинстве случаев соответствующий результат отображается вверху, но не всегда. По этой причине я полагаю, что неправильно делать вид, что 404 просто не существует.
Вы можете перенаправить пользователя на копию своей страницы поиска, добавив несколько сообщений в духе "Эта страница перемещена, это одна из них?" (Или, что еще лучше, динамически добавляйте эти сообщения на стандартную страницу поиска, если пользователь был перенаправлен).
В зависимости от того, как настроен ваш поиск, вы можете отправить исходный URL-адрес как переменную php POST, чтобы запустить поиск, или проанализировать его на странице 404 и отправить в виде последовательности переменных GET.
Или я неправильно понимаю некоторые ограничения при разборе вашего URL и отправке его в поиске по WordPress?