Как загрузить стили/скрипты только на определенных страницах /wp-admin?

4 февр. 2012 г., 21:56:16
Просмотры: 76.1K
Голосов: 72

У меня есть две простые функции, которые загружают ресурсы с помощью wp_enqueue_style() и wp_enqueue_script(), примерно такие:

function admin_custom_css()
{ wp_enqueue_style( 'stylesheet_name', 'stylesheet.css') }; 

function admin_custom_js 
{ wp_enqueue_script( 'javascript_file', 'script.js') };

... и несколько страниц админки, созданных с помощью add_menu_page() и add_submenu_page()

function my_menu() {
   add_menu_page('Страница 1', 'bar', 'something', 'else', 'foo');
   add_submenu_page( 'theme_menu', 'Подстраница 1', 'Подстраница', 'something', 'else', 'foo'); 
}
add_action('admin_menu', 'my_menu'); 

Как загрузить мои две функции только на этих страницах?

Сейчас я использую:

add_action('admin_init', 'admin_custom_css' ); 
add_action('admin_init', 'admin_custom_js' );  

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

Можно ли сделать это через одну простую строку в functions.php или придется подключать их отдельно внутри моих страниц (я очень предпочитаю первый вариант, так как пришлось бы редактировать множество функций создания админ-страниц).

Спасибо!

1
Комментарии

Смотрите примеры из официальной документации https://developer.wordpress.org/plugins/javascript/enqueuing/#enqueue

http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts#Example:_Target_a_Specific_Admin_Page

paul paul
11 янв. 2015 г. 12:17:28
Все ответы на вопрос 9
7
90

Проблема с ответом @tollmanz заключается в том, что, используя хуки -print-styles и -print-scripts, вы вынуждены вручную генерировать HTML для загрузки скриптов. Это не оптимально, так как вы теряете удобные возможности управления зависимостями и версиями, которые предоставляют функции wp_enqueue_script() и wp_enqueue_style(). Кроме того, такой подход не позволяет размещать скрипты в подвале (футере) страницы, если это было бы более подходящим местом.

Итак, возвращаясь к исходному вопросу: как лучше всего обеспечить загрузку JS/CSS только на определенных страницах админки?

  1. Используйте хук "load-{$my_admin_page}", чтобы выполнять действия только при загрузке конкретной страницы админки вашего плагина, и затем

  2. Используйте хук "admin_enqueue_scripts" для правильного добавления вызовов wp_enqueue_script.

Может показаться, что это немного сложно, но на самом деле реализация очень проста. Вот полный пример:

    add_action( 'admin_menu', 'add_my_admin_menus' ); // Хук для добавления меню в левую панель админки

    /**
     * Создаем меню администрирования в левой панели навигации и загружаем JavaScript только на этой странице
     */
    function add_my_admin_menus(){
        $my_page = add_menu_page( 'Заголовок страницы', 'Заголовок меню', MY_ADMIN_CAPABILITY, 'menu-slug', 'show_page_content' );

        // Загружаем JS только для этой страницы
        add_action( 'load-' . $my_page, 'load_admin_js' );
    }

    // Эта функция вызывается только при загрузке страницы нашего плагина!
    function load_admin_js(){
        // К сожалению, мы не можем просто подключить скрипты здесь - это слишком рано. Поэтому регистрируем правильный хук
        add_action( 'admin_enqueue_scripts', 'enqueue_admin_js' );
    }

    function enqueue_admin_js(){
        // Разве не здорово использовать зависимости и уже зарегистрированные основные js-файлы?
        wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
    }
}
17 дек. 2012 г. 22:43:04
Комментарии

+1 - По моему мнению, это правильный подход. Индивидуальные хуки с пространством имен (someaction-$hook) хороши для 1-2 действий, но если вы разрабатываете плагин, вам может понадобиться выполнять множество различных действий только на страницах настроек, что делает этот метод очень удобным. Я обычно просто добавляю 1 действие к хуку load-$hook, которое запускает мою функцию option_page_actions, куда я могу добавить множество других хуков/фильтров и т.д. Поскольку эти действия вызываются только на выбранной странице, хуки после этого момента не нуждаются в использовании хуков с пространством имен (как вы показали), что гораздо эффективнее и интуитивно понятнее.

Evan Mattson Evan Mattson
2 июн. 2013 г. 19:34:36

Привет, этот способ все еще поддерживается? load_admin_js никогда не вызывается

IAmJulianAcosta IAmJulianAcosta
23 мар. 2014 г. 21:53:07

Конечно, он все еще поддерживается. Строка 206 в admin.php. Это работает с версии 2.6 и вряд ли исчезнет в ближайшее время (или вообще когда-либо).

