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
适合这样做:-)