Чи є недолік використання wp_defer_term_counting?


11

У мене база даних 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' );
  }
}

Відповіді:


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

Тепер у вашому випадку, якщо ви вставляєте лише одну посаду за один раз, відкладений підрахунок терміну все одно піде на користь вам, однак не зателефонувавши wp_defer_term_counting(false)після того, як ваша операція могла б залишити вас та інші учасники запиту, якщо ви покладаєтесь на підрахунок терміна для будь-якої іншої логіки / обробки, умовної чи іншої.

Щоб пояснити далі, скажімо, що ви виконуєте наступне:

Припустимо, що у таксономії називається 3 терміни product_cat, ідентифікатори для цих термінів - 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)або чекати, поки хтось додасть термін для даної таксономії або через інтерфейс таксономії, або програмно.

Їжа для роздумів.


1
Я думаю, ви це підсумовуєте блискуче. Все залежить від того, чи збираєтесь ви використати фактичну кількість термінів, наскільки я можу отримати копання через пов'язаний з цим вихідний код
Пітер Гузен

3
Так, я подумав, що це цікаве питання, тому мені довелося копати глибше ... Здається, єдине питання полягає в тому, якщо вам потрібен точний підрахунок терміну під час того ж запиту і навіть після закінчення запиту. Подумайте про це, якщо хтось коли-небудь покладається на кількість термінів для будь-якої серйозної логіки бізнесу, то вам не вдалося гарантувати, що те, що ви дивитесь, насправді є правильним підрахунком. Вам доведеться вручну спробувати і оновити кількість (наприклад wp_update_term_count()), перш ніж використовувати її значення. Я не уявляв, що це буде так.
Адам

Дуже вичерпна відповідь. Оскільки я фактично роблю масову вставку, з того, що ви пояснили, мені потрібно переглядати умови після цього і зателефонувати wp_update_term_count($terms, $taxonomy)кожному, правильно?
KalenGi

2
WordPress ніколи не підводить грубих пробуджень. Треба визнати, іноді ви дізнаєтесь більше відповідей на подібні запитання, ніж просто заповнення ядра загалом ;-)
Пітер Гузен

1
Якщо ви робите масову вставку, я б просто wp_defer_term_counting(true), DO MASS вставити тоді wp_defer_term_counting(false). Єдина причина, яку ви б зателефонували wp_update_term_count()безпосередньо, полягає в тому, що ви зберігаєте термін_ids у перехідному періоді, а потім відкладаєте підрахунок цілком, але, наприклад, вимкніть AJAX-запит за лаштунками, захопіть перехідний, а потім вручну зателефонувавши wp_update_term_count()або використовуючи завдання cron або подібне. Якщо ви перебуваєте в тому ж запиті (до виконання повністю припиняється) , то викликаючи wp_defer_term_counting(false)виклики wp_update_term_count()під капотом в будь-якому випадку.
Адама

0

Це має бути відносно безпечним як операція. Це відкладає підрахунок термінів, який з’являється на сторінці Редагувати таксономію. Отже, не здається, що це матиме якісь серйозні наслідки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.