wordpress用户您好,
我在运行2个自制的Wordpress插件时遇到了一个问题。我将使用以下代码:
define(\'PLUGIN_URL\', plugin_dir_url( __FILE__ ));
add_action( \'admin_enqueue_scripts\', \'plugin_load_js_and_css\' );
function plugin_load_js_and_css() {
wp_register_style( \'plugin.css\', PLUGIN_URL . \'plugin.css\', array());
wp_enqueue_style( \'plugin.css\');
wp_register_script( \'plugin.js\', PLUGIN_URL . \'plugin.js\', array(\'jquery\'));
wp_enqueue_script( \'plugin.js\' );
}
}
但是它在管理面板的任何地方都加载了这个样式表。现在我在抄本中找到了这个:
function my_enqueue($hook) {
if( \'edit.php\' != $hook )
return;
wp_enqueue_script( \'my_custom_script\', plugins_url(\'/myscript.js\', __FILE__) );
}
add_action( \'admin_enqueue_scripts\', \'my_enqueue\' );
但此代码不适用于我的。。有人有其他选择吗?或者你知道为什么这对我不起作用吗?
SO网友:fuxia
当您注册插件选项页面时,您会从注册函数中获得一个挂钩:
$hook = add_menu_page(
\'T5 Demo\', // page title
\'T5 Demo\', // menu title
\'manage_options\', // capability
\'t5-demo\', // menu slug
\'my_render_page\' // callback function
);
使用此挂钩将脚本和样式排队:
add_action( "admin_print_styles-$hook", "my_enqueue_style" );
add_action( "admin_print_scripts-$hook", "my_enqueue_script" );
查看我的插件
T5 Admin Menu Demo 例如。
不定义常量PLUGIN_URL
. 您将与其他代码发生冲突。
SO网友:Chris Sprague
经过进一步研究,@fuxia找到了最好的答案,即使在使用Redux框架作为管理菜单时也是如此。使用Redux时,$hook
将是toplevel_page_
与输入的值串联page_slug
在options-init.php
文件
例如:
$opt_name = my_option
\'page_slug\' => $opt_name.\'_settings\'
add_action( "admin_print_styles-**toplevel_page_my_option_settings**", "my_enqueue_style" );
add_action( "admin_print_scripts-**toplevel_page_my_option_settings**", "my_enqueue_script" );
此外,如果您不记得将my\\u选项设置为什么,只需打开Redux管理面板并查看URL,它应该是:
yoursite/wp-admin/admin.php?page=**my_option_settings**&tab=1
SO网友:maverick
下面是一个您可能需要注意的场景!
您的插件有多个页面,现在您只想加载这些页面的脚本和样式!
你怎么能这么做?
解决方案:
add_action( \'admin_enqueue_scripts\', \'prefix_admin_scripts\' );
function prefix_admin_scripts( $hook ){
// use
// wp_die( $hook ); // get your page slugs
if(
( \'current-plugin-page-slug-1\' == $hook )
||
( \'current-plugin-page-slug-2\' == $hook )
){
// styles
wp_register_style();
wp_enqueue_style();
// scripts
wp_register_script();
wp_enqueue_script();
}
}
您希望将排队函数包装在true条件中的原因是,对于多个页面,if条件将始终为true,脚本将永远不会排队。请参见以下示例:
// inside admin script callback
if(
( \'current-plugin-page-slug-1\' !== $hook )
||
( \'current-plugin-page-slug-2\' !== $hook )
){
return;
// this will not work because at least one of the condition will be true in
// your plugins page and scripts will not be enqueued.
// if you are thinking of using && (AND) operator that will not work either.
// only way to successfully enqueue your scripts on both of the pages is to
// wrap the enqueue function inside true condition block!
}
wp_register_style();
wp_enqueue_style();
wp_register_script();
wp_enqueue_script();
这是一个简单的情况,但出于某种原因,我有一段时间感到困惑。
我希望这对任何人都有帮助!