diff --git a/includes/admin/class-wc-admin-importers.php b/includes/admin/class-wc-admin-importers.php index 8c02b9642cd..5b1a31d2c8a 100644 --- a/includes/admin/class-wc-admin-importers.php +++ b/includes/admin/class-wc-admin-importers.php @@ -230,6 +230,8 @@ class WC_Admin_Importers { if ( 100 === $percent_complete ) { // Clear temp meta. $wpdb->delete( $wpdb->postmeta, array( 'meta_key' => '_original_id' ) ); + $wpdb->delete( $wpdb->posts, array( 'post_status' => 'importing', 'post_type' => 'product' ) ); + $wpdb->delete( $wpdb->posts, array( 'post_status' => 'importing', 'post_type' => 'product_variation' ) ); // Send success. wp_send_json_success( array( diff --git a/includes/import/class-wc-product-csv-importer.php b/includes/import/class-wc-product-csv-importer.php index a0762548a17..8d7ab94412e 100644 --- a/includes/import/class-wc-product-csv-importer.php +++ b/includes/import/class-wc-product-csv-importer.php @@ -119,7 +119,19 @@ class WC_Product_CSV_Importer extends WC_Product_Importer { $id = intval( $matches[1] ); $original_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_original_id' AND meta_value = %s;", $id ) ); - return $original_id ? $original_id : $id; + if ( $original_id ) { + return absint( $original_id ); + + // If we're not updating existing posts, we need a placeholder. + } elseif ( ! $this->params['update_existing'] ) { + $product = new WC_Product_Simple(); + $product->set_name( 'Import placeholder for ' . $id ); + $product->set_status( 'importing' ); + $product->add_meta_data( '_original_id', $id, true ); + $id = $product->save(); + } + + return $id; } if ( $id = wc_get_product_id_by_sku( $field ) ) { @@ -152,18 +164,31 @@ class WC_Product_CSV_Importer extends WC_Product_Importer { * @return int */ protected function parse_id_field( $field ) { - $field = absint( $field ); + global $wpdb; - // Not updating? Make sure we have a new placeholder for this ID. - if ( $field && ! $this->params['update_existing'] ) { - $product = new WC_Product_Simple(); - $product->set_name( 'Import placeholder for ' . $field ); - $product->set_status( 'importing' ); - $product->add_meta_data( '_original_id', $field, true ); - $field = $product->save(); + $id = absint( $field ); + + if ( ! $id ) { + return 0; } - return $field && ! is_wp_error( $field ) ? $field : 0; + // See if this maps to an ID placeholder already. + $original_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_original_id' AND meta_value = %s;", $id ) ); + + if ( $original_id ) { + return absint( $original_id ); + } + + // Not updating? Make sure we have a new placeholder for this ID. + if ( ! $this->params['update_existing'] ) { + $product = new WC_Product_Simple(); + $product->set_name( 'Import placeholder for ' . $id ); + $product->set_status( 'importing' ); + $product->add_meta_data( '_original_id', $id, true ); + $id = $product->save(); + } + + return $id && ! is_wp_error( $id ) ? $id : 0; } /**