Merge pull request #26519 from woocommerce/fix/csv-import-special-columns
Fixed the case conversion for meta key column mapping in product CSV imports
This commit is contained in:
commit
eea062f9fa
|
@ -45,7 +45,7 @@
|
||||||
},
|
},
|
||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Automattic\\WooCommerce\\Tests\\": "tests/php/"
|
"Automattic\\WooCommerce\\Tests\\": "tests/php/src"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
|
@ -319,6 +319,7 @@ class WC_Product_CSV_Importer_Controller {
|
||||||
return new WP_Error( 'woocommerce_product_csv_importer_upload_file_empty', __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.', 'woocommerce' ) );
|
return new WP_Error( 'woocommerce_product_csv_importer_upload_file_empty', __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.', 'woocommerce' ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated
|
||||||
if ( ! self::is_file_valid_csv( wc_clean( wp_unslash( $_FILES['import']['name'] ) ), false ) ) {
|
if ( ! self::is_file_valid_csv( wc_clean( wp_unslash( $_FILES['import']['name'] ) ), false ) ) {
|
||||||
return new WP_Error( 'woocommerce_product_csv_importer_upload_file_invalid', __( 'Invalid file type. The importer supports CSV and TXT file formats.', 'woocommerce' ) );
|
return new WP_Error( 'woocommerce_product_csv_importer_upload_file_invalid', __( 'Invalid file type. The importer supports CSV and TXT file formats.', 'woocommerce' ) );
|
||||||
}
|
}
|
||||||
|
@ -327,7 +328,7 @@ class WC_Product_CSV_Importer_Controller {
|
||||||
'test_form' => false,
|
'test_form' => false,
|
||||||
'mimes' => self::get_valid_csv_filetypes(),
|
'mimes' => self::get_valid_csv_filetypes(),
|
||||||
);
|
);
|
||||||
$import = $_FILES['import']; // WPCS: sanitization ok, input var ok.
|
$import = $_FILES['import']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.ValidatedSanitizedInput.MissingUnslash
|
||||||
$upload = wp_handle_upload( $import, $overrides );
|
$upload = wp_handle_upload( $import, $overrides );
|
||||||
|
|
||||||
if ( isset( $upload['error'] ) ) {
|
if ( isset( $upload['error'] ) ) {
|
||||||
|
@ -577,14 +578,15 @@ class WC_Product_CSV_Importer_Controller {
|
||||||
|
|
||||||
$headers = array();
|
$headers = array();
|
||||||
foreach ( $raw_headers as $key => $field ) {
|
foreach ( $raw_headers as $key => $field ) {
|
||||||
$field = strtolower( $field );
|
$normalized_field = strtolower( $field );
|
||||||
$index = $num_indexes ? $key : $field;
|
$index = $num_indexes ? $key : $field;
|
||||||
$headers[ $index ] = $field;
|
$headers[ $index ] = $normalized_field;
|
||||||
|
|
||||||
if ( isset( $default_columns[ $field ] ) ) {
|
if ( isset( $default_columns[ $normalized_field ] ) ) {
|
||||||
$headers[ $index ] = $default_columns[ $field ];
|
$headers[ $index ] = $default_columns[ $normalized_field ];
|
||||||
} else {
|
} else {
|
||||||
foreach ( $special_columns as $regex => $special_key ) {
|
foreach ( $special_columns as $regex => $special_key ) {
|
||||||
|
// Don't use the normalized field in the regex since meta might be case-sensitive.
|
||||||
if ( preg_match( $regex, $field, $matches ) ) {
|
if ( preg_match( $regex, $field, $matches ) ) {
|
||||||
$headers[ $index ] = $special_key . $matches[1];
|
$headers[ $index ] = $special_key . $matches[1];
|
||||||
break;
|
break;
|
||||||
|
@ -619,7 +621,7 @@ class WC_Product_CSV_Importer_Controller {
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function sanitize_special_column_name_regex( $value ) {
|
protected function sanitize_special_column_name_regex( $value ) {
|
||||||
return '/' . str_replace( array( '%d', '%s' ), '(.*)', trim( quotemeta( $value ) ) ) . '/';
|
return '/' . str_replace( array( '%d', '%s' ), '(.*)', trim( quotemeta( $value ) ) ) . '/i';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -5,12 +5,10 @@
|
||||||
* @package WooCommerce|Tests|WC_Helper.
|
* @package WooCommerce|Tests|WC_Helper.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Automattic\WooCommerce;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class WC_Tests_WC_Helper.
|
* Class WC_Tests_WC_Helper.
|
||||||
*/
|
*/
|
||||||
class WCHelperTest extends \WC_Unit_Test_Case {
|
class WC_Helper_Test extends \WC_Unit_Test_Case {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test that woo plugins are loaded correctly even if incorrect cache is intially set.
|
* Test that woo plugins are loaded correctly even if incorrect cache is intially set.
|
|
@ -0,0 +1,64 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Class WC_Product_CSV_Importer_Controller_Test
|
||||||
|
* @package WooCommerce\Tests\Admin
|
||||||
|
*
|
||||||
|
* Tests to ensure that the CSV product importer works as expected.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class WC_Product_CSV_Importer_Controller_Test
|
||||||
|
*/
|
||||||
|
class WC_Product_CSV_Importer_Controller_Test extends WC_Unit_Test_Case {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load up the importer classes since they aren't loaded by default.
|
||||||
|
*/
|
||||||
|
public function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$bootstrap = WC_Unit_Tests_Bootstrap::instance();
|
||||||
|
require_once $bootstrap->plugin_dir . '/includes/import/class-wc-product-csv-importer.php';
|
||||||
|
require_once $bootstrap->plugin_dir . '/includes/admin/importers/class-wc-product-csv-importer-controller.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that the automatic mapping is case insensitive so that columns can be matched more easily.
|
||||||
|
*/
|
||||||
|
public function test_that_auto_mapping_is_case_insensitive() {
|
||||||
|
// Allow us to call the protected method.
|
||||||
|
$class = new ReflectionClass( WC_Product_CSV_Importer_Controller::class );
|
||||||
|
$method = $class->getMethod( 'auto_map_columns' );
|
||||||
|
$method->setAccessible( true );
|
||||||
|
|
||||||
|
$controller = new WC_Product_CSV_Importer_Controller();
|
||||||
|
|
||||||
|
// Test a few different casing formats first.
|
||||||
|
$columns = $method->invoke( $controller, array( 'Name', 'Type' ) );
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
0 => 'name',
|
||||||
|
1 => 'type',
|
||||||
|
),
|
||||||
|
$columns
|
||||||
|
);
|
||||||
|
$columns = $method->invoke( $controller, array( 'NAME', 'tYpE' ) );
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
0 => 'name',
|
||||||
|
1 => 'type',
|
||||||
|
),
|
||||||
|
$columns
|
||||||
|
);
|
||||||
|
|
||||||
|
// Make sure that the case sensitivity doesn't squash the meta keys.
|
||||||
|
$columns = $method->invoke( $controller, array( 'Meta: _TESTING', 'Meta: _testing' ) );
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
0 => 'meta:_TESTING',
|
||||||
|
1 => 'meta:_testing',
|
||||||
|
),
|
||||||
|
$columns
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue