Вопрос или проблема
ОБНОВЛЕНИЕ: Я провел еще исследование своей проблемы и более точно определил ее. Вопрос ниже значительно переписан с оригинала.
Я пытаюсь настроить плагин для перенаправления всех запросов страницы – фронтенд, админ, вход и т.д. – на дополнительную страницу проверки кода (целесообразность этого не обсуждается, это то, что хочет клиент). Исходя из функций, хуков и фильтров, которые мне нужно использовать, я определил, что самый ранний хук, к которому я могу привязать функцию перенаправления, это wp
:
add_action('wp', 'cg_check_validation');
Функция проходит через некоторые проверки $_COOKIE
и $_POST
перед тем, как в конечном итоге:
wp_redirect(add_query_arg('validate-access', 1, $_SERVER['REQUEST_URI']));
Следующий фильтр и действие были настроены для обработки перенаправления:
add_filter('query_vars', 'cg_redirect_query_vars');
function cg_redirect_query_vars($query_vars)
{
$query_vars[] = 'validate-access';
return $query_vars;
}
add_action('parse_request', 'cg_redirect_parse_request');
function cg_redirect_parse_request(&$wp)
{
// если наш пользовательский запрос на проверку доступа существует, загружаем наше представление плагина
// затем завершаем скрипт
if (array_key_exists('validate-access', $wp->query_vars)) {
include(plugin_dir_path(__FILE__) . 'views/validate-access.php');
exit();
}
return;
}
Перенаправление и проверка кода работает для ПОЧТИ каждой страницы, однако страница входа и базовая страница администрирования (/wp-admin/
) не перенаправляются вообще. Что может быть причиной исключения этих страниц?
ИЗМЕНЕНИЕ: Еще одно обновление! Перенаправление РАБОТАЕТ ТОЛЬКО на админских страницах, у которых есть строка запроса. Например, перенаправление работает на wp-admin/edit.php?post_type=page
, но не работает на /wp-admin/edit-comments.php
. Хотя я идентифицировал проблему, я не ближе к ее решению — моё лучшее предположение заключается в том, что parse_request
или query_vars
не срабатывают на страницах без строк запроса?
Подключение к admin_init
– это то, что вам нужно, для выполнения перенаправления внутри админа. Так что вам нужно обе – эта и хук к template_redirect
для обработчика фронтенда.
Ответ или решение
Процесс перенаправления всех запросов на странице в WordPress: полное руководство
Введение
Создание плагина для перенаправления всех запросов на дополнительную страницу валидации кода — это задача, требующая тщательного подхода к обработке хуков WordPress. В данном ответе мы рассмотрим, как настроить перенаправление для всех страниц, включая административные, а также страницу входа в систему.
1. Определение проблемы
Вы правильно определили, что используете хук wp
для перенаправления, однако это может не сработать на страницах администратора и страницах без параметров запроса. Эти страницы могут не инициировать стандартный процесс, что приводит к недоступности механизма обработки запроса.
2. Решение: Использование хуков admin_init
и template_redirect
Для обеспечения корректной работы перенаправления во всех частях сайта, следует использовать несколько хуков:
admin_init
для административных страниц.template_redirect
для фронтенд-страниц.
Такой подход гарантирует обработку запросов на всех страницах, включая страницы входа и основные административные страницы.
3. Реализация
Вот пример реализации, который следует вашим требованиям:
// Пример перенаправления для админки
add_action('admin_init', 'cg_check_validation_admin');
function cg_check_validation_admin() {
if (is_user_logged_in()){ // Проверка, что пользователь вошел в систему
cg_check_validation();
}
}
// Пример перенаправления для фронтенда
add_action('template_redirect', 'cg_check_validation');
function cg_check_validation() {
// Проверка условий валидации
if (!is_valid_request()) { // Предполагаемая функция валидации
wp_redirect(add_query_arg('validate-access', 1, $_SERVER['REQUEST_URI']));
exit();
}
}
// Фильтрация переменных запроса
add_filter('query_vars', 'cg_redirect_query_vars');
function cg_redirect_query_vars($query_vars) {
$query_vars[] = 'validate-access';
return $query_vars;
}
// Парсинг запроса для обработки перенаправлений
add_action('parse_request', 'cg_redirect_parse_request');
function cg_redirect_parse_request(& $wp) {
if (array_key_exists('validate-access', $wp->query_vars)) {
include(plugin_dir_path(__FILE__) . 'views/validate-access.php');
exit();
}
return;
}
4. Объяснение кода
admin_init
: Этот хук вызывается на всех страницах админки. Если пользователь вошел в систему, будет проверка предоставленной функцииcg_check_validation()
.template_redirect
: Этот хук обрабатывает запросы для всех фронтенд-страниц. Здесь опять же условие для валидации и редирект на страницу валидации.query_vars
иparse_request
: Настройка кастомного параметра запроса и обработка этого параметра для отображения страницы валидации.
5. Заключение
Использование вышеуказанных хуков позволяет вам обеспечить стабильную работу переадресации для всех необходимых страниц вашего сайта. Следует учесть, что любые изменения в поведении или логике должны сопровождаться тщательным тестированием для предотвращения ненужных проблем с доступом. Также рекомендуется регулярно проверять обновления и изменения в API WordPress, так как они могут повлиять на ваш плагин.