使用分层分类法更新 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');
}
我花了一段时间才达到这一点,但我需要一些帮助。
我有一个函数可以在保存时设置自定义 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');
}