Como enfileirar estilos / scripts em determinadas páginas / wp-admin?

53

Eu tenho duas funções simples que carregam coisas usando wp_enqueue_style()e wp_enqueue_script(), algo como estes:

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

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

... e algumas páginas de administração, criadas com add_menu_page()eadd_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'); 

Como carrego minhas duas funções apenas nessas páginas?

Agora eu estou usando:

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

Mas ele carrega meus arquivos em todas as páginas de administração, o que não é nada agradável.

Posso fazer isso através de uma linha simples functions.phpou preciso enfileirá-los em minhas páginas separadamente (prefiro a primeira opção fortemente, pois precisaria editar várias funções de criação de página de administração).

Obrigado!

Wordpressor
fonte

Respostas:

33

add_menu_pagee add_submenu_pageambos retornam o "sufixo do gancho" da página, que pode ser usado para identificar a página com determinados ganchos. Como tal, você pode usar esse sufixo em combinação com os ganchos variáveis admin_print_styles-{$hook_suffix}e admin_print_scripts-{$hook_suffix}direcionar especificamente essas páginas.

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' );
}

Acho que esse é um método limpo para adicionar tudo isso, pois tudo é tratado na única função. Se você decidir remover essa funcionalidade, basta remover a chamada para a única função.

tollmanz
fonte
5
Esta resposta não está tecnicamente correta. o Codex paraadmin_print_scripts() estados " admin_print_scripts não deve ser usado para enfileirar estilos ou scripts ". A resposta de @TomAuger é na verdade a correta, embora não seja a ideal. Seria benéfico se a equipe do WP adicionasse um admin_enqueue_scripts-(hookname)gancho ...
David Gard
Levei 3 dias para encontrar esta resposta que foi realmente útil para mim :) Obrigado :) #
Asfandyar Khan
@DavidGard, você provavelmente deveria olhar para developer.wordpress.org/reference/hooks/… , developer.wordpress.org/reference/hooks/…
hkchakladar
11
@hkchakladar Meu comentário tem quase quatro anos ... Se não for mais relevante, adicione um comentário mais atualizado, explicando o porquê.
David Gard
61

O problema com a resposta @tollmanz é que, como você está utilizando os ganchos -print-styles e -print-scripts, deve gerar o HTML para carregar seus scripts manualmente. Isso não é o ideal, pois você não obtém a boa dependência e o versionamento que acompanham o wp_enqueue_script()e wp_enqueue_style(). Também não permite colocar as coisas no rodapé, se for um lugar melhor para elas.

Então, voltando à pergunta do OP: qual é a melhor maneira de garantir que eu possa enfileirar o JS / CSS apenas em páginas de administração específicas?

  1. Desligue a ação "load - {$ my_admin_page}" para fazer apenas as coisas quando a página de administração de seu plug-in específico estiver carregada e, em seguida,

  2. Desligue a ação "admin_enqueue_scripts" para adicionar corretamente suas wp_enqueue_scriptchamadas.

Parece um pouco trabalhoso, mas na verdade é muito fácil de implementar. Do topo:

    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' ) );
    }
}
Tom Auger
fonte
4
+1 - Este é o caminho a seguir na IMO. Os ganchos individuais com espaço para nome (someaction- $ hook) são bons para 1 ou 2 ações, mas se você estiver criando um plug-in, talvez seja necessário fazer várias coisas diferentes apenas nas páginas de opções que tornam esse método realmente conveniente. Normalmente, apenas adiciono uma ação ao load-$hookgancho que dispara minha option_page_actionsfunção à qual posso adicionar muitos outros ganchos / filtros etc. Como essas ações são chamadas apenas na página de escolha, os ganchos além desse ponto não precisam usar os ganchos com espaço para nome (como você mostrou), que é muito mais eficiente e intuitivo.
Evan Mattson
Olá, este caminho ainda é suportado? load_admin_js nunca está chamando #
IAmJulianAcosta 23/03
Claro que ainda é suportado. Linha 206 do admin.php. Está lá desde 2.6, e é improvável que vá embora tão cedo (nunca).
Tom Auger
Olhando para a minha resposta agora, acredito que enfileirar explicitamente o jquery-ui-core e o jquery-ui-tabs é totalmente maravilhoso, já que esses scripts já estão registrados. Você só precisa chamá-los na dependência. Vou atualizar minha resposta de acordo.
Tom Auger #
Funciona perfeitamente com WordPress 4.9.6
ethmz
13

Se você usar get_current_screen(), poderá detectar em que página está. Há um exemplo no artigo codex que eu ligado, que mostra como usar get_current_screen()com add_options_page(), este método irá funcionar para qualquer página de administração.

mor7ifer
fonte
3

Você pode receber a resposta e expandi-la um pouco, permitindo também o uso condicional ...@tollmanz

Exemplo:

/* 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');
Michael Ecklund
fonte
3

Como @ mor7ifer mencionado acima, você pode usar a função nativa do WordPress get_current_screen () . Se você percorrer a saída desta função, por exemplo:

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

... você notará uma chave chamada base . Eu uso isso para detectar em que página estou e enfileirar, desenfileirar assim:

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');

    }
}
recurso
fonte
2

Eu estava pensando a mesma coisa. Existe uma versão moderna que usa 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");
  });
});
Kit Sunde
fonte
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
fonte
0

Para fazer isso, você precisa primeiro encontrar o nome da página de administrador. Adicione admin_enqueue_scriptscom wp_die($hook)e vá para a sua página específica de plug-in. Você verá o nome da página.

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

settings_page_plugging_info

Agora copie o nome da página e use-o em condição para carregar os scripts na página específica.

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
fonte