web-dev-qa-db-fra.com

Importation en masse de données JSON dans des champs personnalisés (postmeta)

Je suis en train d'importer de grandes quantités de données dans un type de publication personnalisé comportant plusieurs champs personnalisés (champs postmeta créés par Champs personnalisés avancés ). J'utilise la fonction suivante pour importer les données et cela fonctionne bien avec mon fichier de test d'environ 10 messages, à l'exception du postmeta. Voici la fonction que j'utilise pour l'importation:

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

La méta de publication est effectivement importée, mais je dois cliquer manuellement sur le bouton de mise à jour pour afficher les données sur le front-end. J'ai cherché un peu et trouvé ceci (ci-dessous, je lierais l'article mais je l'ai perdu) que j'ai essayé et j'ai limité le nombre de messages à 10 pour éliminer les problèmes de mémoire, mais cela n'a toujours pas l'effet souhaité. reproduire le clic sur le bouton publier.

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

Je suis également conscient que cela va coûter cher en mémoire et je ne suis pas sûr de la meilleure façon de procéder. Peut-être par lots?

EDIT: Je devrais mentionner que les données sont affichées au début par l’intermédiaire de l’API WP, qui semble en fait être le problème. Donc, je suppose que je dois mettre à jour l'API plutôt que le post méta dans la base de données. Le plug-in qui affiche les métadonnées ACF pour l'API WP est/ ACF vers WP-API .

1
mantis

Ajoutez simplement ceci pour la postérité au cas où quelqu'un Le problème est en effet avec ACF qui ajoute insère deux lignes dans la base de données.

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

Donc, afin d'importer postmeta dans des champs ACF, vous devez également ajouter la deuxième ligne de postmeta contenant le nom du champ (précédé d'un trait de soulignement) et la clé de champ qui ressemble à field_16d7f66185fc6.

Donc, dans l'exemple précédent, il doit y avoir un deuxième tableau comme ceci:

$field_meta    = array(
        '_meta_1'        => field_16d6e32f46959,
        '_meta_2'        => field_16d6e42d461ce,
        '_meta_3'        => field_16d6e5254695c,
);

Qui est bouclé après la fonction 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 );
}

Une fois la deuxième ligne de méta de champ ajoutée, les champs sont disponibles dans WP-API.

1
mantis

update_field() est une fonction ACF, donc je suppose que le problème vient de celle-ci. À partir des sources, il appelle get_field_object() et ainsi de suite, de sorte que l’environnement risque de ne pas être suffisant pour fonctionner correctement lors de l’importation.

Il n'y a pas d'état "à moitié" pour les métadonnées natives, qu'elles existent dans la base de données ou non. Vous pouvez essayer de vous en tenir à l'API native WP pour les métadonnées, mais vous ne savez pas exactement ce qui est réellement nécessaire pour qu'ACF le récupère correctement.

2
Rarst