Как перенаправить один URL-администратора на другой, если в URL страницы администратора есть “/admin.php?page=”?

Вопрос или проблема

Следующий код (из здесь, средняя часть вырезана) позволяет мне перенаправлять пользователей, попадающих на определённую страницу в админке 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');

Пояснение кода

  1. Получение текущего экрана: Функция get_current_screen() возвращает объект текущего экрана. Если объект не создан (например, вы находитесь на странице настройки темы), скрипт не будет продолжать выполнение.

  2. Условие перенаправления: С помощью свойства $screen->id вы можете проверить, какой экран активен. Вы можете заменить 'example-options' своим идентификатором, с которым вы хотите работать.

  3. Перенаправление: Функция wp_redirect() создаёт перенаправление на другую страницу администрирования. Код состояния 301 указывает на постоянное перенаправление, а функция exit останавливает дальнейшее выполнение кода, чтобы предотвратить потенциальные проблемы с множественным выводом заголовков.

Заключение

Данный метод предоставляет простой и эффективный способ перенаправления пользователей на различные страницы администрирования WordPress на основе текущего экрана. Не забудьте протестировать ваш код в безопасной среде разработки перед развертыванием на рабочем сайте, чтобы избежать неожиданных проблем и убедиться в корректной работе перенаправления.

Оцените материал
Добавить комментарий

Капча загружается...