使用分层分类法更新 post 标题 - 需要孙子们也能渡过难关

Update post title with hierarchical taxonomy - need grandchildren to also pull through

我花了一段时间才达到这一点,但我需要一些帮助。

我有一个函数可以在保存时设置自定义 post 标题以包含分层分类法。到目前为止,parent 和 child 正在渡过难关,但 grandchild 还没有。

我尝试了多种代码变体,我的主要问题是我需要获取当前条款(保存时),而不是获取当前针对 post 保存的条款。

任何人都可以根据下面的代码帮助让 grandchildren 添加到 post 标题中吗?术语必须按层级顺序排列 (parent>child>grandchild):

非常感谢。

add_action('save_post', 'update_term_title');
function update_term_title($post_id)
{
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
        return;
    if(!current_user_can('edit_post', $post_id))
        return;

    $terms = wp_get_post_terms($post_id, 'TAXONOMY');

    if(empty($terms))
        return;

    $title = false;
    foreach($terms as $term)
    {
        if($term->parent)
        {
            $parent = get_term($term->parent, 'TAXONOMY');
            $title = $parent->name.' '.$term->name;
            break;
        }
    }
    /*Default to first selected term name if no children were found*/
    $title = $title ? $title : $terms[0]->name;

    remove_action('save_post', 'update_term_title');
    $update = array(
        'ID'=>$post_id,
        'post_name'=>sanitize_title_with_dashes($title),
        'post_title'=>$title
    );
    wp_update_post($update);
    add_action('save_post', 'update_term_title');
}

这是一个应该可以解决问题的修改版本:

add_action('save_post', 'update_term_title');
function update_term_title($post_id)
{
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
    return;
if(!current_user_can('edit_post', $post_id))
    return;

$terms = wp_get_post_terms($post_id, 'TAXONOMY');

if(empty($terms))
    return;

$parent = $child = $grandchild = false;
$parent_id = $child_id = $grandchild_id = 0;

// Find parent
foreach($terms as $term)
{
    if(!$term->parent)
    {
        $parent = $term->name;
        $parent_id = $term->term_id;
        break;
    }
}
// Find child
foreach($terms as $term)
{
    if($term->parent == $parent_id)
    {
        $child = $term->name;
        $child_id = $term->term_id;
        break;
    }
}
// Find grandchild
foreach($terms as $term)
{
    if($term->parent == $child_id)
    {
        $grandchild = $term->name;
        $grandchild_id = $term->term_id;
        break;
    }
}

$title = trim( $parent . ' ' . $child . ' ' . $grandchild );

remove_action('save_post', 'update_term_title');
$update = array(
    'ID'=>$post_id,
    'post_name'=>sanitize_title_with_dashes($title),
    'post_title'=>$title
);
wp_update_post($update);
add_action('save_post', 'update_term_title');
}