web-dev-qa-db-fra.com

Comment conserver les modifications apportées à Name ou Slug lorsque vous utilisez wp_update_term sur save?

J'essaie d'insérer du contenu dans le champ description d'un terme lors de la sauvegarde.

// insert stuff into description field of taxonomy
function insert_taxonomy_content( $term_id, $tt_id, $taxonomy ){
    // only insert content on certain taxonomies
    if ( $taxonomy === 'some_custom_taxonomy' ){

         // unhook this function so it doesn't loop infinitely
         remove_action('edit_term', 'insert_taxonomy_content');

         $content = "Some Content";
         $update_args = array(
             'description' => $content,
         );

         // update the post, which calls save_post again
         wp_update_term( $term_id, $taxonomy, $update_args );

         // re-hook this function
         add_action('edit_term', 'insert_taxonomy_content');
     }
 }
add_action('edit_term', 'insert_taxonomy_content', 10, 3);

L'ajout du contenu fonctionne, mais je ne peux plus modifier le titre d'un terme existant. Je ne peux pas non plus ajouter un nouveau terme.

Je pense que cela me dirige dans la bonne direction: https://wordpress.stackexchange.com/a/183852/10595

Le tableau transmis est fusionné avec les données déjà présentes dans la base de données.

Alors, comment pourrais-je capturer un nouveau titre et/ou slug entré dans le champ Nom/Slug pour le transmettre à wp_update_term?

J'ai aussi essayé ceci selon la suggestion de de cjbj :

// insert stuff into description field of taxonomy
function insert_taxonomy_content( $term_id, $taxonomy ){
    // only insert content on certain taxonomies
    if ( $taxonomy === 'some_custom_taxonomy' ){

         // unhook this function so it doesn't loop infinitely
         remove_action('edit_terms', 'insert_taxonomy_content');

         $content = "Some Content";
         $update_args = array(
             'description' => $content,
         );

         // update the post, which calls save_post again
         wp_update_term( $term_id, $taxonomy, $update_args );

         // re-hook this function
         add_action('edit_terms', 'insert_taxonomy_content');
     }
 }
add_action('edit_terms', 'insert_taxonomy_content', 10, 2);

Cela me permet de modifier à nouveau les titres et les slugs, mais maintenant, la variable description n'est pas mise à jour.

1
Florian

Donc, grâce à cjbj, j'ai enfin trouvé la bonne réponse! J'avais besoin d'utiliser edited_term au lieu de edit_term. Différence très subtile. edited_term se déclenche après la sauvegarde d'un terme.

// insert stuff into description field of taxonomy
function insert_taxonomy_content( $term_id, $tt_id, $taxonomy ){
    // only insert content on certain taxonomies
    if ( $taxonomy === 'some_custom_taxonomy' ){

         // unhook this function so it doesn't loop infinitely
         remove_action('edited_term', 'insert_taxonomy_content');

         $content = "Some Content";
         $update_args = array(
             'description' => $content,
         );

         // update the post, which calls save_post again
         wp_update_term( $term_id, $taxonomy, $update_args );

         // re-hook this function
         add_action('edited_term', 'insert_taxonomy_content');
     }
 }
add_action('edited_term', 'insert_taxonomy_content', 10, 3);
2
Florian

Le hook edit_term se déclenche " après un terme a été mis à jour, mais avant le nettoyage de son cache. ". Ainsi, chaque fois que vous mettez à jour un terme, vous lancez une fonction qui le met à jour à nouveau, mais uniquement sa description. Je n'ai pas testé cela, mais je peux imaginer que quelque part dans ce processus, WP perd la première mise à jour et pense que la deuxième mise à jour est la seule qui compte.

Quoi qu'il en soit, je vous suggère d'essayer le crochet edit_terms , qui se déclenche avant le terme est mis à jour. De cette manière, votre mise à jour n'interrompt pas le processus de mise à jour habituel.

UPDATE

Cela peut devenir un peu un jeu de devinettes, mais il y a quelques autres crochets dans wp_update_term que vous pouvez essayer: edited_terms, edit_term_taxonomy et edited_term_taxonomy.

Cependant, il reste que vous appelez wp_update_term à mi-chemin de wp_update_term. Cette fonction manipule la variable globale $wpdb. Ainsi, la base de données est d'abord modifiée par la première partie de l'appel externe, puis par l'appel interne (votre fonction), puis à nouveau par la seconde partie de l'appel externe.

Une meilleure solution serait peut-être de laisser tomber l'appel à wp_update_terms dans votre fonction. Au lieu de cela, vous pouvez essayer de mettre à jour la description immédiatement en utilisant $wpdb->update, afin qu'aucune autre manipulation de la base de données n'ait lieu dans votre fonction de hook. Je ne pouvais pas tester cela, mais en traçant comment wp_update_terms traitait la description, cela ressemblerait à ceci:

$description = "Some Content";
$wpdb->update( $wpdb->term_taxonomy, compact( 'description' ));
1
cjbj