Wp_defer_term_counting kullanmanın bir dezavantajı var mı?


11

2 milyondan fazla yayını olan bir WordPress veritabanım var. Ne zaman yeni bir yazı eklerseniz, aramam wp_set_object_termsiki saniyeden uzun sürüyor. Ben rastladım bu yazı arayarak önerir wp_defer_term_countingvadeli sayma atlamak için.

Bu yaklaşımı kullanırsam WordPress'in işleyişinde ciddi sonuçlar var mı?

Bağlantının kesilmesi durumunda yazının kodu:

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' );
  }
}

Yanıtlar:


8

İşte konuyla ilgili bazı düşünceler, ama lütfen bunun kesin bir cevap olmadığını unutmayın, göz ardı ettiğim bazı şeyler olabilir, ancak bu potansiyel gotchas hakkında bir fikir vermelidir.


Evet, teknik olarak sonuçları olabilir.

Çağrı nerede wp_defer_term_counting(true)gerçekten faydalı olur, örneğin Eğer mesajların veri tabanında bir kütle ekleme performans ve işleminin bir parçası olarak, her nesneye tahsis koşullar zamandır.

Böyle bir durumda aşağıdakileri yaparsınız:

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

Şimdi sizin durumunuzda, bir seferde yalnızca bir gönderi ekliyorsanız, erteleme terimi sayımı yine de size fayda sağlayacaktır, ancak wp_defer_term_counting(false)operasyonunuz sizi ve / veya talebe bağlı diğer tarafları, şartlı veya başka herhangi bir diğer mantık / işlem için terim sayısı.

Daha fazla açıklamak için, aşağıdakileri yaptığınızı varsayalım:

Bir sınıflandırma dahilinde 3 terimimiz olduğunu varsayalım product_cat, bu terimlerin kimliklerinin sırasıyla 1 (terim adı A), 2 (terim adı B) ve 3 (terim adı C) olduğunu varsayalım .

Yukarıdaki terimlerin her birinin zaten bir terim sayısı vardır 5(sadece örnek için).

Sonra bu olur ...

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');

Daha sonra mantığınızda, terimi getirmeye karar verirsiniz, çünkü o terimle ilişkili nesnelerin miktarını değerlendirmek ve sonuca göre başka bir işlem yapmak istersiniz.

Yani bunu yapıyorsun ...

$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',
  )),
)

Örneğimizde, A (term_id 1) teriminin zaten kendisiyle ilişkilendirilmiş 5 nesnesi olduğunu, başka bir deyişle zaten 5 terim sayısına sahip olduğunu söyledik.

Bu nedenle count, yukarıdaki döndürülen nesne üzerindeki parametrenin 6 olmasını bekleriz, ancak wp_defer_term_counting(false)işleminizden sonra aramadıysanız, terim sayıları geçerli terimler için (A, B veya C terimi) güncellenmedi.

Bu nedenle ameliyattan sonra arama yapmadan arama yapmanın sonucudur .wp_defer_term_counting(true)wp_defer_term_counting(false)

Şimdi soru elbette, bu sizi etkiliyor mu? Başka bir işlemi gerçekleştirmek get_the_termsiçin countdeğeri kullandığınız terimi geri alan bir eylemi çağırmanız veya gerçekleştirmeniz gerekmiyorsa ne olur ? Bu durumda harika, senin için sorun değil .

Ama ... ya bir başkası fonksiyonda set_object_termseyleme bağlıysa wp_set_object_terms()ve terim sayımının doğru olmasına güveniyorsa ne olacak? Şimdi sonuçların nerede ortaya çıkabileceğini görüyorsunuz.

Veya istek sona erdikten sonra, bir sınıflandırma terimini alan ve countmülkü iş mantığında kullanan başka bir istek gerçekleştirilirse ne olur ? Bu bir sorun olabilir.

countDeğerlerin çok zarar verebileceği çok zor gibi görünse de , bu tür verilerin kendi felsefemize dayanarak nasıl kullanılacağını varsayamayız.

Ayrıca alternatif cevapta belirtildiği gibi, sınıflandırma listesi tablosunda görülen sayım da güncellenmeyecektir.

Aslında, terim sayımını erteledikten ve isteğiniz sona erdikten sonra terim sayılarını güncellemenin tek yolu, wp_update_term_count($terms, $taxonomy)birisi taksonomi kullanıcı arabirimi aracılığıyla veya programlı olarak belirli bir sınıflandırma için bir terim ekleyene kadar manuel olarak aramak veya beklemektir.

Düşünce için yiyecek.


1
Bence bunu zekice özetliyorsun. Her şey, ilgili kaynak kodunu kullanarak kazmayı alabildiğim kadarıyla gerçek terim sayımından faydalanıp yararlanmayacağınıza bağlıdır
Pieter Goosen

3
Evet, bu ilginç bir soru olduğunu düşündüm, bu yüzden daha derin kazmak zorunda kaldım ... tek sorun, aynı istek sırasında ve hatta istek sona erdikten sonra bile doğru bir terim sayısına ihtiyacınız varsa görünüyor. Bunu düşünmeye gel, eğer birisi herhangi bir ciddi iş mantığı için terim sayımına güveniyorsa, baktığın şeyin aslında doğru sayım olduğu garanti edilemezdi. wp_update_term_count()Değerini kullanmadan önce sayımı (ör. ) Manuel olarak denemeniz ve güncellemeniz gerekir . Durumun böyle olacağı hakkında hiçbir fikrim yoktu.
Adam

Çok kapsamlı bir cevap. Aslında toplu bir eklenti yaptığım için, açıkladığınızdan, daha sonra terimler arasında dolaşmam ve wp_update_term_count($terms, $taxonomy)her birini çağırmam gerekiyor , değil mi?
16:50

2
WordPress asla kaba bir uyanış vererek başarısız olmaz. İtiraf etmeliyim ki, bazen bu gibi soruları cevaplamak daha çok
temelde

1
Toplu ekleme yapıyorsanız, ben sadece wp_defer_term_counting(true), o zaman KİTLE TAKINwp_defer_term_counting(false) . wp_update_term_count()Doğrudan çağırmanızın tek nedeni , term_id'leri geçici olarak sakladıktan sonra saymayı tamamen ertelemeniz, ancak örneğin sahnelerin arkasında bir AJAX talebini tetiklemeniz, geçici olanı tutmanız ve manuel olarak wp_update_term_count()bir cron işi veya benzeri bir şey kullanmanız veya kullanmanızdır. Aynı istekte bulunuyorsanız (yürütme tamamen sona ermeden önce) , yine de başlık altında wp_defer_term_counting(false)çağrıları wp_update_term_count()arayın.
Adam

0

Bu bir operasyon olarak nispeten güvenli olmalıdır. Bu, Sınıflandırmayı Düzenle sayfasında görünen terimlerin sayılmasını erteliyor. Yani ciddi sonuçlar doğuracak gibi görünmüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.