Это не проверено, но это должен быть шаг в правильном направлении, я сделал несколько настроек и прокомментирую:
<?php
add_action('save_post','add_tags_auto');
function add_tags_auto($post_id) {
$post = get_post($post_id);
// bail if this isn't a type of post we want to auto-tag
if($post->post_type != 'CUSTOM_POST_TYPE')
return false;
// --------------------------------------------------
// get the list of tag names from the post
// --------------------------------------------------
$tagNames = array();
$tags = get_the_tags($post_id);
foreach($tags as $tag)
$tagNames[] = $tag->name;
// --------------------------------------------------
// get the list slugs from terms in the post, any
// slugs that aren't alredy a tag, will be marked for
// addition automatically
// --------------------------------------------------
$tagsToAdd = array();
foreach(get_the_terms($post_id, 'TAXONOMY_NAME') as $term)
if(!in_array($term->slug, $tagNames))
$tagsToAdd[] = $term->slug;
// if we have some new tags to add, let's do that now
if(!empty($tagsToAdd))
wp_add_post_tags($post_id, implode(',', $tagsToAdd));
}
Одна потенциальная проблема, с которой я столкнулся в вашем коде, заключалась в установке $ post после попытки его использования. Я уверен, что когда в первой строке вашей функции вызывается $ post-> id , PHP вызывает предупреждение о том, что $ post не является объектом. Итак, я переместил вызов на get_post наверх функции.
Небольшой трюк, который я добавил, - это возвращение пораньше, если сообщение не соответствует желаемому типу. Лучше сделать это КАК МОЖНО СКОРЕЕ, а не тратить время на вычисления, которые могут быть просто отброшены чеком дальше по линии.
Я также собрал количество циклов foreach и переименовал некоторые переменные для пояснения. Единственное, что я видел в вашем исходном коде, который, возможно, не работал должным образом, это вызов wp_add_post_tags , это задокументировано , чтобы принять строку с разделителем-запятой в качестве второго параметра, массив.