在自定义顶级菜单页上将脚本入队

时间:2013-03-09 作者:Griffin

我使用以下功能创建了一个菜单页:

add_menu_page(
\'Nonpareil options\',
\'Nonpareil options\',    
\'administrator\',    
\'nonpareil_theme_options\',  
\'nonpareil_theme_display\'   
);
现在我只想在这个页面上加载一个js文件。我正试图通过仅在我的新页面上排队来正确地做到这一点:

function nonpareil_options_js_enqueue($hook_suffix) {
    if( \'nonpareil_theme_options\' != $hook_suffix )
    return;
    wp_enqueue_script( \'nonpareil-options\', get_template_directory_uri().\'/js/nonpareil-options.js\', array(\'jquery\') );
}       
add_action( \'admin_enqueue_scripts\', \'nonpareil_options_js_enqueue\' );
脚本未排队。我认为问题可能是$hook\\u后缀!=“nonpareil\\u theme\\u options”在我的新页面上,但在这种情况下,我不知道该放什么。这里怎么了?

非常感谢。

2 个回复
最合适的回答,由SO网友:birgire 整理而成

您可以尝试更换

if( \'nonpareil_theme_options\' != $hook )
使用

if( \'toplevel_page_nonpareil_theme_options\' != $hook )
如果您像这样添加了自定义菜单:

add_action(\'admin_menu\', \'register_custom_menu_page\');
function register_custom_menu_page() {
    add_menu_page(\'Nonpareil options\',\'Nonpareil options\',    \'administrator\',    \'nonpareil_theme_options\',  \'nonpareil_theme_display\'   );
}
Edit:

看起来你在用这个admin_enqueue_scripts 法典中的示例:

http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts#Example:_Target_a_Specific_Admin_Page

因此,在您的案例中,Codex示例如下:

function nonpareil_options_js_enqueue($hook) {
    if( \'toplevel_page_nonpareil_theme_options\' != $hook )
    return;
    wp_enqueue_script( \'nonpareil-options\', get_template_directory_uri().\'/js/nonpareil-options.js\', array(\'jquery\') );
}       
add_action( \'admin_enqueue_scripts\', \'nonpareil_options_js_enqueue\' );
在文件中/wp-admin/admin-header.php 您有以下内容

do_action(\'admin_enqueue_scripts\', $hook_suffix);
do_action("admin_print_scripts-$hook_suffix");
do_action(\'admin_print_scripts\');
所以你可以看到区别,admin_print_scripts 不接受输入,但admin_enqueue_scripts 确实如此(这是您在代码示例中使用的过滤器)。

如果你想知道在哪里toplevel_page_ 来自,您可以查看的源代码get_plugin_page_hookname() 因为它正在为$hook_suffix 在你的情况下。

Conclusion:

添加toplevel_page_ 在你的菜单前。

SO网友:s_ha_dum

您不能通过在回调函数中命名某个特定变量来将其导入操作。导入的变量(如果可用)是do_action 运行该挂钩名称的函数。回调函数中对该变量的调用与此无关。

admin_print_scripts 根本不传递变量。你可以用这个一次性功能向自己证明这一点(which will break stuff):

function apx($a) {
 var_dump($a); die;
}
add_action(\'admin_print_scripts\',\'apx\');
再一次,that will break the site. 您必须删除该函数(或至少删除die 管理页面将再次工作之前。我在开发服务器上工作,所以这对我来说不是问题。

admin_enqueue-scripts 确实传递了一个变量,您尝试执行的操作应该可以,但需要函数中的附加逻辑,而执行以下操作则不行。逻辑由钩子本身处理。

访问要将脚本排入队列的页面在浏览器中查看该页面的源代码顶部附近有一些嵌入的Javascriptpagenow = \'some_string_resembling_the_page_slug\'admin_print_scripts-some_string_resembling_the_page_slug在您的情况下,类似于:

function nonpareil_options_js_enqueue($hook) {
    wp_enqueue_script( \'nonpareil-options\', get_template_directory_uri().\'/js/nonpareil-options.js\', array(\'jquery\') );
}       
add_action( \'admin_print_scripts-some_string_resembling_the_page_slug\', \'nonpareil_options_js_enqueue\' );

结束

相关推荐