Come puoi verificare se ti trovi in ​​una determinata pagina nella sezione WP Admin? Ad esempio, come posso verificare se mi trovo nella pagina Utenti> Il tuo profilo?


32

Sto creando un plug-in e voglio aggiungere frammenti di javascript nella testa dell'amministratore, ma solo per determinate pagine dell'amministratore. Non intendo le pagine come in una pagina di WordPress che crei tu stesso, ma piuttosto pagine della sezione di amministrazione esistenti come "Il tuo profilo", "Utenti", ecc. Esiste una funzione wp specifica per questa attività? Ho cercato e trovo solo la funzione booleana is_admine gli hook di azione, ma non una funzione booleana che controlla.


1
Una leggera spinta a ricordare una risposta non è stata accettata. Se nessuna delle risposte fornite risponde sufficientemente alla tua domanda o hai difficoltà a comprendere le informazioni fornite, ti preghiamo di commentare per farcelo sapere.
t31os,

Risposte:


24

Il modo per farlo è utilizzare l'hook 'admin_enqueue_scripts' per mettere in coda i file necessari. A questo hook verrà passato $ hook_suffix relativo alla pagina corrente che viene caricata:

function my_admin_enqueue($hook_suffix) {
    if($hook_suffix == 'appearance_page_theme-options') {
        wp_enqueue_script('my-theme-settings', get_template_directory_uri() . '/js/theme-settings.js', array('jquery'));
        wp_enqueue_style('my-theme-settings', get_template_directory_uri() . '/styles/theme-settings.css');
        ?>
        <script type="text/javascript">
        //<![CDATA[
        var template_directory = '<?php echo get_template_directory_uri() ?>';
        //]]>
        </script>
        <?php
    }
}
add_action('admin_enqueue_scripts', 'my_admin_enqueue');

55

Esiste una variabile globale in wp-admin chiamata $ pagenow che contiene il nome della pagina corrente, cioè edit.php, post.php, ecc.

Puoi anche controllare la richiesta $ _GET per restringere ulteriormente la tua posizione, ad esempio:

global $pagenow;
if (( $pagenow == 'post.php' ) && ($_GET['post_type'] == 'page')) {

    // editing a page

    }

if ($pagenow == 'users.php') {

    // user listing page

    }

if ($pagenow == 'profile.php') {

    // editing user profile page

    }

1
global $pagenow; if ( ( 'admin.php' === $pagenow ) && ( 'prefix-theme-settings' === $_GET['page'] ) ) { logic.. }ad esempio controlla se ti trovi in ​​una pagina delle impostazioni del tema personalizzato admin.php?page=prefix-theme-settings.
lowtechsun,

19

Il metodo più completo è stato get_current_screenaggiunto in WordPress 3.1

$screen = get_current_screen();

ritorna

WP_Screen Object (
    [action] => 
    [base] => post
    [id] => post
    [is_network] => 
    [is_user] => 
    [parent_base] => edit
    [parent_file] => edit.php
    [post_type] => post
    [taxonomy] => 
)

3
"Restrizioni d'uso - Questa funzione è definita nella maggior parte delle pagine di amministrazione, ma non in tutte. Pertanto ci sono casi in cui is_admin () restituirà true, ma il tentativo di chiamare get_current_screen () comporterà un errore irreversibile perché non definito. Uno esempio noto è wp-admin /ustom.php. La funzione restituisce null se chiamata dall'hook admin_init. Dovrebbe essere OK da usare in un hook successivo come current_screen. "- Codex .
Quel ragazzo brasiliano il

@ThatBrazilianGuy Un rapido controllo suggerisce che non è più così, per quanto posso vedere get_current_screen()è sicuro da usare su tutte le pagine di amministrazione.
Shahar

1
@shahar questo è ancora il caso, secondo la documentazione collegata sopra e la mia esperienza.
fabrik

9

Offrire un metodo / approccio alternativo alla domanda di cui sopra.

// When you are viewing the users list or your editing another user's profile
add_action( 'admin_print_scripts-users.php', 'your_enqueue_callback' );

// When you are editing your own profile
add_action( 'admin_print_scripts-profile.php', 'your_enqueue_callback' );

function your_enqueue_callback() {
    wp_enqueue_script( .. YOUR ENQUEUE ARGS .. );
}

Questo metodo prende di mira le pagine specifiche in modo più diretto ed evita la necessità di una logica condizionale all'interno del callback (perché hai già fatto questa distinzione nell'hook selezionato).


Vorrei sapere perché questa risposta non ha ottenuto più voti, copre l'esatto caso d'uso nella domanda e fornisce la soluzione con una quantità minima di codice. Il feedback sarebbe bello ..
t31os,

3

Trovo strano che nessuno abbia menzionato il fatto che la funzione add_menu_page restituisce un hook di azione che è possibile utilizzare per eseguire determinate azioni solo su quelle pagine

$hook = add_menu_page($menu_title, $page_title, $capability, $slug, $function, $icon_url, $position);
add_action( 'load-' . $hook, 'my_admin_enqueue_scripts' );
function my_admin_enqueue_scripts() {
    wp_enqueue_script(/*...*/);
    wp_enqueue_style(/*...*/);
}

Se hai bisogno di $ hook e non hai aggiunto tu stesso la pagina del menu, il documento è qui

Ad esempio, l'hook per una pagina di menu di livello superiore è

carico-toplevel_page_ $ MenuSlug

L'hook per una pagina di sottomenu è

del carico $ MenuSlug_page_ $ SubMenuSlug

Seguendo questa logica, l'hook per la pagina del profilo dell'utente è

carico-users_page_profile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.