wp_defer_term_countingを使用することの欠点はありますか?


11

私は200万以上の投稿を持つWordPressデータベースを持っています。新しい投稿を挿入するたびにwp_set_object_terms、実行に2秒以上かかる呼び出しをしなければなりません。用語のカウントをスキップするように電話することを推奨するこの投稿に出くわしました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' );
  }
}

回答:


8

これは問題に関するいくつかの考えですが、これは私が見落としているいくつかの点があるかもしれないので、これは決して決定的な答えではないことに注意してください。


はい、技術的には影響があるかもしれません。

呼び出しwp_defer_term_counting(true)が本当に有益になるのは、たとえば、プロセスの一部として、投稿のデータベースへの一括挿入と各オブジェクトへの用語の割り当てを実行しているときです。

このような場合は、次のようにします。

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

さて、あなたの場合、一度に1つの投稿しか挿入しない場合でも、用語のカウントを延期することでメリットがあります。ただしwp_defer_term_counting(false)、条件付きまたはその他のその他のロジック/処理の期間カウント。

さらに説明するために、次のことを実行するとします。

という分類法内に3つの用語があると仮定します。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_id 1)にはすでに5つのオブジェクトが関連付けられていると言いました。言い換えると、用語カウントはすでに5です。

したがって、count上記の返されたオブジェクトのパラメーターは6であると想定しますが、wp_defer_term_counting(false)操作後に呼び出しを行わなかったため、該当する用語(用語A、B、またはC)の用語カウントは更新されませんでした。

したがって、これは操作後に呼び出しをせずに呼び出した結果です。wp_defer_term_counting(true)wp_defer_term_counting(false)

さて問題はもちろんです、これはあなたに影響を与えますか?値を使用して他の操作を実行get_the_termsするという用語を取得するアクションを呼び出したり実行する必要がない場合はどうなりますcountか?まあその場合は素晴らしい、あなたにとっては問題ありません

しかし、他の誰かが関数のset_object_termsアクションに夢中になっwp_set_object_terms()ていて、用語カウントが正しいことに依存している場合はどうなりますか?これで、結果が発生する可能性のある場所がわかります。

または、リクエストが終了した後、分類用語を取得countしてビジネスロジックでプロパティを利用する別のリクエストが実行された場合はどうなりますか?それは問題になる可能性があります。

count値が非常に害を及ぼす可能性があるとは思えないかもしれませんが、そのようなデータが私たちの哲学に基づいて使用される方法を想定することはできません。

また、代替回答で述べたように、分類リストの表に表示される数も更新されません。

実際、用語カウントを延期してリクエストが終了した後で用語カウントを更新する唯一の方法は、手動で電話をかけるwp_update_term_count($terms, $taxonomy)か、分類UIを介して、またはプログラムによって、誰かが特定の分類の用語を追加するまで待つことです。

思考の糧。


1
これは見事にまとめると思います。関連するソースコードを掘り下げることができる限り、実際の用語カウントを利用するかどうかにかかっています
Pieter Goosen

3
ええ、これは興味深い質問だと思ったので、さらに深く掘り下げなければなりませんでした...唯一の問題は、同じリクエストの間、およびリクエストが終了した後でさえ、正確な期間カウントが必要な場合です。考えてみてください。深刻なビジネスロジックの用語カウントに誰かが依存している場合、あなたが見ているものが実際に正しいカウントであると保証することはできません。wp_update_term_count()値を使用する前に、手動で数を試して更新する必要があります(例:)。それが本当かどうかはわかりませんでした。
アダム

非常に包括的な答え。私は実際に大量挿入を行っているので、あなたが説明したことから、後で用語をループしてwp_update_term_count($terms, $taxonomy)それぞれを呼び出す必要があり ますよね?
KalenGi 2016年

2
ワードプレスは失礼な目覚めを与えて失敗することはありません。私は認めざるを得ません。一般的にコアに詰め込むだけでなく、このような質問に答えることがときどきあります;-)
Pieter Goosen

1
あなたが大量の挿入を行っている場合、私はちょうど希望wp_defer_term_counting(true)DO MASS INSERT、その後wp_defer_term_counting(false)wp_update_term_count()直接呼び出す理由は、term_idをトランジェントに保存し、カウントをすべて延期する場合ですが、たとえば、AJAXリクエストをバックグラウンドで開始し、トランジェントを取得してから、手動で呼び出すwp_update_term_count()か、cronジョブなどを使用します。同じリクエスト内にいる場合(実行が完全に終了する前)、とにかく内部で呼び出しをwp_defer_term_counting(false)呼び出しwp_update_term_count()ます。
アダム

0

これは操作としては比較的安全なはずです。これにより、[分類の編集]ページに表示される用語のカウントが延期されます。したがって、深刻な結果が生じるとは思われません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.