Cum Încarc Style-uri/Script-uri doar pe Anumite Pagini /wp-admin?

4 feb. 2012, 21:56:16
Vizualizări: 76.1K
Voturi: 72

Am două funcții simple care încarcă resurse folosind wp_enqueue_style() și wp_enqueue_script(), ceva de genul:

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

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

... și câteva pagini de admin, create cu add_menu_page() și add_submenu_page()

function my_menu() {
   add_menu_page('Pagina 1', 'bar', 'something', 'else', 'foo');
   add_submenu_page( 'theme_menu', 'Subpagina 1', 'Subpagina', 'something', 'else', 'foo'); 
}
add_action('admin_menu', 'my_menu'); 

Cum pot încărca cele două funcții doar pe aceste pagini?

Momentan folosesc:

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

Dar această metodă încarcă fișierele mele pe fiecare pagină de admin, ceea ce nu este deloc optim.

Pot face acest lucru printr-o singură linie în functions.php sau trebuie să le încarc separat în fiecare pagină (prefer prima opțiune, deoarece ar trebui să editez multe funcții care creează pagini de admin).

Mulțumesc!

1
Toate răspunsurile la întrebare 9
7
90

Problema cu răspunsul lui @tollmanz este că, deoarece te conectezi la hook-urile -print-styles și -print-scripts, trebuie să generezi manual HTML-ul pentru încărcarea scripturilor tale. Acest lucru nu este optim, deoarece nu beneficiezi de dependențele și versiunile frumos gestionate oferite de wp_enqueue_script() și wp_enqueue_style(). De asemenea, nu îți permite să plasezi elementele în footer, dacă acesta ar fi un loc mai potrivit pentru ele.

Deci, revenind la întrebarea OP: care este cea mai bună metodă pentru a mă asigura că pot încărca JS / CSS doar pe anumite pagini din administrare?

  1. Folosește hook-ul "load-{$my_admin_page}" pentru a executa acțiuni doar atunci când este încărcată pagina specifică de administrare a plugin-ului tău, și apoi

  2. Folosește hook-ul "admin_enqueue_scripts" pentru a adăuga corect apelurile tale wp_enqueue_script.

Pare un pic complicat, dar de fapt este foarte ușor de implementat. Iată cum:

    add_action( 'admin_menu', 'add_my_admin_menus' ); // hook pentru a adăuga meniuri în navigația din stânga a administrării

    /**
     * Crează meniurile de administrare în navigația din stânga și încarcă JavaScript-ul condiționat doar pe acea pagină
     */
    function add_my_admin_menus(){
        $my_page = add_menu_page( 'Titlul Paginii', 'Titlul Meniului', MY_ADMIN_CAPABILITY, 'menu-slug', 'show_page_content' );

        // Încarcă JS-ul condiționat
        add_action( 'load-' . $my_page, 'load_admin_js' );
    }

    // Această funcție este apelată doar când se încarcă pagina plugin-ului nostru!
    function load_admin_js(){
        // Din păcate, nu putem încărca scripturile aici - este prea devreme. Așa că ne înregistrăm la hook-ul potrivit pentru a face acest lucru
        add_action( 'admin_enqueue_scripts', 'enqueue_admin_js' );
    }

    function enqueue_admin_js(){
        // Nu este frumos să folosești dependențe și fișierele js de bază deja înregistrate?
        wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
    }
}
17 dec. 2012 22:43:04
Comentarii

+1 - Aceasta este calea de urmat, după părerea mea. Hook-urile individuale cu namespace (someaction-$hook) sunt bune pentru 1 sau 2 acțiuni, dar dacă dezvolți un plugin, poate fi nevoie să faci multe lucruri diferite doar pe pagina/paginile de setări, ceea ce face această metodă foarte convenabilă. De obicei adaug doar 1 acțiune la hook-ul load-$hook care declanșează funcția mea option_page_actions la care pot adăuga multe alte hook-uri/filtre etc. Deoarece acele acțiuni sunt apelate doar pe pagina aleasă, hook-urile de acolo încolo nu mai trebuie să folosească hook-uri cu namespace (așa cum ai arătat), ceea ce este mult mai eficient și intuitiv.

Evan Mattson Evan Mattson
2 iun. 2013 19:34:36

Bună, această metodă este încă suportată? load_admin_js nu se apelează niciodată

IAmJulianAcosta IAmJulianAcosta
23 mar. 2014 21:53:07

Cu siguranță este încă suportată. Linia 206 din admin.php. Există din versiunea 2.6 și este puțin probabil să dispară în viitorul apropiat (sau vreodată).

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

Privind acum răspunsul meu, cred că încărcarea explicită a jquery-ui-core și jquery-ui-tabs este complet inutilă, deoarece aceste scripturi sunt deja înregistrate. Este suficient să le apelați în dependențe. Voi actualiza răspunsul meu în consecință.

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

Funcționează perfect cu WordPress 4.9.6

ethmz ethmz
18 iun. 2018 04:45:46

Am folosit în WPPB (într-o clasă) + WP 5.4 și încă funcționează.

alexwc_ alexwc_
25 apr. 2020 08:44:57

Este o soluție drăguță, dar poți folosi și parametrul $hook_suffix al acțiunii admin_enqueue_scripts. Îmi place mai mult această variantă, nu știu exact de ce. Poți folosi funcții anonime pentru a o face mai curată.

