如何用自定义字段替换帖子标题?

时间:2017-08-17 作者:Shed Simas

我一直在努力实现这一点,但没有成功。我有一个自定义的帖子类型“Contributor”,在这里我禁用了默认的标题字段,我正试图找出如何根据高级自定义字段中的四个值设置自定义标题:

“公司”吗复选框公司名称文本字段(如果选中了“公司”)给定名称和姓氏文本字段的组合(如果未选中“公司”)我正在使用此函数来组合管理列的全名,例如:

function biwp_contributor_name($post_id) {
    $corporate = get_field(\'biwp_corporate\', $post_id ); //get Corporate checkbox value
    if ($corporate) { //if Corporate is checked, use biwp_cname (Corportate Name)
        $name = get_field(\'biwp_cname\', $post_id );
    } else { //if Corporate is unchecked, use biwp_gnames (Given Names) and biwp_snames (Surnames)
        $gnames = get_field(\'biwp_gnames\', $post_id );
        $snames = get_field(\'biwp_snames\', $post_id );
        $name = $gnames .\' \'. $snames;
    }
    return $name;
}
这对于展示来说非常有用。但问题是WP中的许多内容都依赖于默认标题,因此使用该函数来实际创建帖子标题(和slug)会更好。

我已经看到了一些关于这个主题的其他帖子,尝试了一些不同的解决方案,但都没有用。这一条来自this ACF forum thread:

add_filter(\'acf/update_value\', \'biwp_fix_contributor_title\', 10, 3);

function biwp_fix_contributor_title( $value, $post_id, $field ) {
    if (get_post_type($post_id) == \'contributor\') {

        $name = biwp_contributor_name($post_id);
        $new_title = $name;
        $new_slug = sanitize_title( $new_title );

        // update post
        $biwp_contributor = array(
            \'ID\'          => $post_id,
            \'post_title\'  => $new_title,
            \'post_name\'   => $new_slug,
        );  

        if ( ! wp_is_post_revision( $post_id ) ){
            // unhook this function so it doesn\'t loop infinitely
            remove_action(\'save_post\', \'biwp_fix_contributor_title\');
            // update the post, which calls save_post again
            wp_update_post( $biwp_contributor );
            // re-hook this function
            add_action(\'save_post\', \'biwp_fix_contributor_title\');
        }

    }   

    return $value;
}
这个是this SE thread:

add_action(\'save_post\', \'biwp_fix_contributor_title\', 12);

function biwp_fix_contributor_title ($post_id) {
    if ( $post_id == null || empty($_POST) )
        return;

    if ( !isset( $_POST[\'post_type\'] ) || $_POST[\'post_type\']!=\'contributor\' )  
        return; 

    if ( wp_is_post_revision( $post_id ) )
        $post_id = wp_is_post_revision( $post_id );

    global $post;  
    if ( empty( $post ) )
        $post = get_post($post_id);

    if ($_POST[\'biwp_corporate\']!=\'\') {
        global $wpdb;
        $name = biwp_contributor_name($post_id);
        $where = array( \'ID\' => $post_id );
        $wpdb->update( $wpdb->posts, array( \'post_title\' => $name ), $where );
    }
}
但这两者似乎都没有起到任何实际作用,甚至都没有产生负面的、令人不快的影响,这真的让我感到奇怪。

提前感谢您的帮助。

2 个回复
SO网友:Dylan

这个acf/update_value 过滤器无法工作,因为它用于修改acf值,而不是与之关联的帖子。尝试使用acf/save_post 改为操作。下面是一个简化的示例,说明我通常如何从acf中的名字和姓氏字段设置帖子标题。

add_action( \'acf/save_post\', \'biwp_set_title_from_first_last_name\', 20 );

function biwp_set_title_from_first_last_name( $post_id ) {
    $post_type = get_post_type( $post_id );

    if ( \'contributor\' == $post_type ) {
        $first_name = get_field( \'biwp_first_name\', $post_id );
        $last_name = get_field( \'biwp_last_name\', $post_id );

        $title = $first_name . \' \' . $last_name; 

        $data = array(
            \'ID\'         => $post_id,
            \'post_title\' => $title,
            \'post_name\'  => sanitize_title( $title ),
        );

        wp_update_post( $data );
    }
}
请注意操作中使用的20的优先级。小于10的优先级将挂接到acf/save_post ACF保存$\\u POST数据之前的操作。而大于10的优先级将挂接到acf/save_post ACF保存$\\u POST数据后的操作。我使用的是20,因此我可以访问已保存的acf数据。

查看文档,acf的5.6.0版本刚刚添加了一个名为$values的参数,该参数是一个包含字段值的数组。您可以使用它直接获取acf值,而不是使用get_field.

SO网友:Tiffany Tyree

我偏离了迪伦的答案,修改了你说不适合你的部分。这将检查以确保帖子具有用于填充值的acf字段的值,而不是检查帖子类型。这个解决方案对我有效,我希望对你也有效。

add_action( \'acf/save_post\', \'set_title\', 20 );

function set_title( $post_id ) {

    if (get_post_meta( $post_id, \'contributor\', true )) {

        $title = get_post_meta( $post_id, \'contributor\', true );

        $data = array(
            \'ID\'         => $post_id,
            \'post_title\' => $title,
            \'post_name\'  => sanitize_title( $title ),
        );

        wp_update_post( $data );
    }
}

结束

相关推荐

如何用自定义字段替换帖子标题? - 小码农CODE - 行之有效找到问题解决它

如何用自定义字段替换帖子标题?

时间:2017-08-17 作者:Shed Simas

我一直在努力实现这一点,但没有成功。我有一个自定义的帖子类型“Contributor”,在这里我禁用了默认的标题字段,我正试图找出如何根据高级自定义字段中的四个值设置自定义标题:

“公司”吗复选框公司名称文本字段(如果选中了“公司”)给定名称和姓氏文本字段的组合(如果未选中“公司”)我正在使用此函数来组合管理列的全名,例如:

function biwp_contributor_name($post_id) {
    $corporate = get_field(\'biwp_corporate\', $post_id ); //get Corporate checkbox value
    if ($corporate) { //if Corporate is checked, use biwp_cname (Corportate Name)
        $name = get_field(\'biwp_cname\', $post_id );
    } else { //if Corporate is unchecked, use biwp_gnames (Given Names) and biwp_snames (Surnames)
        $gnames = get_field(\'biwp_gnames\', $post_id );
        $snames = get_field(\'biwp_snames\', $post_id );
        $name = $gnames .\' \'. $snames;
    }
    return $name;
}
这对于展示来说非常有用。但问题是WP中的许多内容都依赖于默认标题,因此使用该函数来实际创建帖子标题(和slug)会更好。

我已经看到了一些关于这个主题的其他帖子,尝试了一些不同的解决方案,但都没有用。这一条来自this ACF forum thread:

add_filter(\'acf/update_value\', \'biwp_fix_contributor_title\', 10, 3);

function biwp_fix_contributor_title( $value, $post_id, $field ) {
    if (get_post_type($post_id) == \'contributor\') {

        $name = biwp_contributor_name($post_id);
        $new_title = $name;
        $new_slug = sanitize_title( $new_title );

        // update post
        $biwp_contributor = array(
            \'ID\'          => $post_id,
            \'post_title\'  => $new_title,
            \'post_name\'   => $new_slug,
        );  

        if ( ! wp_is_post_revision( $post_id ) ){
            // unhook this function so it doesn\'t loop infinitely
            remove_action(\'save_post\', \'biwp_fix_contributor_title\');
            // update the post, which calls save_post again
            wp_update_post( $biwp_contributor );
            // re-hook this function
            add_action(\'save_post\', \'biwp_fix_contributor_title\');
        }

    }   

    return $value;
}
这个是this SE thread:

add_action(\'save_post\', \'biwp_fix_contributor_title\', 12);

function biwp_fix_contributor_title ($post_id) {
    if ( $post_id == null || empty($_POST) )
        return;

    if ( !isset( $_POST[\'post_type\'] ) || $_POST[\'post_type\']!=\'contributor\' )  
        return; 

    if ( wp_is_post_revision( $post_id ) )
        $post_id = wp_is_post_revision( $post_id );

    global $post;  
    if ( empty( $post ) )
        $post = get_post($post_id);

    if ($_POST[\'biwp_corporate\']!=\'\') {
        global $wpdb;
        $name = biwp_contributor_name($post_id);
        $where = array( \'ID\' => $post_id );
        $wpdb->update( $wpdb->posts, array( \'post_title\' => $name ), $where );
    }
}
但这两者似乎都没有起到任何实际作用,甚至都没有产生负面的、令人不快的影响,这真的让我感到奇怪。

提前感谢您的帮助。

2 个回复
SO网友:Dylan

这个acf/update_value 过滤器无法工作,因为它用于修改acf值,而不是与之关联的帖子。尝试使用acf/save_post 改为操作。下面是一个简化的示例,说明我通常如何从acf中的名字和姓氏字段设置帖子标题。

add_action( \'acf/save_post\', \'biwp_set_title_from_first_last_name\', 20 );

function biwp_set_title_from_first_last_name( $post_id ) {
    $post_type = get_post_type( $post_id );

    if ( \'contributor\' == $post_type ) {
        $first_name = get_field( \'biwp_first_name\', $post_id );
        $last_name = get_field( \'biwp_last_name\', $post_id );

        $title = $first_name . \' \' . $last_name; 

        $data = array(
            \'ID\'         => $post_id,
            \'post_title\' => $title,
            \'post_name\'  => sanitize_title( $title ),
        );

        wp_update_post( $data );
    }
}
请注意操作中使用的20的优先级。小于10的优先级将挂接到acf/save_post ACF保存$\\u POST数据之前的操作。而大于10的优先级将挂接到acf/save_post ACF保存$\\u POST数据后的操作。我使用的是20,因此我可以访问已保存的acf数据。

查看文档,acf的5.6.0版本刚刚添加了一个名为$values的参数,该参数是一个包含字段值的数组。您可以使用它直接获取acf值,而不是使用get_field.

SO网友:Tiffany Tyree

我偏离了迪伦的答案,修改了你说不适合你的部分。这将检查以确保帖子具有用于填充值的acf字段的值,而不是检查帖子类型。这个解决方案对我有效,我希望对你也有效。

add_action( \'acf/save_post\', \'set_title\', 20 );

function set_title( $post_id ) {

    if (get_post_meta( $post_id, \'contributor\', true )) {

        $title = get_post_meta( $post_id, \'contributor\', true );

        $data = array(
            \'ID\'         => $post_id,
            \'post_title\' => $title,
            \'post_name\'  => sanitize_title( $title ),
        );

        wp_update_post( $data );
    }
}

相关推荐

如何让`wp-list-table`显示我在Custom-Post中的`Custom-Fields`

一切都好吗<我需要wp-list-table 也要显示custom-fields 在每个custom-post 我有,但我不知道如何做到这一点,在这幅图中,它显示了带有字段的表格:Title, Author and Publication Date: 我想要的是能够选择custom-fields 将出现,例如以下示例Title, Carta, Naipe, Author, and Date of Publication: