我正在将大量数据导入到具有多个自定义字段(由创建的Posteta字段)的自定义post类型中Advanced Custom Fields). 我正在使用以下函数导入数据,它可以很好地处理我的测试文件,其中包括大约10篇文章,但Posteta除外。以下是我用于导入的函数:
function mysite_import_json() {
$json_feed = \'http://local.mysite.com/wp-content/test.json\';
$json = file_get_contents( $json_feed );
$objs = json_decode( $json, true );
$wp_error = true;
$post_id = - 1;
foreach ( $objs as $obj ) {
$title = $obj[\'title\'];
$meta1 = $obj[\'taxonomy\'][0];
$meta2 = $obj[\'nom\'];
$meta3 = $obj[\'prenom\'];
$d = new DateTime();
$d->setTimestamp( $obj[\'created\'] );
$date_created = $d->format( \'Y-m-d H:i:s\' );
$post_meta = array(
\'meta_1\' => $meta1,
\'meta_2\' => $meta2,
\'meta_3\' => $meta3,
);
$post_data = array(
\'post_title\' => $title,
\'post_date\' => $date_created,
\'post_status\' => \'publish\',
\'post_type\' => \'cpt\',
\'meta_input\' => $post_meta,
);
if ( null === get_page_by_title( $title, \'object\', \'message\' ) ) {
$post_id = wp_insert_post( $post_data, $wp_error );
foreach ( $post_meta as $key => $value ) {
update_field( $key, $value, $post_id );
}
} else {
$post_id = - 2;
}
}
}
add_action( \'after_setup_theme\', \'mysite_import_json\' );
post meta确实已导入,但我必须手动单击update按钮才能在前端显示数据。我对此进行了一些研究,发现了这个(下面,我会链接这篇文章,但我丢失了它),我尝试将帖子数量限制为10篇,以排除内存问题,但它仍然没有复制单击发布按钮的预期效果。
function mass_update_posts() {
$args = array(
\'post_type\' => \'message\',
\'posts_per_page\' => 10
);
$my_posts = get_posts( $args );
foreach ( $my_posts as $key => $my_post ) {
$meta_values = get_post_meta( $my_post->ID );
foreach ( $meta_values as $meta_key => $meta_value ) {
update_field( $meta_key, $meta_value[0], $my_post->ID );
}
}
}
add_action( \'init\', \'mass_update_posts\' );
我也知道,这将是昂贵的内存明智的,我不知道最好的方式去做这件事。也许是成批?
编辑:我应该提到,数据通过WP API显示在前端,这实际上似乎是问题所在。所以我想我需要更新API,而不是数据库中的post meta。为WP API显示ACF元数据的插件是ACF to WP-API.
最合适的回答,由SO网友:mantis 整理而成
只是为了子孙后代添加这个,以防其他人遇到这个问题。问题确实出在ACF上,它在数据库中添加了两行INSERT。
meta_key | meta_value
{$field_name} | $value
_{$field_name} | $field_key
因此,为了将Posteta导入到ACF字段中,还需要添加第二行Posteta,其中包含字段名(前面有下划线)和字段键
field_16d7f66185fc6
因此,在上一个示例中,需要第二个这样的数组:
$field_meta = array(
\'_meta_1\' => field_16d6e32f46959,
\'_meta_2\' => field_16d6e42d461ce,
\'_meta_3\' => field_16d6e5254695c,
);
在
wp_insert_post()
功能:
$post_id = wp_insert_post( $post_data, $wp_error );
foreach ( $field_meta as $key => $value ) {
update_post_meta( $post_id, $key, $value );
}
添加第二行字段meta后,这些字段将在WP-API中可用。