使用wp_defer_Term_count有什么不利之处吗?

时间:2016-03-07 作者:KalenGi

我有一个WordPress数据库,有超过200万篇帖子。每当我插入新帖子时,我都要打电话wp_set_object_terms 这需要两秒钟才能执行。我偶然发现this post 建议致电wp_defer_term_counting 跳过术语计数。

如果我使用这种方法,会对WordPress的功能造成严重后果吗?

以下是帖子中的代码,以防链接失效:

function insert_many_posts(){
  wp_defer_term_counting(true);
  $tasks = get_default_tasks(); 
  for ($tasks as $task){
     $post = array(
       \'post_title\' => $task[content],
       \'post_author\' => $current_user->ID,
       \'post_content\' => \'\',
       \'post_type\' => \'bpc_default_task\',
       \'post_status\' => \'publish\'
     );
     $task_id = wp_insert_post( $post );

     if ( $task[category] )
        //Make sure we\'re passing an int as the term so it isn\'t mistaken for a slug
        wp_set_object_terms( $task_id, array( intval( $category ) ), \'bpc_category\' );
  }
}

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

Here are some thoughts on the issue, but please note that this is by no means a conclusive answer as there may be some things I have overlooked however this should give you an insight to the potential gotchas.

<是的,从技术上讲可能会有后果。

何处呼叫wp_defer_term_counting(true) 例如,当您将大量插入到POST数据库中,并将术语作为过程的一部分分配给每个对象时,这才是真正有益的。

在这种情况下,您可以执行以下操作:

wp_defer_term_counting(true); //defer counting terms

//mass insertion or posts and assignment of terms here

wp_defer_term_counting(false); //count terms after completing business logic
现在,在你的情况下,如果你一次只插入一个帖子,那么推迟计算期限仍然会对你有利,但是不要打电话wp_defer_term_counting(false) 如果您依赖术语count进行任何其他逻辑/处理(有条件或其他),则操作后可能会使您和/或与请求相关的其他各方陷入困境。

为了进一步解释,假设您执行以下操作:

假设我们在一个名为product_cat, 这些术语的ID分别为1(术语名称A)、2(术语名称B)和3(术语名称C)。

以上每个术语的术语计数均已为5 (仅举个例子)。

然后这就发生了。。。

wp_defer_term_counting(true); //defer counting terms

$post_id = wp_insert_post($data);

wp_set_object_terms($post_id, array(1, 2, 3), \'product_cat\');
然后,在稍后的逻辑中,您决定提取术语,因为您希望评估与该术语相关联的对象的数量,并根据结果执行一些其他操作。

所以你这么做。。。

$terms = get_the_terms($post_id, \'product_cat\');

//let\'s just grab the first term object off the array of returned results
//for the sake of this example $terms[0] relates to term_id 1 (A)
echo $terms[0]->count; //result 5

//dump output of $terms above
array (
  0 => 
  WP_Term::__set_state(array(
     \'term_id\' => 1,
     \'name\' => \'A\',
     \'slug\' => \'a\',
     \'term_group\' => 0,
     \'term_taxonomy_id\' => 1,
     \'taxonomy\' => \'product_cat\',
     \'description\' => \'\',
     \'parent\' => 0,
     \'count\' => 5, //notice term count still equal to 5 instead of 6
     \'filter\' => \'raw\',
  )),
)
在我们的示例中,我们说过术语名称A(term\\u id 1)已经有5个与之关联的对象,换句话说,已经有5个术语计数。

所以我们希望count 上面返回的对象上的参数为6,但因为您没有调用wp_defer_term_counting(false) 操作后,未更新适用术语(术语A、B或C)的术语计数。

因此,这是consequence 调用的wp_defer_term_counting(true) 不打电话wp_defer_term_counting(false) 手术后。

现在的问题是,这对你有影响吗?如果你不需要打电话怎么办get_the_terms 或者执行一些操作,检索使用count 执行其他操作的值?那么在这种情况下great, no problem for you.

但是如果有人上钩了怎么办set_object_terms 中的操作wp_set_object_terms() 函数,并且它们依赖于术语计数是否正确?现在你看到了可能产生的后果。

或者,如果在请求终止后,执行另一个请求来检索分类术语并使用count 业务逻辑中的属性?这可能是个问题。

虽然这听起来有些牵强count 价值观可能会有很大的危害,我们不能根据自己的理念假设这些数据的使用方式。

此外,如备选答案中所述,分类列表中的计数也不会更新。

事实上,在延迟期限计数并且请求结束后,更新期限计数的唯一方法是手动调用wp_update_term_count($terms, $taxonomy) 或者等待,直到有人通过分类法UI或编程方式为给定的分类法添加一个术语。

值得深思。

SO网友:phatskat

这应该是相对安全的操作。这将推迟显示在“编辑分类法”页面上的术语计数。因此,似乎不会有任何严重后果。

相关推荐

GET_THE_TERMS与wp_GET_POST_TERMS中的奇怪结果

我正在尝试制作一个面包屑函数,但有一个小问题。。。使用时:$categories = get_the_terms( $post->ID, \'product_cat\' ); 我得到了一个循环中使用的类别数组,等等。唯一的问题是它是按字母顺序排列的。(我希望它按层次顺序排列。)经过一番挖掘,我发现了一种替代方法,即使用wp\\u get\\u post\\u terms(),但我肯定遗漏了一些东西,因为当我使用此方法时:$categories = wp_get_post_terms( $p