Tom Auger Tom Auger
24 мар. 2014 г. 16:01:50

Сейчас, пересматривая свой ответ, я понимаю, что явное добавление jquery-ui-core и jquery-ui-tabs в очередь полностью избыточно, так как эти скрипты уже зарегистрированы. Достаточно просто указать их в зависимостях. Я обновлю свой ответ соответствующим образом.

Tom Auger Tom Auger
26 апр. 2015 г. 04:17:57

Отлично работает на WordPress 4.9.6

ethmz ethmz
18 июн. 2018 г. 04:45:46

Использовал в WPPB (в классе) + WP 5.4, и все еще работает.

alexwc_ alexwc_
25 апр. 2020 г. 08:44:57

Это милое решение, но вы также можете использовать параметр $hook_suffix действия admin_enqueue_scripts. Хотя мне это нравится больше, не знаю почему. Вы можете использовать анонимные колбэки, чтобы сделать код чище.

DrLightman DrLightman
4 окт. 2023 г. 18:52:06
Показать остальные 2 комментариев
4
48

Функции add_menu_page и add_submenu_page возвращают "суффикс хука" (hook suffix) страницы, который можно использовать для идентификации страницы с определёнными хуками. Таким образом, вы можете использовать этот суффикс в сочетании с переменными хуками admin_print_styles-{$hook_suffix} и admin_print_scripts-{$hook_suffix} для точного применения стилей и скриптов к этим страницам.

function my_menu() {
   $menu = add_menu_page( 'Page 1', 'bar', 'something', 'else', 'foo' );
   $submenu = add_submenu_page( 'theme_menu', 'Subpage 1', 'Subpage', 'something', 'else', 'foo' );

   add_action( 'admin_print_styles-' . $menu, 'admin_custom_css' );
   add_action( 'admin_print_styles-' . $submenu, 'admin_custom_css' );

   add_action( 'admin_print_scripts-' . $menu, 'admin_custom_js' );
   add_action( 'admin_print_scripts-' . $submenu, 'admin_custom_js' );
}

Я считаю этот метод чистым для добавления всего этого, так как всё обрабатывается в одной функции. Если вы решите удалить эту функциональность, просто удалите вызов одной функции.

5 февр. 2012 г. 00:51:28
Комментарии

Этот ответ технически неверен. Кодекс для admin_print_scripts() гласит: "admin_print_scripts не должен использоваться для подключения стилей или скриптов." Ответ от @TomAuger на самом деле правильный, хотя и не оптимальный. Было бы полезно, если бы команда WP добавила хук admin_enqueue_scripts-(hookname)...

David Gard David Gard
2 мая 2014 г. 18:15:33

Я потратил 3 дня, чтобы найти этот ответ, который действительно мне помог :) Спасибо :)

Asfandyar Khan Asfandyar Khan
24 нояб. 2016 г. 08:43:50

@DavidGard, вам стоит посмотреть на эти ссылки: https://developer.wordpress.org/reference/hooks/admin_print_styles-hook_suffix/ , https://developer.wordpress.org/reference/hooks/admin_print_scripts-hook_suffix/

hkchakladar hkchakladar
24 февр. 2018 г. 20:34:13

@hkchakladar Мой комментарий был сделан почти четыре года назад... Если он больше не актуален, пожалуйста, добавьте более свежий комментарий с объяснением почему.

David Gard David Gard
24 февр. 2018 г. 20:38:39
0
17

Если вы используете get_current_screen(), вы можете определить, на какой странице находитесь. В статье кодекса, на которую я дал ссылку, есть пример, показывающий, как использовать get_current_screen() вместе с add_options_page(). Этот метод будет работать для любой страницы админки.

4 февр. 2012 г. 22:15:23
0

Как упомянул @mor7ifer выше, вы можете использовать встроенную функцию WordPress get_current_screen(). Если вы переберёте вывод этой функции, например:

$current_screen = get_current_screen();
foreach($current_screen as $key => $value) {
    error_log(print_r($key,1));
}

... вы заметите ключ под названием base. Я использую его для определения текущей страницы и подключения/отключения скриптов и стилей следующим образом:

add_action('admin_enqueue_scripts', 'some_hook_function')* ):

public function some_hook_function(){

    // # регистрируем и подключаем скрипты и стили ТОЛЬКО на странице редактирования записи в админке
    $current_page = get_current_screen()->base;
    if($current_page == 'post' || $current_page == 'page') {

        wp_enqueue_script('datetimepicker', plugins_url('assets/jquery-ui-timepicker-addon.min.js', __FILE__), array('jquery', 'jquery-ui-datepicker', 'jquery-ui-slider'), '1.9.1', true);

        wp_enqueue_style( 'jquery-ui-datepicker', plugins_url('assets/jquery-ui.min.css', __FILE__), array(), '1.11.2', 'all');


    } else { // # если не на странице записи, отключаем стили и скрипты

        wp_dequeue_script('datetimepicker');
        wp_dequeue_style('jquery-ui-datepicker');

    }
}
14 нояб. 2016 г. 23:24:02
0

