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