将json数据批量导入自定义字段(POSTMETA)

时间:2016-05-14 作者:mantis

我正在将大量数据导入到具有多个自定义字段(由创建的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.

2 个回复
最合适的回答,由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中可用。

SO网友:Rarst

update_field() 是ACF函数,所以我猜问题出在它身上。通过快速查看其调用的源get_field_object() 等等,所以环境可能不足以使其在导入期间正常工作。

本机元数据没有“半”状态,要么存在于数据库中,要么不存在。您可以尝试使用本机WP API获取元数据,但不知道ACF正确获取元数据实际需要什么。