从_POSTS筛选器添加时,匿名函数在wp_head中执行两次?

时间:2011-11-14 作者:hamahama

我知道这听起来很复杂,所以请耐心听我说。

我正在尝试根据当前帖子/页面中的短代码(如果有)添加某些自定义css样式。

function load_shortcode_styles($posts){

      //function to check short codes here

      //regex to get id from shortcode(e.g [item id=""] )

      //get custom post meta from the id that has my custom css

      add_action(\'wp_head\', create_function(\'\', \'echo "\\n<!-- my style -->\\n<style>\' . $custom_css . \'</style>\\n";\') );

}

add_filter(\'the_posts\', \'load_shortcode_styles\' );
打开帖子页面后,源代码显示我的风格被打印了两次,如下所示:

<!-- my style -->
<style>
</style>
<!-- my style -->
<style>
</style>
出于测试目的,我使用了一个硬编码函数来回显某个字符串,它工作得很好。

e、 g.:

function test_print(){
    echo "\\n<!-- my style -->\\n<style>foo bar</style>\\n";
}
并用这个替换上面的行动钩

add_action(\'wp_head\', \'test_print\' );
不知何故,这将打印出来,这是正确的!

<!-- my style -->
<style>
foo bar
</style>
有人知道这个问题吗?我如何解决这个问题?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

我只能假设页面上有多个查询或这篇文章的实例,但它暴露了逻辑中的一个缺陷,即您没有检查是否已经添加了样式。通常会使用wp\\u enqueue\\u脚本来解决这个问题,但无论出于何种原因,您可能无法做到这一点。

因此,您需要先进行检查。我想提出以下建议:

全局$we\\u found\\u短代码$we\\u found\\u shortcode=false;

function load_shortcode_styles($posts){

      //function to check short codes here

      // if found

      $we_found_shortcode = true;
}

function header_check(){
    global $we_found_shortcode;
    if($we_found_shortcode == true){
        //regex to get id from shortcode(e.g [item id=""] )

        //get custom post meta from the id that has my custom css

        echo "\\n<!-- my style -->\\n<style>\' . $custom_css . \'</style>\\n";
    }

}

add_filter(\'the_posts\', \'load_shortcode_styles\' );
add_filter(\'wp_head\', \'header_check\' );

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $