Come Caricare stili/script su Specifiche Pagine /wp-admin?

4 feb 2012, 21:56:16
Visualizzazioni: 76.1K
Voti: 72

Ho due semplici funzioni che caricano risorse usando wp_enqueue_style() e wp_enqueue_script(), qualcosa del genere:

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

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

... e alcune pagine di amministrazione, create con add_menu_page() e add_submenu_page()

function my_menu() {
   add_menu_page('Pagina 1', 'barra', 'qualcosa', 'altro', 'foo');
   add_submenu_page( 'theme_menu', 'Sottopagina 1', 'Sottopagina', 'qualcosa', 'altro', 'foo'); 
}
add_action('admin_menu', 'my_menu'); 

Come posso caricare le mie due funzioni solo su queste pagine?

Al momento sto usando:

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

Ma questo carica i miei file su ogni pagina di amministrazione, il che non è affatto ideale.

Posso farlo tramite una semplice riga in functions.php o devo accodarli separatamente all'interno delle mie pagine (preferisco fortemente la prima opzione, dato che dovrei modificare molte funzioni che creano pagine di amministrazione).

Grazie!

1
Tutte le risposte alla domanda 9
7
90

Il problema con la risposta di @tollmanz è che, poiché ci si aggancia agli hook -print-styles e -print-scripts, bisogna generare manualmente l'HTML per caricare gli script. Questo non è ottimale, perché non si ottiene la comoda gestione delle dipendenze e delle versioni offerta da wp_enqueue_script() e wp_enqueue_style(). Inoltre non permette di posizionare gli elementi nel footer se quello fosse il luogo più adatto.

Quindi, tornando alla domanda originale: qual è il modo migliore per assicurarsi di poter caricare JS/CSS solo su specifiche pagine di amministrazione?

  1. Agganciarsi all'azione "load-{$my_admin_page}" per eseguire operazioni solo quando viene caricata la specifica pagina di amministrazione del tuo plugin, e poi

  2. Agganciarsi all'azione "admin_enqueue_scripts" per aggiungere correttamente le chiamate a wp_enqueue_script.

Sembra un po' macchinoso, ma in realtà è molto semplice da implementare. Dallo schema generale:

    add_action( 'admin_menu', 'add_my_admin_menus' ); // hook per aggiungere menu alla navigazione sinistra dell'amministrazione

    /**
     * Crea i menu di amministrazione nella navigazione sinistra e carica il JavaScript condizionalmente solo su quella pagina
     */
    function add_my_admin_menus(){
        $my_page = add_menu_page( 'Titolo Pagina', 'Titolo Menu', MY_ADMIN_CAPABILITY, 'menu-slug', 'show_page_content' );

        // Carica il JS condizionalmente
        add_action( 'load-' . $my_page, 'load_admin_js' );
    }

    // Questa funzione viene chiamata solo quando la pagina del nostro plugin viene caricata!
    function load_admin_js(){
        // Sfortunatamente non possiamo semplicemente accodare gli script qui - è troppo presto. Quindi registriamo l'hook corretto per farlo
        add_action( 'admin_enqueue_scripts', 'enqueue_admin_js' );
    }

    function enqueue_admin_js(){
        // Non è bello poter usare le dipendenze e i file js già registrati del core?
        wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
    }
}
17 dic 2012 22:43:04
Commenti

+1 - Questo è il modo migliore secondo me. Gli hook individuali con namespace (someaction-$hook) sono utili per 1 o 2 azioni, ma se stai sviluppando un plugin, potresti aver bisogno di fare molte cose diverse solo nella tua pagina di opzioni, il che rende questo metodo molto conveniente. Di solito aggiungo solo 1 azione all'hook load-$hook che attiva la mia funzione option_page_actions alla quale posso aggiungere molti altri hook/filter ecc. Poiché queste azioni vengono chiamate solo nella pagina scelta, gli hook oltre quel punto non hanno bisogno di usare quelli con namespace (come hai mostrato), il che è molto più efficiente e intuitivo.

Evan Mattson Evan Mattson
2 giu 2013 19:34:36

Ciao, questo metodo è ancora supportato? load_admin_js non viene mai chiamato

IAmJulianAcosta IAmJulianAcosta
23 mar 2014 21:53:07

Certo che è ancora supportato. Linea 206 di admin.php. È presente dalla versione 2.6, ed è improbabile che venga rimosso a breve (o mai).

Tom Auger Tom Auger
24 mar 2014 16:01:50

Guardando ora la mia risposta, credo che includere esplicitamente jquery-ui-core e jquery-ui-tabs sia completamente superfluo, poiché questi script sono già registrati. Basta semplicemente richiamarli nelle dipendenze. Aggiornerò di conseguenza la mia risposta.

Tom Auger Tom Auger
26 apr 2015 04:17:57

Funziona perfettamente con WordPress 4.9.6

ethmz ethmz
18 giu 2018 04:45:46

L'ho usato all'interno di WPPB (in una classe) + WP 5.4 e funziona ancora.

alexwc_ alexwc_
25 apr 2020 08:44:57

È una soluzione carina, ma puoi anche usare il parametro $hook_suffix dell'azione admin_enqueue_scripts. Però questa mi piace di più, non so perché. Puoi usare callback anonime per renderla più pulita.

DrLightman DrLightman
4 ott 2023 18:52:06
Mostra i restanti 2 commenti
4
48

add_menu_page e add_submenu_page restituiscono entrambi il "hook suffix" della pagina, che può essere utilizzato per identificare la pagina con determinati hook. Pertanto, puoi utilizzare questo suffisso in combinazione con gli hook variabili admin_print_styles-{$hook_suffix} e admin_print_scripts-{$hook_suffix} per indirizzare specificamente queste pagine.

