Как проверить, находитесь ли вы на определенной странице в админ-панели WordPress? Например, как проверить, что вы находитесь на странице Пользователи > Ваш профиль?
Я разрабатываю плагин и хочу добавить некоторый JavaScript-код в head админ-панели, но только для определенных административных страниц. Я имею в виду не страницы, которые вы создаете сами в WordPress, а существующие страницы админ-панели, такие как 'Ваш профиль', 'Пользователи' и т.д. Существует ли специальная функция WordPress для этой задачи? Я искал и нашел только булеву функцию is_admin
и хуки действий, но не нашел булеву функцию, которая просто проверяет это.

В админке WordPress существует глобальная переменная $pagenow, которая содержит название текущей страницы, например edit.php, post.php и т.д.
Вы также можете проверить $_GET запрос для более точного определения местоположения, например:
global $pagenow;
if (( $pagenow == 'post.php' ) && ($_GET['post_type'] == 'page')) {
// редактируем страницу
}
if ($pagenow == 'users.php') {
// страница списка пользователей
}
if ($pagenow == 'profile.php') {
// страница редактирования профиля пользователя
}

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

Наиболее полным методом является 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] =>
)

"Ограничения использования --
Эта функция определена на большинстве страниц админки, но не на всех. Поэтому бывают случаи, когда is_admin() возвращает true, но попытка вызвать get_current_screen() приведет к фатальной ошибке, так как функция не определена. Один известный пример - wp-admin/customize.php.
Функция возвращает null, если вызывается из хука admin_init. Её можно безопасно использовать в более поздних хуках, таких как current_screen." -- Codex.

@ThatBrazilianGuy Быстрая проверка показывает, что это больше не так. Насколько я вижу, get_current_screen()
можно безопасно использовать на всех страницах админки.

@shahar Согласно приведенной выше документации и моему опыту, это всё ещё актуально.

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

Для этого необходимо использовать хук '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');

Предлагаем альтернативный метод/подход к вышеуказанному вопросу.
// При просмотре списка пользователей или редактировании профиля другого пользователя
add_action( 'admin_print_scripts-users.php', 'your_enqueue_callback' );
// При редактировании собственного профиля
add_action( 'admin_print_scripts-profile.php', 'your_enqueue_callback' );
function your_enqueue_callback() {
wp_enqueue_script( .. YOUR ENQUEUE ARGS .. );
}
Этот метод более точно нацеливается на конкретные страницы и позволяет избежать необходимости в условной логике внутри вашей функции обратного вызова (поскольку это различие уже сделано в выбранном хуке).

Мне кажется странным, что никто не упоминает факт, что функция 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, а вы сами не добавляли страницу меню, документация находится здесь
Например, хук для страницы верхнего уровня меню:
load-toplevel_page_$MenuSlug
Хук для страницы подменю:
load-$MenuSlug_page_$SubMenuSlug
Следуя этой логике, хук для страницы профиля пользователя:
load-users_page_profile
