Вот некоторые соображения по этому вопросу, но, пожалуйста, обратите внимание, что это ни в коем случае не является окончательным ответом, так как могут быть некоторые вещи, которые я упустил, однако это должно дать вам представление о потенциальных проблемах.
Да, технически могут быть последствия.
Когда вызов 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)
или подождать, пока кто-нибудь не добавит термин для данной таксономии либо через пользовательский интерфейс таксономии, либо программно.
Пища для размышлений.
wp_update_term_count()
), прежде чем использовать его значение. Я понятия не имел, что будет так.wp_update_term_count($terms, $taxonomy)
каждое из них, верно?wp_defer_term_counting(true)
, DO MASS ВСТАВИТЬ тогдаwp_defer_term_counting(false)
. Единственная причина, по которой вы быwp_update_term_count()
вызвали напрямую, это если вы сохранили term_ids в переходном процессе, а затем полностью отложили подсчет, но, например, запустите AJAX-запрос за кулисами, захватите переходный процесс, затем вызовите вручнуюwp_update_term_count()
или используйте cron-job или подобное. Если вы находитесь в том же запросе (до того, как выполнение полностью завершится), тогда вызовитеwp_defer_term_counting(false)
вызовыwp_update_term_count()
в любом случае.Это должно быть относительно безопасно как операция. Это откладывает подсчет терминов, отображаемых на странице «Изменить таксономию». Так что не похоже, что будут какие-то серьезные последствия.
источник