Как вы можете проверить, находитесь ли вы на определенной странице в разделе WP Admin? Например, как я могу проверить, нахожусь ли я на странице Пользователи> Ваш профиль?

32

Я создаю плагин, и я хочу добавить кусочки JavaScript в голове администратора, но только для определенных страниц администратора. Я имею в виду не страницы, как на странице WordPress, которые вы создаете сами, а скорее существующие страницы раздела администратора, такие как «Ваш профиль», «Пользователи» и т. Д. Есть ли функция wp специально для этой задачи? Я искал и могу найти только булеву функцию is_adminи хуки действий, но не булеву функцию, которая просто проверяет.

racl101
источник
1
Нежный толчок, чтобы напомнить вам, что ответ не был принят. Если ни один из ответов не дал ответа на ваш вопрос в достаточной степени или вы пытаетесь понять предоставленную информацию, пожалуйста, оставьте комментарий, чтобы сообщить нам.
t31os

Ответы:

24

Способ сделать это - использовать ловушку admin_enqueue_scripts, чтобы поставить в очередь нужные вам файлы. Этот хук получит $ hook_suffix, который относится к текущей загруженной странице:

function my_admin_enqueue($hook_suffix) {
    if($hook_suffix == 'appearance_page_theme-options') {
        wp_enqueue_script('my-theme-settings', get_template_directory_uri() . '/js/theme-settings.js', array('jquery'));
        wp_enqueue_style('my-theme-settings', get_template_directory_uri() . '/styles/theme-settings.css');
        ?>
        <script type="text/javascript">
        //<![CDATA[
        var template_directory = '<?php echo get_template_directory_uri() ?>';
        //]]>
        </script>
        <?php
    }
}
add_action('admin_enqueue_scripts', 'my_admin_enqueue');
prettyboymp
источник
55

В wp-admin есть глобальная переменная с именем $ pagenow, которая содержит имя текущей страницы, то есть edit.php, post.php и т. Д.

Вы также можете проверить запрос $ _GET, чтобы сузить свое местоположение, например:

global $pagenow;
if (( $pagenow == 'post.php' ) && ($_GET['post_type'] == 'page')) {

    // editing a page

    }

if ($pagenow == 'users.php') {

    // user listing page

    }

if ($pagenow == 'profile.php') {

    // editing user profile page

    }
goldenapples
источник
1
global $pagenow; if ( ( 'admin.php' === $pagenow ) && ( 'prefix-theme-settings' === $_GET['page'] ) ) { logic.. }например, проверяет, находитесь ли вы на странице настроек пользовательской темы admin.php?page=prefix-theme-settings.
lowtechsun
19

Наиболее полный метод get_current_screenдобавлен в WordPress 3.1

$screen = get_current_screen();

возвращается

WP_Screen Object (
    [action] => 
    [base] => post
    [id] => post
    [is_network] => 
    [is_user] => 
    [parent_base] => edit
    [parent_file] => edit.php
    [post_type] => post
    [taxonomy] => 
)
Луи-Рэй
источник
3
«Ограничения использования - эта функция определена на большинстве страниц администратора, но не на всех. Таким образом, в некоторых случаях is_admin () возвращает true, но попытка вызвать get_current_screen () приведет к фатальной ошибке, поскольку она не определена. известным примером является wp-admin / customize.php. Функция возвращает значение null, если вызывается из ловушки admin_init. Она должна быть в порядке для использования в более поздней ловушке, такой как current_screen. "- Кодекс .
Этот бразильский парень
@ThatBrazilianGuy Быстрая проверка показывает, что это больше не так, насколько я вижу get_current_screen(), безопасно использовать на всех страницах администратора.
Шахар
1
@shahar это все еще так, согласно документации, указанной выше, и моему опыту.
Фабрика
9

Предложить альтернативный метод / подход к вышеуказанному вопросу.

// When you are viewing the users list or your editing another user's profile
add_action( 'admin_print_scripts-users.php', 'your_enqueue_callback' );

// When you are editing your own profile
add_action( 'admin_print_scripts-profile.php', 'your_enqueue_callback' );

function your_enqueue_callback() {
    wp_enqueue_script( .. YOUR ENQUEUE ARGS .. );
}

Этот метод нацелен на конкретные страницы более напрямую и позволяет избежать необходимости в условной логике внутри вашего обратного вызова (потому что вы уже сделали это различие в выбранном хуке).

t31os
источник
Жаль, что я не знаю, почему этот ответ не получил больше голосов, охватывает конкретный вариант использования в вопросе и предоставляет решение в минимальном количестве кода. Обратная связь была бы хорошей ..
t31os
3

Я нахожу странным, что никто не упомянул тот факт, что функция add_menu_page возвращает ловушку действия, которую вы можете использовать для выполнения определенных действий только на этих страницах.

$hook = add_menu_page($menu_title, $page_title, $capability, $slug, $function, $icon_url, $position);
add_action( 'load-' . $hook, 'my_admin_enqueue_scripts' );
function my_admin_enqueue_scripts() {
    wp_enqueue_script(/*...*/);
    wp_enqueue_style(/*...*/);
}

Если вам нужен $ hook, и вы не добавили страницу меню самостоятельно, документ здесь

Например, крючок для страницы меню верхнего уровня

нагрузки toplevel_page_ $ MenuSlug

Крюк для страницы подменю есть

load- $ MenuSlug_page_ $ SubMenuSlug

Следуя этой логике, хук для страницы профиля пользователя

нагрузки users_page_profile

Tofandel
источник