web-dev-qa-db-fra.com

empêche wp_insert_post d'ajouter des doublons

J'ai eu du mal à importer des publications à partir de données JSON. Le problème est que wp_insert_post() ajoute plusieurs versions des publications. Auparavant, je vérifiais si le message existait en vérifiant si le titre existait, mais plusieurs messages à importer ont le même titre mais un contenu différent.

function get_all_cpt_ids() {
    global $wpdb;
    $mids = $wpdb->get_results( "SELECT ID FROM tablename.subsite_4_posts WHERE post_type='thing'", OBJECT );

foreach ( $mids as $key => $value ) {
    $thing_ids[] = $value->ID;
}

    return $thing_ids;
}

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;
  $id_arr    = [];

foreach ( $objs as $obj ) {
    $id_arr    = get_all_cpt_ids();
    $id        = $obj['nid'];
    $title     = $obj['title'];
    $meta1     = $obj['name'];
    $d         = new DateTime();
    $d->setTimestamp( $obj['created'] );
    $date_created = $d->format( 'Y-m-d H:i:s' );
    $post_meta = array(
        'meta_1'        => $meta1,
    );

    $post_data = array(
        'import_id'   => $id,
        'post_title'  => $title,
        'post_date'   => $date_created,
        'post_status' => 'publish',
        'post_type'   => 'thing',
        'meta_input'  => $post_meta,
    );

    if ( ! in_array( $id_arr, $id, true ) ) {
        $post_id = wp_insert_post( $post_data, $wp_error );

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

add_action( 'after_setup_theme', 'mysite_import_json' );

En passant, je fais tout cela localement, donc je ne m'inquiète pas de la sécurité lors de l'interrogation de la base de données.

J'ai également paramétré la fonction pour qu'elle ne s'exécute qu'une seule fois en ajoutant un indicateur comme option une fois qu'elle s'est exécutée. Je ne comprends donc pas vraiment pourquoi wp_insert_post() est exécuté plus d'une fois par $obj dans la boucle foreach.

1
mantis

Le problème a fini par être le hook after_setup_theme. J'appelais effectivement la fonction en actualisant le navigateur qui lance le hook en Javascript et PHP, de sorte que le hook était déclenché plusieurs fois lors de l'actualisation du navigateur.

Une fois que j'ai désactivé Javascript, tout a bien fonctionné. Une autre solution aurait été d'utiliser un hook différent, déclenché une seule fois.

0
mantis