web-dev-qa-db-fra.com

L'utilisation de wp_defer_term_counting présente-t-elle des inconvénients?

J'ai une base de données WordPress avec plus de 2 millions de messages. Chaque fois que j'insère un nouveau message, je dois appeler wp_set_object_terms, ce qui prend plus de deux secondes. Je suis tombé sur ce message qui recommande d'appeler wp_defer_term_counting pour ignorer le décompte des termes.

Existe-t-il des conséquences graves pour le fonctionnement de WordPress si j'utilise cette approche?

Voici le code de la poste juste au cas où le lien disparaîtrait:

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

Voici quelques réflexions sur la question, mais s'il vous plaît, notez que ceci n'est en aucun cas une réponse concluante, car il se peut que certaines choses aient été oubliées, mais cela devrait vous donner un aperçu des pièges potentiels.


Oui, techniquement, cela pourrait avoir des conséquences.

Appeler wp_defer_term_counting(true) devient vraiment avantageux, par exemple lorsque vous effectuez une insertion en masse dans la base de données de publications et attribuez des conditions à chaque objet dans le cadre du processus.

Dans ce cas, procédez comme suit:

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

Maintenant, dans votre cas, si vous n'insérez qu'un seul message à la fois, le report du décompte des termes vous sera tout de même avantageux, mais vous n'aurez pas à appeler wp_defer_term_counting(false) après que votre opération pourrait vous laisser, ou à d'autres parties impliquées dans la demande, si vous comptez sur vous. le terme compte pour toute autre logique/traitement, conditionnel ou autre.

Pour expliquer davantage, supposons que vous fassiez ce qui suit:

Supposons que nous ayons 3 termes dans une taxonomie appelée product_cat, les ID pour ces termes sont respectivement 1 (nom du terme A), 2 (nom du terme B) et 3 (nom du terme C).

Chacun des termes ci-dessus a déjà un nombre de termes de5(juste pour l'exemple).

Alors cela arrive ...

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

Ensuite, dans votre logique, vous décidez d'extraire le terme car vous souhaitez évaluer la quantité d'objets associés à ce terme et effectuer une autre action en fonction du résultat.

Alors tu fais ça ...

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

Dans le cas de notre exemple, nous avons dit que le nom de terme A (term_id 1) a déjà 5 objets qui lui sont associés, autrement dit qu’il compte déjà 5 termes.

Nous nous attendons donc à ce que le paramètre count de l'objet renvoyé ci-dessus soit égal à 6, mais comme vous n'avez pas appelé wp_defer_term_counting(false) après votre opération, les comptages de termes n'ont pas été mis à jour pour les termes applicables (termes A, B ou C).

C'est donc la conséquence d'appeler wp_defer_term_counting(true) sans appeler wp_defer_term_counting(false) après votre opération.

Maintenant, la question est bien sûr, est-ce que cela vous concerne? Que se passe-t-il si vous n'avez pas besoin d'appeler get_the_terms ou d'exécuter une action qui récupère le terme lorsque vous utilisez la valeur count pour effectuer une autre opération? Bien dans ce cas génial, pas de problème pour vous .

Mais ... que se passe-t-il si quelqu'un d'autre est accroché à l'action set_object_terms dans la fonction wp_set_object_terms() et qu'il se base sur le nombre de termes correct? Vous voyez maintenant où les conséquences pourraient en découler.

Ou si, après la fin de la demande, une autre demande est exécutée, laquelle extrait un terme de taxonomie et utilise la propriété count dans sa logique métier? Cela pourrait être un problème.

Bien qu'il puisse sembler exagéré que les valeurs count puissent être très dommageables, nous ne pouvons pas supposer que de telles données seront utilisées sur la base de notre propre philosophie.

De plus, comme indiqué dans la réponse alternative, le nombre indiqué dans le tableau de la liste de taxonomie ne sera pas mis à jour non plus.

En fait, le seul moyen de mettre à jour le nombre de termes après avoir différé le dénombrement et terminé votre demande est d'appeler manuellement wp_update_term_count($terms, $taxonomy) ou d'attendre que quelqu'un ajoute un terme pour la taxonomie donnée, via l'interface utilisateur de taxonomie ou par programme.

Nourriture pour la pensée.

8
userabuser

Cela devrait être relativement sûr comme une opération. Cela retarde le comptage des termes qui apparaît sur la page Modifier la taxonomie. Donc, il ne semble pas que cela aurait des conséquences graves.

0
phatskat