Wordpress:无法在 wp_insert_post 之后设置 post 的 ACF 转发器字段
Wordpress: Cannot set ACF repeater field of a post after wp_insert_post
我现在正在使用 WordPress 高级自定义字段 插件:http://www.advancedcustomfields.com/
并且我在自定义 post_type 上设置了转发器字段 rows
sales_order
:
然后,现在使用脚本插入 post:
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_name' => $slug,
'post_content' => $content,
'post_type' => 'sales_order',
'post_status' => 'publish',
));
但是当我这样做时:
update_field('rows', array(), $post_id);
没有效果。
但是如果我先在管理面板中手动保存 post,然后调用 update_field
方法,就可以了。
所以,我试图监视 wp_postmeta
数据库 table,我发现如果我使用脚本调用 wp_insert_post
,post 不会生成元数据
| meta_key | meta_value |
|----------|---------------------|
| _rows | field_568e7aeb22714 |
正确。
但是我必须使用纯脚本执行导入工作流,我该如何解决这个问题?
您正在传递 field_name
,但 update_field
需要 field_key
,如文档所述 update_field
考虑这个例子
update_field('field_568e7aeb22714', array(), $post_id);
最后根据源码解决了
原因:
为什么下面的操作失败了?
update_field('rows', array(), $post_id);
现在我们使用的是字段名称,而不是字段键。
在这种情况下,ACF 将执行以下操作:
- 尝试查找具有
meta_key
的当前 post 元:_rows
,它在 字段名称 [= 之前添加了 under-slash 63=].
- 之后,得到
meta_value
,它应该是一个字段键,其形式类似于field_XXXXXXX
- 用建立的field_key.
更新字段
现在我们知道,如果我们以这种方式wp_insert_post
,_rows
meta 不会生成正确的meta_value
。
因此,如果我们在管理面板中更新 post,则会提交 字段键 并生成正确的 meta_value
.
Conclusion: Only THAT meta value matters.
解决方案:
所以,其实我们唯一更应该做的就是将ACF中定义的那个meta_values设置绑定到指定的post_type
.
以下例程适用于:
// The current post_type to search
$post_type = 'sales_order';
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_name' => $slug,
'post_content' => $content,
'post_type' => $post_type,
'post_status' => 'publish',
));
foreach (get_posts(array('post_type' => 'acf', 'posts_per_page' => -1)) as $acf) {
$meta = get_post_meta($acf->ID);
$rule = unserialize($meta['rule'][0]);
if($rule['param'] == 'post_type' &&
$rule['operator'] == '==' &&
$rule['value'] == $post_type) {
foreach($meta as $key => $field) {
if(substr($key, 0, 6) == 'field_') {
$field = unserialize($field[0]);
update_post_meta($post_id, '_'.$field['name'], $key);
}
}
}
}
请注意,我们遍历所有定义的 ACF posts,并检查 rule
元数据,以确认它是否在指定的 post_type
.[=25 范围内=]
如果是,则循环所有以 field_
开头的 ACF 元数据,并将元数据设置为当前 post。
全部完成。
$i = 0; //for metakey
$j=0; //files Count
foreach($files as $fileid){
$j++;
$meta_key = 'files_'.$i.'_file';
//"files" repeater main name and "file" subname ;
update_post_meta($post_id,$meta_key,$fileid);
$i++;
}
update_post_meta($post_id,'files',$j);
我现在正在使用 WordPress 高级自定义字段 插件:http://www.advancedcustomfields.com/
并且我在自定义 post_type 上设置了转发器字段 rows
sales_order
:
然后,现在使用脚本插入 post:
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_name' => $slug,
'post_content' => $content,
'post_type' => 'sales_order',
'post_status' => 'publish',
));
但是当我这样做时:
update_field('rows', array(), $post_id);
没有效果。
但是如果我先在管理面板中手动保存 post,然后调用 update_field
方法,就可以了。
所以,我试图监视 wp_postmeta
数据库 table,我发现如果我使用脚本调用 wp_insert_post
,post 不会生成元数据
| meta_key | meta_value |
|----------|---------------------|
| _rows | field_568e7aeb22714 |
正确。
但是我必须使用纯脚本执行导入工作流,我该如何解决这个问题?
您正在传递 field_name
,但 update_field
需要 field_key
,如文档所述 update_field
考虑这个例子
update_field('field_568e7aeb22714', array(), $post_id);
最后根据源码解决了
原因:
为什么下面的操作失败了?
update_field('rows', array(), $post_id);
现在我们使用的是字段名称,而不是字段键。
在这种情况下,ACF 将执行以下操作:
- 尝试查找具有
meta_key
的当前 post 元:_rows
,它在 字段名称 [= 之前添加了 under-slash 63=]. - 之后,得到
meta_value
,它应该是一个字段键,其形式类似于field_XXXXXXX
- 用建立的field_key. 更新字段
现在我们知道,如果我们以这种方式wp_insert_post
,_rows
meta 不会生成正确的meta_value
。
因此,如果我们在管理面板中更新 post,则会提交 字段键 并生成正确的 meta_value
.
Conclusion: Only THAT meta value matters.
解决方案:
所以,其实我们唯一更应该做的就是将ACF中定义的那个meta_values设置绑定到指定的post_type
.
以下例程适用于:
// The current post_type to search
$post_type = 'sales_order';
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_name' => $slug,
'post_content' => $content,
'post_type' => $post_type,
'post_status' => 'publish',
));
foreach (get_posts(array('post_type' => 'acf', 'posts_per_page' => -1)) as $acf) {
$meta = get_post_meta($acf->ID);
$rule = unserialize($meta['rule'][0]);
if($rule['param'] == 'post_type' &&
$rule['operator'] == '==' &&
$rule['value'] == $post_type) {
foreach($meta as $key => $field) {
if(substr($key, 0, 6) == 'field_') {
$field = unserialize($field[0]);
update_post_meta($post_id, '_'.$field['name'], $key);
}
}
}
}
请注意,我们遍历所有定义的 ACF posts,并检查 rule
元数据,以确认它是否在指定的 post_type
.[=25 范围内=]
如果是,则循环所有以 field_
开头的 ACF 元数据,并将元数据设置为当前 post。
全部完成。
$i = 0; //for metakey
$j=0; //files Count
foreach($files as $fileid){
$j++;
$meta_key = 'files_'.$i.'_file';
//"files" repeater main name and "file" subname ;
update_post_meta($post_id,$meta_key,$fileid);
$i++;
}
update_post_meta($post_id,'files',$j);