web-dev-qa-db-de.com

Massenimport von JSON-Daten in benutzerdefinierte Felder (Postmeta)

Ich importiere gerade große Datenmengen in einen benutzerdefinierten Beitragstyp mit mehreren benutzerdefinierten Feldern (Postmetafelder, die von Erweiterte benutzerdefinierte Felder erstellt wurden). Ich benutze die folgende Funktion, um die Daten zu importieren und es funktioniert gut mit meiner Testdatei von etwa 10 Posts, mit Ausnahme des Postmetas. Hier ist die Funktion, die ich für den Import benutze:

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

Das Post-Meta wird zwar importiert, aber ich muss manuell auf die Schaltfläche "Aktualisieren" klicken, um die Daten im Front-End anzuzeigen. Ich habe dies ein wenig recherchiert und Folgendes gefunden (unten würde ich den Artikel verlinken, aber ich habe ihn verloren), wobei ich versucht habe, die Anzahl der Beiträge auf 10 zu beschränken, um Speicherprobleme auszuschließen, aber es hat immer noch nicht den gewünschten Effekt von Reproduzieren Sie den Klick auf die Schaltfläche "Veröffentlichen".

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

Mir ist auch bewusst, dass dies in Bezug auf den Speicher teuer sein wird, und ich bin mir nicht sicher, wie ich am besten vorgehen soll. Vielleicht in Chargen?

EDIT: Ich sollte erwähnen, dass die Daten im Frontend über die WP API angezeigt werden, was tatsächlich das Problem zu sein scheint. Also muss ich wohl eher die API aktualisieren als das Post-Meta in der Datenbank. Das Plugin, das die ACF-Metadaten für die WP-API anzeigt, ist ACF to WP-API .

1
mantis

Fügen Sie dies einfach für die Nachwelt hinzu, falls jemand anderes darauf stößt. Das Problem liegt in der Tat bei ACF, bei dem der Datenbank zwei Zeilen hinzugefügt werden.

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

Um also Postmeta in ACF-Felder zu importieren, müssen Sie auch die zweite Postmeta-Zeile hinzufügen, die den Feldnamen (mit vorangestelltem Unterstrich) und den Feldschlüssel enthält, der ungefähr so ​​aussieht wie field_16d7f66185fc6

Im vorherigen Beispiel muss also ein zweites Array wie folgt vorhanden sein:

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

Was nach der wp_insert_post() -Funktion durchgeschleift wird:

$post_id = wp_insert_post( $post_data, $wp_error );

foreach ( $field_meta as $key => $value ) {
    update_post_meta( $post_id, $key, $value );
}

Sobald die zweite Zeile des Feld-Metas hinzugefügt wurde, sind die Felder in der WP-API verfügbar.

1
mantis

update_field() ist eine ACF-Funktion, daher würde ich vermuten, dass das Problem damit zusammenhängt. Ausgehend von der Quellenübersicht wird get_field_object() usw. aufgerufen, sodass die Umgebung möglicherweise nicht ausreicht, um beim Import ordnungsgemäß zu funktionieren.

Es gibt keinen "halben" Status für native Metadaten, entweder in der Datenbank oder nicht. Sie könnten versuchen, die native WP -API für Metadaten beizubehalten, aber Sie wissen nicht, was tatsächlich erforderlich ist, damit ACF die Daten ordnungsgemäß aufnimmt.

2
Rarst