Come Caricare stili/script su Specifiche Pagine /wp-admin?
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!

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?
Agganciarsi all'azione "load-{$my_admin_page}" per eseguire operazioni solo quando viene caricata la specifica pagina di amministrazione del tuo plugin, e poi
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' ) );
}
}

+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.

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

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

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.

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

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.

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ò...

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

@DavidGard, probabilmente dovresti dare un'occhiata a questi https://developer.wordpress.org/reference/hooks/admin_print_styles-hook_suffix/ , https://developer.wordpress.org/reference/hooks/admin_print_scripts-hook_suffix/

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.

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

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

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

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

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

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 inveceadmin_enqueue_scripts
."
Lo stesso vale per admin_print_styles
.

Guarda questi https://developer.wordpress.org/reference/hooks/admin_print_scripts-hook_suffix/ , https://developer.wordpress.org/reference/hooks/admin_print_styles-hook_suffix/

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