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

25

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

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

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

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

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

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

  • Сложное решение, если только возможно: используйте сам шаблон поиска. Путь поиска можно полностью удалить, подключившись к правилам перезаписи с помощью $wp_rewrite->search_base = '';. Это теоретически превращает почти любой url, брошенный в него в поиск. Огромная проблема заключается в том, что он также делает это для postnames и всего остального, кроме категорий и тегов. Так что я получаю от этого следующее: Всякий раз, когда есть URL-запрос, Wordpress будет выглядеть, если есть соответствие категории, затем тег, затем он будет выполнять поиск. Только после этого он будет искать подходящих авторов, архивов, сообщений и т.д. Если бы я мог каким-то образом подключиться к внутренним правилам Wordpress, касающимся приоритета разбора URL-адресов, и переместить объект поиска в конец списка, проблема будет решена.

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

Итак, вопрос заключается в том, есть ли способ сделать одно из приведенного выше и как.

  • 0
    Что "шаблон 404" является чем-то специфичным для WP? Во всяком случае, почему бы не сделать «нумерацию страниц» через AJAX? Когда кто-то прокручивает до конца, ajax загрузит следующие результаты X на активную страницу без перезагрузки или изменения URL-адреса ...
  • 0
    Шаблон не является конкретным, как он работает, я думаю, это. Пагинация на самом деле выполняется с помощью ajax, но целевые страницы по-прежнему нужно создавать в первую очередь, чего не происходит.
Теги:
redirect
search
pagination

2 ответа

10

Простое решение, если только возможно: каким-то образом сделать разбиение на страницы на шаблон 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;
}
  • 0
    «Трудно сказать, почему нумерация страниц не работает, не увидев код для вашего шаблона 404». Пробовал с циклом WordPress по умолчанию, и он работает на любом другом шаблоне, кроме этого. Я начал подозревать, что это может быть связано с запросом на разбиение на страницы args / slug, который рассматривается как часть самого поиска. «Вы можете использовать фильтр template_include для изменения шаблона. Вам также придется вручную изменить основной запрос на поисковый запрос». Я попробую, похоже, это может быть.
  • 0
    По-видимому, на этом этапе нельзя выполнить нумерацию страниц, если только WordPress не изменит приоритеты парсинга URL-адресов или не документирует для этого некоторые хуки. Это хороший шаг вперед по сравнению с тем, что я использовал.
3

Вы можете настроить свою оригинальную идею:

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

Вы можете перенаправить пользователя на копию своей страницы поиска с помощью некоторых добавленных сообщений по строкам "Эта страница переместилась, это одна из них?" (Или, что еще лучше, динамически добавьте этот обмен сообщениями на свою стандартную страницу поиска, если пользователь был перенаправлен).

В зависимости от того, как настроен ваш поиск, вы можете отправить исходный URL как переменную POST PHP для запуска поиска или проанализировать его на странице 404 и отправить его в виде серии переменных GET.

Или я недопонимаю какое-то ограничение при анализе вашего URL-адреса и отправке его в WordPress?

  • 0
    Да, никогда не думал о дублировании какого-либо существующего шаблона - это открывает довольно много возможностей. На самом деле эти вещи можно сделать с помощью Wordpress. Ограничение в том, что у WP есть собственный внутренний список приоритетов с URL-запросом. Итак, сначала он будет проверять, является ли это категория, если служит совпадение, иначе проверять, если тег, если совпадение служит, либо пробовать поиск - и с этого момента ничего больше не имеет значения, как что-либо (автор, дата, пользовательская таксономия, публикация! И т. Д.) ) анализируется в поиске. ИМО, поиск всегда должен идти последним, по умолчанию или, по крайней мере, через хак, который я ищу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню