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

53

У меня есть две простые функции, материал нагрузки с помощью 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('Page 1', 'bar', 'something', 'else', 'foo');
   add_submenu_page( 'theme_menu', 'Subpage 1', 'Subpage', '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или поставить их в отдельности на своих страницах (я настоятельно предпочитаю первый вариант, так как мне придется редактировать множество функций создания страниц администратора).

Спасибо!

Wordpressor
источник
См официальных примеров документации developer.wordpress.org/plugins/javascript/enqueuing/#enqueue codex.wordpress.org/Plugin_API/Action_Reference/...
PAUL

Ответы:

33

add_menu_pageи add_submenu_pageоба возвращают «суффикс крючка» страницы, который можно использовать для идентификации страницы с определенными хуками. Таким образом, вы можете использовать этот суффикс в сочетании с перехватчиками переменных 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' );
}

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

tollmanz
источник
5
Этот ответ не является технически правильным. Кодекс дляadmin_print_scripts() государств « admin_print_scripts не следует использовать для блокировок стилей или скриптов .» Ответ @TomAuger на самом деле правильный, хотя и не оптимальный. Было бы полезно, если бы команда WP добавила admin_enqueue_scripts-(hookname)хук, хотя ...
Дэвид Гард
Мне понадобилось 3 дня, чтобы найти этот ответ, который был очень полезен для меня :) Спасибо :)
Асфандьяр Хан
@DavidGard, вам, вероятно, стоит взглянуть на эти developer.wordpress.org/reference/hooks/… , developer.wordpress.org/reference/hooks/…
hkchakladar
1
@hkchakladar Моему комментарию почти четыре года ... Если он больше не актуален, непременно добавьте более актуальный комментарий, объясняющий почему.
Дэвид Гард
61

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

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

  1. Отключите действие «load - {$ my_admin_page}», чтобы делать что-то, только когда загружена страница администратора вашего конкретного плагина, а затем

  2. Подключите действие «admin_enqueue_scripts», чтобы правильно добавить ваши wp_enqueue_scriptзвонки.

Похоже, немного боли, но на самом деле это очень легко реализовать. От верхней:

    add_action( 'admin_menu', 'add_my_admin_menus' ); // hook so we can add menus to our admin left-hand menu

    /**
     * Create the administration menus in the left-hand nav and load the JavaScript conditionally only on that page
     */
    function add_my_admin_menus(){
        $my_page = add_menu_page( 'Page Title', 'Menu Title', MY_ADMIN_CAPABILITY, 'menu-slug', 'show_page_content' );

        // Load the JS conditionally
        add_action( 'load-' . $my_page, 'load_admin_js' );
    }

    // This function is only called when our plugin's page loads!
    function load_admin_js(){
        // Unfortunately we can't just enqueue our scripts here - it's too early. So register against the proper action hook to do it
        add_action( 'admin_enqueue_scripts', 'enqueue_admin_js' );
    }

    function enqueue_admin_js(){
        // Isn't it nice to use dependencies and the already registered core js files?
        wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
    }
}
Том Оже
источник
4
+1 - это путь ИМО. Отдельные хуки пространства имен (someaction- $ hook) хороши для 1 или 2 действий, но если вы создаете плагин, вам может потребоваться сделать много разных вещей только на страницах опций, что делает этот метод действительно удобный. Обычно я просто добавляю 1 действие к load-$hookхуку, который запускает мою option_page_actionsфункцию, к которой я могу добавить множество других хуков / фильтров и т. Д. Поскольку эти действия вызываются только на выбранной странице, хукам за пределами этой точки не нужно использовать хуки с пространством имен (как вы показали), что гораздо более эффективно и интуитивно понятно.
Эван Мэтсон
Привет, этот способ все еще поддерживается? load_admin_js никогда не звонит
IAmJulianAcosta
Конечно, это все еще поддерживается. Строка 206 из admin.php. Был там с 2.6, и вряд ли уйдет в ближайшее время (когда-либо).
Том Ожер
Глядя на мой ответ сейчас, я считаю, что явная постановка в очередь jquery-ui-core и jquery-ui-tabs совершенно бесполезна, поскольку эти сценарии уже зарегистрированы. Вам просто нужно вызвать их в зависимости. Я обновлю свой ответ соответственно.
Том Ожер
Прекрасно работает с WordPress 4.9.6
ethmz
13

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

mor7ifer
источник
3

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

Пример:

/* Add admin pages */   
function my_admin_pages(){
    $menu = array();
    $menu['main_page'] = add_menu_page('Page 1', 'bar', 'something', 'else', 'foo');
    $menu['sub_page'] = add_submenu_page('theme_menu', 'Subpage 1', 'Subpage', 'something', 'else', 'foo');
    foreach($menu as $key => $value){
        if($key == 'main_page'){
            /* Print styles on only the main page. */
            add_action('admin_print_styles-'.$value, 'print_styles');
        }
        /* Print scripts on all of our admin pages. */
        add_action('admin_print_scripts-'.$value, 'print_scripts');
    }
}
add_action('admin_menu', 'my_admin_pages');
Майкл Эклунд
источник
3

Как упоминалось выше @ 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(){

    // # only register and queue scripts & styles on POST edit screen of admin
    $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 { // # if not on post page, deregister and dequeue styles & scripts

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

    }
}
рекурсию
источник
2

Я думал о том же самом. Есть современная версия, которая использует admin_enqueue_scripts:

add_action('admin_menu', function () {
  $settingsPage = add_options_page('Settings', 'Mortgage Calculator', 'manage_options', 'mortgagecalculator', function () {
    echo "<div id='app'></div>";
  });
  /**
   * Include the ember admin scripts only on pages where it's needed.
   */
  add_action("admin_enqueue_scripts", function ($hook) use ($settingsPage){
    if($hook !== $settingsPage){
      return;
    }
    // Remove default jQuery since Ember provides its own.
    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");
  });
});
Кит Сунде
источник
0

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

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

То же самое с admin_print_styles.

Толеа Бивол
источник
0
add_action( 'admin_menu', 'add_my_admin_menus' ); 

function add_my_admin_menus() {
    $GLOBALS['my_page'] = add_menu_page( 'Page Title', 'Menu Title', 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' );
        // Isn't it nice to use dependencies and the already registered core js files?
        wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
    }
}
Jashwant
источник
0

Чтобы сделать это, вы должны сначала найти имя страницы администратора. Добавить 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' );
IqbalBary
источник