对于有条件的使用,这是wp_enQueue_script的错误实现吗?

时间:2011-04-06 作者:Wok

有条件地在xhtml文档头中包含js或css脚本。。。这通常是一件棘手的事情,尤其是如果您想根据短代码或自定义元字段或小部件将某些内容排队。

如果您知道确实需要脚本,只需执行Wordpress Codex 建议使用带有以下挂钩的wp\\u enqueue\\u脚本,

* init
* template_redirect
* admin_print_scripts
但有时您需要在脚本或样式表中包含更多细微差别。例如,基于短代码的脚本包含。短代码的问题是,除非对内容应用strpos(),否则无法真正判断是否使用了短代码。这是因为,我相信“init”+“template\\u redirect”+“admin\\u print\\u scripts”在设置WP\\u查询对象之前就启动了。因此,有条件地包含用于短代码和其他触发器的脚本可能会很棘手。

为了避免这种情况,可以将strpos()与“the\\u posts”挂钩一起使用,该挂钩在wp\\u head之前被激发。但缺点之一是它需要额外传递数据。

讨论地点:http://beerpla.net/2010/01/13/wordpress-plugin-development-how-to-include-css-and-javascript-conditionally-and-only-when-needed-by-the-posts/

此外,我还没有看到这个钩子能够在文档头部插入js或css的排队脚本示例

Scribu建议,使用标志变量,并将其发送到页脚,http://scribu.net/wordpress/optimal-script-loading.html ...但对于应该包含在文档头部的css样式表来说,这是不可行的

我一直在考虑最好的折衷方案,想知道你的想法。基本上,我选择的钩子是wp\\u head,因为我可以访问wp\\u查询对象,以防我需要搜索短代码,或使用条件标记,甚至小部件使用检测。如果我知道我需要注入css或js,那么在确定页面是否需要我的js或css后,我可以调用wp\\u print\\u scripts()函数。

下面是WP 3.1中包含脚本的框架。。。我已经成功地将其用于js包含。还没有尝试过CSS,但我怀疑它也会起到同样的作用。

add_action("wp_head","add_conditional_scripts", 20);
function add_conditional_scripts() {
   global $posts, $wp_scripts;

    foreach ($posts as $post) { 
        if ( condition_gets_met == true ) : 
            wp_enqueue_script( "scripthandle" , get_home_url().\'/js/scriptfilename.js, array(\'jcycle\'), \'1.0\', true);   // This will add to the $wp_scripts variable
        endif;
    }

   wp_print_scripts(); // This uses the $wp_script object, will print, out the newly enqueue script
}
请注意,*condition\\u gets\\u met是strpos检查或条件标记或自定义\\u meta\\u字段检查的替代项。

这样做的任何反馈或批评都会很好。

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

为了避免这种情况,您可以使用strpos() 具有the_posts 钩子,在wp\\U头之前被点燃。但缺点之一是它需要额外传递数据。

实际上,您在挂接的回调中也在执行相同的操作wp_head, 我看不出有什么区别。。(如果您不这么认为,请澄清)。。

你是否the_postswp_head 您仍在迭代same 阵列数据,即。$posts..

我个人不认为在the_posts 钩子,如果担心钩子可能被多次调用,只需在回调开始时检查标志,如果已经设置了,则返回(确保在该数组上只进行一次迭代)。

实际上,我在一个等待发布的插件中使用了这种方法,我还意识到Scribu发布的方法在使用CSS时并不能真正起作用,这是不可能的。Scribu提到可能用JS将CSS注入头部,但我个人觉得这有点不太对劲(我个人的观点)。

我有一个函数the_posts 是这样的。。

public function on_the_posts( $posts ) {

    if( empty( $posts ) || $this->has_tabs )
        return $posts;

    // trimmed code not relevant to the example

    foreach( $posts as $post ) {
        if( !stripos( $post->post_content, \'[end_tabset]\' ) )
            continue;
        $this->has_tabs = true;
    }

    return $posts;
}
wp_head, 我仍然需要迭代$posts 我不是吗?

对于有条件的使用,这是wp\\u enqueue\\u脚本的错误实现吗?

不,我个人不这么认为。

SO网友:Rarst

对于这些东西wp_enqueue_scripts 内部提前触发的操作(优先级1)wp_head . 对于您可能需要工作的任何条件来说,这已经足够晚了,但早于脚本/样式队列输出。

SO网友:rmorse

为了补充其他答案,如果用户使用do_shortcode 函数,则不会加载脚本/css

结束

相关推荐