Y a-t-il un inconvénient à utiliser wp_defer_term_counting?

11

J'ai une base de données WordPress avec plus de 2 millions de publications. Chaque fois que j'insère un nouveau message, je dois appeler, wp_set_object_termsce qui prend plus de deux secondes à exécuter. Je suis tombé sur ce post qui recommande d'appeler wp_defer_term_countingpour ignorer le comptage des termes.

Y a-t-il des conséquences graves sur le fonctionnement de WordPress si j'utilise cette approche?

Voici le code de la publication 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' );
  }
}
KalenGi
la source

Réponses:

8

Voici quelques réflexions sur la question, mais veuillez noter que ce n'est en aucun cas une réponse concluante car il y a peut-être des choses que j'ai négligées, mais cela devrait vous donner un aperçu des pièges potentiels.


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

Lorsque l'appel wp_defer_term_counting(true)devient vraiment bénéfique, c'est par exemple lorsque vous effectuez une insertion en masse dans la base de données de publications et des termes attribués à chaque objet dans le cadre du processus.

Dans un tel cas, vous feriez ce qui 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 comptage des termes vous sera néanmoins bénéfique en ne téléphonant pas wp_defer_term_counting(false)après que votre opération pourrait vous laisser, ainsi que d'autres parties impliquées dans la demande, si vous comptez sur le nombre de termes pour toute autre logique / traitement, conditionnel ou autre.

Pour expliquer davantage, disons que vous procédez comme suit:

Supposons que nous ayons 3 termes dans une taxonomie appelée product_cat, les ID de 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 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');

Plus tard 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 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 associés, en d'autres termes a déjà un nombre de termes de 5.

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

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

Maintenant, la question est bien sûr, cela vous affecte-t-il? Que faire si vous n'avez pas besoin d'appeler get_the_termsou d'effectuer une action qui récupère le terme où vous utilisez la countvaleur pour effectuer une autre opération? Eh bien dans ce cas , pas de problème pour vous .

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

Ou que se passe-t-il si après la fin de la demande, une autre demande est exécutée qui récupère un terme de taxonomie et utilise le countbien dans sa logique métier? Cela pourrait être un problème.

Bien qu'il puisse sembler farfelu que les countvaleurs puissent être très préjudiciables, nous ne pouvons pas supposer la manière dont ces données seront utilisées en fonction de notre propre philosophie.

De plus, comme mentionné 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, la seule façon de mettre à jour le décompte des termes après avoir différé le décompte des termes et votre demande est terminée 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 la taxonomie ou par programme.

Nourriture pour la pensée.

Adam
la source
1
Je pense que vous résumez cela avec brio. Tout dépend si vous comptez utiliser le nombre de termes réels dans la mesure où je peux chercher à fouiller dans le code source associé
Pieter Goosen
3
Oui, je pensais que c'était une question intéressante, j'ai donc dû creuser plus profondément ... le seul problème semble être si vous avez besoin d'un décompte précis des termes pendant la même demande et même après la fin de la demande. À bien y penser, si quelqu'un s'appuie sur le nombre de termes pour une logique métier sérieuse, vous ne pouvez pas être assuré que ce que vous regardez est en fait le nombre correct. Vous devez essayer de mettre à jour manuellement le nombre (par exemple wp_update_term_count()) avant d'utiliser sa valeur. Je ne savais pas que ce serait le cas.
Adam
Réponse très complète. Puisque je fais en fait un encart de masse, d'après ce que vous avez expliqué, je dois parcourir les termes par la suite et faire appel wp_update_term_count($terms, $taxonomy)à chacun, n'est-ce pas?
KalenGi
2
WordPress ne manque jamais d'éveiller un grossier réveil. Je dois admettre que l'on apprend parfois plus à répondre à des questions comme celles-ci qu'à se fourrer dans le cœur en général ;-)
Pieter Goosen
1
Si vous faites de l'insertion en masse, je voudrais simplement wp_defer_term_counting(true), FAITES INSÉRER LA MASSE alors wp_defer_term_counting(false). La seule raison pour laquelle vous appelez wp_update_term_count()directement est si vous avez stocké les term_ids dans un transitoire, puis différez entièrement le comptage, mais par exemple lancez une demande AJAX en arrière-plan, saisissez le transitoire puis appelez manuellement wp_update_term_count()ou utilisez un cron-job ou similaire. Si vous êtes dans la même requête (avant l' exécution se termine complètement) puis en appelant les wp_defer_term_counting(false)appels wp_update_term_count()sous le capot de toute façon.
Adam
0

Cela devrait être relativement sûr en tant qu'opération. Cela reporte le comptage des termes qui apparaît sur la page Modifier la taxonomie. Il ne semble donc pas qu'il y aurait de conséquences graves.

phatskat
la source