2017-05-01 21:30:45 +00:00
< ? php
if ( ! defined ( 'ABSPATH' ) ) {
exit ;
}
if ( ! class_exists ( 'WP_Importer' ) ) {
return ;
}
/**
2017-05-17 13:16:38 +00:00
* Product importer controller - handles file upload and forms in admin .
2017-05-01 21:30:45 +00:00
*
* @ author Automattic
* @ category Admin
* @ package WooCommerce / Admin / Importers
* @ version 3.1 . 0
*/
2017-05-17 13:16:38 +00:00
class WC_Product_CSV_Importer_Controller {
2017-05-01 21:30:45 +00:00
/**
2017-05-17 13:16:38 +00:00
* The path to the current file .
2017-05-01 21:30:45 +00:00
*
2017-05-17 13:16:38 +00:00
* @ var string
2017-05-01 21:30:45 +00:00
*/
2017-05-17 13:16:38 +00:00
protected $file = '' ;
2017-05-01 21:30:45 +00:00
/**
2017-05-17 13:16:38 +00:00
* The current import step .
2017-05-01 21:30:45 +00:00
*
* @ var string
*/
2017-05-17 13:16:38 +00:00
protected $step = '' ;
2017-05-01 21:30:45 +00:00
/**
2017-05-17 13:16:38 +00:00
* Progress steps .
2017-05-01 21:30:45 +00:00
*
2017-05-17 13:16:38 +00:00
* @ var array
*/
protected $steps = array ();
/**
* Errors .
*
* @ var array
2017-05-01 21:30:45 +00:00
*/
2017-05-17 13:16:38 +00:00
protected $errors = array ();
2017-05-01 21:30:45 +00:00
/**
2017-05-17 13:16:38 +00:00
* The current delimiter for the file being read .
2017-05-01 21:30:45 +00:00
*
* @ var string
*/
2017-05-17 13:16:38 +00:00
protected $delimiter = ',' ;
2017-05-01 21:30:45 +00:00
2017-05-18 16:49:58 +00:00
/**
* Get importer instance .
*
* @ param string $file File to import .
* @ param array $args Importer arguments .
* @ return WC_Product_CSV_Importer
*/
public static function get_importer ( $file , $args = array () ) {
$importer_class = apply_filters ( 'woocommerce_product_csv_importer_class' , 'WC_Product_CSV_Importer' );
return new $importer_class ( $file , $args );
}
2017-05-01 21:30:45 +00:00
/**
* Constructor .
*/
public function __construct () {
2017-05-17 13:16:38 +00:00
$this -> steps = array (
'upload' => array (
'name' => __ ( 'Upload CSV file' , 'woocommerce' ),
'view' => array ( $this , 'upload_form' ),
'handler' => array ( $this , 'upload_form_handler' ),
),
'mapping' => array (
'name' => __ ( 'Column mapping' , 'woocommerce' ),
'view' => array ( $this , 'mapping_form' ),
'handler' => '' ,
),
'import' => array (
'name' => __ ( 'Import' , 'woocommerce' ),
'view' => array ( $this , 'import' ),
'handler' => '' ,
),
'done' => array (
'name' => __ ( 'Done!' , 'woocommerce' ),
'view' => array ( $this , 'done' ),
'handler' => '' ,
),
);
$this -> step = isset ( $_REQUEST [ 'step' ] ) ? sanitize_key ( $_REQUEST [ 'step' ] ) : current ( array_keys ( $this -> steps ) );
$this -> file = isset ( $_REQUEST [ 'file' ] ) ? wc_clean ( $_REQUEST [ 'file' ] ) : '' ;
2017-05-01 21:30:45 +00:00
}
/**
2017-05-17 13:16:38 +00:00
* Get the URL for the next step ' s screen .
* @ param string step slug ( default : current step )
* @ return string URL for next step if a next step exists .
* Admin URL if it ' s the last step .
* Empty string on failure .
2017-05-01 21:30:45 +00:00
*/
2017-05-17 13:16:38 +00:00
public function get_next_step_link ( $step = '' ) {
if ( ! $step ) {
$step = $this -> step ;
}
2017-05-01 21:30:45 +00:00
2017-05-17 13:16:38 +00:00
$keys = array_keys ( $this -> steps );
2017-05-01 21:30:45 +00:00
2017-05-17 13:16:38 +00:00
if ( end ( $keys ) === $step ) {
return admin_url ();
}
2017-05-01 21:30:45 +00:00
2017-05-17 13:16:38 +00:00
$step_index = array_search ( $step , $keys );
2017-05-01 21:30:45 +00:00
2017-05-17 13:16:38 +00:00
if ( false === $step_index ) {
return '' ;
}
2017-05-01 21:30:45 +00:00
2017-05-17 13:16:38 +00:00
$params = array (
'step' => $keys [ $step_index + 1 ],
'file' => $this -> file ,
'delimiter' => $this -> delimiter ,
'_wpnonce' => wp_create_nonce ( 'woocommerce-csv-importer' ), // wp_nonce_url() escapes & to & breaking redirects.
);
2017-05-01 21:30:45 +00:00
2017-05-17 13:16:38 +00:00
return add_query_arg ( $params );
}
2017-05-10 20:15:28 +00:00
2017-05-17 13:16:38 +00:00
/**
* Output header view .
*/
protected function output_header () {
include ( dirname ( __FILE__ ) . '/views/html-csv-import-header.php' );
}
/**
* Output steps view .
*/
protected function output_steps () {
include ( dirname ( __FILE__ ) . '/views/html-csv-import-steps.php' );
}
/**
* Output footer view .
*/
protected function output_footer () {
include ( dirname ( __FILE__ ) . '/views/html-csv-import-footer.php' );
}
/**
* Add error message .
*/
protected function add_error ( $error ) {
$this -> errors [] = $error ;
}
/**
* Add error message .
*/
protected function output_errors () {
if ( $this -> errors ) {
foreach ( $this -> errors as $error ) {
2017-05-19 12:25:03 +00:00
echo '<div class="error inline"><p>' . esc_html ( $error ) . '</p></div>' ;
2017-05-17 13:16:38 +00:00
}
}
}
/**
* Dispatch current step and show correct view .
*/
public function dispatch () {
2017-05-17 21:34:49 +00:00
if ( ! empty ( $_POST [ 'save_step' ] ) && ! empty ( $this -> steps [ $this -> step ][ 'handler' ] ) ) {
2017-05-17 13:16:38 +00:00
call_user_func ( $this -> steps [ $this -> step ][ 'handler' ], $this );
}
$this -> output_header ();
$this -> output_steps ();
$this -> output_errors ();
call_user_func ( $this -> steps [ $this -> step ][ 'view' ], $this );
$this -> output_footer ();
}
2017-05-01 21:30:45 +00:00
2017-05-17 13:16:38 +00:00
/**
* Output information about the uploading process .
*/
protected function upload_form () {
$bytes = apply_filters ( 'import_upload_size_limit' , wp_max_upload_size () );
$size = size_format ( $bytes );
$upload_dir = wp_upload_dir ();
include ( dirname ( __FILE__ ) . '/views/html-product-csv-import-form.php' );
2017-05-01 21:30:45 +00:00
}
/**
2017-05-17 13:16:38 +00:00
* Handle the upload form and store options .
2017-05-01 21:30:45 +00:00
*/
2017-05-17 13:16:38 +00:00
public function upload_form_handler () {
check_admin_referer ( 'woocommerce-csv-importer' );
$file = $this -> handle_upload ();
if ( is_wp_error ( $file ) ) {
2017-05-17 16:15:49 +00:00
$this -> add_error ( $file -> get_error_message () );
2017-05-17 13:16:38 +00:00
return ;
} else {
$this -> file = $file ;
2017-05-01 21:30:45 +00:00
}
2017-05-17 13:16:38 +00:00
wp_redirect ( esc_url_raw ( $this -> get_next_step_link () ) );
exit ;
2017-05-01 21:30:45 +00:00
}
/**
2017-05-17 13:16:38 +00:00
* Handles the CSV upload and initial parsing of the file to prepare for .
* displaying author import options .
2017-05-01 21:30:45 +00:00
*
2017-05-17 13:16:38 +00:00
* @ return string | WP_Error
2017-05-01 21:30:45 +00:00
*/
2017-05-17 13:16:38 +00:00
public function handle_upload () {
if ( empty ( $_POST [ 'file_url' ] ) ) {
if ( ! isset ( $_FILES [ 'import' ] ) ) {
2017-05-19 12:25:03 +00:00
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' ) );
2017-05-17 13:16:38 +00:00
}
$overrides = array ( 'test_form' => false , 'test_type' => false );
$_FILES [ 'import' ][ 'name' ] .= '.txt' ;
$upload = wp_handle_upload ( $_FILES [ 'import' ], $overrides );
if ( isset ( $upload [ 'error' ] ) ) {
2017-05-17 17:57:03 +00:00
return new WP_Error ( 'woocommerce_product_csv_importer_upload_error' , $upload [ 'error' ] );
2017-05-17 13:16:38 +00:00
}
// Construct the object array
$object = array (
'post_title' => basename ( $upload [ 'file' ] ),
'post_content' => $upload [ 'url' ],
'post_mime_type' => $upload [ 'type' ],
'guid' => $upload [ 'url' ],
'context' => 'import' ,
'post_status' => 'private' ,
);
// Save the data
$id = wp_insert_attachment ( $object , $upload [ 'file' ] );
/*
* Schedule a cleanup for one day from now in case of failed
* import or missing wp_import_cleanup () call .
*/
wp_schedule_single_event ( time () + DAY_IN_SECONDS , 'importer_scheduled_cleanup' , array ( $id ) );
return $upload [ 'file' ];
} elseif ( file_exists ( ABSPATH . $_POST [ 'file_url' ] ) ) {
return ABSPATH . $_POST [ 'file_url' ];
2017-05-01 21:30:45 +00:00
}
2017-05-17 17:57:03 +00:00
return new WP_Error ( 'woocommerce_product_csv_importer_upload_invalid_file' , __ ( 'Please upload or provide the link to a valid CSV file.' , 'woocommerce' ) );
2017-05-17 13:16:38 +00:00
}
/**
* Mapping step @ todo
*/
protected function mapping_form () {
2017-05-18 17:11:34 +00:00
$importer = $this :: get_importer ( $this -> file , array ( 'lines' => 1 ) );
2017-05-17 20:55:28 +00:00
$headers = $importer -> get_raw_keys ();
2017-05-17 23:59:36 +00:00
$mapped_items = $this -> auto_map_columns ( $headers );
2017-05-17 20:55:28 +00:00
$sample = current ( $importer -> get_raw_data () );
2017-05-17 13:16:38 +00:00
if ( empty ( $sample ) ) {
$this -> add_error ( __ ( 'The file is empty, please try again with a new file.' , 'woocommerce' ) );
return ;
}
// Check if all fields matches.
2017-05-17 20:55:28 +00:00
if ( 0 === count ( array_diff ( $mapped_items , $this -> get_default_fields () ) ) ) {
2017-05-17 13:16:38 +00:00
wp_redirect ( esc_url_raw ( $this -> get_next_step_link () ) );
exit ;
}
include_once ( dirname ( __FILE__ ) . '/views/html-csv-import-mapping.php' );
}
/**
2017-05-17 21:43:03 +00:00
* Import the file if it exists and is valid .
2017-05-17 13:16:38 +00:00
*/
public function import () {
if ( ! is_file ( $this -> file ) ) {
$this -> add_error ( __ ( 'The file does not exist, please try again.' , 'woocommerce' ) );
return ;
}
2017-05-01 21:30:45 +00:00
2017-05-17 21:34:49 +00:00
$mapping = array ();
2017-05-10 20:15:28 +00:00
if ( ! empty ( $_POST [ 'map_to' ] ) ) {
2017-05-17 21:43:03 +00:00
$mapping = wp_unslash ( $_POST [ 'map_to' ] );
2017-05-19 14:06:36 +00:00
} else {
wp_redirect ( esc_url_raw ( $this -> get_next_step_link ( 'upload' ) ) );
exit ;
2017-05-10 20:15:28 +00:00
}
2017-05-17 21:34:49 +00:00
wp_localize_script ( 'wc-product-import' , 'wc_product_import_params' , array (
'import_nonce' => wp_create_nonce ( 'wc-product-import' ),
2017-05-18 16:49:58 +00:00
'mapping' => $mapping ,
'file' => $this -> file ,
2017-05-17 21:34:49 +00:00
) );
wp_enqueue_script ( 'wc-product-import' );
2017-05-19 12:25:03 +00:00
include_once ( dirname ( __FILE__ ) . '/views/html-csv-import-progress.php' );
2017-05-17 21:34:49 +00:00
}
/**
* Done step .
* @ todo Make this better .
*/
protected function done () {
$imported = isset ( $_GET [ 'imported' ] ) ? absint ( $_GET [ 'imported' ] ) : 0 ;
2017-05-19 12:25:03 +00:00
$failed = isset ( $_GET [ 'failed' ] ) ? absint ( $_GET [ 'failed' ] ) : 0 ;
2017-05-15 23:41:19 +00:00
2017-05-19 12:25:03 +00:00
include_once ( dirname ( __FILE__ ) . '/views/html-csv-import-done.php' );
2017-05-01 21:30:45 +00:00
}
2017-05-15 22:49:53 +00:00
/**
* Get default fields .
*
* @ return array
*/
protected function get_default_fields () {
$fields = array (
'id' ,
'type' ,
'sku' ,
'name' ,
'status' ,
'featured' ,
'catalog_visibility' ,
'short_description' ,
'description' ,
'date_on_sale_from' ,
'date_on_sale_to' ,
'tax_status' ,
'tax_class' ,
'stock_status' ,
'backorders' ,
'sold_individually' ,
'weight' ,
'length' ,
'width' ,
'height' ,
'reviews_allowed' ,
'purchase_note' ,
'price' ,
'regular_price' ,
'manage_stock' ,
'stock_quantity' ,
'category_ids' ,
'tag_ids' ,
'shipping_class_id' ,
'images' ,
'downloads' ,
'download_limit' ,
'download_expiry' ,
'parent_id' ,
'upsell_ids' ,
'cross_sell_ids' ,
);
return apply_filters ( 'woocommerce_csv_product_default_fields' , $fields );
}
2017-05-17 23:59:36 +00:00
/**
* Auto map column names .
*
* @ param array $fields Header columns .
* @ return array
*/
protected function auto_map_columns ( $fields ) {
2017-05-18 00:10:26 +00:00
$weight_unit = get_option ( 'woocommerce_weight_unit' );
$dimension_unit = get_option ( 'woocommerce_dimension_unit' );
$default_columns = array_flip ( apply_filters ( 'woocommerce_csv_product_import_mapping_default_columns' , array (
2017-05-17 20:55:28 +00:00
'id' => __ ( 'ID' , 'woocommerce' ),
'type' => __ ( 'Type' , 'woocommerce' ),
'sku' => __ ( 'SKU' , 'woocommerce' ),
'name' => __ ( 'Name' , 'woocommerce' ),
'published' => __ ( 'Published' , 'woocommerce' ),
'featured' => __ ( 'Is featured?' , 'woocommerce' ),
'catalog_visibility' => __ ( 'Visibility in catalog' , 'woocommerce' ),
'short_description' => __ ( 'Short Description' , 'woocommerce' ),
'description' => __ ( 'Description' , 'woocommerce' ),
'date_on_sale_from' => __ ( 'Date sale price starts' , 'woocommerce' ),
'date_on_sale_to' => __ ( 'Date sale price ends' , 'woocommerce' ),
'tax_status' => __ ( 'Tax Class' , 'woocommerce' ),
'stock_status' => __ ( 'In stock?' , 'woocommerce' ),
'stock' => __ ( 'Stock' , 'woocommerce' ),
'backorders' => __ ( 'Backorders allowed?' , 'woocommerce' ),
'sold_individually' => __ ( 'Sold individually?' , 'woocommerce' ),
'weight' => sprintf ( __ ( 'Weight (%s)' , 'woocommerce' ), $weight_unit ),
'length' => sprintf ( __ ( 'Length (%s)' , 'woocommerce' ), $dimension_unit ),
'width' => sprintf ( __ ( 'Width (%s)' , 'woocommerce' ), $dimension_unit ),
'height' => sprintf ( __ ( 'Height (%s)' , 'woocommerce' ), $dimension_unit ),
'reviews_allowed' => __ ( 'Allow customer reviews?' , 'woocommerce' ),
'purchase_note' => __ ( 'Purchase Note' , 'woocommerce' ),
'sale_price' => __ ( 'Sale Price' , 'woocommerce' ),
'regular_price' => __ ( 'Regular Price' , 'woocommerce' ),
'category_ids' => __ ( 'Categories' , 'woocommerce' ),
'tag_ids' => __ ( 'Tags' , 'woocommerce' ),
'shipping_class_id' => __ ( 'Shipping Class' , 'woocommerce' ),
'image_id' => __ ( 'Images' , 'woocommerce' ),
'download_limit' => __ ( 'Download Limit' , 'woocommerce' ),
'download_expiry' => __ ( 'Download Expiry Days' , 'woocommerce' ),
'parent_id' => __ ( 'Parent' , 'woocommerce' ),
'upsell_ids' => __ ( 'Upsells' , 'woocommerce' ),
'cross_sell_ids' => __ ( 'Cross-sells' , 'woocommerce' ),
2017-05-18 00:10:26 +00:00
) ) );
2017-05-19 12:25:03 +00:00
2017-05-18 00:10:26 +00:00
$special_columns = array_map (
array ( $this , 'sanitize_special_column_name_regex' ),
apply_filters ( 'woocommerce_csv_product_import_mapping_special_columns' ,
array (
'attributes:name' => __ ( 'Attribute %d Name' , 'woocommerce' ),
'attributes:value' => __ ( 'Attribute %d Value(s)' , 'woocommerce' ),
'attributes:default' => __ ( 'Attribute %d Default' , 'woocommerce' ),
'downloads:name' => __ ( 'Download %d Name' , 'woocommerce' ),
'downloads:url' => __ ( 'Download %d URL' , 'woocommerce' ),
'meta:' => __ ( 'Meta: %s' , 'woocommerce' ),
)
)
);
2017-05-17 20:55:28 +00:00
$new_fields = array ();
2017-05-17 23:59:36 +00:00
foreach ( $fields as $index => $field ) {
$new_fields [ $index ] = $field ;
2017-05-18 00:10:26 +00:00
if ( isset ( $default_columns [ $field ] ) ) {
$new_fields [ $index ] = $default_columns [ $field ];
2017-05-17 23:59:36 +00:00
} else {
2017-05-18 00:10:26 +00:00
foreach ( $special_columns as $special_key => $regex ) {
2017-05-17 23:59:36 +00:00
if ( preg_match ( $regex , $field , $matches ) ) {
$new_fields [ $index ] = $special_key . $matches [ 1 ];
break ;
}
}
}
2017-05-17 20:55:28 +00:00
}
2017-05-18 00:10:26 +00:00
return apply_filters ( 'woocommerce_csv_product_import_mapped_columns' , $new_fields , $fields );
2017-05-17 23:59:36 +00:00
}
/**
* Sanitize special column name regex .
*
* @ param string $value Raw special column name .
* @ return string
*/
protected function sanitize_special_column_name_regex ( $value ) {
return '/' . str_replace ( array ( '%d' , '%s' ), '(.*)' , quotemeta ( $value ) ) . '/' ;
2017-05-17 20:55:28 +00:00
}
2017-05-10 20:15:28 +00:00
/**
* Get mapping options .
*
2017-05-10 21:56:29 +00:00
* @ param string $item Item name
2017-05-10 20:15:28 +00:00
* @ return array
*/
2017-05-10 21:56:29 +00:00
protected function get_mapping_options ( $item = '' ) {
2017-05-18 00:10:26 +00:00
// Get index for special column names.
$index = $item ;
2017-05-19 12:25:03 +00:00
if ( preg_match ( '/\d+$/' , $item , $matches ) ) {
2017-05-18 00:10:26 +00:00
$index = $matches [ 0 ];
2017-05-17 23:59:36 +00:00
}
2017-05-19 12:25:03 +00:00
2017-05-18 00:10:26 +00:00
// Properly format for meta field.
2017-05-17 23:59:36 +00:00
$meta = str_replace ( 'meta:' , '' , $item );
2017-05-18 00:10:26 +00:00
// Available options.
2017-05-10 20:15:28 +00:00
$weight_unit = get_option ( 'woocommerce_weight_unit' );
$dimension_unit = get_option ( 'woocommerce_dimension_unit' );
$options = array (
'id' => __ ( 'ID' , 'woocommerce' ),
'type' => __ ( 'Type' , 'woocommerce' ),
'sku' => __ ( 'SKU' , 'woocommerce' ),
'name' => __ ( 'Name' , 'woocommerce' ),
2017-05-17 20:55:28 +00:00
'published' => __ ( 'Published' , 'woocommerce' ),
2017-05-10 20:15:28 +00:00
'featured' => __ ( 'Is featured?' , 'woocommerce' ),
'catalog_visibility' => __ ( 'Visibility in catalog' , 'woocommerce' ),
'short_description' => __ ( 'Short Description' , 'woocommerce' ),
'description' => __ ( 'Description' , 'woocommerce' ),
'date_on_sale_from' => __ ( 'Date sale price starts' , 'woocommerce' ),
'date_on_sale_to' => __ ( 'Date sale price ends' , 'woocommerce' ),
'tax_status' => __ ( 'Tax Status' , 'woocommerce' ),
'tax_class' => __ ( 'Tax Class' , 'woocommerce' ),
'stock_status' => __ ( 'In stock?' , 'woocommerce' ),
'backorders' => __ ( 'Backorders allowed?' , 'woocommerce' ),
'sold_individually' => __ ( 'Sold individually?' , 'woocommerce' ),
/* translators: %s: weight unit */
'weight' => sprintf ( __ ( 'Weight (%s)' , 'woocommerce' ), $weight_unit ),
2017-05-17 23:59:36 +00:00
'dimensions' => array (
'name' => __ ( 'Dimensions' , 'woocommerce' ),
'options' => array (
/* translators: %s: dimension unit */
'length' => sprintf ( __ ( 'Length (%s)' , 'woocommerce' ), $dimension_unit ),
/* translators: %s: dimension unit */
'width' => sprintf ( __ ( 'Width (%s)' , 'woocommerce' ), $dimension_unit ),
/* translators: %s: dimension unit */
'height' => sprintf ( __ ( 'Height (%s)' , 'woocommerce' ), $dimension_unit ),
),
),
2017-05-10 20:15:28 +00:00
'reviews_allowed' => __ ( 'Allow customer reviews?' , 'woocommerce' ),
'purchase_note' => __ ( 'Purchase Note' , 'woocommerce' ),
2017-05-17 20:55:28 +00:00
'sale_price' => __ ( 'Sale Price' , 'woocommerce' ),
2017-05-10 20:15:28 +00:00
'regular_price' => __ ( 'Regular Price' , 'woocommerce' ),
2017-05-17 20:55:28 +00:00
'stock' => __ ( 'Stock' , 'woocommerce' ),
2017-05-10 20:15:28 +00:00
'category_ids' => __ ( 'Categories' , 'woocommerce' ),
'tag_ids' => __ ( 'Tags' , 'woocommerce' ),
'shipping_class_id' => __ ( 'Shipping Class' , 'woocommerce' ),
2017-05-17 20:55:28 +00:00
'image_id' => __ ( 'Images' , 'woocommerce' ),
'parent_id' => __ ( 'Parent' , 'woocommerce' ),
'upsell_ids' => __ ( 'Upsells' , 'woocommerce' ),
'cross_sell_ids' => __ ( 'Cross-sells' , 'woocommerce' ),
2017-05-17 23:59:36 +00:00
'downloads' => array (
'name' => __ ( 'Downloads' , 'woocommerce' ),
'options' => array (
2017-05-18 00:10:26 +00:00
'downloads:name' . $index => __ ( 'Download Name' , 'woocommerce' ),
'downloads:url' . $index => __ ( 'Download URL' , 'woocommerce' ),
'download_limit' => __ ( 'Download Limit' , 'woocommerce' ),
'download_expiry' => __ ( 'Download Expiry Days' , 'woocommerce' ),
2017-05-17 23:59:36 +00:00
),
),
2017-05-10 20:15:28 +00:00
'attributes' => array (
'name' => __ ( 'Attributes' , 'woocommerce' ),
'options' => array (
2017-05-18 00:10:26 +00:00
'attributes:name' . $index => __ ( 'Attributes name' , 'woocommerce' ),
'attributes:value' . $index => __ ( 'Attributes value' , 'woocommerce' ),
'attributes:default' . $index => __ ( 'Default attribute' , 'woocommerce' ),
2017-05-10 20:15:28 +00:00
),
),
2017-05-17 23:59:36 +00:00
'meta:' . $meta => __ ( 'Import as meta' , 'woocommerce' ),
2017-05-10 20:15:28 +00:00
);
2017-05-15 22:49:53 +00:00
return apply_filters ( 'woocommerce_csv_product_import_mapping_options' , $options , $item );
2017-05-10 20:15:28 +00:00
}
2017-05-01 21:30:45 +00:00
}