function my_menu() {
   $menu = add_menu_page( 'Pagina 1', 'bar', 'something', 'else', 'foo' );
   $submenu = add_submenu_page( 'theme_menu', 'Sottopagina 1', 'Sottopagina', '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' );
}

Trovo che questo sia un metodo pulito per aggiungere tutto ciò perché è tutto gestito all'interno di un'unica funzione. Se decidi di rimuovere questa funzionalità, è sufficiente rimuovere la chiamata all'unica funzione.

5 feb 2012 00:51:28
Commenti

Questa risposta non è tecnicamente corretta. Il Codex per admin_print_scripts() afferma "admin_print_scripts non dovrebbe essere usato per accodare stili o script." La risposta di @TomAuger è in realtà quella corretta, anche se non ottimale. Sarebbe utile se il team WP aggiungesse un hook admin_enqueue_scripts-(hookname) però...

David Gard David Gard
2 mag 2014 18:15:33

Mi ci sono voluti 3 giorni per trovare questa risposta che è stata davvero utile per me :) Grazie :)

Asfandyar Khan Asfandyar Khan
24 nov 2016 08:43:50

@hkchakladar Il mio commento risale a quasi quattro anni fa... Se non è più rilevante, aggiungi pure un commento più aggiornato spiegando il perché.

David Gard David Gard
24 feb 2018 20:38:39
0
17

Se utilizzi get_current_screen(), puoi rilevare su quale pagina ti trovi. Nell'articolo del codex che ho linkato c'è un esempio che mostra come usare get_current_screen() con add_options_page(), questo metodo funzionerà per qualsiasi pagina di amministrazione.

4 feb 2012 22:15:23
0

Come menzionato da @mor7ifer sopra, puoi utilizzare la funzione nativa di WordPress get_current_screen(). Se cicli attraverso l'output di questa funzione, ad esempio:

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

... noterai una chiave chiamata base. Io la uso per rilevare su quale pagina mi trovo e per caricare o rimuovere script e stili in questo modo:

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

public function some_hook_function(){

    // # registra e carica script & stili solo nella schermata di modifica POST/PAGE dell'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 { // # se non nella pagina di modifica, deregistra e rimuovi stili & script

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

    }
}
14 nov 2016 23:24:02
0

Mi stavo chiedendo la stessa cosa. C'è una versione moderna che utilizza admin_enqueue_scripts:

add_action('admin_menu', function () {
  $settingsPage = add_options_page('Impostazioni', 'Calcolatore Mutuo', 'manage_options', 'mortgagecalculator', function () {
    echo "<div id='app'></div>";
  });
  /**
   * Includi gli script admin di Ember solo nelle pagine dove è necessario.
   */
  add_action("admin_enqueue_scripts", function ($hook) use ($settingsPage){
    if($hook !== $settingsPage){
      return;
    }
    // Rimuovi jQuery predefinito poiché Ember fornisce il suo.
    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 lug 2015 11:58:43
2

Per farlo, devi prima trovare il nome della pagina di amministrazione. Aggiungi admin_enqueue_scripts con wp_die($hook) e vai alla pagina specifica del tuo plugin, vedrai il nome della pagina.

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

settings_page_plugging_info

Ora copia il nome della pagina e usalo nella condizione per caricare gli script solo su quella pagina specifica.

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 feb 2019 07:42:17
Commenti

Questo è l'approccio corretto. Tutte le risposte precedenti a questo post sono eccessivamente complicate e/o semplicemente sbagliate.

Miqi180 Miqi180
4 mar 2022 02:06:07

Questa soluzione ha funzionato per me su WordPress 6.5.5. È una soluzione solida. Un modo più semplice ora per trovare il nome della pagina delle opzioni del plugin su cui ti trovi è semplicemente fare echo di $hook su di essa.

klewis klewis
12 lug 2024 01:05:24
0

Potresti prendere la @tollmanz risposta e ampliarla leggermente, permettendo anche un utilizzo condizionale...

Esempio:

/* Aggiungi pagine admin */   
function my_admin_pages(){
    $menu = array();
    $menu['main_page'] = add_menu_page('Pagina 1', 'bar', 'something', 'else', 'foo');
    $menu['sub_page'] = add_submenu_page('theme_menu', 'Sottopagina 1', 'Sottopagina', 'something', 'else', 'foo');
    foreach($menu as $key => $value){
        if($key == 'main_page'){
            /* Stampa stili solo sulla pagina principale. */
            add_action('admin_print_styles-'.$value, 'print_styles');
        }
        /* Stampa script su tutte le nostre pagine admin. */
        add_action('admin_print_scripts-'.$value, 'print_scripts');
    }
}
add_action('admin_menu', 'my_admin_pages');
21 set 2012 00:17:32
1

Dalla documentazione:

admin_print_scripts viene principalmente utilizzato per visualizzare javascript inline. admin_print_scripts non dovrebbe essere usato per accodare stili o script nelle pagine di amministrazione. Usa invece admin_enqueue_scripts."

Lo stesso vale per admin_print_styles.

5 lug 2013 14:31:03
0
add_action( 'admin_menu', 'add_my_admin_menus' ); 

function add_my_admin_menus() {
    $GLOBALS['my_page'] = add_menu_page( 'Titolo Pagina', 'Titolo Menu', 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' );
        // Non è bello poter usare le dipendenze e i file js già registrati nel core?
        wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
    }
}
11 gen 2015 09:48:40