Parser progress
This commit is contained in:
parent
f2af2d4e7c
commit
1f10995d80
|
@ -114,7 +114,7 @@ class WC_Product_Importer extends WP_Importer {
|
||||||
|
|
||||||
$this->import_start();
|
$this->import_start();
|
||||||
|
|
||||||
$raw_data = $this->read_csv( $file, array( 'lines' => 3 ) );
|
$raw_data = $this->read_csv( $file, array( 'lines' => 3, 'parse' => true ) );
|
||||||
|
|
||||||
// TODO: Remove temporary code once mapping screen is ready.
|
// TODO: Remove temporary code once mapping screen is ready.
|
||||||
// Mapping screen.
|
// Mapping screen.
|
||||||
|
@ -171,16 +171,17 @@ class WC_Product_Importer extends WP_Importer {
|
||||||
* Read a CSV file.
|
* Read a CSV file.
|
||||||
*
|
*
|
||||||
* @param mixed $file
|
* @param mixed $file
|
||||||
* @param array $args Args to modify reading
|
* @param array $args See $default_args
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function read_csv( $file, $args ) {
|
public function read_csv( $file, $args ) {
|
||||||
|
|
||||||
$default_args = array(
|
$default_args = array(
|
||||||
'start_pos' => 0,
|
'start_pos' => 0, // File pointer start.
|
||||||
'end_pos' => -1,
|
'end_pos' => -1, // File pointer end.
|
||||||
'lines' => -1,
|
'lines' => -1, // Max lines to read.
|
||||||
'mapping' => array()
|
'mapping' => array(), // Column mapping. csv_heading => schema_heading.
|
||||||
|
'parse' => false, // Whether to sanitize and format data.
|
||||||
);
|
);
|
||||||
$args = wp_parse_args( $args, $default_args );
|
$args = wp_parse_args( $args, $default_args );
|
||||||
|
|
||||||
|
@ -209,12 +210,24 @@ class WC_Product_Importer extends WP_Importer {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! empty( $args['mapping'] ) ) {
|
if ( ! empty( $args['mapping'] ) ) {
|
||||||
$data = $this->parse_data( $data, $args['mapping'] );
|
$data = $this->map_headers( $data, $args['mapping'] );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $args['parse'] ) {
|
||||||
|
$data = $this->parse_data( $data );
|
||||||
}
|
}
|
||||||
|
|
||||||
return apply_filters( 'woocommerce_csv_product_import_data', $data, $file, $args );
|
return apply_filters( 'woocommerce_csv_product_import_data', $data, $file, $args );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function map_headers( $data, $mapping ) {
|
||||||
|
$data['headers'] = array();
|
||||||
|
foreach ( $data['raw_headers'] as $heading ) {
|
||||||
|
$data['headers'] = isset( $mapping[ $heading ] ) ? $mapping[ $heading ] : $heading;
|
||||||
|
}
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map and format raw data to known fields.
|
* Map and format raw data to known fields.
|
||||||
*
|
*
|
||||||
|
@ -231,19 +244,69 @@ class WC_Product_Importer extends WP_Importer {
|
||||||
'Date sale price ends' => 'wc_format_datetime',
|
'Date sale price ends' => 'wc_format_datetime',
|
||||||
'In stock?' => 'boolval',
|
'In stock?' => 'boolval',
|
||||||
'Sold individually?' => 'boolval',
|
'Sold individually?' => 'boolval',
|
||||||
// etc.
|
'Weight' => 'absint',
|
||||||
|
'Length' => 'absint',
|
||||||
|
'Height' => 'absint',
|
||||||
|
'Width' => 'absint',
|
||||||
|
'Allow customer reviews?' => 'boolval',
|
||||||
|
'Purchase Note' => 'wp_kses',
|
||||||
|
'Price' => 'wc_format_decimal',
|
||||||
|
'Regular Price' => 'wc_format_decimal',
|
||||||
|
'Stock' => 'absint',
|
||||||
|
'Categories' => array( $this, 'parse_categories' ),
|
||||||
|
'Tags' => array( $this, 'parse_comma_field' ),
|
||||||
|
'Images' => array( $this, 'parse_comma_field' ),
|
||||||
|
'Upsells' => array( $this, 'parse_comma_field' ),
|
||||||
|
'Cross-sells' => array( $this, 'parse_comma_field' ),
|
||||||
|
'Download Limit' => 'absint',
|
||||||
|
'Download Expiry Days' => 'absint',
|
||||||
);
|
);
|
||||||
|
|
||||||
$data['headers'] = array();
|
|
||||||
foreach ( $data['raw_headers'] as $heading ) {
|
$regex_match_data_formatting = array(
|
||||||
$data['headers'] = isset( $mapping[ $heading ] ) ? $mapping[ $heading ] : $heading;
|
'/Attribute * Value\(s\)/' => array( $this, 'parse_comma_field' ),
|
||||||
|
'/Attribute * Visible/' => 'boolval',
|
||||||
|
'/Download * URL/' => 'esc_url',
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// special cases: attribute * name, attribute * value(s), attribute * default, attribute * visible
|
||||||
|
// Download 1 Name, Download 1 URL,
|
||||||
|
$headers = isset( $data['headers'] ) && ! empty( $data['headers'] ) ? $data['headers'] : $data['raw_headers'];
|
||||||
|
|
||||||
|
foreach ( $headers as $index => $heading ) {
|
||||||
|
|
||||||
|
// Figure out the parse function.
|
||||||
|
$formatting_function = 'esc_attr';
|
||||||
|
if ( isset( $data_formatting[ $heading ] ) ) {
|
||||||
|
$formatting_function = $data_formatting[ $heading ];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
foreach ( $regex_match_data_formatting as $regex => $callback ) {
|
||||||
|
if ( preg_match( $regex, $heading ) ) {
|
||||||
|
$formatting_function = $callback;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run columns through formatting.
|
// Go down the column parsing.
|
||||||
|
foreach ( $data['data'] as &$row ) {
|
||||||
|
$row[ $index ] = call_user_func( $formatting_function, $row[ $index ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function parse_comma_field( $field ) {
|
||||||
|
return $field;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function parse_categories( $field ) {
|
||||||
|
return $field;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Output header html.
|
* Output header html.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue