Перенаправление страницы с ограниченным доступом на 404
Есть ли способ показать страницу 404, если текущий авторизованный пользователь не имеет необходимых прав для просмотра страницы? Я ищу PHP-метод, что-то вроде
if( !current_user_can('administrator') ) { show_404(); exit(); }
Я думал об использовании перенаправления, но хотелось бы сохранить тот же URL.

Мне удалось отобразить ошибку 404, используя следующий код в шапке сайта.
<?php
global $wp_query;
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 ); exit();
?>
Разберём по частям:
$wp_query->set_404()
: указывает wp_query, что это страница 404, что изменяет заголовок
status_header()
: отправляет HTTP-заголовок 404
get_template_part()
: выводит шаблон 404 страницы

Это хороший ответ, но я бы также использовал http_status_code(404);
перед установкой шаблона, чтобы убедиться, что заголовок верный (что значительно быстрее, чем функция WordPress status_header( 404 );
). Если вас беспокоит рейтинг страницы, вам также следует добавить правило Disallow
в ваш robots.txt, чтобы указать, что это не публичный ресурс.

Почему бы не создать страницу, которая показывает сообщение об ошибке, а затем перенаправляет пользователя на эту страницу? Вот простой способ реализовать это:
Откройте файл 404.php
и добавьте эти строки в начало:
/**
* Шаблон страницы: 404 Страница
*/
Создайте страницу с шаблоном 404 Страница
. Затем перенаправьте пользователей:
if ( !current_user_can('administrator') ) {
$404_page = get_permalink( $404_page_id );
wp_redirect( $404_page );
exit();
}
Причина, по которой следует использовать страницу для 404 ошибки: в WordPress страница 404 фактически является страницей, которой не существует, WordPress должен проверить весь свой контент перед тем, как вернуть страницу 404, и эта работа является пустой тратой ресурсов. Использование предварительно настроенной страницы может помочь сделать ваш блог быстрее.

Я думал об использовании этого. Но пара недостатков, которые я вижу, это то, что придется создавать и поддерживать два шаблона 404 (страницы и реальный). Клиенту нужно будет создать страницу 404. И я хотел бы оставить URL таким же. Например, если я перейду по http://www.example.com/restricted, я не хочу перенаправляться на .../404/

Вообще-то я только что понял, что 404.php — это шаблон. Моя ошибка.

Нет, это довольно ужасная идея, если вы хотите сохранить какой-либо рейтинг страниц. Поисковые системы считают страницы, возвращающие заголовок 404 или любой из диапазона 4xx, как ошибку для пользователя, и будут охотно индексировать всё, что возвращает страницу с кодом 200. Если вы делаете перенаправление, то сообщаете краулерам, что ваша страница "не найдена" является валидной страницей, что сильно испортит ваш рейтинг. Всё, что вам действительно нужно делать при получении страницы 404 — это http_response_code(404); exit();
. Если вам нужна страница, используйте get_template_part( 404 );
перед выходом. Это также намного быстрее, чем любая функциональность WordPress.

У меня было похожее требование, где я не должен был позволять пользователям доступ к странице author.php в зависимости от их роли. Я зарегистрировал действие template_redirect для выполнения проверок и перенаправления на страницу 404 еще до фактической загрузки страницы.
Регистрация:
add_action( 'template_redirect', [ $this, 'handle_inactive_users']);
Обработчик:
public function handle_inactive_users() {
global $wp_query;
if ( $wp_query->is_author() ) {
$user = $wp_query->get_queried_object();
if ( is_a( $user, \WP_User::class ) && $user->has_cap( 'inactive' ) ) {
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
}
}
}
Если вы решите использовать только следующий фрагмент кода в середине шаблона, страница может быть уже частично отрисована, и вы не будете фактически перенаправлены на страницу 404. Поэтому лучше делать это в действии template_redirect
-
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();

Вы можете записать этот код в файл 404.php в директории используемой темы (wp-content/themes/..../404.php):
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".get_bloginfo('url'));
exit();
?>
Этот код должен начинаться с самого начала файла (без каких-либо символов перед ним).
Ссылка на оригинал: Как перенаправить страницу 404 на главную в WordPress

Автор ищет способ отображать 404 ошибку для пользователей, которые не соответствуют определённым критериям, например: "Если пользователь А не имеет права 'can_edit', то показывать страницу 404."
