Product Import Export for WooCommerce - Version 1.4.4

Version Description

  • Enhancement: Improved parsing.
  • Updates: Tested OK with WP 4.9.5 and WC 3.3.5
  • Fixed warnings.
Download this release

Release Info

Developer mujeebur
Plugin Icon 128x128 Product Import Export for WooCommerce
Version 1.4.4
Comparing to
See all releases

Code changes from version 1.4.3 to 1.4.4

includes/importer/class-wf-csv-parser.php CHANGED
@@ -229,7 +229,7 @@ class WF_CSV_Parser {
229
230
}
231
}
232
- $product['merging'] = true;
233
}
234
}
235
@@ -279,52 +279,30 @@ class WF_CSV_Parser {
279
}
280
281
// Handle special meta fields
282
- if ( isset($item['post_parent']) ) {
283
-
284
- // price
285
- if ( $merging ) {
286
- if ( ! isset( $postmeta['regular_price'] ) )
287
- $postmeta['regular_price'] = get_post_meta( $post_id, '_regular_price', true );
288
- $postmeta['regular_price'] = $this->hf_currency_formatter($postmeta['regular_price']);
289
- if ( ! isset( $postmeta['sale_price'] ) )
290
- $postmeta['sale_price'] = get_post_meta( $post_id, '_sale_price', true );
291
- $postmeta['sale_price'] = $this->hf_currency_formatter($postmeta['sale_price']);
292
- }
293
-
294
- if ( isset( $postmeta['regular_price'] ) && isset( $postmeta['sale_price'] ) && $postmeta['sale_price'] !== '' ) {
295
- $postmeta['sale_price'] = $this->hf_currency_formatter($postmeta['sale_price']);
296
$postmeta['regular_price'] = $this->hf_currency_formatter($postmeta['regular_price']);
297
- $price = min( $postmeta['sale_price'], $postmeta['regular_price']);
298
- $postmeta['price'] = $price;
299
- } elseif ( isset( $postmeta['regular_price'] ) ) {
300
- $postmeta['price'] = $this->hf_currency_formatter($postmeta['regular_price']);
301
- }
302
-
303
- } else {
304
-
305
- // price
306
- if ( $merging ) {
307
- if ( ! isset( $postmeta['regular_price'] ) )
308
- $postmeta['regular_price'] = get_post_meta( $post_id, '_regular_price', true );
309
- $postmeta['regular_price'] = $this->hf_currency_formatter($postmeta['regular_price']);
310
- if ( ! isset( $postmeta['sale_price'] ) )
311
- $postmeta['sale_price'] = get_post_meta( $post_id, '_sale_price', true );
312
- $postmeta['sale_price'] = $this->hf_currency_formatter($postmeta['sale_price']);
313
- }
314
-
315
- if ( isset( $postmeta['regular_price'] ) && isset( $postmeta['sale_price'] ) && $postmeta['sale_price'] !== '' ) {
316
$postmeta['sale_price'] = $this->hf_currency_formatter($postmeta['sale_price']);
317
- $postmeta['regular_price'] = $this->hf_currency_formatter($postmeta['regular_price']);
318
- $price = min( $postmeta['sale_price'], $postmeta['regular_price']);
319
- $postmeta['price'] = $price;
320
- } elseif ( isset( $postmeta['regular_price'] ) ) {
321
- $postmeta['price'] = $this->hf_currency_formatter($postmeta['regular_price']);
322
- }
323
324
- // Reset dynamically generated meta
325
- $postmeta['min_variation_price'] = $postmeta['max_variation_price'] = $postmeta['min_variation_regular_price'] =$postmeta['max_variation_regular_price'] = $postmeta['min_variation_sale_price'] = $postmeta['max_variation_sale_price'] = '';
326
}
327
328
// upsells
329
if ( isset( $postmeta['upsell_ids'] ) && ! is_array( $postmeta['upsell_ids'] ) ) {
330
$ids = array_filter( array_map( 'trim', explode( '|', $postmeta['upsell_ids'] ) ) );
@@ -864,7 +842,7 @@ class WF_CSV_Parser {
864
$product['sku'] = ( ! empty( $item['sku'] ) ) ? $item['sku'] : '';
865
$product['post_title'] = ( ! empty( $item['post_title'] ) ) ? $item['post_title'] : '';
866
$product['post_type'] = $this->post_type;
867
- unset( $item, $terms_array, $postmeta, $attributes, $gpf_data, $images );
868
return $product;
869
}
870
public function hf_currency_formatter($price){
229
230
}
231
}
232
+
233
}
234
}
235
279
}
280
281
// Handle special meta fields
282
+ // price
283
+ if ( $merging ) {
284
+ if ( ! isset( $postmeta['regular_price'] ) )
285
+ $postmeta['regular_price'] = get_post_meta( $post_id, '_regular_price', true );
286
$postmeta['regular_price'] = $this->hf_currency_formatter($postmeta['regular_price']);
287
+ if ( ! isset( $postmeta['sale_price'] ) )
288
+ $postmeta['sale_price'] = get_post_meta( $post_id, '_sale_price', true );
289
$postmeta['sale_price'] = $this->hf_currency_formatter($postmeta['sale_price']);
290
+ }
291
292
+ if ( isset( $postmeta['regular_price'] ) && isset( $postmeta['sale_price'] ) && $postmeta['sale_price'] !== '' ) {
293
+ $postmeta['sale_price'] = $this->hf_currency_formatter($postmeta['sale_price']);
294
+ $postmeta['regular_price'] = $this->hf_currency_formatter($postmeta['regular_price']);
295
+ $price = min( $postmeta['sale_price'], $postmeta['regular_price']);
296
+ $postmeta['price'] = $price;
297
+ } elseif ( isset( $postmeta['regular_price'] ) ) {
298
+ $postmeta['price'] = $this->hf_currency_formatter($postmeta['regular_price']);
299
}
300
301
+ // Reset dynamically generated meta
302
+ if ( !isset($item['post_parent']) ) {
303
+ $postmeta['min_variation_price'] = $postmeta['max_variation_price'] = $postmeta['min_variation_regular_price'] =$postmeta['max_variation_regular_price'] = $postmeta['min_variation_sale_price'] = $postmeta['max_variation_sale_price'] = '';
304
+ }
305
+
306
// upsells
307
if ( isset( $postmeta['upsell_ids'] ) && ! is_array( $postmeta['upsell_ids'] ) ) {
308
$ids = array_filter( array_map( 'trim', explode( '|', $postmeta['upsell_ids'] ) ) );
842
$product['sku'] = ( ! empty( $item['sku'] ) ) ? $item['sku'] : '';
843
$product['post_title'] = ( ! empty( $item['post_title'] ) ) ? $item['post_title'] : '';
844
$product['post_type'] = $this->post_type;
845
+ unset( $item, $terms_array, $postmeta, $attributes, $gpf_data, $images );
846
return $product;
847
}
848
public function hf_currency_formatter($price){
includes/importer/class-wf-prodimpexpcsv-product-import.php CHANGED
@@ -168,7 +168,7 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
168
data: data,
169
type: 'POST',
170
success: function( response ) {
171
- console.log( response );
172
if ( response ) {
173
174
try {
@@ -256,15 +256,15 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
256
while ( ( $postmeta = fgetcsv( $handle, 0, $this->delimiter ) ) !== FALSE ) {
257
$count++;
258
259
- if ( $count >= $limit ) {
260
- $previous_position = $position;
261
- $position = ftell( $handle );
262
- $count = 0;
263
- $import_count ++;
264
265
- // Import rows between $previous_position $position
266
- ?>rows.push( [ <?php echo $previous_position; ?>, <?php echo $position; ?> ] ); <?php
267
- }
268
}
269
270
// Remainder
@@ -273,8 +273,8 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
273
$import_count ++;
274
}
275
276
- fclose( $handle );
277
- }
278
?>
279
280
var data = rows.shift();
@@ -680,48 +680,7 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
680
}
681
682
public function product_exists( $title, $sku = '', $post_name = '' ) {
683
- global $wpdb;
684
-
685
- // Post Title Check
686
- $post_title = stripslashes( sanitize_post_field( 'post_title', $title, 0, 'db' ) );
687
-
688
- $query = "SELECT ID FROM $wpdb->posts WHERE post_type = 'product' AND post_status IN ( 'publish', 'private', 'draft', 'pending', 'future' )";
689
- $args = array();
690
-
691
- /*
692
- * removed title check
693
- if ( ! empty ( $title ) ) {
694
- $query .= ' AND post_title = %s';
695
- $args[] = $post_title;
696
- }
697
-
698
-
699
- if ( ! empty ( $post_name ) ) {
700
- $query .= ' AND post_name = %s';
701
- $args[] = $post_name;
702
- }
703
-
704
- */
705
-
706
- if ( ! empty ( $args ) ) {
707
- $posts_that_exist = $wpdb->get_col( $wpdb->prepare( $query, $args ) );
708
-
709
- if ( $posts_that_exist ) {
710
-
711
- foreach( $posts_that_exist as $post_exists ) {
712
-
713
- // Check unique SKU
714
- $post_exists_sku = get_post_meta( $post_exists, '_sku', true );
715
-
716
- if ( $sku == $post_exists_sku ) {
717
- return true;
718
- }
719
-
720
- }
721
-
722
- }
723
- }
724
-
725
// Sku Check
726
if ( $sku ) {
727
@@ -740,6 +699,28 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
740
741
return false;
742
}
743
744
/**
745
* Create new posts based on import information
@@ -775,15 +756,10 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
775
}
776
// Check if post exists when importing
777
if ( ! $merging ) {
778
- if ( $this->product_exists( $processing_product_title, $processing_product_sku, $post['post_name'] ) ) {
779
- if(!$processing_product_id && empty($processing_product_sku)) {
780
- // if no sku , no id and no merge + is product in db with same title -> just give message
781
- $usr_msg = 'Product with same title already exist.';
782
- }else{
783
- $usr_msg = 'Product already exists.';
784
- }
785
- $this->add_import_result( 'skipped', __( $usr_msg, 'wf_csv_import_export' ), $processing_product_id, $processing_product_title, $processing_product_sku );
786
- $this->hf_log_data_change( 'csv-import', sprintf( __('> &#8220;%s&#8221;'.$usr_msg, 'wf_csv_import_export'), esc_html($processing_product_title) ), true );
787
unset( $post );
788
return;
789
}
@@ -797,7 +773,7 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
797
}
798
// Check post type to avoid conflicts with IDs
799
$is_post_exist_in_db = get_post_type( $processing_product_id );
800
- if ( $merging && $processing_product_id && !empty($is_post_exist_in_db) && (get_post_type( $processing_product_id ) !== $post['post_type'] )) {
801
$this->add_import_result( 'skipped', __( 'Post is not a product', 'wf_csv_import_export' ), $processing_product_id, $processing_product_title, $processing_product_sku );
802
$this->hf_log_data_change( 'csv-import', sprintf( __('> &#8220;%s&#8221; is not a product.', 'wf_csv_import_export'), esc_html($processing_product_id) ), true );
803
unset( $post );
@@ -884,7 +860,7 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
884
} else {
885
$merging = FALSE;
886
// Get parent
887
- $post_parent = $post['post_parent'];
888
889
if ( $post_parent !== "" ) {
890
$post_parent = absint( $post_parent );
@@ -910,19 +886,19 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
910
911
$postdata = array(
912
'import_id' => $processing_product_id,
913
- 'post_author' => $post['post_author'] ? absint( $post['post_author'] ) : get_current_user_id(),
914
- 'post_date' => ( $post['post_date'] ) ? date( 'Y-m-d H:i:s', strtotime( $post['post_date'] )) : '',
915
- 'post_date_gmt' => ( $post['post_date_gmt'] ) ? date( 'Y-m-d H:i:s', strtotime( $post['post_date_gmt'] )) : '',
916
- 'post_content' => $post['post_content'],
917
- 'post_excerpt' => $post['post_excerpt'],
918
'post_title' => $processing_product_title,
919
- 'post_name' => ( $post['post_name'] ) ? $post['post_name'] : sanitize_title( $processing_product_title ),
920
- 'post_status' => ( $post['post_status'] ) ? $post['post_status'] : 'publish',
921
'post_parent' => $post_parent,
922
- 'menu_order' => $post['menu_order'],
923
- 'post_type' => $post['post_type'],
924
- 'post_password' => $post['post_password'],
925
- 'comment_status' => $post['comment_status'],
926
);
927
$post_id = wp_insert_post( $postdata, true );
928
168
data: data,
169
type: 'POST',
170
success: function( response ) {
171
+ //console.log( response );
172
if ( response ) {
173
174
try {
256
while ( ( $postmeta = fgetcsv( $handle, 0, $this->delimiter ) ) !== FALSE ) {
257
$count++;
258
259
+ if ( $count >= $limit ) {
260
+ $previous_position = $position;
261
+ $position = ftell( $handle );
262
+ $count = 0;
263
+ $import_count ++;
264
265
+ // Import rows between $previous_position $position
266
+ ?>rows.push( [ <?php echo $previous_position; ?>, <?php echo $position; ?> ] ); <?php
267
+ }
268
}
269
270
// Remainder
273
$import_count ++;
274
}
275
276
+ fclose( $handle );
277
+ }
278
?>
279
280
var data = rows.shift();
680
}
681
682
public function product_exists( $title, $sku = '', $post_name = '' ) {
683
+ global $wpdb;
684
// Sku Check
685
if ( $sku ) {
686
699
700
return false;
701
}
702
+
703
+
704
+ public function wf_get_product_id_by_sku( $sku ) {
705
+ global $wpdb;
706
+
707
+ // phpcs:ignore WordPress.VIP.DirectDatabaseQuery.DirectQuery
708
+ $id = $wpdb->get_var(
709
+ $wpdb->prepare(
710
+ "SELECT posts.ID
711
+ FROM $wpdb->posts AS posts
712
+ LEFT JOIN $wpdb->postmeta AS postmeta ON ( posts.ID = postmeta.post_id )
713
+ WHERE posts.post_type IN ( 'product', 'product_variation' )
714
+ AND posts.post_status != 'trash'
715
+ AND postmeta.meta_key = '_sku'
716
+ AND postmeta.meta_value = %s
717
+ LIMIT 1",
718
+ $sku
719
+ )
720
+ );
721
+
722
+ return (int) apply_filters( 'wf_get_product_id_by_sku', $id, $sku );
723
+ }
724
725
/**
726
* Create new posts based on import information
756
}
757
// Check if post exists when importing
758
if ( ! $merging ) {
759
+ if ( $this->wf_get_product_id_by_sku( $processing_product_sku ) ) {
760
+ $usr_msg = __( 'Product already exists.', 'wf_csv_import_export' );
761
+ $this->add_import_result( 'skipped',$usr_msg, $processing_product_id, $processing_product_title, $processing_product_sku );
762
+ $this->hf_log_data_change( 'csv-import', sprintf( __('> &#8220;%s&#8221; Product already exists.', 'wf_csv_import_export'), esc_html($processing_product_title) ), true );
763
unset( $post );
764
return;
765
}
773
}
774
// Check post type to avoid conflicts with IDs
775
$is_post_exist_in_db = get_post_type( $processing_product_id );
776
+ if ( $merging && $processing_product_id && !empty($is_post_exist_in_db) && ($is_post_exist_in_db !== $post['post_type'] )) {
777
$this->add_import_result( 'skipped', __( 'Post is not a product', 'wf_csv_import_export' ), $processing_product_id, $processing_product_title, $processing_product_sku );
778
$this->hf_log_data_change( 'csv-import', sprintf( __('> &#8220;%s&#8221; is not a product.', 'wf_csv_import_export'), esc_html($processing_product_id) ), true );
779
unset( $post );
860
} else {
861
$merging = FALSE;
862
// Get parent
863
+ $post_parent = (isset($post['post_parent'])?$post['post_parent']:'');
864
865
if ( $post_parent !== "" ) {
866
$post_parent = absint( $post_parent );
886
887
$postdata = array(
888
'import_id' => $processing_product_id,
889
+ 'post_author' => isset($post['post_author']) ? absint( $post['post_author'] ) : get_current_user_id(),
890
+ 'post_date' => isset( $post['post_date'] ) ? date( 'Y-m-d H:i:s', strtotime( $post['post_date'] )) : '',
891
+ 'post_date_gmt' => isset( $post['post_date_gmt'] ) ? date( 'Y-m-d H:i:s', strtotime( $post['post_date_gmt'] )) : '',
892
+ 'post_content' => isset($post['post_content'])?$post['post_content']:"",
893
+ 'post_excerpt' => isset($post['post_excerpt'])?$post['post_excerpt']:'',
894
'post_title' => $processing_product_title,
895
+ 'post_name' => isset( $post['post_name'] ) ? $post['post_name'] : sanitize_title( $processing_product_title ),
896
+ 'post_status' => isset( $post['post_status'] ) ? $post['post_status'] : 'publish',
897
'post_parent' => $post_parent,
898
+ 'menu_order' => isset($post['menu_order'])?$post['menu_order']:'',
899
+ 'post_type' => isset($post['post_type'])?$post['post_type']:"",
900
+ 'post_password' => isset($post['post_password'])?$post['post_password']:'',
901
+ 'comment_status' => isset($post['comment_status'])?$post['comment_status']:'',
902
);
903
$post_id = wp_insert_post( $postdata, true );
904
product-csv-import-export.php CHANGED
@@ -1,417 +1,417 @@
1
- <?php
2
- /*
3
- Plugin Name: Product CSV Import Export (BASIC)
4
- Plugin URI: https://www.xadapter.com/product/product-import-export-plugin-for-woocommerce/
5
- Description: Import and Export Products From and To your WooCommerce Store.
6
- Author: XAdapter
7
- Author URI: https://www.xadapter.com/shop
8
- Version: 1.4.3
9
- WC tested up to: 3.3.5
10
- Text Domain: wf_csv_import_export
11
- */
12
-
13
- if (!defined('ABSPATH') || !is_admin()) {
14
- return;
15
- }
16
-
17
-
18
- if (!defined('WF_PIPE_CURRENT_VERSION')) {
19
- define("WF_PIPE_CURRENT_VERSION", "1.4.3");
20
- }
21
- if (!defined('WF_PROD_IMP_EXP_ID')) {
22
- define("WF_PROD_IMP_EXP_ID", "wf_prod_imp_exp");
23
- }
24
- if (!defined('WF_WOOCOMMERCE_CSV_IM_EX')) {
25
- define("WF_WOOCOMMERCE_CSV_IM_EX", "wf_woocommerce_csv_im_ex");
26
- }
27
- /**
28
- * Check if WooCommerce is active
29
- */
30
- if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
31
-
32
- if (!class_exists('WF_Product_Import_Export_CSV')) :
33
-
34
- /**
35
- * Main CSV Import class
36
- */
37
- class WF_Product_Import_Export_CSV {
38
-
39
- /**
40
- * Constructor
41
- */
42
- public function __construct() {
43
- if (!defined('WF_ProdImpExpCsv_FILE')) {
44
- define('WF_ProdImpExpCsv_FILE', __FILE__);
45
- }
46
-
47
- if (!defined('WF_ProdImpExpCsv_BASE')) {
48
- define('WF_ProdImpExpCsv_BASE', plugin_dir_path(__FILE__));
49
- }
50
-
51
- add_filter('woocommerce_screen_ids', array($this, 'woocommerce_screen_ids'));
52
- add_filter('plugin_action_links_' . plugin_basename(__FILE__), array($this, 'wf_plugin_action_links'));
53
- add_action('init', array($this, 'load_plugin_textdomain'));
54
- add_action('init', array($this, 'catch_export_request'), 20);
55
- add_action('admin_init', array($this, 'register_importers'));
56
-
57
- add_action('admin_footer', array($this, 'deactivate_scripts'));
58
- add_action('wp_ajax_pipe_submit_uninstall_reason', array($this, "send_uninstall_reason"));
59
-
60
- include_once( 'includes/class-wf-prodimpexpcsv-system-status-tools.php' );
61
- include_once( 'includes/class-wf-prodimpexpcsv-admin-screen.php' );
62
- include_once( 'includes/importer/class-wf-prodimpexpcsv-importer.php' );
63
-
64
- if (defined('DOING_AJAX')) {
65
- include_once( 'includes/class-wf-prodimpexpcsv-ajax-handler.php' );
66
- }
67
- }
68
-
69
- public function wf_plugin_action_links($links) {
70
- $plugin_links = array(
71
- '<a href="' . admin_url('admin.php?page=wf_woocommerce_csv_im_ex&tab=export') . '">' . __('Import Export', 'wf_csv_import_export') . '</a>',
72
- '<a target="_blank" href="https://www.xadapter.com/product/product-import-export-plugin-for-woocommerce/" target="_blank">' . __('Premium Upgrade', 'wf_csv_import_export') . '</a>',
73
- '<a target="_blank" href="https://wordpress.org/support/plugin/product-import-export-for-woo/">' . __('Support', 'wf_csv_import_export') . '</a>',
74
- '<a target="_blank" href="https://wordpress.org/support/plugin/product-import-export-for-woo/reviews/">' . __('Review', 'wf_csv_import_export') . '</a>',
75
- );
76
- if (array_key_exists('deactivate', $links)) {
77
- $links['deactivate'] = str_replace('<a', '<a class="pipe-deactivate-link"', $links['deactivate']);
78
- }
79
- return array_merge($plugin_links, $links);
80
- }
81
-
82
- /**
83
- * Add screen ID
84
- */
85
- public function woocommerce_screen_ids($ids) {
86
- $ids[] = 'admin'; // For import screen
87
- return $ids;
88
- }
89
-
90
- /**
91
- * Handle localization
92
- */
93
- public function load_plugin_textdomain() {
94
- load_plugin_textdomain('wf_csv_import_export', false, dirname(plugin_basename(__FILE__)) . '/lang/');
95
- }
96
-
97
- /**
98
- * Catches an export request and exports the data. This class is only loaded in admin.
99
- */
100
- public function catch_export_request() {
101
-
102
- if (!empty($_GET['action']) && !empty($_GET['page']) && $_GET['page'] == 'wf_woocommerce_csv_im_ex') {
103
- switch ($_GET['action']) {
104
- case "export" :
105
- $user_ok = $this->hf_user_permission();
106
- if ($user_ok) {
107
- include_once( 'includes/exporter/class-wf-prodimpexpcsv-exporter.php' );
108
- WF_ProdImpExpCsv_Exporter::do_export('product');
109
- } else {
110
- wp_redirect(wp_login_url());
111
- }
112
- break;
113
- }
114
- }
115
- }
116
-
117
- /**
118
- * Register importers for use
119
- */
120
- public function register_importers() {
121
- register_importer('xa_woocommerce_csv', 'XAdapter WooCommerce Product Import (CSV)', __('Import <strong>products</strong> to your store via a csv file.', 'wf_csv_import_export'), 'WF_ProdImpExpCsv_Importer::product_importer');
122
- }
123
-
124
- private function hf_user_permission() {
125
- // Check if user has rights to export
126
- $current_user = wp_get_current_user();
127
- $user_ok = false;
128
- $wf_roles = apply_filters('hf_user_permission_roles', array('administrator', 'shop_manager'));
129
- if ($current_user instanceof WP_User) {
130
- $can_users = array_intersect($wf_roles, $current_user->roles);
131
- if (!empty($can_users)) {
132
- $user_ok = true;
133
- }
134
- }
135
- return $user_ok;
136
- }
137
-
138
- private function get_uninstall_reasons() {
139
-
140
- $reasons = array(
141
- array(
142
- 'id' => 'used-it',
143
- 'text' => __('Used it successfully. Don\'t need anymore.', 'wf_csv_import_export'),
144
- 'type' => 'reviewhtml',
145
- 'placeholder' => __('Have used it successfully and aint in need of it anymore', 'wf_csv_import_export')
146
- ),
147
- array(
148
- 'id' => 'could-not-understand',
149
- 'text' => __('I couldn\'t understand how to make it work', 'wf_csv_import_export'),
150
- 'type' => 'textarea',
151
- 'placeholder' => __('Would you like us to assist you?', 'wf_csv_import_export')
152
- ),
153
- array(
154
- 'id' => 'found-better-plugin',
155
- 'text' => __('I found a better plugin', 'wf_csv_import_export'),
156
- 'type' => 'text',
157
- 'placeholder' => __('Which plugin?', 'wf_csv_import_export')
158
- ),
159
- array(
160
- 'id' => 'not-have-that-feature',
161
- 'text' => __('The plugin is great, but I need specific feature that you don\'t support', 'wf_csv_import_export'),
162
- 'type' => 'textarea',
163
- 'placeholder' => __('Could you tell us more about that feature?', 'wf_csv_import_export')
164
- ),
165
- array(
166
- 'id' => 'is-not-working',
167
- 'text' => __('The plugin is not working', 'wf_csv_import_export'),
168
- 'type' => 'textarea',
169
- 'placeholder' => __('Could you tell us a bit more whats not working?', 'wf_csv_import_export')
170
- ),
171
- array(
172
- 'id' => 'looking-for-other',
173
- 'text' => __('It\'s not what I was looking for', 'wf_csv_import_export'),
174
- 'type' => 'textarea',
175
- 'placeholder' => __('Could you tell us a bit more?', 'wf_csv_import_export')
176
- ),
177
- array(
178
- 'id' => 'did-not-work-as-expected',
179
- 'text' => __('The plugin didn\'t work as expected', 'wf_csv_import_export'),
180
- 'type' => 'textarea',
181
- 'placeholder' => __('What did you expect?', 'wf_csv_import_export')
182
- ),
183
- array(
184
- 'id' => 'other',
185
- 'text' => __('Other', 'wf_csv_import_export'),
186
- 'type' => 'textarea',
187
- 'placeholder' => __('Could you tell us a bit more?', 'wf_csv_import_export')
188
- ),
189
- );
190
-
191
- return $reasons;
192
- }
193
-
194
- public function deactivate_scripts() {
195
-
196
- global $pagenow;
197
- if ('plugins.php' != $pagenow) {
198
- return;
199
- }
200
- $reasons = $this->get_uninstall_reasons();
201
- ?>
202
- <div class="pipe-modal" id="pipe-pipe-modal">
203
- <div class="pipe-modal-wrap">
204
- <div class="pipe-modal-header">
205
- <h3><?php _e('If you have a moment, please let us know why you are deactivating:', 'wf_csv_import_export'); ?></h3>
206
- </div>
207
- <div class="pipe-modal-body">
208
- <ul class="reasons">
209
- <?php foreach ($reasons as $reason) { ?>
210
- <li data-type="<?php echo esc_attr($reason['type']); ?>" data-placeholder="<?php echo esc_attr($reason['placeholder']); ?>">
211
- <label><input type="radio" name="selected-reason" value="<?php echo $reason['id']; ?>"> <?php echo $reason['text']; ?></label>
212
- </li>
213
- <?php } ?>
214
- </ul>
215
- </div>
216
- <div class="pipe-modal-footer">
217
- <a href="#" class="dont-bother-me"><?php _e('I rather wouldn\'t say', 'wf_csv_import_export'); ?></a>
218
- <button class="button-primary pipe-model-submit"><?php _e('Submit & Deactivate', 'wf_csv_import_export'); ?></button>
219
- <button class="button-secondary pipe-model-cancel"><?php _e('Cancel', 'wf_csv_import_export'); ?></button>
220
- </div>
221
- </div>
222
- </div>
223
-
224
- <style type="text/css">
225
- .pipe-modal {
226
- position: fixed;
227
- z-index: 99999;
228
- top: 0;
229
- right: 0;
230
- bottom: 0;
231
- left: 0;
232
- background: rgba(0,0,0,0.5);
233
- display: none;
234
- }
235
- .pipe-modal.modal-active {display: block;}
236
- .pipe-modal-wrap {
237
- width: 50%;
238
- position: relative;
239
- margin: 10% auto;
240
- background: #fff;
241
- }
242
- .pipe-modal-header {
243
- border-bottom: 1px solid #eee;
244
- padding: 8px 20px;
245
- }
246
- .pipe-modal-header h3 {
247
- line-height: 150%;
248
- margin: 0;
249
- }
250
- .pipe-modal-body {padding: 5px 20px 20px 20px;}
251
- .pipe-modal-body .input-text,.pipe-modal-body textarea {width:75%;}
252
- .pipe-modal-body .reason-input {
253
- margin-top: 5px;
254
- margin-left: 20px;
255
- }
256
- .pipe-modal-footer {
257
- border-top: 1px solid #eee;
258
- padding: 12px 20px;
259
- text-align: right;
260
- }
261
- .reviewlink{
262
- padding:10px 0px 0px 35px !important;
263
- font-size: 15px;
264
- }
265
- .review-and-deactivate{
266
- padding:5px;
267
- }
268
- </style>
269
- <script type="text/javascript">
270
- (function ($) {
271
- $(function () {
272
- var modal = $('#pipe-pipe-modal');
273
- var deactivateLink = '';
274
-
275
-
276
- $('#the-list').on('click', 'a.pipe-deactivate-link', function (e) {
277
- e.preventDefault();
278
- modal.addClass('modal-active');
279
- deactivateLink = $(this).attr('href');
280
- modal.find('a.dont-bother-me').attr('href', deactivateLink).css('float', 'left');
281
- });
282
-
283
- $('#pipe-pipe-modal').on('click', 'a.review-and-deactivate', function (e) {
284
- e.preventDefault();
285
- window.open("https://wordpress.org/support/plugin/product-import-export-for-woo/reviews/#new-post");
286
- window.location.href = deactivateLink;
287
- });
288
- modal.on('click', 'button.pipe-model-cancel', function (e) {
289
- e.preventDefault();
290
- modal.removeClass('modal-active');
291
- });
292
- modal.on('click', 'input[type="radio"]', function () {
293
- var parent = $(this).parents('li:first');
294
- modal.find('.reason-input').remove();
295
- var inputType = parent.data('type'),
296
- inputPlaceholder = parent.data('placeholder');
297
- if('reviewhtml' === inputType) {
298
- var reasonInputHtml = '<div class="reviewlink"><a href="#" target="_blank" class="review-and-deactivate"><?php _e('Deactivate and leave a review', 'wf_csv_import_export'); ?> <span class="xa-pipe-rating-link"> &#9733;&#9733;&#9733;&#9733;&#9733; </span></a></div>';
299
- }else{
300
- var reasonInputHtml = '<div class="reason-input">' + (('text' === inputType) ? '<input type="text" class="input-text" size="40" />' : '<textarea rows="5" cols="45"></textarea>') + '</div>';
301
- }
302
- if (inputType !== '') {
303
- parent.append($(reasonInputHtml));
304
- parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus();
305
- }
306
- });
307
-
308
- modal.on('click', 'button.pipe-model-submit', function (e) {
309
- e.preventDefault();
310
- var button = $(this);
311
- if (button.hasClass('disabled')) {
312
- return;
313
- }
314
- var $radio = $('input[type="radio"]:checked', modal);
315
- var $selected_reason = $radio.parents('li:first'),
316
- $input = $selected_reason.find('textarea, input[type="text"]');
317
-
318
- $.ajax({
319
- url: ajaxurl,
320
- type: 'POST',
321
- data: {
322
- action: 'pipe_submit_uninstall_reason',
323
- reason_id: (0 === $radio.length) ? 'none' : $radio.val(),
324
- reason_info: (0 !== $input.length) ? $input.val().trim() : ''
325
- },
326
- beforeSend: function () {
327
- button.addClass('disabled');
328
- button.text('Processing...');
329
- },
330
- complete: function () {
331
- window.location.href = deactivateLink;
332
- }
333
- });
334
- });
335
- });
336
- }(jQuery));
337
- </script>
338
- <?php
339
- }
340
-
341
- public function send_uninstall_reason() {
342
-
343
- global $wpdb;
344
-
345
- if (!isset($_POST['reason_id'])) {
346
- wp_send_json_error();
347
- }
348
-
349
- //$current_user = wp_get_current_user();
350
-
351
- $data = array(
352
- 'reason_id' => sanitize_text_field($_POST['reason_id']),
353
- 'plugin' => "productimportexort",
354
- 'auth' => 'wfpipe_uninstall_1234#',
355
- 'date' => gmdate("M d, Y h:i:s A"),
356
- 'url' => home_url(),
357
- 'user_email' => '',//$current_user->user_email,
358
- 'reason_info' => isset($_REQUEST['reason_info']) ? trim(stripslashes($_REQUEST['reason_info'])) : '',
359
- 'software' => $_SERVER['SERVER_SOFTWARE'],
360
- 'php_version' => phpversion(),
361
- 'mysql_version' => $wpdb->db_version(),
362
- 'wp_version' => get_bloginfo('version'),
363
- 'wc_version' => (!defined('WC_VERSION')) ? '' : WC_VERSION,
364
- 'locale' => get_locale(),
365
- 'multisite' => is_multisite() ? 'Yes' : 'No',
366
- 'wfpipe_version' => WF_PIPE_CURRENT_VERSION
367
- );
368
- // Write an action/hook here in webtoffe to recieve the data
369
- $resp = wp_remote_post('http://feedback.webtoffee.com/wp-json/wfpipe/v1/uninstall', array(
370
- 'method' => 'POST',
371
- 'timeout' => 45,
372
- 'redirection' => 5,
373
- 'httpversion' => '1.0',
374
- 'blocking' => false,
375
- 'headers' => array('user-agent' => 'pipe/' . md5(esc_url(home_url())) . ';'),
376
- 'body' => $data,
377
- 'cookies' => array()
378
- )
379
- );
380
-
381
- wp_send_json_success();
382
- }
383
-
384
- }
385
-
386
- endif;
387
-
388
- new WF_Product_Import_Export_CSV();
389
- }
390
-
391
-
392
-
393
- // Welcome screen tutorial video --> Move this function to inside the class
394
- add_action('admin_init', 'impexp_welcome');
395
-
396
- register_activation_hook(__FILE__, 'hf_welcome_screen_activate_basic');
397
-
398
- function hf_welcome_screen_activate_basic() {
399
- if (is_plugin_active('product-csv-import-export-for-woocommerce/product-csv-import-export.php')) {
400
- deactivate_plugins(basename(__FILE__));
401
- wp_die(__("Is everything fine? You already have the Premium version installed in your website. For any issues, kindly raise a ticket via <a target='_blank' href='//support.xadapter.com/'>support.xadapter.com</a>", "wf_csv_import_export"), "", array('back_link' => 1));
402
- }
403
- update_option('xa_pipe_plugin_installed_date', date('Y-m-d H:i:s'));
404
- set_transient('_welcome_screen_activation_redirect', true, 30);
405
- }
406
-
407
- if (!function_exists('impexp_welcome')) {
408
-
409
- function impexp_welcome() {
410
- if (!get_transient('_welcome_screen_activation_redirect')) {
411
- return;
412
- }
413
- delete_transient('_welcome_screen_activation_redirect');
414
- wp_safe_redirect(add_query_arg(array('page' => 'wf_woocommerce_csv_im_ex'), admin_url('admin.php')));
415
- }
416
-
417
}
1
+ <?php
2
+ /*
3
+ Plugin Name: Product CSV Import Export (BASIC)
4
+ Plugin URI: https://www.xadapter.com/product/product-import-export-plugin-for-woocommerce/
5
+ Description: Import and Export Products From and To your WooCommerce Store.
6
+ Author: XAdapter
7
+ Author URI: https://www.xadapter.com/shop
8
+ Version: 1.4.4
9
+ WC tested up to: 3.4.0
10
+ Text Domain: wf_csv_import_export
11
+ */
12
+
13
+ if (!defined('ABSPATH') || !is_admin()) {
14
+ return;
15
+ }
16
+
17
+
18
+ if (!defined('WF_PIPE_CURRENT_VERSION')) {
19
+ define("WF_PIPE_CURRENT_VERSION", "1.4.4");
20
+ }
21
+ if (!defined('WF_PROD_IMP_EXP_ID')) {
22
+ define("WF_PROD_IMP_EXP_ID", "wf_prod_imp_exp");
23
+ }
24
+ if (!defined('WF_WOOCOMMERCE_CSV_IM_EX')) {
25
+ define("WF_WOOCOMMERCE_CSV_IM_EX", "wf_woocommerce_csv_im_ex");
26
+ }
27
+ /**
28
+ * Check if WooCommerce is active
29
+ */
30
+ if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
31
+
32
+ if (!class_exists('WF_Product_Import_Export_CSV')) :
33
+
34
+ /**
35
+ * Main CSV Import class
36
+ */
37
+ class WF_Product_Import_Export_CSV {
38
+
39
+ /**
40
+ * Constructor
41
+ */
42
+ public function __construct() {
43
+ if (!defined('WF_ProdImpExpCsv_FILE')) {
44
+ define('WF_ProdImpExpCsv_FILE', __FILE__);
45
+ }
46
+
47
+ if (!defined('WF_ProdImpExpCsv_BASE')) {
48
+ define('WF_ProdImpExpCsv_BASE', plugin_dir_path(__FILE__));
49
+ }
50
+
51
+ add_filter('woocommerce_screen_ids', array($this, 'woocommerce_screen_ids'));
52
+ add_filter('plugin_action_links_' . plugin_basename(__FILE__), array($this, 'wf_plugin_action_links'));
53
+ add_action('init', array($this, 'load_plugin_textdomain'));
54
+ add_action('init', array($this, 'catch_export_request'), 20);
55
+ add_action('admin_init', array($this, 'register_importers'));
56
+
57
+ add_action('admin_footer', array($this, 'deactivate_scripts'));
58
+ add_action('wp_ajax_pipe_submit_uninstall_reason', array($this, "send_uninstall_reason"));
59
+
60
+ include_once( 'includes/class-wf-prodimpexpcsv-system-status-tools.php' );
61
+ include_once( 'includes/class-wf-prodimpexpcsv-admin-screen.php' );
62
+ include_once( 'includes/importer/class-wf-prodimpexpcsv-importer.php' );
63
+
64
+ if (defined('DOING_AJAX')) {
65
+ include_once( 'includes/class-wf-prodimpexpcsv-ajax-handler.php' );
66
+ }
67
+ }
68
+
69
+ public function wf_plugin_action_links($links) {
70
+ $plugin_links = array(
71
+ '<a href="' . admin_url('admin.php?page=wf_woocommerce_csv_im_ex&tab=export') . '">' . __('Import Export', 'wf_csv_import_export') . '</a>',
72
+ '<a target="_blank" href="https://www.xadapter.com/product/product-import-export-plugin-for-woocommerce/" target="_blank">' . __('Premium Upgrade', 'wf_csv_import_export') . '</a>',
73
+ '<a target="_blank" href="https://wordpress.org/support/plugin/product-import-export-for-woo/">' . __('Support', 'wf_csv_import_export') . '</a>',
74
+ '<a target="_blank" href="https://wordpress.org/support/plugin/product-import-export-for-woo/reviews/">' . __('Review', 'wf_csv_import_export') . '</a>',
75
+ );
76
+ if (array_key_exists('deactivate', $links)) {
77
+ $links['deactivate'] = str_replace('<a', '<a class="pipe-deactivate-link"', $links['deactivate']);
78
+ }
79
+ return array_merge($plugin_links, $links);
80
+ }
81
+
82
+ /**
83
+ * Add screen ID
84
+ */
85
+ public function woocommerce_screen_ids($ids) {
86
+ $ids[] = 'admin'; // For import screen
87
+ return $ids;
88
+ }
89
+
90
+ /**
91
+ * Handle localization
92
+ */
93
+ public function load_plugin_textdomain() {
94
+ load_plugin_textdomain('wf_csv_import_export', false, dirname(plugin_basename(__FILE__)) . '/lang/');
95
+ }
96
+
97
+ /**
98
+ * Catches an export request and exports the data. This class is only loaded in admin.
99
+ */
100
+ public function catch_export_request() {
101
+
102
+ if (!empty($_GET['action']) && !empty($_GET['page']) && $_GET['page'] == 'wf_woocommerce_csv_im_ex') {
103
+ switch ($_GET['action']) {
104
+ case "export" :
105
+ $user_ok = $this->hf_user_permission();
106
+ if ($user_ok) {
107
+ include_once( 'includes/exporter/class-wf-prodimpexpcsv-exporter.php' );
108
+ WF_ProdImpExpCsv_Exporter::do_export('product');
109
+ } else {
110
+ wp_redirect(wp_login_url());
111
+ }
112
+ break;
113
+ }
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Register importers for use
119
+ */
120
+ public function register_importers() {
121
+ register_importer('xa_woocommerce_csv', 'XAdapter WooCommerce Product Import (CSV)', __('Import <strong>products</strong> to your store via a csv file.', 'wf_csv_import_export'), 'WF_ProdImpExpCsv_Importer::product_importer');
122
+ }
123
+
124
+ private function hf_user_permission() {
125
+ // Check if user has rights to export
126
+ $current_user = wp_get_current_user();
127
+ $user_ok = false;
128
+ $wf_roles = apply_filters('hf_user_permission_roles', array('administrator', 'shop_manager'));
129
+ if ($current_user instanceof WP_User) {
130
+ $can_users = array_intersect($wf_roles, $current_user->roles);
131
+ if (!empty($can_users)) {
132
+ $user_ok = true;
133
+ }
134
+ }
135
+ return $user_ok;
136
+ }
137
+
138
+ private function get_uninstall_reasons() {
139
+
140
+ $reasons = array(
141
+ array(
142
+ 'id' => 'used-it',
143
+ 'text' => __('Used it successfully. Don\'t need anymore.', 'wf_csv_import_export'),
144
+ 'type' => 'reviewhtml',
145
+ 'placeholder' => __('Have used it successfully and aint in need of it anymore', 'wf_csv_import_export')
146
+ ),
147
+ array(
148
+ 'id' => 'could-not-understand',
149
+ 'text' => __('I couldn\'t understand how to make it work', 'wf_csv_import_export'),
150
+ 'type' => 'textarea',
151
+ 'placeholder' => __('Would you like us to assist you?', 'wf_csv_import_export')
152
+ ),
153
+ array(
154
+ 'id' => 'found-better-plugin',
155
+ 'text' => __('I found a better plugin', 'wf_csv_import_export'),
156
+ 'type' => 'text',
157
+ 'placeholder' => __('Which plugin?', 'wf_csv_import_export')
158
+ ),
159
+ array(
160
+ 'id' => 'not-have-that-feature',
161
+ 'text' => __('The plugin is great, but I need specific feature that you don\'t support', 'wf_csv_import_export'),
162
+ 'type' => 'textarea',
163
+ 'placeholder' => __('Could you tell us more about that feature?', 'wf_csv_import_export')
164
+ ),
165
+ array(
166
+ 'id' => 'is-not-working',
167
+ 'text' => __('The plugin is not working', 'wf_csv_import_export'),
168
+ 'type' => 'textarea',
169
+ 'placeholder' => __('Could you tell us a bit more whats not working?', 'wf_csv_import_export')
170
+ ),
171
+ array(
172
+ 'id' => 'looking-for-other',
173
+ 'text' => __('It\'s not what I was looking for', 'wf_csv_import_export'),
174
+ 'type' => 'textarea',
175
+ 'placeholder' => __('Could you tell us a bit more?', 'wf_csv_import_export')
176
+ ),
177
+ array(
178
+ 'id' => 'did-not-work-as-expected',
179
+ 'text' => __('The plugin didn\'t work as expected', 'wf_csv_import_export'),
180
+ 'type' => 'textarea',
181
+ 'placeholder' => __('What did you expect?', 'wf_csv_import_export')
182
+ ),
183
+ array(
184
+ 'id' => 'other',
185
+ 'text' => __('Other', 'wf_csv_import_export'),
186
+ 'type' => 'textarea',
187
+ 'placeholder' => __('Could you tell us a bit more?', 'wf_csv_import_export')
188
+ ),
189
+ );
190
+
191
+ return $reasons;
192
+ }
193
+
194
+ public function deactivate_scripts() {
195
+
196
+ global $pagenow;
197
+ if ('plugins.php' != $pagenow) {
198
+ return;
199
+ }
200
+ $reasons = $this->get_uninstall_reasons();
201
+ ?>
202
+ <div class="pipe-modal" id="pipe-pipe-modal">
203
+ <div class="pipe-modal-wrap">
204
+ <div class="pipe-modal-header">
205
+ <h3><?php _e('If you have a moment, please let us know why you are deactivating:', 'wf_csv_import_export'); ?></h3>
206
+ </div>
207
+ <div class="pipe-modal-body">
208
+ <ul class="reasons">
209
+ <?php foreach ($reasons as $reason) { ?>
210
+ <li data-type="<?php echo esc_attr($reason['type']); ?>" data-placeholder="<?php echo esc_attr($reason['placeholder']); ?>">
211
+ <label><input type="radio" name="selected-reason" value="<?php echo $reason['id']; ?>"> <?php echo $reason['text']; ?></label>
212
+ </li>
213
+ <?php } ?>
214
+ </ul>
215
+ </div>
216
+ <div class="pipe-modal-footer">
217
+ <a href="#" class="dont-bother-me"><?php _e('I rather wouldn\'t say', 'wf_csv_import_export'); ?></a>
218
+ <button class="button-primary pipe-model-submit"><?php _e('Submit & Deactivate', 'wf_csv_import_export'); ?></button>
219
+ <button class="button-secondary pipe-model-cancel"><?php _e('Cancel', 'wf_csv_import_export'); ?></button>
220
+ </div>
221
+ </div>
222
+ </div>
223
+
224
+ <style type="text/css">
225
+ .pipe-modal {
226
+ position: fixed;
227
+ z-index: 99999;
228
+ top: 0;
229
+ right: 0;
230
+ bottom: 0;
231
+ left: 0;
232
+ background: rgba(0,0,0,0.5);
233
+ display: none;
234
+ }
235
+ .pipe-modal.modal-active {display: block;}
236
+ .pipe-modal-wrap {
237
+ width: 50%;
238
+ position: relative;
239
+ margin: 10% auto;
240
+ background: #fff;
241
+ }
242
+ .pipe-modal-header {
243
+ border-bottom: 1px solid #eee;
244
+ padding: 8px 20px;
245
+ }
246
+ .pipe-modal-header h3 {
247
+ line-height: 150%;
248
+ margin: 0;
249
+ }
250
+ .pipe-modal-body {padding: 5px 20px 20px 20px;}
251
+ .pipe-modal-body .input-text,.pipe-modal-body textarea {width:75%;}
252
+ .pipe-modal-body .reason-input {
253
+ margin-top: 5px;
254
+ margin-left: 20px;
255
+ }
256
+ .pipe-modal-footer {
257
+ border-top: 1px solid #eee;
258
+ padding: 12px 20px;
259
+ text-align: right;
260
+ }
261
+ .reviewlink{
262
+ padding:10px 0px 0px 35px !important;
263
+ font-size: 15px;
264
+ }
265
+ .review-and-deactivate{
266
+ padding:5px;
267
+ }
268
+ </style>
269
+ <script type="text/javascript">
270
+ (function ($) {
271
+ $(function () {
272
+ var modal = $('#pipe-pipe-modal');
273
+ var deactivateLink = '';
274
+
275
+
276
+ $('#the-list').on('click', 'a.pipe-deactivate-link', function (e) {
277
+ e.preventDefault();
278
+ modal.addClass('modal-active');
279
+ deactivateLink = $(this).attr('href');
280
+ modal.find('a.dont-bother-me').attr('href', deactivateLink).css('float', 'left');
281
+ });
282
+
283
+ $('#pipe-pipe-modal').on('click', 'a.review-and-deactivate', function (e) {
284
+ e.preventDefault();
285
+ window.open("https://wordpress.org/support/plugin/product-import-export-for-woo/reviews/#new-post");
286
+ window.location.href = deactivateLink;
287
+ });
288
+ modal.on('click', 'button.pipe-model-cancel', function (e) {
289
+ e.preventDefault();
290
+ modal.removeClass('modal-active');
291
+ });
292
+ modal.on('click', 'input[type="radio"]', function () {
293
+ var parent = $(this).parents('li:first');
294
+ modal.find('.reason-input').remove();
295
+ var inputType = parent.data('type'),
296
+ inputPlaceholder = parent.data('placeholder');
297
+ if('reviewhtml' === inputType) {
298
+ var reasonInputHtml = '<div class="reviewlink"><a href="#" target="_blank" class="review-and-deactivate"><?php _e('Deactivate and leave a review', 'wf_csv_import_export'); ?> <span class="xa-pipe-rating-link"> &#9733;&#9733;&#9733;&#9733;&#9733; </span></a></div>';
299
+ }else{
300
+ var reasonInputHtml = '<div class="reason-input">' + (('text' === inputType) ? '<input type="text" class="input-text" size="40" />' : '<textarea rows="5" cols="45"></textarea>') + '</div>';
301
+ }
302
+ if (inputType !== '') {
303
+ parent.append($(reasonInputHtml));
304
+ parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus();
305
+ }
306
+ });
307
+
308
+ modal.on('click', 'button.pipe-model-submit', function (e) {
309
+ e.preventDefault();
310
+ var button = $(this);
311
+ if (button.hasClass('disabled')) {
312
+ return;
313
+ }
314
+ var $radio = $('input[type="radio"]:checked', modal);
315
+ var $selected_reason = $radio.parents('li:first'),
316
+ $input = $selected_reason.find('textarea, input[type="text"]');
317
+
318
+ $.ajax({
319
+ url: ajaxurl,
320
+ type: 'POST',
321
+ data: {
322
+ action: 'pipe_submit_uninstall_reason',
323
+ reason_id: (0 === $radio.length) ? 'none' : $radio.val(),
324
+ reason_info: (0 !== $input.length) ? $input.val().trim() : ''
325
+ },
326
+ beforeSend: function () {
327
+ button.addClass('disabled');
328
+ button.text('Processing...');
329
+ },
330
+ complete: function () {
331
+ window.location.href = deactivateLink;
332
+ }
333
+ });
334
+ });
335
+ });
336
+ }(jQuery));
337
+ </script>
338
+ <?php
339
+ }
340
+
341
+ public function send_uninstall_reason() {
342
+
343
+ global $wpdb;
344
+
345
+ if (!isset($_POST['reason_id'])) {
346
+ wp_send_json_error();
347
+ }
348
+
349
+ //$current_user = wp_get_current_user();
350
+
351
+ $data = array(
352
+ 'reason_id' => sanitize_text_field($_POST['reason_id']),
353
+ 'plugin' => "productimportexort",
354
+ 'auth' => 'wfpipe_uninstall_1234#',
355
+ 'date' => gmdate("M d, Y h:i:s A"),
356
+ 'url' => home_url(),
357
+ 'user_email' => '',//$current_user->user_email,
358
+ 'reason_info' => isset($_REQUEST['reason_info']) ? trim(stripslashes($_REQUEST['reason_info'])) : '',
359
+ 'software' => $_SERVER['SERVER_SOFTWARE'],
360
+ 'php_version' => phpversion(),
361
+ 'mysql_version' => $wpdb->db_version(),
362
+ 'wp_version' => get_bloginfo('version'),
363
+ 'wc_version' => (!defined('WC_VERSION')) ? '' : WC_VERSION,
364
+ 'locale' => get_locale(),
365
+ 'multisite' => is_multisite() ? 'Yes' : 'No',
366
+ 'wfpipe_version' => WF_PIPE_CURRENT_VERSION
367
+ );
368
+ // Write an action/hook here in webtoffe to recieve the data
369
+ $resp = wp_remote_post('http://feedback.webtoffee.com/wp-json/wfpipe/v1/uninstall', array(
370
+ 'method' => 'POST',
371
+ 'timeout' => 45,
372
+ 'redirection' => 5,
373
+ 'httpversion' => '1.0',
374
+ 'blocking' => false,
375
+ 'headers' => array('user-agent' => 'pipe/' . md5(esc_url(home_url())) . ';'),
376
+ 'body' => $data,
377
+ 'cookies' => array()
378
+ )
379
+ );
380
+
381
+ wp_send_json_success();
382
+ }
383
+
384
+ }
385
+
386
+ endif;
387
+
388
+ new WF_Product_Import_Export_CSV();
389
+ }
390
+
391
+
392
+
393
+ // Welcome screen tutorial video --> Move this function to inside the class
394
+ add_action('admin_init', 'impexp_welcome');
395
+
396
+ register_activation_hook(__FILE__, 'hf_welcome_screen_activate_basic');
397
+
398
+ function hf_welcome_screen_activate_basic() {
399
+ if (is_plugin_active('product-csv-import-export-for-woocommerce/product-csv-import-export.php')) {
400
+ deactivate_plugins(basename(__FILE__));
401
+ wp_die(__("Is everything fine? You already have the Premium version installed in your website. For any issues, kindly raise a ticket via <a target='_blank' href='//support.xadapter.com/'>support.xadapter.com</a>", "wf_csv_import_export"), "", array('back_link' => 1));
402
+ }
403
+ update_option('xa_pipe_plugin_installed_date', date('Y-m-d H:i:s'));
404
+ set_transient('_welcome_screen_activation_redirect', true, 30);
405
+ }
406
+
407
+ if (!function_exists('impexp_welcome')) {
408
+
409
+ function impexp_welcome() {
410
+ if (!get_transient('_welcome_screen_activation_redirect')) {
411
+ return;
412
+ }
413
+ delete_transient('_welcome_screen_activation_redirect');
414
+ wp_safe_redirect(add_query_arg(array('page' => 'wf_woocommerce_csv_im_ex'), admin_url('admin.php')));
415
+ }
416
+
417
}
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: xadapter, mujeebur, webtoffee
3
Donate link:
4
Tags: woocommerce product import, woocommerce import products, woocommerce export products, export woocommerce products, import products into woocommerce
5
Requires at least: 3.0.1
6
- Tested up to: 4.9.4
7
- Stable tag: 1.4.3
8
License: GPLv3 or later
9
License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
@@ -104,7 +104,7 @@ Export Products by Category: You can even choose desired product categories from
104
Export Products by Type: You can selectively export products belonging to specific product types. All you need to do is choose the required product types from the plugin settings page while exporting.
105
Merge Products: This feature is useful for adding more information to existing products, for example when your existing products get modified. To get the modified product details into your online store, you can update the current product by importing modified product CSV file.
106
107
- Map and Transform: You can map the fields ( WooCommerce fields ) with column headings ( CSV file header ). To map, select the required field under “Map to Column by using drop-down list for a particular column heading. An Evaluation field is used to fix/update the required value for the particular field.
108
109
Cron Job / Scheduled Import Export: WooCommerce Product Import and Export plugin facilitates to schedule the Import and Export of the products. You can auto import the products at regular intervals from CSV which is present on FTP Server by providing starting time and intervals between import. There is an option to skip new products in scheduled import too. You can also auto export the products to FTP in a CSV file at regular intervals. There is also option to use saved mapping files for auto export.
110
@@ -140,7 +140,10 @@ Yes. You can import or export product images along with other details
140
3. Premium Export Settings Screen
141
142
== Changelog ==
143
-
144
= 1.4.3 =
145
* Updates: Interface updated.
146
* Updates: Tested OK with WC 3.3.3
@@ -228,6 +231,7 @@ Yes. You can import or export product images along with other details
228
229
== Upgrade Notice ==
230
231
- = 1.4.3 =
232
- * Updates: Interface updated.
233
- * Updates: Tested OK with WC 3.3.3
3
Donate link:
4
Tags: woocommerce product import, woocommerce import products, woocommerce export products, export woocommerce products, import products into woocommerce
5
Requires at least: 3.0.1
6
+ Tested up to: 4.9.6
7
+ Stable tag: 1.4.4
8
License: GPLv3 or later
9
License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
104
Export Products by Type: You can selectively export products belonging to specific product types. All you need to do is choose the required product types from the plugin settings page while exporting.
105
Merge Products: This feature is useful for adding more information to existing products, for example when your existing products get modified. To get the modified product details into your online store, you can update the current product by importing modified product CSV file.
106
107
+ Map and Transform: You can map the fields ( WooCommerce fields ) with column headings ( CSV file header ). To map, select the required field under “Map to Column��? by using drop-down list for a particular column heading. An Evaluation field is used to fix/update the required value for the particular field.
108
109
Cron Job / Scheduled Import Export: WooCommerce Product Import and Export plugin facilitates to schedule the Import and Export of the products. You can auto import the products at regular intervals from CSV which is present on FTP Server by providing starting time and intervals between import. There is an option to skip new products in scheduled import too. You can also auto export the products to FTP in a CSV file at regular intervals. There is also option to use saved mapping files for auto export.
110
140
3. Premium Export Settings Screen
141
142
== Changelog ==
143
+ = 1.4.4 =
144
+ * Enhancement: Improved parsing.
145
+ * Updates: Tested OK with WP 4.9.5 and WC 3.3.5
146
+ * Fixed warnings.
147
= 1.4.3 =
148
* Updates: Interface updated.
149
* Updates: Tested OK with WC 3.3.3
231
232
== Upgrade Notice ==
233
234
+ = 1.4.4 =
235
+ * Enhancement: Improved parsing.
236
+ * Updates: Tested OK with WP 4.9.6 and WC 3.3.5
237
+ * Fixed warnings.