Я тоже задавался этим вопросом. Вот современная версия с использованием admin_enqueue_scripts:

add_action('admin_menu', function () {
  $settingsPage = add_options_page('Настройки', 'Ипотечный калькулятор', 'manage_options', 'mortgagecalculator', function () {
    echo "<div id='app'></div>";
  });
  /**
   * Подключаем скрипты Ember для админки только на нужных страницах.
   */
  add_action("admin_enqueue_scripts", function ($hook) use ($settingsPage){
    if($hook !== $settingsPage){
      return;
    }
    // Удаляем стандартный jQuery, так как Ember предоставляет свой.
    wp_dequeue_script('jquery');
    wp_enqueue_script('ember-vendor', plugins_url("admin/assets/vendor.js", __FILE__));
    wp_enqueue_script('ember-project', plugins_url("admin/assets/mortgage-plugin-ember-admin.js", __FILE__), ['ember-vendor']);
    wp_enqueue_script('ember-live-reload', "http://localhost:4200/ember-cli-live-reload.js");
  });
});
8 июл. 2015 г. 11:58:43
2

Для этого сначала необходимо найти название страницы админки. Добавьте admin_enqueue_scripts с wp_die($hook) и перейдите на страницу вашего конкретного плагина, чтобы увидеть название страницы.

function my_plugin_scripts($hook) {
    wp_die($hook);
}
add_action( 'admin_enqueue_scripts', 'my_plugin_scripts' );

settings_page_plugging_info

Теперь скопируйте название страницы и используйте его в условии для загрузки скриптов только на нужной странице.

function my_plugin_scripts($hook) {
    if ( 'settings_page_plugging_info' != $hook ) {
        return;
    }

    wp_enqueue_script( 'my_custom_script', plugins_url('js/file.js', __FILE__));
}
add_action( 'admin_enqueue_scripts', 'my_plugin_scripts' );
18 февр. 2019 г. 07:42:17
Комментарии

Это правильный подход. Все предыдущие ответы на этот пост излишне запутаны и/или совершенно неверны.

Miqi180 Miqi180
4 мар. 2022 г. 02:06:07

Это сработало для меня на WordPress 6.5.5. Это надежное решение. Более простой способ сейчас просто найти название страницы настроек плагина, на которой вы находитесь, это просто вывести $hook на ней.

klewis klewis
12 июл. 2024 г. 01:05:24
0

Вы можете взять @tollmanz ответ и немного расширить его, добавив возможность условного использования...

Пример:

/* Добавляем страницы админки */   
function my_admin_pages(){
    $menu = array();
    $menu['main_page'] = add_menu_page('Страница 1', 'бар', 'something', 'else', 'foo');
    $menu['sub_page'] = add_submenu_page('theme_menu', 'Подстраница 1', 'Подстраница', 'something', 'else', 'foo');
    foreach($menu as $key => $value){
        if($key == 'main_page'){
            /* Добавляем стили только на главную страницу. */
            add_action('admin_print_styles-'.$value, 'print_styles');
        }
        /* Добавляем скрипты на все страницы админки. */
        add_action('admin_print_scripts-'.$value, 'print_scripts');
    }
}
add_action('admin_menu', 'my_admin_pages');
21 сент. 2012 г. 00:17:32
1

Из документации:

admin_print_scripts в основном используется для вывода встроенного JavaScript. admin_print_scripts не следует использовать для подключения стилей или скриптов на страницах админки. Вместо этого используйте admin_enqueue_scripts.

То же самое относится и к admin_print_styles.

5 июл. 2013 г. 14:31:03
0
add_action( 'admin_menu', 'add_my_admin_menus' ); 

function add_my_admin_menus() {
    $GLOBALS['my_page'] = add_menu_page( 'Заголовок страницы', 'Заголовок меню', MY_ADMIN_CAPABILITY, 'menu-slug', 'show_page_content');
    add_action( 'admin_enqueue_scripts', 'enqueue_admin_js');
}

function enqueue_admin_js($hook) {
    if($GLOBALS['my_page'] === $hook) {
        wp_enqueue_script( 'jquery-ui-core' );
        wp_enqueue_script( 'jquery-ui-tabs' );
        // Разве не удобно использовать зависимости и уже зарегистрированные основные JS-файлы?
        wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
    }
}
11 янв. 2015 г. 09:48:40