Вопрос или проблема
Следующий код (из здесь, средняя часть вырезана) позволяет мне перенаправлять пользователей, попадающих на определённую страницу в админке WP, на другую админ-страницу…
function admin_redirects() {
global $pagenow;
/* Перенаправление из Кастомайзера на Опции темы */
if($pagenow == 'customize.php'){
wp_redirect(admin_url('/admin.php?page=theme_options', 'http'), 301);
exit;
}
}
add_action('admin_init', 'admin_redirects');
Это работает отлично… для некоторых страниц. Проблема в том, что я не могу заставить перенаправления работать для страниц с URL-структурой, такой как “admin.php?page=example-options.” Строка example-options — это просто плагин, над которым я работал, но вы понимаете, о чём я. Я пробовал множество вариантов и других вещей на данный момент, но ничего не работает. Я что-то упускаю?
Я думаю, вы добьётесь желаемого, используя [get_current_screen()][1]
и считывая свойства из объекта WP_Screen по необходимости. В вашем случае, я думаю, вам понадобится $screen->base
или, возможно, $screen->id
. Согласно WordPress Codex:
id (строка) Уникальный ID экрана
и
base (строка) Основной тип экрана. Например, для страницы ‘post-new.php’ база — ‘post’.
В качестве примера, Панель управления Yoast SEO находится на admin.php?page=wpseo_dashboard, и $screen->base property
для этой страницы — ‘toplevel_page_wpseo_dashboard
‘
Ниже вы найдёте пример, взятый из того, над чем я работал несколько недель назад.
/**
* Запретить страницы админа для пользователей, не являющихся суперадминами, на хуке current_screen.
* Резервный вариант, когда ограничение доступа невозможно через manage_admin_access_on_init
*
* @since 0.1.0
*/
public function wpse_283875_manage_admin_access_on_screen() {
// список базовых свойств ограниченных страниц из get_current_screen
$restricted_screens = array(
'formularios_page_gf_help',
'toplevel_page_genesis',
'genesis_page_genesis-translations',
'genesis_page_genesis-import-export',
'genesis_page_genesis-simple-edits',
'media_page_wp-smush-bulk',
);
// получить текущий экран
$screen = get_current_screen();
// если объекта $screen нет, мы в кастомайзере, выходим
if ( is_null($screen) ){
return;
}
// получить screen->base
$screen_base = $screen->base;
// сравнить screen->base с каждой ограниченной страницей
foreach ($restricted_screens as $restricted_screen) {
// если пользователь не может управлять сетью и базовый экран ограничен
if (!current_user_can('manage_network') && $screen_base == $restricted_screen) {
//выйти!
wp_redirect(admin_url());
// остановить выполнение
exit;
}
}
}
// хук на действие current_screen с приоритетом 5 для немедленного выполнения
add_action('current_screen','manage_admin_access_on_screen', 5);
Если вам нужно проверить объект экрана, вы можете использовать что-то вроде этого в среде разработки и прочитать HTML-код:
function debug_admin_screen(){
$screen = get_current_screen();
echo '<!--<pre>' . print_r($screen, TRUE) . '</pre>-->';
}
add_action('current_screen', 'debug_admin_screen', 100);
Ответ или решение
Чтобы настроить перенаправление одной административной URL-адреса на другую в WordPress, когда URL-адрес содержит "admin.php?page=", вам необходимо использовать хук admin_init
или current_screen
для проверки текущей страницы и условия перенаправления. Метод, основанный на объекте WP_Screen
, будет наиболее безопасным и эффективным способом выполнения этой задачи.
Шаг 1: Определение текущего экрана
Первое, что вам нужно сделать, это получить информацию о текущем экране с помощью функции get_current_screen()
. Этот объект содержит свойства, которые помогут вам идентифицировать, на какой именно странице вы находитесь.
Шаг 2: Проверка условий
Затем вы можете установить условия для проверки, находится ли пользователь на нужной странице, на которую вы хотите перенаправить. Например, вы можете использовать идентификатор ($screen->id
) или базу ($screen->base
) для сравнения.
Шаг 3: Выполнение перенаправления
Если условия выполняются, вам нужно будет использовать функцию wp_redirect()
для выполнения перенаправления.
Пример кода
Вот пример кода, который выполняет описанные выше шаги и осуществляет перенаправление:
function custom_admin_redirects() {
// Получаем текущий экран
$screen = get_current_screen();
// Проверяем, что объект экрана существует
if (is_null($screen)) {
return; // Выход, если экран не определён
}
// Проверяем, находится ли пользователь на конкретной странице
if ($screen->id === 'example-options') { // Замените 'example-options' на ваш ID страницы
wp_redirect(admin_url('/admin.php?page=theme_options', 'http'), 301); // URL, на который вы хотите перенаправить
exit; // Завершаем выполнение скрипта
}
}
// Привязываем нашу функцию к хуку current_screen
add_action('current_screen', 'custom_admin_redirects');
Пояснение кода
-
Получение текущего экрана: Функция
get_current_screen()
возвращает объект текущего экрана. Если объект не создан (например, вы находитесь на странице настройки темы), скрипт не будет продолжать выполнение. -
Условие перенаправления: С помощью свойства
$screen->id
вы можете проверить, какой экран активен. Вы можете заменить'example-options'
своим идентификатором, с которым вы хотите работать. -
Перенаправление: Функция
wp_redirect()
создаёт перенаправление на другую страницу администрирования. Код состояния 301 указывает на постоянное перенаправление, а функцияexit
останавливает дальнейшее выполнение кода, чтобы предотвратить потенциальные проблемы с множественным выводом заголовков.
Заключение
Данный метод предоставляет простой и эффективный способ перенаправления пользователей на различные страницы администрирования WordPress на основе текущего экрана. Не забудьте протестировать ваш код в безопасной среде разработки перед развертыванием на рабочем сайте, чтобы избежать неожиданных проблем и убедиться в корректной работе перенаправления.