仅在插件页面上加载插件脚本和样式

时间:2013-03-29 作者:Ronny Rook

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\' );
但此代码不适用于我的。。有人有其他选择吗?或者你知道为什么这对我不起作用吗?

3 个回复
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_slugoptions-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();
这是一个简单的情况,但出于某种原因,我有一段时间感到困惑。

我希望这对任何人都有帮助!

结束

相关推荐

如何为图库添加不同的CSS

我对我所有的画廊都使用jetpack carousel,即使是我的特色图片,我的问题是,我如何设置我的[画廊]结果的样式,以便对特色图片使用不同的CSS,这样我就可以稍微操纵它,但不会弄乱常规的默认画廊结果?