Existe-t-il des inconvénients à l’utilisation de wp_defer_term_counting?

12

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

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

Voici le code de la poste 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' );
  }
}
    
posée KalenGi 07.03.2016 - 15:24

2 réponses

8

Voici quelques réflexions sur la question, mais veuillez noter qu'il ne s'agit en aucun cas d'une réponse concluante, car certaines choses ont peut-être été oubliées, mais cela devrait vous donner un aperçu des pièges potentiels.

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

L'appel de wp_defer_term_counting(true) devient véritablement avantageux, par exemple lorsque vous effectuez une insertion en masse dans la base de données de publications et que vous 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'une publication à la fois, le report du décompte des durées vous sera tout de même bénéfique. Si vous n'appelez pas wp_defer_term_counting(false) après que votre opération a pu vous quitter, vous ou une autre partie impliquée dans la demande, dans un délai raisonnable. lier si vous comptez sur le nombre de termes pour toute autre logique / traitement, conditionnel ou autre.

Pour expliquer davantage, supposons que vous procédiez comme suit:

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

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

Ensuite, cela se produit ...

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 de récupérer 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 vous faites ç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 (identifiant_termestre 1) est déjà associé à 5 objets. En d'autres termes, il compte déjà 5 dénombrements.

Nous nous attendions donc à ce que le paramètre count sur 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 conditions 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? Eh bien, dans ce cas, super, pas de problème pour vous .

Mais ... que se passe-t-il si quelqu'un d'autre est accroché à set_object_terms action 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 que se passe-t-il si, une fois la demande terminée, une autre demande est exécutée, laquelle extrait un terme de taxonomie et utilise la propriété count dans leur logique métier? Cela pourrait être un problème.

Bien qu'il puisse sembler fantaisiste que les valeurs de count puissent être très dommageables, nous ne pouvons pas supposer que ces données seront utilisées selon notre propre philosophie.

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 requête est d'appeler manuellement wp_update_term_count($terms, $taxonomy) ou d'attendre que quelqu'un ajoute un terme pour la taxonomie donnée, soit via l'interface utilisateur de taxonomie, soit par programmation.

Matière à réflexion.

    
réponse donnée userabuser 08.03.2016 - 12:26
0

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. Il ne semble donc pas que cela aurait des conséquences graves.

    
réponse donnée phatskat 07.03.2016 - 15:40

Lire d'autres questions sur les étiquettes