Php 获取wp\u insert\u post\u数据过滤器中的自定义字段值

Php 获取wp\u insert\u post\u数据过滤器中的自定义字段值,php,wordpress,hook,advanced-custom-fields,Php,Wordpress,Hook,Advanced Custom Fields,大家好,感谢阅读 环境: Wordpress+高级自定义字段插件 问题: 我已经搜索了几个小时,但似乎找不到执行以下操作的正确语法: 发布新帖子时,获取自定义字段值,以便用该值自动替换帖子标题。示例:我创建了一篇帖子,并在“时间”自定义字段中设置了“10am”。帖子的标题将自动替换为“上午10点” 示例: 因此,我添加了一个具有以下内容的过滤器: add_filter('wp_insert_post_data', 'change_title') ; function change_tit

大家好,感谢阅读


环境

Wordpress+高级自定义字段插件


问题:

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

发布新帖子时,获取自定义字段值,以便用该值自动替换帖子标题。示例:我创建了一篇帖子,并在“时间”自定义字段中设置了“10am”。帖子的标题将自动替换为“上午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和插件文档中可用的所有功能。如果有路过的人给我答案,我会非常感激

提前谢谢

你可以试试这个

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
}

实际上,您可以为字段值访问全局$\u POST变量,但我想您可以通过使用save\u 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的答案更新答案。

调整Riadh接受的答案(将添加为注释,但尚未获得足够的代表):

wp\u update\u post
中所述,包括
save\u post
钩子,因此在
save\u post
钩子中调用
wp\u update\u 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');
}    

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

查找
数据字段键
。您将在页面源代码中看到一个类似于
数据字段key=“field5847B00820F13”
的值。在访问
wp\u insert\u post\u data
过滤器中的
$postarr
参数中的值时使用此值。自定义字段将位于
$postarr
参数中名为
fields
的嵌套数组中

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

在下面的示例中,我连接了两个高级自定义字段,并更新从函数返回的
$data
数组中的
post\u title

结果是,
post\u title
值将通过内置Wordpress save post逻辑保存到数据库中

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;
}

很好用,非常感谢!就我所知,如果我在你的建议中理解正确,我们将在帖子创建后更新帖子,而在我的帖子中,我试图获取一个自定义字段,而帖子尚未创建,对吗?这将导致无限循环。这不会获取新创建帖子的自定义字段。它只在更新现有帖子时起作用。是的,它不会起作用,
save\u post
适合这样做:-)