2017-05-15 22:49:53 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* WooCommerce Product CSV importer
|
|
|
|
*
|
|
|
|
* @author Automattic
|
|
|
|
* @category Admin
|
|
|
|
* @package WooCommerce/Import
|
|
|
|
* @version 3.1.0
|
|
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Include dependencies.
|
|
|
|
*/
|
2017-05-16 04:02:46 +00:00
|
|
|
if ( ! class_exists( 'WC_Product_Importer', false ) ) {
|
|
|
|
include_once( dirname( __FILE__ ) . '/abstract-wc-product-importer.php' );
|
2017-05-15 22:49:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-05-15 23:23:42 +00:00
|
|
|
* WC_Product_CSV_Importer Class.
|
2017-05-15 22:49:53 +00:00
|
|
|
*/
|
2017-05-16 04:02:46 +00:00
|
|
|
class WC_Product_CSV_Importer extends WC_Product_Importer {
|
2017-05-15 22:49:53 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize importer.
|
|
|
|
*
|
|
|
|
* @param string $file File to read.
|
|
|
|
* @param array $args Arguments for the parser.
|
|
|
|
*/
|
|
|
|
public function __construct( $file, $params = array() ) {
|
|
|
|
$default_args = array(
|
|
|
|
'start_pos' => 0, // File pointer start.
|
|
|
|
'end_pos' => -1, // File pointer end.
|
|
|
|
'lines' => -1, // Max lines to read.
|
|
|
|
'mapping' => array(), // Column mapping. csv_heading => schema_heading.
|
|
|
|
'parse' => false, // Whether to sanitize and format data.
|
|
|
|
'delimiter' => ',', // CSV delimiter.
|
|
|
|
);
|
|
|
|
|
|
|
|
$this->params = wp_parse_args( $params, $default_args );
|
|
|
|
$this->file = $file;
|
|
|
|
|
|
|
|
$this->read_file();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Read file.
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function read_file() {
|
|
|
|
if ( false !== ( $handle = fopen( $this->file, 'r' ) ) ) {
|
|
|
|
$this->raw_keys = fgetcsv( $handle, 0, $this->params['delimiter'] );
|
|
|
|
|
|
|
|
if ( 0 !== $this->params['start_pos'] ) {
|
|
|
|
fseek( $handle, (int) $this->params['start_pos'] );
|
|
|
|
}
|
|
|
|
|
|
|
|
while ( false !== ( $row = fgetcsv( $handle, 0, $this->params['delimiter'] ) ) ) {
|
|
|
|
$this->raw_data[] = $row;
|
|
|
|
|
|
|
|
if ( ( $this->params['end_pos'] > 0 && ftell( $handle ) >= $this->params['end_pos'] ) || 0 === --$this->params['lines'] ) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2017-05-17 21:34:49 +00:00
|
|
|
|
|
|
|
$this->file_position = ftell( $handle );
|
2017-05-15 22:49:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! empty( $this->params['mapping'] ) ) {
|
|
|
|
$this->set_mapped_keys();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( $this->params['parse'] ) {
|
|
|
|
$this->set_parsed_data();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set file mapped keys.
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function set_mapped_keys() {
|
|
|
|
$mapping = $this->params['mapping'];
|
|
|
|
|
|
|
|
foreach ( $this->raw_keys as $key ) {
|
|
|
|
$this->mapped_keys[] = isset( $mapping[ $key ] ) ? $mapping[ $key ] : $key;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-18 21:32:03 +00:00
|
|
|
/**
|
|
|
|
* Parse relative field and return product ID.
|
|
|
|
* Handle `id:xx` and SKUs.
|
|
|
|
*
|
|
|
|
* @param string $field Field value.
|
2017-05-18 23:15:42 +00:00
|
|
|
* @return int|string
|
2017-05-18 21:32:03 +00:00
|
|
|
*/
|
|
|
|
protected function parse_relative_field( $field ) {
|
2017-05-18 23:15:42 +00:00
|
|
|
if ( empty( $field ) ) {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
|
2017-05-18 21:32:03 +00:00
|
|
|
if ( preg_match( '/^id:(\d+)$/', $field, $matches ) ) {
|
|
|
|
return intval( $matches[1] );
|
|
|
|
}
|
|
|
|
|
|
|
|
return wc_get_product_id_by_sku( $field );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Parse reletive comma-delineated field and return product ID.
|
|
|
|
*
|
|
|
|
* @param string $field Field value.
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function parse_relative_comma_field( $field ) {
|
|
|
|
if ( empty( $field ) ) {
|
|
|
|
return array();
|
|
|
|
}
|
|
|
|
|
|
|
|
return array_filter( array_map( array( $this, 'parse_relative_field' ), array_map( 'trim', explode( ',', $field ) ) ) );
|
|
|
|
}
|
|
|
|
|
2017-05-15 22:49:53 +00:00
|
|
|
/**
|
|
|
|
* Parse a comma-delineated field from a CSV.
|
|
|
|
*
|
2017-05-18 21:28:24 +00:00
|
|
|
* @param string $field Field value.
|
2017-05-15 22:49:53 +00:00
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function parse_comma_field( $field ) {
|
|
|
|
if ( empty( $field ) ) {
|
|
|
|
return array();
|
|
|
|
}
|
|
|
|
|
2017-05-18 21:28:24 +00:00
|
|
|
return array_map( 'wc_clean', array_map( 'trim', explode( ',', $field ) ) );
|
2017-05-15 22:49:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Parse a field that is generally '1' or '0' but can be something else.
|
|
|
|
*
|
2017-05-18 21:28:24 +00:00
|
|
|
* @param string $field Field value.
|
2017-05-15 22:49:53 +00:00
|
|
|
* @return bool|string
|
|
|
|
*/
|
|
|
|
protected function parse_bool_field( $field ) {
|
|
|
|
if ( '0' === $field ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( '1' === $field ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Don't return explicit true or false for empty fields or values like 'notify'.
|
2017-05-18 21:28:24 +00:00
|
|
|
return wc_clean( $field );
|
2017-05-15 22:49:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Parse a float value field.
|
|
|
|
*
|
2017-05-18 21:28:24 +00:00
|
|
|
* @param string $field Field value.
|
2017-05-15 22:49:53 +00:00
|
|
|
* @return float|string
|
|
|
|
*/
|
|
|
|
protected function parse_float_field( $field ) {
|
|
|
|
if ( '' === $field ) {
|
|
|
|
return $field;
|
|
|
|
}
|
|
|
|
|
|
|
|
return floatval( $field );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Parse a category field from a CSV.
|
|
|
|
* Categories are separated by commas and subcategories are "parent > subcategory".
|
|
|
|
*
|
2017-05-18 21:28:24 +00:00
|
|
|
* @param string $field Field value.
|
2017-05-15 22:49:53 +00:00
|
|
|
* @return array of arrays with "parent" and "name" keys.
|
|
|
|
*/
|
2017-05-24 06:14:54 +00:00
|
|
|
protected function parse_categories_field( $field ) {
|
2017-05-15 22:49:53 +00:00
|
|
|
if ( empty( $field ) ) {
|
|
|
|
return array();
|
|
|
|
}
|
|
|
|
|
2017-05-24 00:06:16 +00:00
|
|
|
$row_terms = array_map( 'trim', explode( ',', $field ) );
|
2017-05-15 22:49:53 +00:00
|
|
|
$categories = array();
|
|
|
|
|
2017-05-24 00:06:16 +00:00
|
|
|
foreach ( $row_terms as $row_term ) {
|
|
|
|
$parent = null;
|
|
|
|
$_terms = array_map( 'trim', explode( '>', $row_term ) );
|
|
|
|
$total = count( $_terms );
|
|
|
|
|
|
|
|
foreach ( $_terms as $index => $_term ) {
|
|
|
|
// Check if category exists. Parent must be empty string or null if doesn't exists.
|
2017-05-24 06:26:17 +00:00
|
|
|
// @codingStandardsIgnoreStart
|
2017-05-24 00:06:16 +00:00
|
|
|
$term = term_exists( $_term, 'product_cat', $parent );
|
2017-05-24 06:26:17 +00:00
|
|
|
// @codingStandardsIgnoreEnd
|
2017-05-24 00:06:16 +00:00
|
|
|
|
|
|
|
if ( is_array( $term ) ) {
|
|
|
|
$term_id = $term['term_id'];
|
|
|
|
} else {
|
|
|
|
$term = wp_insert_term( $_term, 'product_cat', array( 'parent' => intval( $parent ) ) );
|
|
|
|
$term_id = $term['term_id'];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Only requires assign the last category.
|
2017-05-24 06:26:17 +00:00
|
|
|
if ( ( 1 + $index ) === $total ) {
|
2017-05-24 00:06:16 +00:00
|
|
|
$categories[] = $term_id;
|
|
|
|
} else {
|
|
|
|
// Store parent to be able to insert or query categories based in parent ID.
|
|
|
|
$parent = $term_id;
|
|
|
|
}
|
2017-05-15 22:49:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $categories;
|
|
|
|
}
|
|
|
|
|
2017-05-22 21:54:30 +00:00
|
|
|
/**
|
|
|
|
* Parse a tag field from a CSV.
|
|
|
|
*
|
|
|
|
* @param string $field Field value.
|
|
|
|
* @return array
|
|
|
|
*/
|
2017-05-24 06:14:54 +00:00
|
|
|
protected function parse_tags_field( $field ) {
|
2017-05-22 21:54:30 +00:00
|
|
|
if ( empty( $field ) ) {
|
|
|
|
return array();
|
|
|
|
}
|
|
|
|
|
2017-05-24 00:11:21 +00:00
|
|
|
$names = array_map( 'trim', explode( ',', $field ) );
|
2017-05-22 21:54:30 +00:00
|
|
|
$tags = array();
|
|
|
|
|
|
|
|
foreach ( $names as $name ) {
|
2017-05-22 22:24:33 +00:00
|
|
|
$term = get_term_by( 'name', $name, 'product_tag' );
|
|
|
|
|
|
|
|
if ( ! $term ) {
|
2017-05-24 00:11:21 +00:00
|
|
|
$term = (object) wp_insert_term( $name, 'product_tag' );
|
2017-05-22 21:54:30 +00:00
|
|
|
}
|
2017-05-22 22:24:33 +00:00
|
|
|
|
|
|
|
$tags[] = $term->term_id;
|
2017-05-22 21:54:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return $tags;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Parse a shipping class field from a CSV.
|
|
|
|
*
|
|
|
|
* @param string $field Field value.
|
|
|
|
* @return int
|
|
|
|
*/
|
2017-05-24 06:14:54 +00:00
|
|
|
protected function parse_shipping_class_field( $field ) {
|
2017-05-22 22:24:33 +00:00
|
|
|
$term = get_term_by( 'name', $field, 'product_shipping_class' );
|
|
|
|
|
|
|
|
if ( ! $term ) {
|
2017-05-24 00:11:21 +00:00
|
|
|
$term = (object) wp_insert_term( $name, 'product_shipping_class' );
|
2017-05-22 21:54:30 +00:00
|
|
|
}
|
|
|
|
|
2017-05-22 22:24:33 +00:00
|
|
|
return $term->term_id;
|
2017-05-22 21:54:30 +00:00
|
|
|
}
|
|
|
|
|
2017-05-24 06:14:54 +00:00
|
|
|
/**
|
|
|
|
* Parse images list from a CSV.
|
|
|
|
*
|
|
|
|
* @param string $field Field value.
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function parse_images_field( $field ) {
|
|
|
|
if ( empty( $field ) ) {
|
|
|
|
return array();
|
|
|
|
}
|
|
|
|
|
|
|
|
return array_map( 'esc_url_raw', array_map( 'trim', explode( ',', $field ) ) );
|
|
|
|
}
|
|
|
|
|
2017-05-15 22:49:53 +00:00
|
|
|
/**
|
2017-05-19 21:50:09 +00:00
|
|
|
* Get formatting callback.
|
2017-05-15 22:49:53 +00:00
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
2017-05-19 21:50:09 +00:00
|
|
|
protected function get_formating_callback() {
|
2017-05-15 22:49:53 +00:00
|
|
|
|
|
|
|
/**
|
2017-05-18 21:28:24 +00:00
|
|
|
* Columns not mentioned here will get parsed with 'wc_clean'.
|
2017-05-15 22:49:53 +00:00
|
|
|
* column_name => callback.
|
|
|
|
*/
|
|
|
|
$data_formatting = array(
|
|
|
|
'id' => 'absint',
|
2017-05-19 00:09:25 +00:00
|
|
|
'type' => array( $this, 'parse_comma_field' ),
|
2017-05-18 21:28:24 +00:00
|
|
|
'published' => array( $this, 'parse_bool_field' ),
|
2017-05-15 22:49:53 +00:00
|
|
|
'featured' => array( $this, 'parse_bool_field' ),
|
|
|
|
'date_on_sale_from' => 'strtotime',
|
|
|
|
'date_on_sale_to' => 'strtotime',
|
2017-05-18 21:28:24 +00:00
|
|
|
'short_description' => 'wp_kses_post',
|
|
|
|
'description' => 'wp_kses_post',
|
2017-05-15 22:49:53 +00:00
|
|
|
'manage_stock' => array( $this, 'parse_bool_field' ),
|
|
|
|
'backorders' => array( $this, 'parse_bool_field' ),
|
2017-05-19 00:09:25 +00:00
|
|
|
'stock_status' => array( $this, 'parse_bool_field' ),
|
2017-05-15 22:49:53 +00:00
|
|
|
'sold_individually' => array( $this, 'parse_bool_field' ),
|
|
|
|
'width' => array( $this, 'parse_float_field' ),
|
|
|
|
'length' => array( $this, 'parse_float_field' ),
|
|
|
|
'height' => array( $this, 'parse_float_field' ),
|
|
|
|
'weight' => array( $this, 'parse_float_field' ),
|
|
|
|
'reviews_allowed' => array( $this, 'parse_bool_field' ),
|
|
|
|
'purchase_note' => 'wp_kses_post',
|
|
|
|
'price' => 'wc_format_decimal',
|
|
|
|
'regular_price' => 'wc_format_decimal',
|
|
|
|
'stock_quantity' => 'absint',
|
2017-05-24 06:14:54 +00:00
|
|
|
'category_ids' => array( $this, 'parse_categories_field' ),
|
|
|
|
'tag_ids' => array( $this, 'parse_tags_field' ),
|
|
|
|
'shipping_class_id' => array( $this, 'parse_shipping_class_field' ),
|
|
|
|
'image_id' => array( $this, 'parse_images_field' ),
|
2017-05-18 21:32:03 +00:00
|
|
|
'parent_id' => array( $this, 'parse_relative_field' ),
|
|
|
|
'upsell_ids' => array( $this, 'parse_relative_comma_field' ),
|
|
|
|
'cross_sell_ids' => array( $this, 'parse_relative_comma_field' ),
|
2017-05-15 22:49:53 +00:00
|
|
|
'download_limit' => 'absint',
|
|
|
|
'download_expiry' => 'absint',
|
2017-05-22 23:18:39 +00:00
|
|
|
'external_url' => 'esc_url',
|
2017-05-15 22:49:53 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
2017-05-18 21:28:24 +00:00
|
|
|
* Match special column names.
|
2017-05-15 22:49:53 +00:00
|
|
|
*/
|
|
|
|
$regex_match_data_formatting = array(
|
2017-05-18 21:28:24 +00:00
|
|
|
'/attributes:value*/' => array( $this, 'parse_comma_field' ),
|
|
|
|
'/downloads:url*/' => 'esc_url',
|
2017-05-19 21:50:09 +00:00
|
|
|
'/meta:*/' => 'wp_kses_post', // Allow some HTML in meta fields.
|
2017-05-15 22:49:53 +00:00
|
|
|
);
|
|
|
|
|
2017-05-19 21:50:09 +00:00
|
|
|
$callbacks = array();
|
2017-05-15 22:49:53 +00:00
|
|
|
|
|
|
|
// Figure out the parse function for each column.
|
2017-05-19 21:50:09 +00:00
|
|
|
foreach ( $this->get_mapped_keys() as $index => $heading ) {
|
|
|
|
$callback = 'wc_clean';
|
2017-05-15 22:49:53 +00:00
|
|
|
|
|
|
|
if ( isset( $data_formatting[ $heading ] ) ) {
|
2017-05-19 21:50:09 +00:00
|
|
|
$callback = $data_formatting[ $heading ];
|
2017-05-15 22:49:53 +00:00
|
|
|
} else {
|
|
|
|
foreach ( $regex_match_data_formatting as $regex => $callback ) {
|
|
|
|
if ( preg_match( $regex, $heading ) ) {
|
2017-05-19 21:50:09 +00:00
|
|
|
$callback = $callback;
|
2017-05-15 22:49:53 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-19 21:50:09 +00:00
|
|
|
$callbacks[] = $callback;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $callbacks;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if strings starts with determined word.
|
|
|
|
*
|
|
|
|
* @param string $haystack Complete sentence.
|
|
|
|
* @param string $needle Excerpt.
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
protected function starts_with( $haystack, $needle ) {
|
2017-05-24 06:26:17 +00:00
|
|
|
return substr( $haystack, 0, strlen( $needle ) ) === $needle;
|
2017-05-19 21:50:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Expand special and internal data.
|
|
|
|
*
|
|
|
|
* @param array $data Data to import.
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function expand_data( $data ) {
|
|
|
|
$data = apply_filters( 'woocommerce_product_importer_pre_expand_data', $data );
|
|
|
|
|
|
|
|
// Meta data.
|
|
|
|
$data['meta_data'] = array();
|
|
|
|
$data['attributes'] = array();
|
|
|
|
$data['default_attributes'] = array();
|
|
|
|
$data['downloads'] = array();
|
2017-05-24 06:14:54 +00:00
|
|
|
$data['gallery_image_ids'] = array();
|
2017-05-19 21:50:09 +00:00
|
|
|
|
|
|
|
// Manage stock.
|
|
|
|
if ( isset( $data['stock_quantity'] ) ) {
|
|
|
|
$data['manage_stock'] = 0 < $data['stock_quantity'];
|
|
|
|
}
|
|
|
|
|
2017-05-24 06:14:54 +00:00
|
|
|
// Images.
|
|
|
|
if ( isset( $data['image_id'] ) ) {
|
|
|
|
$images = $data['image_id'];
|
|
|
|
$data['image_id'] = array_shift( $images );
|
|
|
|
|
|
|
|
if ( ! empty( $images ) ) {
|
|
|
|
$data['gallery_image_ids'] = $images;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-19 21:50:09 +00:00
|
|
|
// Type, virtual and downlodable.
|
|
|
|
if ( isset( $data['type'] ) ) {
|
|
|
|
$data['virtual'] = in_array( 'virtual', $data['type'], true );
|
|
|
|
$data['downloadable'] = in_array( 'downloadable', $data['type'], true );
|
|
|
|
|
|
|
|
// Convert type to string.
|
|
|
|
$data['type'] = current( array_diff( $data['type'], array( 'virtual', 'downloadable' ) ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle special column names.
|
|
|
|
foreach ( $data as $key => $value ) {
|
|
|
|
// Attributes.
|
|
|
|
if ( $this->starts_with( $key, 'attributes:name' ) ) {
|
|
|
|
if ( ! empty( $value ) ) {
|
|
|
|
$data['attributes'][ str_replace( 'attributes:name', '', $key ) ]['name'] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
unset( $data[ $key ] );
|
|
|
|
}
|
|
|
|
if ( $this->starts_with( $key, 'attributes:value' ) ) {
|
|
|
|
if ( ! empty( $value ) ) {
|
|
|
|
$data['attributes'][ str_replace( 'attributes:value', '', $key ) ]['value'] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
unset( $data[ $key ] );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Default attributes
|
|
|
|
if ( $this->starts_with( $key, 'attributes:default' ) ) {
|
|
|
|
if ( ! empty( $value ) ) {
|
|
|
|
$data['default_attributes'][] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
unset( $data[ $key ] );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Downloads.
|
|
|
|
if ( $this->starts_with( $key, 'downloads:name' ) ) {
|
|
|
|
if ( ! empty( $value ) ) {
|
2017-05-24 01:31:06 +00:00
|
|
|
$data['downloads'][ str_replace( 'downloads:name', '', $key ) ]['name'] = $value;
|
2017-05-19 21:50:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
unset( $data[ $key ] );
|
|
|
|
}
|
|
|
|
if ( $this->starts_with( $key, 'downloads:url' ) ) {
|
|
|
|
if ( ! empty( $value ) ) {
|
2017-05-24 01:31:06 +00:00
|
|
|
$data['downloads'][ str_replace( 'downloads:url', '', $key ) ]['url'] = $value;
|
2017-05-19 21:50:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
unset( $data[ $key ] );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Meta data.
|
|
|
|
if ( $this->starts_with( $key, 'meta:' ) ) {
|
|
|
|
$data['meta_data'][] = array(
|
|
|
|
'key' => str_replace( 'meta:', '', $key ),
|
|
|
|
'value' => $value,
|
|
|
|
);
|
|
|
|
|
|
|
|
unset( $data[ $key ] );
|
|
|
|
}
|
2017-05-15 22:49:53 +00:00
|
|
|
}
|
|
|
|
|
2017-05-19 21:50:09 +00:00
|
|
|
return $data;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Map and format raw data to known fields.
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function set_parsed_data() {
|
|
|
|
$parse_functions = $this->get_formating_callback();
|
|
|
|
$mapped_keys = $this->get_mapped_keys();
|
|
|
|
|
2017-05-15 22:49:53 +00:00
|
|
|
// Parse the data.
|
|
|
|
foreach ( $this->raw_data as $row ) {
|
2017-05-19 21:50:09 +00:00
|
|
|
$data = array();
|
|
|
|
|
|
|
|
foreach ( $row as $id => $value ) {
|
2017-05-18 21:28:24 +00:00
|
|
|
// Skip ignored columns.
|
2017-05-19 21:50:09 +00:00
|
|
|
if ( empty( $mapped_keys[ $id ] ) ) {
|
2017-05-18 21:28:24 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2017-05-19 21:50:09 +00:00
|
|
|
$data[ $mapped_keys[ $id ] ] = call_user_func( $parse_functions[ $id ], $value );
|
2017-05-15 22:49:53 +00:00
|
|
|
}
|
2017-05-18 21:28:24 +00:00
|
|
|
|
2017-05-19 21:50:09 +00:00
|
|
|
$this->parsed_data[] = apply_filters( 'woocommerce_product_importer_parsed_data', $this->expand_data( $data ) );
|
2017-05-15 22:49:53 +00:00
|
|
|
}
|
|
|
|
}
|
2017-05-16 04:22:00 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Process importer.
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function import() {
|
|
|
|
$data = array(
|
|
|
|
'imported' => array(),
|
|
|
|
'failed' => array(),
|
|
|
|
);
|
|
|
|
|
|
|
|
foreach ( $this->parsed_data as $parsed_data ) {
|
|
|
|
$result = $this->process_item( $parsed_data );
|
|
|
|
|
|
|
|
if ( is_wp_error( $result ) ) {
|
|
|
|
$data['failed'][] = $result;
|
|
|
|
} else {
|
|
|
|
$data['imported'][] = $result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $data;
|
|
|
|
}
|
2017-05-15 22:49:53 +00:00
|
|
|
}
|