添加到_content的挂钩似乎被多次调用

时间:2016-05-05 作者:Ed King

我在插件中运行了以下代码:

 add_filter(\'the_content\',\'thousand_pay\');

//Callback function
function thousand_pay($content)
{
    echo $content;

    if( !in_category( \'Stories\') )

    {
        return;
    }
    ?>
<hr></hr>
[Some HTML]
<?php

    return
}
出于某种原因,在各个帖子的页面上,HTML会被打印多次:

Bug where HTML is printed multiple times

谁能想到为什么会这样?我读过here 我可能需要添加到条件检查中的是\\u singular()和\\u main\\u query(),因此if(!in_category(\'Stories\') || !is_singular() || !is_main_query(), 但这似乎完全阻止了HTML在贴子页面上的打印。有什么想法吗?

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

内容被多次访问是正常的。例如,SEO插件需要这样做才能访问它并从中生成元数据。

它也是一个过滤器挂钩。过滤器不应向页面回显任何内容,它们旨在修改传递的值并返回它。

如果你真的想在那一点上做点什么,但只在循环内,那么in_the_loop() 是您需要的条件。

SO网友:Eric

我也有同样的问题。我的the_content 筛选器被多次调用,这会降低页面加载速度the_content 筛选器正在调用外部API。因此,在我的例子中,API被多次查询相同的数据。

我试过使用in_the_loop(), is_singular()is_main_query() 但有时,根据主题的不同,它们无法将对我的过滤器的调用限制为一次。

所以我在过滤器中添加了一个常量,这似乎解决了这个问题。

下面是一个如何将呼叫限制到the_content 筛选到一次:

add_filter( \'the_content\', \'se225721_the_content\' );

function se225721_the_content( $content ) {

    if ( ! in_the_loop() ) {
        return $content;
    }

    if ( ! is_singular() ) {
        return $content;
    }

    if ( ! is_main_query() ) {
        return $content;
    }

    $content = ucwords( $content );

    remove_filter( \'the_content\', \'se225721_the_content\' );

    return $content;
}
希望有帮助!

埃里克

SO网友:Md Abdulla Al Mamun Nayon

我找到了通过使用did_action() 函数和自定义操作挂钩。

以下是解决方案:

$custom_hook = \'my_plugin_prefix_a_custom_action_hook\';
function my_plugin_prefi_my_filter_callback($content){
  if(did_action($custom_hook) == 0){
    do_action($custom_hook);
    //your filter action code goes here: modification of $content
  }
  return $content;
}

function my_plugin_prefix_custom_action_hook_callback(){
  //do nothing
}
add_action($custom_hook, \'my_plugin_prefix_custom_action_hook_callback\');
首先,动作挂钩的运行计数$custom_hook 将为0,并且do_action($custom_hook); 语句将使运行计数为$custom_hook ,这将阻止后续执行if 陈述

相关推荐

Apply_Filters()对所需的参数进行切片

我正在尝试向WooCommerce订单中的每个退款行添加一个按钮(其功能超出了这个问题的范围,足以说明它需要退款id作为参数)。我发现这些行是在woocommerce\\includes\\admin\\meta Box\\views\\html订单退款中创建的。无法重写的php。然而,有一项行动:do_action( \'woocommerce_admin_order_item_values\', null, $refund, $refund->get_id() ); 这似乎非常适合我的