¿Hay una desventaja de usar wp_defer_term_counting?

11

Tengo una base de datos de WordPress con más de 2 millones de publicaciones. Cada vez que inserto una nueva publicación, tengo que llamar, wp_set_object_termsque tarda más de dos segundos en ejecutarse. Me encontré con esta publicación que recomienda llamar wp_defer_term_countingpara omitir el término contar.

¿Existen graves consecuencias para el funcionamiento de WordPress si uso este enfoque?

Aquí está el código de la publicación por si el enlace se corta:

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
fuente

Respuestas:

8

Aquí hay algunas ideas sobre el tema, pero tenga en cuenta que esta no es una respuesta concluyente, ya que puede haber algunas cosas que he pasado por alto, sin embargo, esto debería darle una idea de las posibles trampas.


Sí, técnicamente podría haber consecuencias.

Cuando las llamadas se wp_defer_term_counting(true)vuelven realmente beneficiosas es cuando, por ejemplo, está realizando una inserción masiva en la base de datos de publicaciones y términos asignados a cada objeto como parte del proceso.

En tal caso, haría lo siguiente:

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

Ahora, en su caso, si solo está insertando una publicación a la vez, aplazar el conteo de términos aún lo beneficiará, sin embargo, al no llamar wp_defer_term_counting(false)después de que su operación pueda dejarlo a usted u otras partes involucradas con la solicitud en un aprieto si confía en el recuento de términos para cualquier otra lógica / procesamiento, condicional o de otro tipo.

Para explicar más, digamos que haces lo siguiente:

Supongamos que tenemos 3 términos dentro de una taxonomía llamada product_cat, los ID para esos términos son 1 (nombre del término A), 2 (nombre del término B) y 3 (nombre del término C) respectivamente.

Cada uno de los términos anteriores ya tiene un recuento de términos 5(solo para el ejemplo).

Entonces esto sucede ...

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

Luego, más adelante en su lógica, decide buscar el término porque desea evaluar la cantidad de objetos asociados con ese término y realizar alguna otra acción basada en el resultado.

Entonces haces esto ...

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

En el caso de nuestro ejemplo, dijimos que el nombre del término A (term_id 1) ya tiene 5 objetos asociados, en otras palabras, ya tiene un recuento de términos de 5.

Por lo tanto, esperaríamos que el countparámetro en el objeto devuelto anterior sea 6, pero debido a que no llamó wp_defer_term_counting(false)después de su operación, los recuentos de términos no se actualizaron para los términos aplicables (término A, B o C).

Por lo tanto, esa es la consecuencia de llamar wp_defer_term_counting(true)sin llamar wp_defer_term_counting(false)después de su operación.

Ahora la pregunta es, por supuesto, ¿esto te afecta? ¿Qué sucede si no tiene necesidad de llamar get_the_termso realizar alguna acción que recupere el término donde utiliza el countvalor para realizar alguna otra operación? Bueno, en ese caso genial, no hay problema para ti .

Pero ... ¿qué pasa si alguien más está enganchado a la set_object_termsacción en la wp_set_object_terms()función y confía en que el término cuenta es correcto? Ahora ves dónde podrían surgir las consecuencias.

¿O qué pasa si después de que la solicitud ha finalizado, se realiza otra solicitud que recupera un término de taxonomía y hace uso de la countpropiedad en su lógica comercial? Eso podría ser un problema.

Si bien puede countparecer descabellado que los valores puedan ser muy perjudiciales, no podemos asumir la forma en que dichos datos se utilizarán según nuestra propia filosofía.

Además, como se menciona en la respuesta alternativa, el recuento como se ve en la tabla de la lista de taxonomía tampoco se actualizará.

De hecho, la única forma de actualizar los recuentos de términos después de diferir el recuento de términos y su solicitud ha finalizado es llamar manualmente wp_update_term_count($terms, $taxonomy)o esperar hasta que alguien agregue un término para la taxonomía dada a través de la interfaz de usuario de la taxonomía o mediante programación.

Comida para el pensamiento.

Adán
fuente
1
Creo que resumen esto brillantemente. Todo depende de si vas a utilizar el recuento de términos real en la medida en que pueda retomar la búsqueda del código fuente relacionado
Pieter Goosen
3
Sí, pensé que esta era una pregunta interesante, así que tuve que profundizar ... parece que el único problema es si necesita un recuento de términos preciso durante la misma solicitud e incluso después de que la solicitud haya finalizado. Ahora que lo pienso, si alguien confía alguna vez en el recuento de términos para una lógica comercial seria, entonces no se le puede garantizar que lo que está viendo es, de hecho, el recuento correcto. Debería intentar actualizar manualmente el recuento (p wp_update_term_count(). Ej. ) Antes de usar su valor. No tenía idea de que ese sería el caso.
Adam
Respuesta muy comprensiva. Como en realidad estoy haciendo una inserción masiva, por lo que has explicado, necesito recorrer los términos después y llamar wp_update_term_count($terms, $taxonomy)a cada uno, ¿correcto?
KalenGi
2
WordPress nunca falla dándole a uno un rudo despertar. Debo admitir que a veces uno aprende más respondiendo preguntas como estas que simplemente dando vueltas en general en general ;-)
Pieter Goosen
1
Si está haciendo una inserción masiva, yo simplemente wp_defer_term_counting(true), INSERTO EN MASA entonces wp_defer_term_counting(false). La única razón por la que llamaría wp_update_term_count()directamente es si almacenó los term_ids en un transitorio y luego difiere el conteo por completo, pero por ejemplo dispara una solicitud AJAX detrás de escena, toma el transitorio y luego llama manualmente wp_update_term_count()o usa un trabajo cron o similar. Si está en la misma solicitud (antes de que la ejecución finalice por completo), llame a las wp_defer_term_counting(false)llamadas wp_update_term_count()bajo el capó de todos modos.
Adam
0

Esto debería ser relativamente seguro como una operación. Esto difiere el recuento de términos que aparece en la página Editar taxonomía. Por lo tanto, no parece que haya consecuencias graves.

Phatskat
fuente