如何检查您是否在WP Admin部分的特定页面中?例如,如何检查我是否在“用户”>“您的个人资料”页面中?


32

我正在构建一个插件,我想在管理头中添加一些javascript,但仅适用于某些管理页面。我并不是指您自己创建的WordPress页面中的页面,而是现有的管理部分页面(如“您的个人资料”,“用户”等)。是否有专门用于此任务的wp函数?我一直在寻找,我只能找到布尔函数is_admin和动作钩子,但不能找到仅检查的布尔函数。


1
温柔地提醒您答案尚未被接受。如果没有提供的答案,则不能充分回答您的问题,或者您在努力理解提供的信息时,请发表评论以告知我们。
t31os 2011年

Answers:


24

完成此操作的方法是使用“ admin_enqueue_scripts”钩子对所需文件进行排队。该挂钩将传递一个$ hook_suffix,它与所加载的当前页面有关:

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

在wp-admin中有一个名为$ pagenow的全局变量,该变量保存当前页面的名称,即edit.php,post.php等。

您还可以检查$ _GET请求以进一步缩小位置范围,例如:

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.. }例如,检查您是否在自定义主题设置页面上admin.php?page=prefix-theme-settings
lowtechsun

19

get_current_screenWordPress 3.1中添加了最全面的方法

$screen = get_current_screen();

退货

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

3
“使用限制-此功能是在大多数管理页面上定义的,但不是全部。在某些情况下,is_admin()将返回true,但是尝试调用get_current_screen()会导致致命错误,因为未定义它。一个已知的示例是wp-admin / customize.php。如果从admin_init挂钩中调用该函数,则返回null。应该在以后的挂钩中使用它,例如current_screen。“- Codex
那位巴西佬

@ThatBrazilianGuy快速检查表明情况已不再如此,据我所知,可以get_current_screen()在所有管理页面上安全使用。
shahar

1
@shahar仍然是这种情况,根据上面链接的文档和我的经验。
fabrik

9

为上述问题提供替代方法/方法。

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

该方法更直接地针对特定页面,并且避免了在回调内部需要条件逻辑(因为您已经在选定的挂钩中做出了区分)。


希望我知道为什么这个答案得不到更多票,涵盖了问题中的确切用例,并以最少的代码提供了解决方案。反馈会很好..
t31os 2014年

3

我觉得很奇怪,没有人提到过add_menu_page函数返回一个动作挂钩的事实,您可以使用该挂钩仅在那些页面上执行某些动作

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

如果您需要$ hook并且没有自己添加菜单页面,则文档在此处

例如,顶层菜单页面的钩子是

load-toplevel_page_ $ MenuSlug

子菜单页面的挂钩是

load- $ MenuSlug_page_ $ SubMenuSlug

按照该逻辑,用户个人资料页面的挂钩为

load-users_page_profile

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.