Вопрос или проблема
Я перечисляю посты на главной странице с постраничной навигацией, и если посты не найдены на главной странице, я хочу перенаправить страницу на 404 и получить код ответа 404.
Например, example.com/page/200 Номер страницы 200, но у постов нет 200 страниц. Я использую два запроса WP на главной странице, и я хочу сделать это для основного запроса.
Я хочу перенаправить на 404 страницу и получить ответ 404 вместо текста “нет результатов”.
Это работает на странице категории, но я не смог сделать это для главной страницы. Спасибо.
Ну, определить 404 в .htaccess невозможно. Это связано с тем, что файл .htaccess будет перенаправлять любые запросы к несуществующим страницам на файл index.php. Оттуда WordPress будет выполнять поиск в базе данных, чтобы узнать, соответствует ли текущий запрос какому-либо содержимому в базе данных.
Если нет, то WordPress возвращает 404. Обработка запросов к несуществующим страницам в .htaccess означала бы, что WordPress никогда не загрузится. Таким образом, вам нужно будет обработать логику перенаправления внутри самого WordPress.
Я рекомендую следующий плагин: https://wordpress.org/plugins/all-404-redirect-to-homepage/ (вы можете перенаправить на конкретную страницу, а не только на главную страницу).
или вы можете добавить этот код, но он на самом деле не сработает:
ErrorDocument 404 http://www.example.com/error.html
Вместо этого попробуйте этот php код в functions.php
add_action( 'wp', 'se344018_redirect_404' );
function se344018_redirect_404()
{
if ( is_404() ) {
wp_redirect( home_url() );
//
// wp_redirect( home_url('some/page-slug') );
exit;
}
}
Я нашел код на https://ananchor.com 👍
Ответ или решение
Для реализации перенаправления на страницу 404 в случае, если на главной странице вашего веб-сайта на базе WordPress не найдено постов, требуется настроить соответствующий обработчик в функции вашего сайта, а не в файле .htaccess
, так как этот файл не сможет адекватно обрабатывать запросы, если ресурсы не существуют.
Шаг 1: Проверка наличия постов
Для начала вам необходимо проверить, есть ли посты в основном цикле. Вы можете использовать условия WordPress для проверки наличия записей на главной странице. Если постов не найдено, вы можете выполнить перенаправление на страницу 404.
Шаг 2: Добавление кода в файл functions.php
Добавьте следующий код в ваш файл functions.php
активной темы. Этот код проверяет, есть ли записи на главной странице, и в случае их отсутствия возвращает код ответа 404 и направляет пользователя на страницу 404 вашего сайта.
add_action( 'template_redirect', 'check_empty_homepage_for_404' );
function check_empty_homepage_for_404() {
if ( is_home() && !have_posts() ) {
// Устанавливаем заголовок ответа 404
status_header( 404 );
// Перенаправляем пользователя на страницу 404
include( get_404_template() );
exit();
}
}
Шаг 3: Пояснение коду
-
add_action: Хук
template_redirect
срабатывает перед загрузкой контента страницы, что позволяет нам контролировать вывод. -
is_home(): Убедитесь, что данный код выполняется только на главной странице.
-
have_posts(): Проверка наличия постов. Если постов нет, выполняются далее описанные действия.
-
status_header( 404 ): Устанавливает заголовок ответа HTTP 404, что сообщает браузеру о том, что страницы не существует.
-
include( get_404_template() ): Загружает шаблон страницы 404, который отображает сообщение об ошибке.
-
exit(): Завершает выполнение скрипта, чтобы избежать выполнения оставшейся части темы после редиректа.
Шаг 4: Тестирование
После внесения изменений в файл functions.php
, вам необходимо протестировать следующую логику:
- Откройте главную страницу сайта, добавив номер страницы, который превышает общее количество страниц постов (например,
example.com/page/200
), и проверьте, что вас перенаправляет на страницу 404.
Заключение
Этот подход позволит вам корректно обрабатывать ситуации, когда на главной странице сайта отсутствуют посты, и обеспечит пользователей адекватной страницей с сообщением об ошибке. Убедитесь, что ваш шаблон страницы 404 оформлен в соответствии с общим дизайном сайта, чтобы пользователь не потерялись, а мог легко вернуться к основному контенту.