J'ai examiné des actions et des crochets, etc ... de Wordpress, mais je ne peux pas sembler faire une chose très simple. Je veux juste exécuter une fonction à chaque fois qu'une publication est mise à jour, et dans la fonction, je veux les noms des termes qui ont été modifiés lors de la sauvegarde. Alors peut-être une sorte de comparaison avant et après des termes ??
Est-ce que quelqu'un pourrait me donner un indice sur la direction à suivre? J'ai commencé avec:
add_action('save_post', 'myFunction');
Mais je n'arrive pas à lui transmettre les termes de taxonomie avant et après pour une comparaison afin de déterminer ceux qui viennent d'être sélectionnés .. si cela a du sens.
Merci :)
Une fois que WordPress a mis à jour les termes de taxonomie d'un article, il déclenche l'action:
set_object_terms
( voir source ) qui transmet 6 variables:
Malheureusement, il n'y a aucun moyen de savoir si cet objet fait référence à post, ou à quelque chose (comme un utilisateur). Cela pourrait être un moyen de s’accrocher à set_object_terms
uniquement lorsque vous pouvez être sûr que lors de son prochain déclenchement, il fait référence à un message.
Les identifiants sont transmis sont des identifiants de taxonomie, pas des identifiants, et la plupart des fonctions WordPress utilisent ce terme. Donc, vous aurez probablement besoin d'obtenir le terme ID (et la taxonomie) à partir du terme taxonomie ID pour faire quoi que ce soit d'utile. Puisque nous connaissons la taxonomie, listez tous les termes, faites une simple boucle foreach
et filtrez-les. De meilleures suggestions sont les bienvenues
Ce qui suit n'a pas été testé.
add_action('set_object_terms','wpse61678_terms_changed',10,6);
function wpse61678_terms_changed($object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids){
//Note problem 1 - we might not necessarily know what $object_id refers to.
//Added terms are specified terms, that did not already exist
$added_tt_ids = array_diff($tt_ids, $old_tt_ids);
if( $append ){
//If appending terms - nothing was removed
$removed_tt_ids = array();
}else{
//Removed terms will be old terms, that were not specified in $tt_ids
$removed_tt_ids = array_diff($old_tt_ids, $tt_ids);
}
/*Note problem 2, we would preferably like the term objects / IDs,
Currently we have the taxonomy term IDs*/
//Get all terms
$all_terms = get_terms( $taxonomy, array('hide_empty'=>0));
$removed_terms =array()
$added_terms =array();
foreach( $all_terms as $term ){
$tt_id = (int) $term->term_taxonomy_id;
if( in_array( $tt_id, $removed_tt_ids) ){
$removed_terms[] = $term;
}elseif( in_array( $tt_id, $added_tt_ids) ){
$added_terms[] = $term;
}
}
//$added_terms contains added term objects
//$removed_terms contains removed term objects
}
S'il existe des problèmes potentiels liés à l'utilisation du crochet set_object_terms
indiqué par Stephen, il est possible que ce soit en pre_post_update
, suivi de wp_insert_post
,
add_action('pre_post_update','get_terms_before_update');
function get_terms_before_update(){
$terms_before = get_the_terms( $id, $taxonomy );
//do something else if required...
return $terms_before;
}
add_action('wp_insert_post','get_terms_after_update');
function get_terms_after_update(){
//pass in $terms_before from get_terms_before_update() function
//compare terms
}
Il s'agit d'une mise à jour de la réponse de Stephen basée sur la nouvelle fonction get_terms_by et supposant que nous savons quelle taxonomie nous voulons.
add_action('set_object_terms','save_terms',10,6);
function save_terms($object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids) {
//Assuming we only want terms from specific taxonomy
//If not simply remove this conditional
$our_taxonomy = 'categories';
if($taxonomy == $our_taxonomy){
//Added terms are specified terms, that did not already exist
$added_tt_ids = array_diff($tt_ids, $old_tt_ids);
if ($append) {
//If appending terms - nothing was removed
$removed_tt_ids = array();
} else {
//Removed terms will be old terms, that were not specified in $tt_ids
$removed_tt_ids = array_diff($old_tt_ids, $tt_ids);
}
/* Note problem 2 by Stephen, we would preferably like the term objects / IDs,
Currently we have the taxonomy term IDs */
foreach($added_tt_ids as $term){
$added_terms[] = get_term_by( 'term_taxonomy_id',$term,$taxonomy);
}
foreach($removed_tt_ids as $term){
$removed_terms[] = get_term_by( 'term_taxonomy_id',$term,$taxonomy);
}
//$added_terms contains added term objects
//$removed_terms contains removed term objects
}
}