Wie können Sie überprüfen, ob Sie sich auf einer bestimmten Seite im WP Admin-Bereich befinden? Wie kann ich beispielsweise überprüfen, ob ich auf der Seite Benutzer> Ihr Profil bin?


32

Ich erstelle ein Plugin und möchte ein bisschen Javascript in den Admin-Kopf einfügen, aber nur für bestimmte Admin-Seiten. Ich meine nicht Seiten wie in einer WordPress-Seite, die Sie selbst erstellen, sondern bestehende Seiten im Admin-Bereich wie "Ihr Profil", "Benutzer" usw. Gibt es eine WP-Funktion speziell für diese Aufgabe? Ich habe gesucht und ich kann nur die Boolesche Funktion is_adminund Aktions-Hooks finden, aber keine Boolesche Funktion, die nur prüft.


1
Ein sanfter Schubs, der Sie an eine Antwort erinnert, wurde nicht akzeptiert. Wenn keine der angegebenen Antworten Ihre Frage ausreichend beantwortet oder Sie Schwierigkeiten haben, die bereitgestellten Informationen zu verstehen, kommentieren Sie bitte, um uns dies mitzuteilen.
t31os

Antworten:


24

Verwenden Sie dazu den Hook "admin_enqueue_scripts", um die benötigten Dateien in die Warteschlange zu stellen. Diesem Hook wird ein $ hook_suffix übergeben, das sich auf die aktuell geladene Seite bezieht:

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

In wp-admin gibt es eine globale Variable namens $ pagenow, die den Namen der aktuellen Seite enthält, dh edit.php, post.php usw.

Sie können auch die $ _GET-Anforderung überprüfen, um Ihren Standort weiter einzugrenzen. Beispiel:

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.. }Überprüft beispielsweise, ob Sie sich auf einer Seite mit benutzerdefinierten Designeinstellungen befinden admin.php?page=prefix-theme-settings.
Lowtechsun

19

Die umfassendste Methode wurde get_current_screenin WordPress 3.1 hinzugefügt

$screen = get_current_screen();

kehrt zurück

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

3
"Nutzungsbeschränkungen - Diese Funktion ist auf den meisten Administrationsseiten definiert, jedoch nicht auf allen. Daher gibt es Fälle, in denen is_admin () true zurückgibt, der Versuch, get_current_screen () aufzurufen, jedoch zu einem schwerwiegenden Fehler führt, da sie nicht definiert ist bekanntes Beispiel ist wp-admin / customize.php. Die Funktion gibt null zurück, wenn sie vom admin_init-Hook aufgerufen wird. Es sollte in Ordnung sein, sie in einem späteren Hook wie current_screen zu verwenden. "- Codex .
Der Brasilianer

@ThatBrazilianGuy Eine kurze Überprüfung legt nahe, dass dies nicht mehr der Fall ist, soweit ich sehen kann, dass get_current_screen()es sicher auf allen Admin-Seiten verwendet werden kann.
Shahar

1
@shahar das ist laut der oben verlinkten dokumentation und meiner erfahrung immer noch der fall.
Fabrik

9

Um eine alternative Methode / Herangehensweise an die obige Frage anzubieten.

// 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 .. );
}

Diese Methode zielt direkter auf bestimmte Seiten ab und vermeidet, dass in Ihrem Rückruf bedingte Logik erforderlich ist (da Sie diese Unterscheidung bereits im ausgewählten Hook vorgenommen haben).


Ich wünschte, ich wüsste, warum diese Antwort nicht mehr Stimmen erhielt, deckt den genauen Anwendungsfall in der Frage ab und bietet die Lösung in einer minimalen Menge an Code. Feedback wäre nett ..
t31os

3

Ich finde es seltsam, dass niemand erwähnt hat, dass die Funktion add_menu_page einen Aktions-Hook zurückgibt, mit dem Sie bestimmte Aktionen nur auf diesen Seiten ausführen können

$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(/*...*/);
}

Wenn Sie den $ -Hook benötigen und die Menüseite nicht selbst hinzugefügt haben, ist das Dokument hier

Zum Beispiel ist der Haken für eine Menüseite der obersten Ebene

load-toplevel_page_ $ MenuSlug

Der Haken für eine Untermenüseite ist

load- $ MenuSlug_page_ $ SubMenuSlug

Nach dieser Logik lautet der Haken für die Profilseite des Benutzers

load-users_page_profile

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.