Как создать собственные страницы ошибок 401, 403 и 500?
Когда возникает ошибка 404, для отображения пользовательского сообщения об ошибке можно использовать файл шаблона 404.php. Это документировано в статье Иерархия шаблонов.
Моя цель - создать пользовательские страницы ошибок для 401, 403 и 500. Я пробовал создавать файлы 401.php, 403.php и 500.php в директории моей темы, но это не работает.
Как создать пользовательские страницы ошибок 401, 403 и 500 в WordPress?

Страницы ошибок настраиваются через файл .HTACCESS. Если вы используете Apache, вам нужно использовать директиву ErrorDocument
и добавить в неё статус и URL.
Вот как это будет выглядеть в вашем .htaccess файле:
ErrorDocument 401 http://yourwebsite.com/error-401
ErrorDocument 403 http://yourwebsite.com/error-403
ErrorDocument 500 http://yourwebsite.com/error-500
Вы можете использовать следующую функцию. Она автоматически добавит необходимые настройки в файл HTACCESS, либо вы можете сделать это вручную.
1. Создание страниц:
Далее вам нужно перейти в админ-панель WordPress и создать страницы, как обычные ('Консоль' > 'Страницы' > 'Добавить новую'). Названия могут быть любыми, но важно, чтобы их ярлыки (slug) совпадали с указанными в функции ниже (например: error-401, error-403, error-404, error-500). Также вы можете использовать шаблоны страниц, чтобы создать уникальный дизайн для этих страниц. Для этого следуйте инструкциям в WordPress Codex.
2. Добавление функции:
// Создание пользовательских страниц ошибок в WordPress с использованием HTACCESS
function royal_custom_error_pages() {
// Получаем путь к HTACCESS и динамический URL сайта
$htaccess_file = '.htaccess';
$website_url = get_bloginfo('url').'/';
// Проверяем и предотвращаем повторную запись страниц ошибок
$check_file = file_get_contents($htaccess_file);
$this_string = '# BEGIN WordPress Error Pages';
if( strpos( $check_file, $this_string ) === false) {
// Формируем динамические пути для страниц ошибок
$error_pages .= PHP_EOL. PHP_EOL . '# BEGIN WordPress Error Pages'. PHP_EOL. PHP_EOL;
$error_pages .= 'ErrorDocument 401 '.$website_url.'error-401'.PHP_EOL;
$error_pages .= 'ErrorDocument 403 '.$website_url.'error-403'.PHP_EOL;
$error_pages .= 'ErrorDocument 404 '.$website_url.'error-404'.PHP_EOL;
$error_pages .= 'ErrorDocument 500 '.$website_url.'error-500'.PHP_EOL;
$error_pages .= PHP_EOL. '# END WordPress Error Pages'. PHP_EOL;
// Записываем пути страниц ошибок в HTACCESS
$htaccess = fopen( $htaccess_file, 'a+');
fwrite( $htaccess, $error_pages );
fclose($htaccess);
}
}
add_action('init','royal_custom_error_pages'); // Функция будет запускаться при каждой загрузке, что не оптимально!
// register_activation_hook( __FILE__, 'royal_custom_error_pages' ); // Используется в плагинах, запускается только один раз!
Важно! Примечания к функции:
При переносе сайта или изменении структуры URL:
Хотя функция проверяет наличие директив ErrorDocument перед их записью, она не обновит их, если вы измените или перенесёте сайт. В таком случае вам нужно вручную удалить существующие директивы из HTACCESS и повторно запустить функцию для создания новых.
Правильный хук для однократного срабатывания функции:
Обратите внимание, что при использовании хука init
функция будет запускаться при каждой загрузке страницы, что неэффективно. Лучше добавить её в плагин и использовать register_activation_hook
, чтобы она срабатывала только при активации плагина.
Права доступа к файлу:
Для работы функции файл .htaccess должен быть доступен для записи. Убедитесь, что установлены правильные права, например CHMOD 777.

Не уверен, как это должно работать, внес изменения вручную в файл .htaccess, но это не сработало. Я пытаюсь сделать это на локальном сервере, и это должно быть возможно, так как у меня есть доступ ко всему - серверу и клиенту. Но почему это не работает?

@SolomonClosson, возможно, вы можете попробовать использовать плагин, который я написал для этого. Он сделает все за вас и точно следует приведенному выше коду :). Официальный плагин WordPress.Org

@MattRoyal Функция работает отлично, и я использую ее для создания других правил htaccess. Как я могу сделать так, чтобы правила вставлялись в самое начало файла, выше стандартных правил wp htaccess? В данный момент правила добавляются в конец файла htaccess. Спасибо.

Я не согласен с предложенным решением: 1- НЕЛЬЗЯ устанавливать права 777 на веб-сервере! Это плохая практика в целом и создаёт серьёзные уязвимости безопасности. 2- Вы добавляете операцию записи файла при каждом запросе к сайту. Поскольку это операция записи, она будет блокировать файл, позволяя только одну запись за раз, что уменьшит количество одновременных запросов, которые вы можете обрабатывать. 3- Веб-сайт не должен зависеть от сервера, на котором он работает. Если сайт перенесут на систему с nginx, например, он перестанет работать как ожидалось. ...продолжение

4- Существуют более правильные способы сбора ошибок https://stackoverflow.com/a/34619308/768516
