将自定义分类保存为帖子标题

时间:2012-11-09 作者:Lars van Peij

我有两种自定义分类法;“名字”和乐队。第一个代表歌曲的名字,第二个代表制作歌曲的乐队。

我想在保存后在帖子标题中自动保存这两个自定义分类法的组合。

因此,在下面的示例中:name=“Little Lion Man”band=“Mumford and sons”。。我想把这篇文章的标题改为“芒福德和儿子——小狮子侠”

我现在拥有的代码(而且有效!)基于this post. 然而,这段代码所做的只是获取一个自定义分类法(在本例中是歌曲名或“name”)。我想在帖子标题中加入两个自定义分类术语。

这是我现在的代码,我不知道从哪里开始。我不是php方面的专家。

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;

$term1 = wp_get_post_terms($post_id, \'name\', array(\'fields\' => \'names\'));
$term2 = wp_get_post_terms($post_id, \'band\', array(\'fields\' => \'names\'));

$terms = $term1;

if(empty($terms)) 
    return;

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

/*We must disable this hook and reenable from within
if we don\'t want to get caught in a loop*/
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\');
}
有没有人对如何做到这一点有什么建议?这应该是对代码的轻微修改。也许做两个循环?

1 个回复
最合适的回答,由SO网友:totels 整理而成

更新答案:

通过使用$args 在里面wp_get_post_terms 您不需要运行foreach 寻找子术语(您的自定义分类法是否具有层次结构?)。作为一个包罗万象的人implode 完整的列表并得到相同的结果(但在没有看到/了解您的模式的情况下,我无法确定它实际上是您想要的。)

<?php
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;

    $names = wp_get_post_terms($post_id, \'name\', array(\'fields\' => \'names\'));
    // $names == array( 0 => \'name1\'[, 1 => \'name2\'[, 2 => ...]])
    $bands = wp_get_post_terms($post_id, \'band\', array(\'fields\' => \'names\'));
    // $bands == array( 0 => \'band1\'[, 1 => \'band2\'[, 2 => ...]])

    // collapse parent and child terms
    $name = implode(\' \', $names);
    // $name == "name1[ name2[ ...]]"
    $band = implode(\' \', $bands);
    // $band == "band1[ band2[ ...]]"

    if ($name OR $band) {
        // concat name and band, use trim to clean the string if one is missing
        $title = trim(implode(\' \', array($name, $band)));
        // $title == "name1[ name2[ ...]] band1[ band2[ ...]]"
        // disable and reenable hook from within to avoid a loop
        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数据的过滤器,名为wp_insert_post_data 用于在DB更新/插入之前更改post数据,但您可能需要了解更多内容,才能了解如何引用尚未保存的分类项目。上述方法在技术上相当昂贵,因为它需要保存一篇文章,请求该文章,然后再次保存该文章

旧答案:

wp_get_post_terms() 返回数组,而不是字符串。wp_get_post_terms docs

你需要治疗$term1$term2 作为阵列。

$term1 = wp_get_post_terms($post_id, \'name\', array(\'fields\' => \'names\'));
$term2 = wp_get_post_terms($post_id, \'band\', array(\'fields\' => \'names\'));
# this assumes the first term in the taxonomy is the one you want
$terms = array_pop($term1) . array_pop($term2);

结束

相关推荐

是否始终将自定义字段设置为.get_the_title()?

有没有办法让the_title() 标记还包括一个名为subtitle?的自定义字段?我想要这样的标题:“字幕自定义字段:帖子标题”。例如,“酷:沃纳·赫尔佐格的新电视节目”在这种情况下,cool将是自定义字段值,而新TV将是the_title().我现在通过以下代码获得此信息:<h1><?php $values = get_post_custom_values(\"myCustomField\"); echo $values[0]; ?>: <?php the_title(