Fix: variations are counted as products in import message of number of products imported (#37829)
Co-authored-by: mujuonly <muju.only@gmail.com> Co-authored-by: barryhughes <3594411+barryhughes@users.noreply.github.com> Co-authored-by: Nestor Soriano <konamiman@konamiman.com>
This commit is contained in:
parent
c19a42398b
commit
9cfd58ad15
|
@ -0,0 +1,4 @@
|
||||||
|
Significance: patch
|
||||||
|
Type: tweak
|
||||||
|
|
||||||
|
Fix typo in a function comment.
|
|
@ -0,0 +1,4 @@
|
||||||
|
Significance: minor
|
||||||
|
Type: add
|
||||||
|
|
||||||
|
Show the number of variations imported
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
// Number of import successes/failures.
|
// Number of import successes/failures.
|
||||||
this.imported = 0;
|
this.imported = 0;
|
||||||
|
this.imported_variations = 0;
|
||||||
this.failed = 0;
|
this.failed = 0;
|
||||||
this.updated = 0;
|
this.updated = 0;
|
||||||
this.skipped = 0;
|
this.skipped = 0;
|
||||||
|
@ -54,6 +55,7 @@
|
||||||
if ( response.success ) {
|
if ( response.success ) {
|
||||||
$this.position = response.data.position;
|
$this.position = response.data.position;
|
||||||
$this.imported += response.data.imported;
|
$this.imported += response.data.imported;
|
||||||
|
$this.imported_variations += response.data.imported_variations;
|
||||||
$this.failed += response.data.failed;
|
$this.failed += response.data.failed;
|
||||||
$this.updated += response.data.updated;
|
$this.updated += response.data.updated;
|
||||||
$this.skipped += response.data.skipped;
|
$this.skipped += response.data.skipped;
|
||||||
|
@ -64,6 +66,8 @@
|
||||||
window.location = response.data.url +
|
window.location = response.data.url +
|
||||||
'&products-imported=' +
|
'&products-imported=' +
|
||||||
parseInt( $this.imported, 10 ) +
|
parseInt( $this.imported, 10 ) +
|
||||||
|
'&products-imported-variations=' +
|
||||||
|
parseInt( $this.imported_variations, 10 ) +
|
||||||
'&products-failed=' +
|
'&products-failed=' +
|
||||||
parseInt( $this.failed, 10 ) +
|
parseInt( $this.failed, 10 ) +
|
||||||
'&products-updated=' +
|
'&products-updated=' +
|
||||||
|
|
|
@ -290,13 +290,14 @@ class WC_Admin_Importers {
|
||||||
// Send success.
|
// Send success.
|
||||||
wp_send_json_success(
|
wp_send_json_success(
|
||||||
array(
|
array(
|
||||||
'position' => 'done',
|
'position' => 'done',
|
||||||
'percentage' => 100,
|
'percentage' => 100,
|
||||||
'url' => add_query_arg( array( '_wpnonce' => wp_create_nonce( 'woocommerce-csv-importer' ) ), admin_url( 'edit.php?post_type=product&page=product_importer&step=done' ) ),
|
'url' => add_query_arg( array( '_wpnonce' => wp_create_nonce( 'woocommerce-csv-importer' ) ), admin_url( 'edit.php?post_type=product&page=product_importer&step=done' ) ),
|
||||||
'imported' => count( $results['imported'] ),
|
'imported' => count( $results['imported'] ),
|
||||||
'failed' => count( $results['failed'] ),
|
'imported_variations' => count( $results['imported_variations'] ),
|
||||||
'updated' => count( $results['updated'] ),
|
'failed' => count( $results['failed'] ),
|
||||||
'skipped' => count( $results['skipped'] ),
|
'updated' => count( $results['updated'] ),
|
||||||
|
'skipped' => count( $results['skipped'] ),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -461,12 +461,13 @@ class WC_Product_CSV_Importer_Controller {
|
||||||
*/
|
*/
|
||||||
protected function done() {
|
protected function done() {
|
||||||
check_admin_referer( 'woocommerce-csv-importer' );
|
check_admin_referer( 'woocommerce-csv-importer' );
|
||||||
$imported = isset( $_GET['products-imported'] ) ? absint( $_GET['products-imported'] ) : 0;
|
$imported = isset( $_GET['products-imported'] ) ? absint( $_GET['products-imported'] ) : 0;
|
||||||
$updated = isset( $_GET['products-updated'] ) ? absint( $_GET['products-updated'] ) : 0;
|
$imported_variations = isset( $_GET['products-imported-variations'] ) ? absint( $_GET['products-imported-variations'] ) : 0;
|
||||||
$failed = isset( $_GET['products-failed'] ) ? absint( $_GET['products-failed'] ) : 0;
|
$updated = isset( $_GET['products-updated'] ) ? absint( $_GET['products-updated'] ) : 0;
|
||||||
$skipped = isset( $_GET['products-skipped'] ) ? absint( $_GET['products-skipped'] ) : 0;
|
$failed = isset( $_GET['products-failed'] ) ? absint( $_GET['products-failed'] ) : 0;
|
||||||
$file_name = isset( $_GET['file-name'] ) ? sanitize_text_field( wp_unslash( $_GET['file-name'] ) ) : '';
|
$skipped = isset( $_GET['products-skipped'] ) ? absint( $_GET['products-skipped'] ) : 0;
|
||||||
$errors = array_filter( (array) get_user_option( 'product_import_error_log' ) );
|
$file_name = isset( $_GET['file-name'] ) ? sanitize_text_field( wp_unslash( $_GET['file-name'] ) ) : '';
|
||||||
|
$errors = array_filter( (array) get_user_option( 'product_import_error_log' ) );
|
||||||
|
|
||||||
include_once dirname( __FILE__ ) . '/views/html-csv-import-done.php';
|
include_once dirname( __FILE__ ) . '/views/html-csv-import-done.php';
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,14 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( 0 < $imported_variations ) {
|
||||||
|
$results[] = sprintf(
|
||||||
|
/* translators: %d: products count */
|
||||||
|
_n( '%s variations imported', '%s variations imported', $imported_variations, 'woocommerce' ),
|
||||||
|
'<strong>' . number_format_i18n( $imported_variations ) . '</strong>'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if ( 0 < $skipped ) {
|
if ( 0 < $skipped ) {
|
||||||
$results[] = sprintf(
|
$results[] = sprintf(
|
||||||
/* translators: %d: products count */
|
/* translators: %d: products count */
|
||||||
|
|
|
@ -250,11 +250,12 @@ abstract class WC_Product_Importer implements WC_Importer_Interface {
|
||||||
if ( 'external' === $object->get_type() ) {
|
if ( 'external' === $object->get_type() ) {
|
||||||
unset( $data['manage_stock'], $data['stock_status'], $data['backorders'], $data['low_stock_amount'] );
|
unset( $data['manage_stock'], $data['stock_status'], $data['backorders'], $data['low_stock_amount'] );
|
||||||
}
|
}
|
||||||
|
$is_variation = false;
|
||||||
if ( 'variation' === $object->get_type() ) {
|
if ( 'variation' === $object->get_type() ) {
|
||||||
if ( isset( $data['status'] ) && -1 === $data['status'] ) {
|
if ( isset( $data['status'] ) && -1 === $data['status'] ) {
|
||||||
$data['status'] = 0; // Variations cannot be drafts - set to private.
|
$data['status'] = 0; // Variations cannot be drafts - set to private.
|
||||||
}
|
}
|
||||||
|
$is_variation = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( 'importing' === $object->get_status() ) {
|
if ( 'importing' === $object->get_status() ) {
|
||||||
|
@ -283,8 +284,9 @@ abstract class WC_Product_Importer implements WC_Importer_Interface {
|
||||||
do_action( 'woocommerce_product_import_inserted_product_object', $object, $data );
|
do_action( 'woocommerce_product_import_inserted_product_object', $object, $data );
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'id' => $object->get_id(),
|
'id' => $object->get_id(),
|
||||||
'updated' => $updating,
|
'updated' => $updating,
|
||||||
|
'is_variation' => $is_variation,
|
||||||
);
|
);
|
||||||
} catch ( Exception $e ) {
|
} catch ( Exception $e ) {
|
||||||
return new WP_Error( 'woocommerce_product_importer_error', $e->getMessage(), array( 'status' => $e->getCode() ) );
|
return new WP_Error( 'woocommerce_product_importer_error', $e->getMessage(), array( 'status' => $e->getCode() ) );
|
||||||
|
|
|
@ -1080,10 +1080,11 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
|
||||||
$index = 0;
|
$index = 0;
|
||||||
$update_existing = $this->params['update_existing'];
|
$update_existing = $this->params['update_existing'];
|
||||||
$data = array(
|
$data = array(
|
||||||
'imported' => array(),
|
'imported' => array(),
|
||||||
'failed' => array(),
|
'imported_variations' => array(),
|
||||||
'updated' => array(),
|
'failed' => array(),
|
||||||
'skipped' => array(),
|
'updated' => array(),
|
||||||
|
'skipped' => array(),
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ( $this->parsed_data as $parsed_data_key => $parsed_data ) {
|
foreach ( $this->parsed_data as $parsed_data_key => $parsed_data ) {
|
||||||
|
@ -1150,7 +1151,11 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
|
||||||
} elseif ( $result['updated'] ) {
|
} elseif ( $result['updated'] ) {
|
||||||
$data['updated'][] = $result['id'];
|
$data['updated'][] = $result['id'];
|
||||||
} else {
|
} else {
|
||||||
$data['imported'][] = $result['id'];
|
if ( $result['is_variation'] ) {
|
||||||
|
$data['imported_variations'][] = $result['id'];
|
||||||
|
} else {
|
||||||
|
$data['imported'][] = $result['id'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$index ++;
|
$index ++;
|
||||||
|
|
|
@ -71,10 +71,11 @@ class WC_Importer_Tracking {
|
||||||
}
|
}
|
||||||
|
|
||||||
$properties = array(
|
$properties = array(
|
||||||
'imported' => isset( $_GET['products-imported'] ) ? absint( $_GET['products-imported'] ) : 0,
|
'imported' => isset( $_GET['products-imported'] ) ? absint( $_GET['products-imported'] ) : 0,
|
||||||
'updated' => isset( $_GET['products-updated'] ) ? absint( $_GET['products-updated'] ) : 0,
|
'imported_variations' => isset( $_GET['products-imported-variations'] ) ? absint( $_GET['products-imported-variations'] ) : 0,
|
||||||
'failed' => isset( $_GET['products-failed'] ) ? absint( $_GET['products-failed'] ) : 0,
|
'updated' => isset( $_GET['products-updated'] ) ? absint( $_GET['products-updated'] ) : 0,
|
||||||
'skipped' => isset( $_GET['products-skipped'] ) ? absint( $_GET['products-skipped'] ) : 0,
|
'failed' => isset( $_GET['products-failed'] ) ? absint( $_GET['products-failed'] ) : 0,
|
||||||
|
'skipped' => isset( $_GET['products-skipped'] ) ? absint( $_GET['products-skipped'] ) : 0,
|
||||||
);
|
);
|
||||||
// phpcs:enable
|
// phpcs:enable
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,8 @@ class WC_Tests_Product_CSV_Importer extends WC_Unit_Test_Case {
|
||||||
|
|
||||||
// Callback used by WP_HTTP_TestCase to decide whether to perform HTTP requests or to provide a mocked response.
|
// Callback used by WP_HTTP_TestCase to decide whether to perform HTTP requests or to provide a mocked response.
|
||||||
$this->http_responder = array( $this, 'mock_http_responses' );
|
$this->http_responder = array( $this, 'mock_http_responses' );
|
||||||
$this->csv_file = dirname( __FILE__ ) . '/sample.csv';
|
$this->csv_file = dirname( __FILE__ ) . '/sample.csv';
|
||||||
$this->sut = new WC_Product_CSV_Importer(
|
$this->sut = new WC_Product_CSV_Importer(
|
||||||
$this->csv_file,
|
$this->csv_file,
|
||||||
array(
|
array(
|
||||||
'mapping' => $this->get_csv_mapped_items(),
|
'mapping' => $this->get_csv_mapped_items(),
|
||||||
|
@ -108,14 +108,14 @@ class WC_Tests_Product_CSV_Importer extends WC_Unit_Test_Case {
|
||||||
public function test_import_for_admin_users() {
|
public function test_import_for_admin_users() {
|
||||||
// In most cases, an admin user will run the import.
|
// In most cases, an admin user will run the import.
|
||||||
wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
|
wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
|
||||||
$results = $this->sut->import();
|
$results = $this->sut->import();
|
||||||
|
|
||||||
$this->assertEquals( 0, count( $results['failed'] ) );
|
$this->assertEquals( 0, count( $results['failed'] ) );
|
||||||
$this->assertEquals( 0, count( $results['updated'] ) );
|
$this->assertEquals( 0, count( $results['updated'] ) );
|
||||||
$this->assertEquals( 0, count( $results['skipped'] ) );
|
$this->assertEquals( 0, count( $results['skipped'] ) );
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
7,
|
7,
|
||||||
count( $results['imported'] ),
|
count( $results['imported'] ) + count( $results['imported_variations'] ),
|
||||||
'One import item references a downloadable file stored in an unapproved location: if the import is triggered by an admin user, that location will be automatically approved.'
|
'One import item references a downloadable file stored in an unapproved location: if the import is triggered by an admin user, that location will be automatically approved.'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -126,11 +126,11 @@ class WC_Tests_Product_CSV_Importer extends WC_Unit_Test_Case {
|
||||||
public function test_import_for_shop_managers() {
|
public function test_import_for_shop_managers() {
|
||||||
// In some cases, a shop manager may run the import.
|
// In some cases, a shop manager may run the import.
|
||||||
wp_set_current_user( self::factory()->user->create( array( 'role' => 'shop_manager' ) ) );
|
wp_set_current_user( self::factory()->user->create( array( 'role' => 'shop_manager' ) ) );
|
||||||
$results = $this->sut->import();
|
$results = $this->sut->import();
|
||||||
|
|
||||||
$this->assertEquals( 0, count( $results['updated'] ) );
|
$this->assertEquals( 0, count( $results['updated'] ) );
|
||||||
$this->assertEquals( 0, count( $results['skipped'] ) );
|
$this->assertEquals( 0, count( $results['skipped'] ) );
|
||||||
$this->assertEquals( 6, count( $results['imported'] ) );
|
$this->assertEquals( 6, count( $results['imported'] ) + count( $results['imported_variations'] ) );
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
1,
|
1,
|
||||||
count( $results['failed'] ),
|
count( $results['failed'] ),
|
||||||
|
|
Loading…
Reference in New Issue