私は200万を超える投稿があるWordPressデータベースを持っています。新しい投稿を挿入するたびに、実行に2秒以上かかるwp_set_object_terms
を呼び出す必要があります。私は出会いました この記事 それは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' );
}
}
ここではこの問題についていくつか考えていますが、見落としていることがあるかもしれませんが、これは決して最終的な答えではないことに注意してください。
はい、技術的には結果が生じる可能性があります。
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)
を呼ばないならば、条件付きまたはそれ以外の、他のロジック/処理の期間カウント。
さらに説明すると、次のようにします。
product_cat
という分類内に3つの用語があり、それらの用語の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)
を呼び出すことの result です。
さて、問題はもちろんです、これはあなたに影響を与えますか? get_the_terms
を呼び出す必要がない場合、または他の操作を実行するためにcount
値を使用する用語を検索するアクションを実行する必要がない場合はどうしますか?その場合は 素晴らしい、あなたにとっては問題ない 。
しかし、他の誰かがwp_set_object_terms()
関数のset_object_terms
アクションに夢中になっていて、彼らがタームカウントが正しいことに頼っているとしたら?今、あなたは結果がどこで起こり得るかを見ます。
あるいは、要求が終了した後に、分類用語を検索してビジネスロジックでcount
プロパティを使用する別の要求が実行された場合はどうなりますか?それは問題になるかもしれません。
count
の値は非常に害がある可能性があるとは言えないかもしれませんが、そのようなデータが自分の哲学に基づいて使用される方法を想定することはできません。
また別の答えで述べたように、分類リスト表で見られるようにカウントはまた更新されません。
実際、期間のカウントを延期してリクエストが終了した後に期間のカウントを更新する唯一の方法は、手動でwp_update_term_count($terms, $taxonomy)
を呼び出すか、または分類UIを介して、またはプログラムによって誰かが特定の分類の用語を追加するまで待つことです。
思考の糧。
これは、操作としては比較的安全なはずです。これにより、[分類の編集]ページに表示される用語のカウントが延期されます。したがって、重大な結果が生じるとは思われません。