web-dev-qa-db-ja.com

カスタムフィールドへのJSONデータの一括インポート(postmeta)

私は、いくつかのカスタムフィールドを持つカスタム投稿タイプ( Advanced Custom Fields によって作成されたpostmetaフィールド)に大量のデータをインポートしています。私はデータをインポートするために次の関数を使っています、そしてそれはpostmetaを除いて約10の投稿の私のテストファイルでうまく働きます。これが私がインポートに使っている関数です:

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' );

投稿メタは実際にインポートされますが、フロントエンドにデータを表示するために手動で更新ボタンをクリックしなければなりません。私はこれを少し研究して、これを見つけました(以下で、私は記事をリンクしますが、私はそれを失いました)。公開ボタンのクリックを再現します。

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 AP​​Iを介してデータがフロントエンドに表示されることに言及する必要があります。だから私はデータベース内のポストメタではなくAPIを更新する必要があると思います。 WP AP​​IのACFメタデータを表示するプラグインは、 ACF to WP-API です。

1
mantis

他の誰かがこれに遭遇した場合に備えて、これを後世に追加するだけです。問題は、実際にはACFがデータベースに2行の挿入を追加することにあります。

meta_key       | meta_value
 {$field_name} | $value
_{$field_name} | $field_key

そのため、postmetaをACFフィールドにインポートするには、フィールド名(先頭にアンダースコアが付きます)とfield_16d7f66185fc6のようなフィールドキーを含むpostmetaの2行目も追加する必要があります。

そのため、前の例では、次のような2番目の配列が必要です。

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

フィールドメタの2行目が追加されると、そのフィールドはWP-APIで使用可能になります。

1
mantis

update_field()はACF関数なので、問題はそれにあると思います。ソースを簡単に見るとget_field_object()などと呼ばれるので、インポート中に正しく動作するには環境が十分でない可能性があります。

ネイティブのメタデータには「ハーフ」状態はありません。データベースに存在するかどうかは関係ありません。あなたはメタデータのためにネイティブのWP AP​​Iを使い続けることを試みることができましたが、ACFがそれを正しく拾うために実際に何が必要なのかわかりません。

2
Rarst