/** * Get an importer Instance * * Loads the importer class and creates an instance of it. * This function will cache instances, so calling it for the * same type of importer will only create one instance and * return the same instance on following calls. * * @since 3.0.0 * @param string $type Importer type. * @return mixed Instance of the importer class or null on failure */ public function get_importer($type) { if (!$type) { return null; } // if importer instance is not in the cache already, load & create it if (!isset($this->importers[$type])) { $this->load_wp_importer_api(); require_once wc_csv_import_suite()->get_plugin_path() . '/includes/class-wc-csv-import-suite-import-exception.php'; require_once wc_csv_import_suite()->get_plugin_path() . '/includes/class-wc-csv-import-suite-parser.php'; require_once wc_csv_import_suite()->get_plugin_path() . '/includes/class-wc-csv-import-suite-importer.php'; $importer = null; switch ($type) { case 'woocommerce_customer_csv': require_once wc_csv_import_suite()->get_plugin_path() . '/includes/class-wc-csv-import-suite-customer-import.php'; $importer = 'WC_CSV_Import_Suite_Customer_Import'; break; case 'woocommerce_coupon_csv': require_once wc_csv_import_suite()->get_plugin_path() . '/includes/class-wc-csv-import-suite-coupon-import.php'; $importer = 'WC_CSV_Import_Suite_Coupon_Import'; break; case 'woocommerce_order_csv': require_once wc_csv_import_suite()->get_plugin_path() . '/includes/class-wc-csv-import-suite-order-import.php'; $importer = 'WC_CSV_Import_Suite_Order_Import'; break; } /** * Filter the loaded importer instance * * Allows 3rd parties to load their importer instances in a streamlined manner * * @since 3.0.0 * @param mixed $importer Importer instance, class name or null (if no matching importer was found) * @param string $type Importer type, such as `woocommerce_customer_csv` */ $importer = apply_filters('wc_csv_import_suite_importer_class', $importer, $type); // create new importer instance if (is_string($importer)) { $importer = new $importer(); } // cache the instance $this->importers[$type] = $importer; } return $this->importers[$type]; }
function init_woocommerce_csv_import_suite() { /** * Customer/Order/Coupon CSV Import Suite Main Class. This class is responsible * for registering the importers and setting up the admin start page/menu * items. The actual import process is handed off to the various parse * and import classes. * * Adapted from the WordPress post importer by the WordPress team */ class WC_CSV_Import_Suite extends SV_WC_Plugin { /** version number */ const VERSION = '3.0.2'; /** @var WC_CSV_Import_Suite single instance of this plugin */ protected static $instance; /** string the plugin id */ const PLUGIN_ID = 'csv_import_suite'; /** plugin text domain, DEPRECATED as of 2.9.0 */ const TEXT_DOMAIN = 'woocommerce-csv-import-suite'; /** @var \WC_CSV_Import_Suite_Admin instance */ protected $admin; /** @var \WC_CSV_Import_Suite_Importers instance */ protected $importers; /** @var \WC_CSV_Import_Suite_Background_Import instance */ protected $background_import; /** @var \WC_CSV_Import_Suite_AJAX instance */ protected $ajax; /** * Construct and initialize the main plugin class */ public function __construct() { parent::__construct(self::PLUGIN_ID, self::VERSION, array('dependencies' => array('mbstring'))); // Initialize add_action('init', array($this, 'includes')); } /** * Include required files * * @since 3.0.0 */ public function includes() { // importers and background import must be loaded all the time, because // otherwise background jobs simply won't work require_once $this->get_framework_path() . '/utilities/class-sv-wp-async-request.php'; require_once $this->get_framework_path() . '/utilities/class-sv-wp-background-job-handler.php'; $this->background_import = $this->load_class('/includes/class-wc-csv-import-suite-background-import.php', 'WC_CSV_Import_Suite_Background_Import'); $this->importers = $this->load_class('/includes/class-wc-csv-import-suite-importers.php', 'WC_CSV_Import_Suite_Importers'); if (is_admin()) { $this->admin_includes(); } if (is_ajax()) { $this->ajax_includes(); } } /** * Include required admin files * * @since 3.0.0 */ private function admin_includes() { $this->admin = $this->load_class('/includes/admin/class-wc-csv-import-suite-admin.php', 'WC_CSV_Import_Suite_Admin'); } /** * Include required AJAX files * * @since 3.0.0 */ private function ajax_includes() { require_once $this->get_plugin_path() . '/includes/class-wc-csv-import-suite-parser.php'; $this->ajax = $this->load_class('/includes/class-wc-csv-import-suite-ajax.php', 'WC_CSV_Import_Suite_AJAX'); } /** * Return admin class instance * * @since 3.0.0 * @return \WC_CSV_Import_Suite_Admin */ public function get_admin_instance() { return $this->admin; } /** * Return importers class instance * * @since 3.0.0 * @return \WC_CSV_Import_Suite_Importers */ public function get_importers_instance() { return $this->importers; } /** * Return background import class instance * * @since 3.0.0 * @return \WC_CSV_Import_Suite_Background_Import */ public function get_background_import_instance() { return $this->background_import; } /** * Return the ajax class instance * * @since 3.0.0 * @return \WC_CSV_Import_Suite_AJAX */ public function get_ajax_instance() { return $this->ajax; } /** * Backwards compat for changing the visibility of some class instances. * * @TODO Remove this as part of WC 2.7 compat {IT 2016-05-17} * * @since 3.0.0 */ public function __get($name) { switch ($name) { case 'admin': _deprecated_function('wc_csv_import_suite()->admin', '3.0.0', 'wc_csv_import_suite()->get_admin_instance()'); return $this->get_admin_instance(); case 'ajax': _deprecated_function('wc_csv_import_suite()->ajax', '3.0.0', 'wc_csv_import_suite()->get_ajax_instance()'); return $this->get_ajax_instance(); } // you're probably doing it wrong trigger_error('Call to undefined property ' . __CLASS__ . '::' . $name, E_USER_ERROR); return null; } /** * Load plugin text domain. * * @see SV_WC_Plugin::load_translation() */ public function load_translation() { load_plugin_textdomain('woocommerce-csv-import-suite', false, dirname(plugin_basename($this->get_file())) . '/i18n/languages'); } /** * Returns the "Import" plugin action link to go directly to the plugin * settings page (if any) * * @since 2.3 * @see SV_WC_Plugin::get_settings_link() * @param string $plugin_id the plugin identifier. Note that this can be a * sub-identifier for plugins with multiple parallel settings pages * (ie a gateway that supports both credit cards and echecks) * @return string plugin configure link */ public function get_settings_link($plugin_id = null) { $settings_url = $this->get_settings_url($plugin_id); if ($settings_url) { return sprintf('<a href="%s">%s</a>', $settings_url, __('Import', 'woocommerce-csv-import-suite')); } // no settings return ''; } /** * Gets the plugin configuration URL * * @since 2.3 * @see SV_WC_Plugin::get_settings_url() * @param string $plugin_id the plugin identifier. * @return string plugin settings URL */ public function get_settings_url($plugin_id = null) { // link to the import page return admin_url('admin.php?page=' . self::PLUGIN_ID); } /** * Gets the plugin documentation url, which is non-standard for this plugin * * @since 2.3.0 * @see SV_WC_Plugin::get_documentation_url() * @return string documentation URL */ public function get_documentation_url() { return 'http://docs.woothemes.com/document/customer-order-csv-import-suite/'; } /** * Gets the plugin support URL * * @since VERSION * @see SV_WC_Plugin::get_support_url() * @return string */ public function get_support_url() { return 'http://support.woothemes.com/'; } /** * Returns true if on the Customer/Order/CouponImport page * * @since 2.3 * @see SV_WC_Plugin::is_plugin_settings() * @return boolean true if on the plugin admin settings page */ public function is_plugin_settings() { return isset($_GET['page']) && self::PLUGIN_ID == $_GET['page']; } /** Helper methods ******************************************************/ /** * Main Customer/Order/Coupon CSV Import Suite Instance, ensures only one instance is/can be loaded * * @since 2.7.0 * @see wc_csv_import_suite() * @return WC_CSV_Import_Suite */ public static function instance() { if (is_null(self::$instance)) { self::$instance = new self(); } return self::$instance; } /** * Returns the plugin name, localized * * @since 2.3 * @see SV_WC_Payment_Gateway::get_plugin_name() * @return string the plugin name */ public function get_plugin_name() { return __('WooCommerce Customer/Order/Coupon CSV Import', 'woocommerce-csv-import-suite'); } /** * Returns __FILE__ * * @since 2.3 * @return string the full path and filename of the plugin file */ protected function get_file() { return __FILE__; } } // class WC_CSV_Import_Suite /** * Returns the One True Instance of Customer/Order/Coupon CSV Import Suite * * @since 2.7.0 * @return WC_CSV_Import_Suite */ function wc_csv_import_suite() { return WC_CSV_Import_Suite::instance(); } // fire it up! wc_csv_import_suite(); }
<div class="wrap woocommerce"> <div class="icon32" id="icon-woocommerce-importer"><br></div> <h2><?php esc_html_e('Import Customers, Coupons & Orders', 'woocommerce-csv-import-suite'); ?> </h2> <div id="message" class="updated woocommerce-message wc-connect"> <div class="squeezer"> <h4><?php printf(esc_html__('%1$sCustomer CSV Import Suite%2$s Before getting started prepare your CSV files:', 'woocommerce-csv-import-suite'), '<strong>', '</strong> –'); ?> </h4> <p class="submit"><a href="<?php echo wc_csv_import_suite()->get_documentation_url(); ?> " class="button-primary"><?php esc_html_e('Documentation', 'woocommerce-csv-import-suite'); ?> </a> <a class="docs button-primary" href="https://docs.google.com/spreadsheets/d/16ub-_xEJD9V5UL6d_rTQ4LLu0PT9jXJ0Ti-iirlKyuU/edit#gid=0"><?php esc_html_e('Sample Customer CSV', 'woocommerce-csv-import-suite'); ?> </a> <a class="docs button-primary" href="https://docs.google.com/spreadsheets/d/16ub-_xEJD9V5UL6d_rTQ4LLu0PT9jXJ0Ti-iirlKyuU/edit#gid=620764597"><?php esc_html_e('Sample Coupon CSV', 'woocommerce-csv-import-suite'); ?> </a> <a class="docs button-primary" href="https://docs.google.com/spreadsheets/d/16ub-_xEJD9V5UL6d_rTQ4LLu0PT9jXJ0Ti-iirlKyuU/edit#gid=584795629"><?php esc_html_e('Sample Order CSV', 'woocommerce-csv-import-suite');
/** * Process a coupon * * @since 3.0.0 * @param mixed $data Parsed coupon data * @param array $options Optional. Options * @param array $raw_headers Optional. Raw headers * @return int|null */ protected function process_item($data, $options = array(), $raw_headers = array()) { $merging = $options['merge'] && isset($data['id']) && $data['id']; $dry_run = isset($options['dry_run']) && $options['dry_run']; wc_csv_import_suite()->log(__('Processing coupon.', 'woocommerce-csv-import-suite')); $coupon_id = null; // merging if ($merging) { wc_csv_import_suite()->log(sprintf(__("> Merging coupon '%s'.", 'woocommerce-csv-import-suite'), esc_html($data['code']))); if (!$dry_run) { $coupon_id = $this->update_coupon($data['id'], $data, $options); } } else { // insert coupon wc_csv_import_suite()->log(sprintf(__("> Inserting coupon '%s'", 'woocommerce-csv-import-suite'), esc_html($data['code']))); if (!$dry_run) { $coupon_id = $this->create_coupon($data, $options); } } // import failed if (!$dry_run && is_wp_error($coupon_id)) { $this->add_import_result('failed', $coupon_id->get_error_message()); return null; } // TODO: is that OK to log and return as coupon_id in case of dry run? if ($dry_run) { $coupon_id = $merging ? $data['id'] : 9999; } $result = $merging ? 'merged' : 'inserted'; $message = $merging ? __('> Finished merging coupon %s.', 'woocommerce-csv-import-suite') : __('> Finished importing coupon %s.', 'woocommerce-csv-import-suite'); wc_csv_import_suite()->log(sprintf($message, esc_html($data['code']))); $this->add_import_result($result); return $coupon_id; }
/** * Load an importer and start processing the import queue * * @since 3.0.0 */ public function load_importer() { if (!defined('WP_LOAD_IMPORTERS')) { return; } $type = isset($_REQUEST['import']) ? esc_attr($_REQUEST['import']) : null; $importer = wc_csv_import_suite()->get_importers_instance()->get_importer($type); if ($importer) { $importer->dispatch(); } }
/** * Log a row's import status * * @since 3.0.0 * @param int $line_num Line number from CSV file * @param string $status Status * @param string $message Optional * @param bool $log Optional. Whether to log the result or not. Defaults to true */ protected function add_import_result($status, $message = '', $log = true) { $this->import_results[$this->line_num] = array('status' => $status, 'message' => $message); if ($log) { $labels = array('inserted' => esc_html__('Inserted', 'woocommerce-csv-import-suite'), 'merged' => esc_html__('Merged', 'woocommerce-csv-import-suite'), 'skipped' => esc_html__('Skipped', 'woocommerce-csv-import-suite'), 'failed' => esc_html__('Failed', 'woocommerce-csv-import-suite')); $status_label = isset($labels[$status]) ? $labels[$status] : $status; $log_message = sprintf("> > %s. %s", $status_label, $message); wc_csv_import_suite()->log($log_message); } }
/** * Update an order item * * @since 3.0.0 * @param \WC_Order $order WC_Order instance * @param int $order_item_id Order item ID to update * @param array $item Parsed item data from CSV * @param string $type Line item type * @return int|false ID of the updated order item, false on failure */ private function update_order_item(WC_Order $order, $order_item_id, $item, $type) { $result = false; switch ($type) { case 'line_item': $product = $this->get_product_for_item($item); $args = $this->prepare_product_args($item); $result = $order->update_product($order_item_id, $product, $args); if (!$result) { wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot update order item %d.', 'woocommerce-csv-import-suite'), $order_item_id)); } break; case 'shipping': $args = array('order_item_name' => $item['method_title']); $result = wc_update_order_item($order_item_id, $args); if (!$result) { wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot update shipping method "%s".', 'woocommerce-csv-import-suite'), esc_html($item['title']))); } break; case 'tax': $args = array('order_item_name' => $item['code']); $result = wc_update_order_item($order_item_id, $args); if (!$result) { wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot update tax "%s".', 'woocommerce-csv-import-suite'), esc_html($item['label']))); } break; case 'coupon': $args = array('code' => $item['code'], 'discount_amount' => $item['amount']); $result = $order->update_coupon($order_item_id, $args); if (!$result) { wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot merge coupon "%s".', 'woocommerce-csv-import-suite'), esc_html($item['code']))); } break; case 'fee': $args = array('name' => $item['title'], 'line_total' => $item['total'], 'line_tax' => $item['total_tax'], 'tax_class' => isset($item['tax_class']) ? $item['tax_class'] : ''); $result = $order->update_fee($order_item_id, $args); if (!$result) { wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot merge fee "%s".', 'woocommerce-csv-import-suite'), esc_html($item['title']))); } break; } return $result; }