- 13.04.16
- 21:52
- 9478
- 0
Ограничить выдачу скриптов и стилей определённым экраном можно так:
|
1 2 3 4 5 6 7 8 9 |
add_action('admin_enqueue_scripts', function () { $scr = get_current_screen(); if ($scr->id == 'screen_id') { // поместить в очередь скрипты для экрана 'screen_id': wp_enqueue_style( ... ); wp_enqueue_script( ... ); ... } }); |
Список идентификаторов экранов WordPress приведён в конце заметки.
Идентификаторы пользовательских экранов возвращаются функциями add_menu_page(), add_submenu_page() и её производными. Эти функции вызываются по хуку 'admin_menu' на ранних этапах загрузки WordPress, поэтому ко времени выполнения 'admin_enqueue_scripts' идентификаторы уже известны.
Поэтому создание экрана можно организовать так:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
add_action('plugins_loaded', array('MyPlugin', 'plugins_loaded')); class MyPlugin { private static $scr_id; // идентификатор экрана хранится здесь public static function plugins_loaded () { add_action('admin_menu', array(__CLASS__, 'admin_menu')); add_action('admin_enqueue_scripts', array(__CLASS__, 'admin_enqueue_scripts')); } public static function admin_menu () { // создание экрана, получение идентификатора: self::$scr_id = add_submenu_page(...); } public static function admin_enqueue_scripts () { $screen = get_current_screen(); if ($screen->id != self::$scr_id) return; // скрипты и стили для экрана self::$scr_id wp_enqueue_style( ... ); wp_enqueue_script( ... ); } } |
При использовании анонимных функций обработчик 'admin_enqueue_scripts' может быть задан сразу после создания экрана:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
add_action('admin_menu', function () { $scr_id = add_submenu_page(...); add_action('admin_enqueue_scripts', function () use ($scr_id) { $screen = get_current_screen(); if ($screen->id != $scr_id) return; // скрипты и стили для $scr_id: wp_enqueue_style( ... ); wp_enqueue_script( ... ); }); }); |
Замечание 1: в обработчике 'admin_menu' вызывать get_current_screen() нет смыла — здесь текущий экран ещё не определён.
Замечание 2: хук "admin_print_scripts-{$scr_id}" может показаться более удобным, т. к. активируется только на экране $scr_id, но использовать его всё-равно не следует: разработчики WordPress прямо заявляют об этом на странице хука 'admin_print_scripts'.
В то же время это не означает, что плагин не будет работать: в текущей версии WordPress (4.5) выдача скриптов и стилей из очередей происходит после обоих этих действий по хуку 'admin_print_scripts' с приоритетом 20. Поэтому при регистрации скриптов в обработчиках "admin_print_scripts-*" работать плагин будет, но при дальнейшем развитии WordPress сохранение такой ситуации не гарантировано, и после очередного обновления CMS плагин рискует оказаться неработоспособным (если, конечно, ограничение рамками 'admin_enqueue_scripts' не будет снято).
Замечание 3: в консоли управления мультисайтом (экраны /wp-admin/network/*) идентификаторы экранов оканчиваются суффиксом '-network'. Функции типа add_submenu_page() этот суффикс не добавляют. Поэтому, если плагин предназначен для работы исключительно с целым мультисайтом (имеет опцию Network: true в заголовке), суффикс приходится добавлять вручную:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php /* * Plugin Name: My Plugin * Network: true */ add_action('network_admin_menu', function () { $scr_id = add_submenu_page(...); $scr_id .= '-network'; // суффикс add_action('admin_enqueue_scripts', function () use ($scr_id) { $screen = get_current_screen(); if ($screen->id != $scr_id) return; // TODO скрипты и стили для $scr_id добавить здесь }); }); |
Идентификаторы экранов WordPress
Идентификаторы стандартных экранов постоянны, их можно задавать строкой непосредственно в обработчиках 'admin_enqueue_scripts'.
| название экрана | идентификатор | |
|---|---|---|
экран редактирования термов таксономии $taxonomy
|
"edit-{$taxonomy}" |
|
| идентификатор одинаков как для экрана терма, так и для экрана самой таксономии; | ||
посты пользовательских типов $post_type
|
||
| все посты | "edit-{$post_type}" |
|
| редактирование поста | $post_type |
|
| страницы (посты типа ‘page’) | ||
| все страницы | 'edit-page' |
|
| экран редактирования страницы | 'page' |
|
| записи (посты типа ‘post’) | ||
| все записи | 'edit-post' |
|
| экран редактирования записи | 'post' |
|
| штатные таксономии | ||
| метки | 'edit-post_tag' |
|
| рубрики | 'edit-category' |
|
| консоль | 'dashboard' |
|
| обновления | 'update-core' |
|
| опции | ||
| общие | 'options-general' |
|
| написание | 'options-writing' |
|
| чтение | 'options-reading' |
|
| обсуждение | 'options-discussion' |
|
| медиафайлы | 'options-media' |
|
| постоянные ссылки | 'options-permalink' |
|
| инструменты | ||
| все инструменты | 'tools' |
|
| импорт | 'import' |
|
| экспорт | 'export' |
|
| пользователи | ||
| все пользователи | 'users' |
|
| новый пользователь | 'user' |
|
| профиль | 'profile' |
|
| редактирование пользователя | 'user-edit' |
|
| плагины | ||
| установленные | 'plugins' |
|
| добавить новый | 'plugin-install' |
|
| редактор | 'plugin-editor' |
|
| внешний вид | ||
| темы | 'themes' |
|
| настроить | 'customize' |
|
| виджеты | 'widgets' |
|
| меню | 'nav-menus' |
|
| редактор | 'theme-editor' |
|
| комментарии | ||
| комментарии | 'edit-comments' |
|
| экран редактирования комментария | 'comment' |
|
| медиафайлы | ||
| библиотека | 'upload' |
|
| добавить новый | 'media' |
|
PS.: на момент данной редакции этой заметки последней версией WordPress является 4.5.