Создание функции, которая получает термины таксономии, измененные в пользовательском типе записи


Я изучал действия и крючки и т. Д. Из wordpress, Но, похоже, не могу сделать очень простую вещь. Я просто хочу выполнять функцию всякий раз, когда сообщение обновляется, и в рамках функции мне нужны имена терминов, которые были изменены при этом сохранении. Так что, может быть, какое-то сравнение терминов до и после??

Не мог бы кто-нибудь, пожалуйста, просто намекнуть мне, в каком направлении идти? Я начал с:

add_action('save_post', 'myFunction');

Но я, кажется, не могу пройти мимо до и после терминов таксономии к нему для сравнения, чтобы увидеть, какие только что были выбраны.. если в этом есть смысл.

Спасибо:)

Author: JamesG, 2012-08-13

3 answers

После того, как WordPress обновил термины таксономии сообщений, он запускает действие:

set_object_terms

( см. Источник), который передает 6 переменных:

  1. Идентификатор объекта
  2. Термины, которые были назначены должности (или добавлены в зависимости от 5) (могут быть их идентификатором слага или термина).
  3. Таксономия - идентификаторы терминов выше (не идентификаторы терминов)
  4. Таксономия
  5. Добавить. Если верно - термины в 2 добавляются к существующим терминам. Если ложные (по умолчанию) термины заменяют существующие термины.
  6. Условия публикации перед обновлением (как идентификаторы терминов таксономии)

Проблема 1

К сожалению, нет способа узнать, относится ли этот объект к сообщению или чему-то еще (например, к пользователю). Это может быть способ зацепиться за set_object_terms только тогда, когда вы можете быть уверены, что при следующем запуске он ссылается на сообщение.

Проблема 2

Передаваемые идентификаторы являются идентификаторами терминов таксономии, а не идентификаторами терминов, и большинство функций WordPress используют идентификатор термина. Так что вам, вероятно, нужно будет получить идентификатор термина (и таксономия) из идентификатора термина таксономии, чтобы сделать что-нибудь полезное. Потенциальный обходной путь состоит в том, чтобы, поскольку мы знаем таксономию, перечислить все термины и выполнить простой цикл foreach и отфильтровать их. Приветствуются лучшие предложения

Следующее не проверено.

 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


 }
 2
Author: Stephen Harris, 2012-08-13 15:15:35

Если есть потенциальные проблемы с использованием крючка set_object_terms, как указал Стивен, возможно, достаточно подключить pre_post_update, а затем 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
}
 2
Author: Adam, 2012-08-13 14:50:36

Это обновление ответа Стивена, основанное на новой функции get_terms_by и предполагающее, что мы знаем, какую таксономию мы хотим.

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
    }
}
 2
Author: Jason Wisely, 2015-03-01 07:33:57