Làm thế nào bạn có thể kiểm tra nếu bạn đang ở trong một trang cụ thể trong phần Quản trị WP? Ví dụ: làm cách nào để kiểm tra xem tôi có ở trang Người dùng> Hồ sơ của bạn không?


32

Tôi đang xây dựng một plugin và tôi muốn thêm các bit javascript vào đầu quản trị nhưng chỉ cho một số trang quản trị nhất định. Tôi không có nghĩa là các trang như trong một trang WordPress mà bạn tự tạo nhưng các trang phần quản trị hiện có như 'Hồ sơ của bạn', 'Người dùng', v.v. Có chức năng wp nào dành riêng cho tác vụ này không? Tôi đã tìm kiếm và tôi chỉ có thể tìm thấy hàm boolean is_adminvà các móc hành động chứ không phải là hàm boolean chỉ kiểm tra.


1
Nudge nhẹ nhàng để nhắc nhở bạn một câu trả lời đã không được chấp nhận. Nếu không có câu trả lời nào được cung cấp đủ để trả lời câu hỏi của bạn hoặc bạn đang đấu tranh để hiểu thông tin được cung cấp, vui lòng bình luận để cho chúng tôi biết.
t31os

Câu trả lời:


24

Cách để thực hiện việc này là sử dụng hook 'admin_enqueue_scripts' để sắp xếp hàng các tệp bạn cần. Móc này sẽ được thông qua $ hook_suffix liên quan đến trang hiện tại được tải:

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

Có một biến toàn cục trong wp-admin được gọi là $ pagenow chứa tên của trang hiện tại, ví dụ: edit.php, post.php, v.v.

Bạn cũng có thể kiểm tra yêu cầu $ _GET để thu hẹp vị trí của bạn hơn nữa, ví dụ:

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.. }ví dụ kiểm tra xem bạn có ở trang cài đặt chủ đề tùy chỉnh không admin.php?page=prefix-theme-settings.
lowTechsun

19

Phương pháp toàn diện nhất được get_current_screenthêm vào trong WordPress 3.1

$screen = get_current_screen();

trả lại

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

3
"Hạn chế sử dụng - Hàm này được xác định trên hầu hết các trang quản trị, nhưng không phải tất cả. Vì vậy, có những trường hợp is_admin () sẽ trả về đúng, nhưng cố gắng gọi get_cien_screen () sẽ dẫn đến lỗi nghiêm trọng vì không được xác định. ví dụ đã biết là wp-admin / custom.php. Hàm trả về null nếu được gọi từ hook admin_init. Sẽ ổn khi sử dụng trong hook sau này như current_screen. "- Codex .
chàng người Brazil đó

@ThatBrazilianGuy Kiểm tra nhanh cho thấy đây không còn là vấn đề nữa, theo như tôi có thể thấy get_current_screen()là an toàn để sử dụng trên tất cả các trang quản trị.
shahar

1
@shahar đây vẫn là trường hợp, theo tài liệu được liên kết ở trên và kinh nghiệm của tôi.
fabrik

9

Để đưa ra một phương pháp / cách tiếp cận khác cho câu hỏi trên.

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

Phương pháp này nhắm mục tiêu các trang cụ thể trực tiếp hơn và tránh cần logic có điều kiện bên trong cuộc gọi lại của bạn (vì bạn đã thực hiện phân biệt đó trong hook đã chọn).


Ước gì tôi biết tại sao câu trả lời này không nhận được nhiều phiếu hơn, bao gồm trường hợp sử dụng chính xác trong câu hỏi và cung cấp giải pháp với số lượng mã tối thiểu. Phản hồi sẽ rất tốt ..
t31os

3

Tôi thấy thật kỳ lạ khi không ai đề cập đến thực tế là hàm add_menu_page trả về một hook hành động mà bạn có thể sử dụng để thực hiện một số hành động nhất định chỉ trên các trang đó

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

Nếu bạn cần $ hook và bạn đã không tự thêm trang menu, tài liệu ở đây

Ví dụ, hook cho trang menu cấp cao nhất là

load-toplevel_page_ $ MenuSlug

Móc cho trang phụ là

tải- $ MenuSlug_page_ $ SubMothySlug

Theo logic đó, hook cho trang hồ sơ của người dùng là

tải-users_page_profile

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.