如何将原生COMMENT_COUNT替换为注释演进聚合计数

时间:2016-02-18 作者:Andre Bulatov

我正在使用一个名为Comments Evolved的插件,该插件聚合了Faceook、G+和WordPress native的选项卡式评论。

我正在尝试替换本地人comments_number 使用插件聚合计数中的数字进行编号。

问题是,我想通过函数来实现这一点。php,但我有麻烦,因为它似乎只是拉Facebook的评论计数。我怀疑我的过滤器没有工作,因此它只会拉WordPress native会拉的东西。

我尝试的内容当前我正在使用此筛选器:

// Replace native comment count with Comments Evolved comment in native comments_number function
function comments_evolved_number() {
    $number = comments_evolved_get_total_count();
}
apply_filters(\'comments_number\', \'comments_evolved_number\');
但它似乎没有发挥作用,因为它只显示Facebook选项卡中的评论数。

在我的索引中。php,我用它来获取评论:

        <?php comments_number( \'Say somethin\\\'!\', \'1 comment\', \'% comments\' ) ?>
我也试过了add_filter 但这似乎没有任何作用,因为评论根本就没有输出。我到处都搜索过,论坛,WordPress codex,插件GitHub,甚至还搜索过处理Discus评论的类似线程,但我找不到我的过滤器失败的原因。

我做错了什么?

更新1已尝试用户birgire的answer 这比我能想到的任何答案都要清晰、合乎逻辑、更好,但由于某些原因,它只能部分起作用。

在测试中,它似乎没有拉动Facebook的评论计数,尽管它拉动并聚合了所有其余的评论。

注释演化构造comments_evolved_get_total_count() 如下所示:函数comments\\u evolved\\u get\\u total\\u count(){$total\\u count=0;

  $wordpress_count = comments_evolved_get_wordpress_count();
  //$wordpress_count = get_comments_number();

  $gplus_count = comments_evolved_get_gplus_count();
  $trackback_count = comments_evolved_get_trackback_count();
  $facebook_count = comments_evolved_get_facebook_count();
  $disqus_count = comments_evolved_get_disqus_count();

  $total_count = $total_count + $wordpress_count + $gplus_count + $trackback_count + $facebook_count + $disqus_count;
  return $total_count;
}
//add_filter(\'get_comments_number\', \'comments_evolved_get_total_count\', 4269);
Facebookcomments_evolved_get_facebook_count() 构造如下:

function comments_evolved_get_facebook_count($url = "") {
  if(empty($url)){ $url = get_permalink(); }
  $link = \'https://graph.facebook.com/?ids=\' . urlencode($url);
  $link_body = wp_remote_retrieve_body(wp_remote_get($link));
  $json = json_decode($link_body);
  return $json->$url->comments;
}
我没有发现任何错误,在其他地方,它得出了正确的Facebook计数(我想——不确定)。

哪些工作正常,但似乎效率不高/不令人满意

function comment_count_agg() {
  $total_count = 0;

  //$wordpress_count = comments_evolved_get_wordpress_count();
  $wordpress_count = get_comments_number();

  $gplus_count = comments_evolved_get_gplus_count();
  $trackback_count = comments_evolved_get_trackback_count();
  $facebook_count = comments_evolved_get_facebook_count();
  $disqus_count = comments_evolved_get_disqus_count();

  $total_count = $total_count + $wordpress_count + $gplus_count + $trackback_count + $facebook_count + $disqus_count;
  return $total_count;
}
add_filter(\'comments_evolved_get_total_count\', \'comment_count_agg\', 4270);
add_filter(\'get_comments_number\', \'comments_evolved_get_total_count\', 4271);
。。。虽然我不知道为什么。

我这样尝试是因为(a)我在应用birgire的过滤器之前,插件中的某些东西弄乱了聚合计数,(b)因为我认为优先级可能是个问题。

你能告诉我为什么我的凌乱函数能工作,但birgire的不能,如果有什么方法可以使它更有效?

更新2用户birgire的回答确实完整且正确,但Facebook的评论数根本没有被纳入,因为我所处理的域超过了Open Graph API调用限制。

我通过从Facebook返回的JSOn对象得到的错误是:

stdClass Object ( [error] => stdClass Object ( [message] => (#4) Application request limit 
reached [type] => OAuthException [is_transient] => 1 [code] => 4 [fbtrace_id] => AgE3COAZ+tj ) )
我提供了detailed answer here 关于FB OG API限制。

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

这里没有什么问题。

使用add_filter() 而不是apply_filters(), 注册自定义回调。

  • return 筛选器回调中的值。

    使用get_comments_number 过滤器,而不是comments_number 过滤器,因为您只想更改数字,而不想更改comments_number() 作用

  • prefix 自定义回调的名称,以避免可能的名称冲突。

    因此,请尝试此版本:

    function wpse_comments_evolved_number( $count ) 
    {
        // Override the comment count
        if( function_exists( \'comments_evolved_get_total_count\' ) )
            $count = comments_evolved_get_total_count();
    
        // We must then return the value:
        return $count;
    }
    add_filter( \'get_comments_number\', \'wpse_comments_evolved_number\');
    
    确保功能comments_evolved_get_total_count() 存在。如果插件被卸载,我们不想让整个网站瘫痪。

    希望它能起作用。