DrLightman DrLightman
4 oct. 2023 18:52:06
Arată celelalte 2 comentarii
4
48

add_menu_page și add_submenu_page returnează ambele "sufixul de hook" al paginii, care poate fi folosit pentru a identifica pagina cu anumite hook-uri. Astfel, poți folosi acel sufix în combinație cu hook-urile variabile admin_print_styles-{$hook_suffix} și admin_print_scripts-{$hook_suffix} pentru a ținti specific aceste pagini.

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

Consider că aceasta este o metodă curată pentru a adăuga toate acestea deoarece totul este gestionat într-o singură funcție. Dacă decideți să eliminați această funcționalitate, pur și simplu eliminați apelul către acea singură funcție.

5 feb. 2012 00:51:28
Comentarii

Acest răspuns nu este corect din punct de vedere tehnic. Codex-ul pentru admin_print_scripts() precizează că "admin_print_scripts nu ar trebui folosit pentru a încărca stiluri sau scripturi." Răspunsul dat de @TomAuger este de fapt cel corect, deși nu este optim. Ar fi benefic dacă echipa WP ar adăuga un hook admin_enqueue_scripts-(hookname) totuși...

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

Mi-a luat 3 zile să găsesc acest răspuns care a fost foarte util pentru mine :) Mulțumesc :)

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

@hkchakladar Comentariul meu are aproape patru ani... Dacă nu mai este relevant, cu siguranță poți adăuga un comentariu mai actual care să explice de ce.

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

Dacă folosești get_current_screen(), poți detecta pe ce pagină te afli. Există un exemplu în articolul codex pe care l-am linkuit care arată cum să folosești get_current_screen() împreună cu add_options_page(), această metodă va funcționa pentru orice pagină de administrare.

4 feb. 2012 22:15:23
0

După cum a menționat @mor7ifer mai sus, puteți utiliza funcția nativă WordPress get_current_screen(). Dacă parcurgeți rezultatul acestei funcții, de exemplu:

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

... veți observa o cheie numită base. Eu folosesc aceasta pentru a detecta pe ce pagină mă aflu și pentru a încărca sau elimina scripturi și stiluri astfel:

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

public function some_hook_function(){

    // # înregistrează și încarcă scripturile & stilurile doar pe ecranul de editare POST în 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 { // # dacă nu sunt pe pagina de postare, elimină înregistrarea și încărcarea stilurilor & scripturilor

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

    }
}
14 nov. 2016 23:24:02
0

Mă întrebam același lucru. Există o versiune modernă care folosește admin_enqueue_scripts:

add_action('admin_menu', function () {
  $settingsPage = add_options_page('Setări', 'Calculator de Ipotecă', 'manage_options', 'mortgagecalculator', function () {
    echo "<div id='app'></div>";
  });
  /**
   * Include scripturile Ember pentru admin doar pe paginile unde sunt necesare.
   */
  add_action("admin_enqueue_scripts", function ($hook) use ($settingsPage){
    if($hook !== $settingsPage){
      return;
    }
    // Elimină jQuery implicit deoarece Ember oferă propria versiune.
    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 iul. 2015 11:58:43
2

Pentru a realiza acest lucru, trebuie mai întâi să găsești numele paginii de administrare. Adaugă admin_enqueue_scripts cu wp_die($hook) și navighează la pagina specifică a pluginului tău. Vei vedea numele paginii.

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

settings_page_plugging_info

Acum copiază numele paginii și folosește-l într-o condiție pentru a încărca scripturile doar pe pagina specifică.

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
Comentarii

Acesta este abordarea corectă. Toate răspunsurile anterioare la această postare sunt excesiv de complicate și/sau pur și simplu greșite.

Miqi180 Miqi180
4 mar. 2022 02:06:07

Aceasta a funcționat pentru mine pe WordPress 6.5.5. Este o soluție solidă. O metodă mai ușoară acum pentru a găsi numele paginii de opțiuni a pluginului pe care te afli este să afișezi pur și simplu $hook pe ea.

klewis klewis
12 iul. 2024 01:05:24
0

Ai putea lua @tollmanz răspunsul și să-l extinzi ușor, permițând și utilizarea condiționată...

Exemplu:

/* Adaugă pagini în 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', 'Subpagina 1', 'Subpagina', 'something', 'else', 'foo');
    foreach($menu as $key => $value){
        if($key == 'main_page'){
            /* Afișează stilurile doar pe pagina principală. */
            add_action('admin_print_styles-'.$value, 'print_styles');
        }
        /* Afișează scripturile pe toate paginile noastre din admin. */
        add_action('admin_print_scripts-'.$value, 'print_scripts');
    }
}
add_action('admin_menu', 'my_admin_pages');
21 sept. 2012 00:17:32
1

Din documentație:

admin_print_scripts este folosit în principal pentru a afișa JavaScript inline. admin_print_scripts nu ar trebui să fie utilizat pentru a încărca stiluri sau scripturi pe paginile de administrare. Folosește în schimb admin_enqueue_scripts."

La fel și cu admin_print_styles.

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

function add_my_admin_menus() {
    $GLOBALS['my_page'] = add_menu_page( 'Titlul Paginii', 'Titlul Meniului', 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' );
        // Nu este minunat să folosim dependințe și fișierele js de bază deja înregistrate?
        wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
    }
}
11 ian. 2015 09:48:40