Перенаправление 404 для поиска с нумерацией страниц по шаблону 404

Прежде всего, я хочу прояснить, что я знаю, что такое лучшие практики, когда дело доходит до обработки 404 ошибок. Однако у меня есть конкретный случай, когда мне может понадобиться индивидуальный подход.

Я работаю с газетным сайтом, на котором хранятся архивы более чем за 10 лет, с 150 тысячами + трудолюбивыми фрагментами контента и множеством ссылок, которые все еще просматриваются. Он также пережил много неприятностей: 3 разных CMS до WP, каждая со своей собственной структурой ссылок и неадекватным перенаправлением при каждом изменении. Так что теперь архивы практически "потеряны" с точки зрения SEO.

С более чем 90% -ным содержанием неуместным, показ классических 404-х на самом деле не вариант. Аварийным выходом было перенаправить слова в URL на поисковый запрос (после фильтрации констант) и надеяться на лучшее. В большинстве случаев соответствующий результат отображается вверху, но не всегда. По этой причине я полагаю, что неправильно делать вид, что 404 просто не существует.

Другой подход, о котором я подумал, заключался в следующем: сохранить URL-адрес дословно, отправить статус 404, но использовать шаблон 404 для отображения поискового запроса (WP_query с параметром 's') на соответствующих словах.

Это имеет преимущество в том, что в сильных матчах (те, которые почти наверняка будут "мне повезет"), я могу принять решение о фактическом перенаправлении 301. Однако это не всегда так: иногда искомая статья очень далеко внизу списка. Тем не менее, это будет работать почти нормально, за исключением того, что по какой-то причине нумерация страниц не работает на 404-х. Так что теперь я думаю, что нужно сделать одну из двух вещей:

  1. Простое решение, если только возможно: каким-то образом заставить работу нумерации страниц на шаблоне 404 - так как я не знаю, почему это не так, я не знаю, можно ли это сделать или как. (Обновление: скорее всего, это потому, что запрос разбивки на страницы var/slug рассматривается как часть поиска)

  2. Сложное решение, если только возможно: используйте сам шаблон поиска. Слаг "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?

Другие вопросы по тегам