¿Tiene algún inconveniente el uso de wp_defer_term_counting?

12

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 a wp_set_object_terms , que tarda más de dos segundos en ejecutarse. Encontré esta publicación que recomienda llamar a wp_defer_term_counting para omitir el recuento de términos.

¿Hay consecuencias graves para el funcionamiento de WordPress si utilizo este enfoque?

Aquí está el código de la publicación, en caso de que el enlace se detenga:

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' );
  }
}
    
pregunta KalenGi 07.03.2016 - 15:24

2 respuestas

8

Aquí hay algunas ideas sobre el tema, pero tenga en cuenta que esto no es una respuesta concluyente, ya que puede haber algunas cosas que he pasado por alto, sin embargo, esto le dará una idea de los posibles problemas.

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

El hecho de que wp_defer_term_counting(true) se convierta en algo realmente beneficioso 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ías 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, el aplazamiento del recuento de términos seguirá beneficiándole, sin embargo, no llame a wp_defer_term_counting(false) después de que su operación pueda dejarlo a usted y a otras partes involucradas en la solicitud. vincular si confía en el recuento de términos para cualquier otra lógica / procesamiento, condicional o de otro tipo.

Para seguir explicando, supongamos 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 de término A), 2 (nombre de término B) y 3 (nombre de término C) respectivamente.

Cada uno de los términos anteriores ya tiene un recuento de términos de 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 tu lógica, decides obtener el término porque deseas evaluar la cantidad de objetos asociados con ese término y realizar alguna otra acción basada en el resultado.

Así que 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 término nombre A (term_id 1) ya tiene 5 objetos asociados, en otras palabras ya tiene un recuento de términos de 5.

Por lo tanto, esperamos que el parámetro count en el objeto devuelto anterior sea 6, pero debido a que no llamó a 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 a wp_defer_term_counting(true) sin llamar a wp_defer_term_counting(false) después de su operación.

Ahora la pregunta es, por supuesto, ¿esto te afecta? ¿Qué sucede si no necesita llamar a get_the_terms o realizar alguna acción que recupere el término en el que utiliza el valor count 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 acción set_object_terms en la función wp_set_object_terms() y confía en que el recuento de términos sea correcto? Ahora ves donde podrían surgir las consecuencias.

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

Aunque puede parecer descabellado que los valores de count podrían ser muy perjudiciales, no podemos asumir la forma en que se usarán esos datos según nuestra propia filosofía.

También como se menciona en la respuesta alternativa, el recuento tal 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 que haya aplazado el recuento de términos y haya finalizado su solicitud es llamar manualmente wp_update_term_count($terms, $taxonomy) o esperar hasta que alguien agregue un término para la taxonomía determinada ya sea a través de la interfaz de usuario de la taxonomía o mediante programación.

Alimento para el pensamiento.

    
respondido por el userabuser 08.03.2016 - 12:26
0

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

    
respondido por el phatskat 07.03.2016 - 15:40

Lea otras preguntas en las etiquetas