8

大家好,感谢阅读。


环境

Wordpress + 高级自定义字段插件


问题 :

我已经搜索了几个小时,但似乎找不到正确的语法来执行以下操作:

发布新帖子时,获取自定义字段值,以便用该值自动替换帖子的标题。示例:我创建了一个帖子并在我的“时间”自定义字段中设置了“上午 10 点”。帖子的标题会自动替换为“上午 10 点”。


例子:

所以我添加了一个带有以下内容的过滤器:

add_filter('wp_insert_post_data', 'change_title') ;

function change_title($data)

{

    $time = XXX ; // How should I get this custom field value ?

    $new_title = 'Topic created at'.$time ;

    $data['post_title'] = $time ;

    return $data;

}

它一定很简单,但我已经尝试了 WP 和插件文档中可用的所有功能。如果有路过的人给我解决方案,我将非常感激。

提前致谢 !

4

4 回答 4

9

调整 Riadh 接受的答案(将作为评论添加,但还没有足够的代表):

正如WordPress Codex wp_update_post中所记录的那样,包括钩子,因此在钩子内save_post调用会创建一个无限循环。为避免这种情况,请取消挂钩然后重新挂钩您的函数,如下所示:wp_update_post()save_post

add_action('save_post', 'change_title');

function change_title($post_id) {
    $time = get_field('time',$post_id);
    $post_title = 'Topic created at '. $time;

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'change_title');

    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));

    // re-hook this function
    add_action('save_post', 'change_title');
}    
于 2014-08-24T07:12:35.957 回答
6

您实际上可以为您的字段值访问全局 $_POST 变量,但我想您可以通过使用 save_post 操作来更新您的帖子标题以更简洁的方式进行操作,例如:

add_action('save_post', 'change_title');

function change_title($post_id) {
    $time = get_field('time',$post_id);
    $post_title = 'Topic created at '. $time;

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'change_title');

    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));

    // re-hook this function
    add_action('save_post', 'change_title');
}  

假设您的 ACF 字段名称是“时间”。

编辑:根据 Mark Chitty 的回答更新了答案。

于 2014-02-12T02:45:19.190 回答
0

你可以试试这个

add_filter( 'wp_insert_post_data', 'change_title', '99', 2 );

function change_title($data , $postarr){

    $custom_field = 'custom_filed_name';
    $post_id = $postarr['ID'];
    $time = get_post_meta( $post_id, $custom_field, true );

    // Now you have the value, do whatever you want
}
于 2014-02-12T02:34:57.910 回答
0

高级自定义字段为创建的每个自定义字段创建一个“字段键”。尝试访问自定义字段时,我能够引用此键值。在 Wordpress 管理部分中查看帖子类型时,可以通过查看页面源找到字段键值。

寻找data-field-key。您将data-field-key="field_5847b00820f13"在页面源中看到类似的值。访问过滤器中$postarr参数中的值时使用此值。wp_insert_post_data自定义字段将位于参数fields内命名的嵌套数组中。$postarr

或者,可以通过从管理部分导航到高级自定义字段/导出选项来定位字段键值。进入高级自定义字段的导出页面后,选择导出到 PHP 选项,您将在生成的 PHP 代码中看到该值。

在下面的示例中,我将连接两个高级自定义字段并更新从函数返回post_title$data数组中的 。

结果是该post_title值将通过内置的 Wordpress 保存后逻辑保存到数据库中。

add_filter('wp_insert_post_data', 'slb_set_title', '99', 2);

function slb_set_title ($data, $postarr){
  if($data['post_type']==='slb_subscriber'){
    $data['post_title'] = $postarr['fields']['field_5847b00820f13'] .' '.       
    $postarr['fields']['field_5847b03f20f14'];
  }
return $data;
}
于 2016-12-27T03:24:17.330 回答