From 7531d0a022b89ddb04700f2460f580c7559f4167 Mon Sep 17 00:00:00 2001 From: claudiulodro Date: Mon, 1 May 2017 14:30:45 -0700 Subject: [PATCH] Importer admin screen --- includes/admin/class-wc-admin-importers.php | 26 +- .../importers/class-wc-product-importer.php | 268 ++++++++++++++++++ 2 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 includes/admin/importers/class-wc-product-importer.php diff --git a/includes/admin/class-wc-admin-importers.php b/includes/admin/class-wc-admin-importers.php index 0ed3c2fd9ed..dad22a15b74 100644 --- a/includes/admin/class-wc-admin-importers.php +++ b/includes/admin/class-wc-admin-importers.php @@ -31,11 +31,35 @@ class WC_Admin_Importers { * Add menu items. */ public function register_importers() { + register_importer( 'woocommerce_product_csv', __( 'WooCommerce products (CSV)', 'woocommerce' ), __( 'Import products to your store via a csv file.', 'woocommerce' ), array( $this, 'product_importer' ) ); register_importer( 'woocommerce_tax_rate_csv', __( 'WooCommerce tax rates (CSV)', 'woocommerce' ), __( 'Import tax rates to your store via a csv file.', 'woocommerce' ), array( $this, 'tax_rates_importer' ) ); } /** - * Add menu item. + * Add product importer menu item. + */ + public function product_importer() { + // Load Importer API + require_once ABSPATH . 'wp-admin/includes/import.php'; + + if ( ! class_exists( 'WP_Importer' ) ) { + $class_wp_importer = ABSPATH . 'wp-admin/includes/class-wp-importer.php'; + + if ( file_exists( $class_wp_importer ) ) { + require $class_wp_importer; + } + } + + // includes + require( dirname( __FILE__ ) . '/importers/class-wc-product-importer.php' ); + + // Dispatch + $importer = new WC_Product_Importer(); + $importer->dispatch(); + } + + /** + * Add tax rate importer menu item. */ public function tax_rates_importer() { // Load Importer API diff --git a/includes/admin/importers/class-wc-product-importer.php b/includes/admin/importers/class-wc-product-importer.php new file mode 100644 index 00000000000..7cc1dda2382 --- /dev/null +++ b/includes/admin/importers/class-wc-product-importer.php @@ -0,0 +1,268 @@ +import_page = 'woocommerce_product_csv'; + $this->delimiter = empty( $_POST['delimiter'] ) ? ',' : (string) wc_clean( $_POST['delimiter'] ); + } + + /** + * Registered callback function for the WordPress Importer. + * + * Manages the three separate stages of the CSV import process. + */ + public function dispatch() { + + $this->header(); + + $step = empty( $_GET['step'] ) ? 0 : (int) $_GET['step']; + + switch ( $step ) { + + case 0: + $this->greet(); + break; + + case 1: + check_admin_referer( 'import-upload' ); + + if ( $this->handle_upload() ) { + + if ( $this->id ) { + $file = get_attached_file( $this->id ); + } else { + $file = ABSPATH . $this->file_url; + } + + $this->import( $file ); + } + break; + } + + $this->footer(); + } + + /** + * Import is starting. + */ + private function import_start() { + if ( function_exists( 'gc_enable' ) ) { + gc_enable(); + } + wc_set_time_limit( 0 ); + @ob_flush(); + @flush(); + @ini_set( 'auto_detect_line_endings', '1' ); + } + + /** + * Import the file if it exists and is valid. + * + * @param mixed $file + */ + public function import( $file ) { + if ( ! is_file( $file ) ) { + $this->import_error( __( 'The file does not exist, please try again.', 'woocommerce' ) ); + } + + $this->import_start(); + + $loop = 0; + + if ( ( $handle = fopen( $file, "r" ) ) !== false ) { + + $header = fgetcsv( $handle, 0, $this->delimiter ); + + while ( ( $row = fgetcsv( $handle, 0, $this->delimiter ) ) !== false ) { + // TODO. Parse and process input. + } + + fclose( $handle ); + } + + // Show Result + echo '

'; + /* translators: %s: products count */ + printf( + __( 'Import complete - imported %s products.', 'woocommerce' ), + '' . $loop . '' + ); + echo '

'; + + $this->import_end(); + } + + /** + * Performs post-import cleanup of files and the cache. + */ + public function import_end() { + echo '

' . __( 'All done!', 'woocommerce' ) . ' ' . __( 'View products', 'woocommerce' ) . '' . '

'; + + do_action( 'import_end' ); + } + + /** + * Handles the CSV upload and initial parsing of the file to prepare for. + * displaying author import options. + * + * @return bool False if error uploading or invalid file, true otherwise + */ + public function handle_upload() { + if ( empty( $_POST['file_url'] ) ) { + + $file = wp_import_handle_upload(); + + if ( isset( $file['error'] ) ) { + $this->import_error( $file['error'] ); + } + + $this->id = absint( $file['id'] ); + + } elseif ( file_exists( ABSPATH . $_POST['file_url'] ) ) { + $this->file_url = esc_attr( $_POST['file_url'] ); + } else { + $this->import_error(); + } + + return true; + } + + /** + * Output header html. + */ + public function header() { + echo '
'; + echo '

' . __( 'Import products', 'woocommerce' ) . '

'; + } + + /** + * Output footer html. + */ + public function footer() { + echo '
'; + } + + /** + * Output information about the uploading process. + */ + public function greet() { + + echo '
'; + echo '

' . __( 'Hi there! Upload a CSV file containing products to import them into your shop. Choose a .csv file to upload, then click "Upload file and import".', 'woocommerce' ) . '

'; + + $action = 'admin.php?import=woocommerce_product_csv&step=1'; + + $bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() ); + $size = size_format( $bytes ); + $upload_dir = wp_upload_dir(); + if ( ! empty( $upload_dir['error'] ) ) : + ?>

+

+
+ + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +

+

+ +

+
+ '; + } + + /** + * Show import error and quit. + * @param string $message + */ + private function import_error( $message = '' ) { + echo '

' . __( 'Sorry, there has been an error.', 'woocommerce' ) . '
'; + if ( $message ) { + echo esc_html( $message ); + } + echo '

'; + $this->footer(); + die(); + } + +}