Apakah ada kerugian menggunakan wp_defer_term_counting?

11

Saya memiliki database WordPress dengan lebih dari 2 juta posting. Setiap kali saya memasukkan posting baru saya harus menelepon wp_set_object_termsyang membutuhkan lebih dari dua detik untuk dieksekusi. Saya menemukan posting ini yang merekomendasikan panggilan wp_defer_term_countinguntuk melewati penghitungan istilah.

Adakah konsekuensi serius terhadap berfungsinya WordPress jika saya menggunakan pendekatan ini?

Berikut kode dari pos untuk berjaga-jaga kalau-kalau tautannya mati:

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

Jawaban:

8

Berikut adalah beberapa pemikiran tentang masalah ini, tetapi harap dicatat bahwa ini sama sekali bukan jawaban konklusif karena mungkin ada beberapa hal yang telah saya abaikan namun ini harus memberi Anda wawasan tentang potensi gotcha.


Ya, secara teknis mungkin ada konsekuensinya.

Di mana panggilan wp_defer_term_counting(true)menjadi benar-benar bermanfaat adalah ketika misalnya Anda melakukan penyisipan massal ke database posting dan istilah yang ditetapkan untuk setiap objek sebagai bagian dari proses.

Dalam kasus seperti itu Anda akan melakukan hal berikut:

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

Sekarang dalam kasus Anda, jika Anda hanya memasukkan satu posting pada suatu waktu, maka menunda penghitungan jangka masih akan menguntungkan Anda namun dengan tidak menelepon wp_defer_term_counting(false)setelah operasi Anda dapat meninggalkan Anda dan atau pihak lain yang terlibat dengan permintaan dalam ikatan jika Anda mengandalkan hitungan istilah untuk logika / pemrosesan lainnya, bersyarat atau sebaliknya.

Untuk menjelaskan lebih lanjut, katakanlah Anda melakukan hal berikut:

Anggaplah kita memiliki 3 istilah dalam taksonomi yang disebut product_cat, ID untuk istilah-istilah tersebut adalah 1 (nama jangka A), 2 (nama term B) dan 3 (nama term C).

Masing-masing istilah di atas sudah memiliki hitungan istilah 5(hanya untuk contoh).

Maka ini terjadi ...

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

Kemudian nanti dalam logika Anda, Anda memutuskan untuk mengambil istilah karena Anda ingin menilai jumlah objek yang terkait dengan istilah itu dan melakukan beberapa tindakan lain berdasarkan hasilnya.

Jadi kamu melakukan ini ...

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

Dalam kasus contoh kami, kami mengatakan bahwa istilah nama A (term_id 1) sudah memiliki 5 objek yang terkait dengannya, di kata lain sudah memiliki hitungan istilah 5.

Jadi kami berharap countparameter pada objek yang dikembalikan di atas menjadi 6 tetapi karena Anda tidak menelepon wp_defer_term_counting(false)setelah operasi Anda, jumlah istilah tidak diperbarui untuk istilah yang berlaku (istilah A, B atau C).

Karenanya itulah konsekuensi dari panggilan wp_defer_term_counting(true)tanpa menelepon wp_defer_term_counting(false)setelah operasi Anda.

Sekarang pertanyaannya tentu saja, apakah ini mempengaruhi Anda? Bagaimana jika Anda tidak perlu memanggil get_the_termsatau melakukan beberapa tindakan yang mengambil istilah di mana Anda menggunakan countnilai untuk melakukan beberapa operasi lain? Nah dalam hal itu hebat, tidak masalah bagi Anda .

Tapi ... bagaimana jika orang lain terpikat pada set_object_termstindakan dalam wp_set_object_terms()fungsi dan mereka mengandalkan istilah yang benar? Sekarang Anda melihat di mana akibatnya bisa muncul.

Atau bagaimana jika setelah permintaan berakhir, permintaan lain dilakukan yang mengambil istilah taksonomi dan memanfaatkan countproperti dalam logika bisnis mereka? Itu bisa menjadi masalah.

Walaupun kedengarannya terlalu jauh bahwa countnilai - nilai bisa sangat berbahaya, kami tidak dapat mengasumsikan cara data tersebut akan digunakan berdasarkan filosofi kami sendiri.

Juga seperti yang disebutkan dalam jawaban alternatif, hitungan seperti yang terlihat pada tabel daftar taksonomi juga tidak akan diperbarui.

Bahkan satu-satunya cara untuk memperbarui penghitungan jangka waktu setelah Anda menunda penghitungan jangka waktu dan permintaan Anda telah berakhir adalah dengan menelepon wp_update_term_count($terms, $taxonomy)atau menunggu secara manual hingga seseorang menambahkan istilah untuk taksonomi yang diberikan baik melalui UI taksonomi atau melalui program.

Bahan pemikiran.

Adam
sumber
1
Saya pikir Anda meringkaskan ini dengan cemerlang. Itu semua tergantung pada apakah Anda akan menggunakan hitungan istilah aktual sejauh yang saya bisa gali melalui kode sumber terkait
Pieter Goosen
3
Ya saya pikir ini adalah pertanyaan yang menarik jadi saya harus menggali lebih dalam ... sepertinya satu-satunya masalah adalah jika Anda memerlukan hitungan istilah yang akurat selama permintaan yang sama dan bahkan setelah permintaan telah berakhir. Kalau dipikir-pikir, jika ada orang yang mengandalkan hitungan istilah untuk logika bisnis serius maka Anda tidak dapat dijamin bahwa apa yang Anda lihat sebenarnya adalah hitungan yang benar. Anda harus mencoba dan memperbarui penghitungan (misalnya wp_update_term_count()) secara manual sebelum menggunakan nilainya. Saya tidak tahu itu akan menjadi masalah.
Adam
Jawabannya sangat komprehensif. Karena saya benar-benar melakukan penyisipan massal, dari apa yang telah Anda jelaskan saya perlu mengulangi istilah-istilah setelahnya dan memanggil wp_update_term_count($terms, $taxonomy)masing-masing, benar?
KalenGi
2
WordPress tidak pernah gagal memberikan satu kebangkitan kasar. Harus saya akui, seseorang kadang-kadang belajar lebih banyak menjawab pertanyaan seperti ini daripada sekadar menjungkirbalikkan secara umum ;-)
Pieter Goosen
1
Jika Anda melakukan insert massal, saya akan hanya wp_defer_term_counting(true), DO MASS INSERT kemudian wp_defer_term_counting(false). Satu-satunya alasan Anda akan menelepon wp_update_term_count()langsung adalah jika Anda menyimpan term_ids dalam transient kemudian menunda penghitungan seluruhnya tetapi misalnya memadamkan permintaan AJAX di belakang layar, ambil transient kemudian panggil secara manual wp_update_term_count()atau gunakan cron-job atau sejenisnya. Jika Anda berada dalam permintaan yang sama (sebelum eksekusi sepenuhnya berakhir) maka tetap memanggil wp_defer_term_counting(false)panggilan di wp_update_term_count()bawah tenda.
Adam
0

Ini harus relatif aman sebagai operasi. Ini menunda penghitungan istilah yang muncul di halaman Edit Taksonomi. Jadi, sepertinya tidak akan ada konsekuensi serius.

phatskat
sumber