Создание функции, которая получает термины таксономии, измененные в пользовательском типе записи
Я изучал действия и крючки и т. Д. Из wordpress, Но, похоже, не могу сделать очень простую вещь. Я просто хочу выполнять функцию всякий раз, когда сообщение обновляется, и в рамках функции мне нужны имена терминов, которые были изменены при этом сохранении. Так что, может быть, какое-то сравнение терминов до и после??
Не мог бы кто-нибудь, пожалуйста, просто намекнуть мне, в каком направлении идти? Я начал с:
add_action('save_post', 'myFunction');
Но я, кажется, не могу пройти мимо до и после терминов таксономии к нему для сравнения, чтобы увидеть, какие только что были выбраны.. если в этом есть смысл.
Спасибо:)
3 answers
После того, как WordPress обновил термины таксономии сообщений, он запускает действие:
set_object_terms
( см. Источник), который передает 6 переменных:
- Идентификатор объекта
- Термины, которые были назначены должности (или добавлены в зависимости от 5) (могут быть их идентификатором слага или термина).
- Таксономия - идентификаторы терминов выше (не идентификаторы терминов)
- Таксономия
- Добавить. Если верно - термины в 2 добавляются к существующим терминам. Если ложные (по умолчанию) термины заменяют существующие термины.
- Условия публикации перед обновлением (как идентификаторы терминов таксономии)
Проблема 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
}
Если есть потенциальные проблемы с использованием крючка 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
}
Это обновление ответа Стивена, основанное на новой функции 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
}
}