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

评论

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

#1 楼

这样做的方法是使用'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');


#2 楼

在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

    }


评论


全球$ pagenow; if(('admin.php'=== $ pagenow)&&('prefix-theme-settings'=== $ _GET ['page'])){逻辑。}例如,检查您是否使用自定义主题设置页面admin.php?page = prefix-theme-settings。

–lowtechsun
18年2月14日在21:01

#3 楼

最全面的方法是在WordPress 3.1中添加的get_current_screen

$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] => 
)


评论


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

–那个巴西佬
18年1月26日在16:17



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

–史蒂文
19年1月27日在8:31

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

– fabrik
19 Mar 14 '19在8:37

#4 楼

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

// 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年1月28日14:56

#5 楼

我觉得很奇怪,没有人提到过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,而您自己没有添加菜单页面,文档在这里

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


-toplevel_page_ $ MenuSlug


子菜单页面的挂钩是


load- $ MenuSlug_page_ $ SubMenuSlug


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


load-users_page_profile