Jak sprawdzić, czy znajdujesz się na określonej stronie w sekcji Administrator WP? Na przykład, jak mogę sprawdzić, czy jestem na stronie Użytkownicy> Twój profil?

32

Buduję wtyczkę i chcę dodać fragmenty javascript w głowie administratora, ale tylko dla niektórych stron administratora. Nie chodzi mi o strony jak na stronie WordPress, którą sam tworzysz, ale o istniejące strony sekcji administracyjnych, takie jak „Twój profil”, „Użytkownicy” itd. Czy istnieje funkcja wp specjalnie dla tego zadania? Szukałem i mogę znaleźć tylko funkcję boolowską is_admini haki akcji, ale nie funkcję boolowską, która tylko sprawdza.

racl101
źródło
1
Delikatne klepnięcie przypominające o odpowiedzi nie zostało zaakceptowane. Jeśli żadna z podanych odpowiedzi nie udzieli wystarczającej odpowiedzi na Twoje pytanie lub próbujesz zrozumieć podane informacje, napisz komentarz, aby nas o tym powiadomić.
t31os

Odpowiedzi:

24

Można to zrobić za pomocą haka „admin_enqueue_scripts” w celu umieszczenia w kolejce potrzebnych plików. Ten hak otrzyma $ hook_suffix, który odnosi się do bieżącej załadowanej strony:

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');
prettyboymp
źródło
55

W wp-admin znajduje się zmienna globalna o nazwie $ pagenow, która zawiera nazwę bieżącej strony, tj. Edit.php, post.php itp.

Możesz także sprawdzić żądanie $ _GET, aby dodatkowo zawęzić lokalizację, na przykład:

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

    }
Złote Jabłka
źródło
1
global $pagenow; if ( ( 'admin.php' === $pagenow ) && ( 'prefix-theme-settings' === $_GET['page'] ) ) { logic.. }na przykład sprawdza, czy jesteś na stronie ustawień niestandardowych motywów admin.php?page=prefix-theme-settings.
lowtechsun
19

Najbardziej wszechstronna metoda została get_current_screendodana w WordPress 3.1

$screen = get_current_screen();

zwraca

WP_Screen Object (
    [action] => 
    [base] => post
    [id] => post
    [is_network] => 
    [is_user] => 
    [parent_base] => edit
    [parent_file] => edit.php
    [post_type] => post
    [taxonomy] => 
)
Louis-Rémi
źródło
3
„Ograniczenia w użytkowaniu - Ta funkcja jest zdefiniowana na większości stron administracyjnych, ale nie na wszystkich. W związku z tym zdarzają się przypadki, w których funkcja is_admin () zwróci wartość true, ale próba wywołania metody get_current_screen () spowoduje błąd krytyczny, ponieważ nie jest zdefiniowana. Jeden znanym przykładem jest wp-admin / customize.php. Funkcja zwraca null, jeśli zostanie wywołana z hooka admin_init. Powinno być OK, aby użyć późniejszego hooka, takiego jak current_screen. "- Codex .
Ten Brazylijczyk
@ThatBrazilianGuy Szybka kontrola sugeruje, że już tak nie jest, o ile widzę, że można get_current_screen()bezpiecznie korzystać ze wszystkich stron administracyjnych.
shahar
1
@shahar nadal tak jest, zgodnie z powyższą dokumentacją i moim doświadczeniem.
fabrik
9

Aby zaoferować alternatywną metodę / podejście do powyższego pytania.

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

Ta metoda jest ukierunkowana na konkretne strony bardziej bezpośrednio i pozwala uniknąć logiki warunkowej w twoim wywołaniu zwrotnym (ponieważ już to rozróżniłeś w wybranym haku).

t31os
źródło
Chciałbym wiedzieć, dlaczego ta odpowiedź nie uzyskała więcej głosów, obejmuje dokładny przypadek użycia w pytaniu i zapewnia rozwiązanie w minimalnej ilości kodu. Opinia byłaby miła ..
t31os 28.01.14
3

Wydaje mi się dziwne, że nikt nie wspomniał o tym, że funkcja add_menu_page zwraca hak akcji, którego można użyć do wykonania niektórych akcji tylko na tych stronach

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

Jeśli potrzebujesz haka $ i sam nie dodałeś strony menu, dokument jest tutaj

Na przykład zaczep do strony menu najwyższego poziomu to

load-toplevel_page_ $ MenuSlug

Zaczep strony podmenu to

load- $ MenuSlug_page_ $ SubMenuSlug

Zgodnie z tą logiką haczyk na stronie profilu użytkownika to

load-users_page_profile

Tofandel
źródło