Product Import Export for WooCommerce - Version 1.6.8

Version Description

  • Bug Fix: Duplicating SKU when updating product with ID
  • Tested OK with WC 3.7.1
Download this release

Release Info

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

Code changes from version 1.6.7 to 1.6.8

includes/exporter/class-wf-prodimpexpcsv-exporter.php CHANGED
@@ -128,7 +128,7 @@ class WF_ProdImpExpCsv_Exporter {
128
'post_status' => array( 'publish', 'pending', 'private', 'draft' ),
129
'post_type' => array('product'),
130
'orderby' => 'ID',
131
- 'suppress_filters' => false,
132
'order' => 'ASC',
133
'offset' => $current_offset
134
) );
128
'post_status' => array( 'publish', 'pending', 'private', 'draft' ),
129
'post_type' => array('product'),
130
'orderby' => 'ID',
131
+ 'suppress_filters' => false,
132
'order' => 'ASC',
133
'offset' => $current_offset
134
) );
includes/images/Import-Export-for-WooCommerce-Product-Image.png ADDED
Binary file
includes/images/documentation.png ADDED
Binary file
includes/images/sample_csv.png ADDED
Binary file
includes/images/setup.png ADDED
Binary file
includes/images/stars.png ADDED
Binary file
includes/images/storefrog.png ADDED
Binary file
includes/images/support.png ADDED
Binary file
includes/images/video.png ADDED
Binary file
includes/images/wf-ajax-loader.gif ADDED
Binary file
includes/images/wf-failed.png ADDED
Binary file
includes/images/wf-import.png ADDED
Binary file
includes/images/wf-notice.png ADDED
Binary file
includes/images/wf-success.png ADDED
Binary file
includes/importer/class-wf-prodimpexpcsv-product-import.php CHANGED
@@ -490,6 +490,10 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
490
_e( 'Finished. Import complete.', 'product-import-export-for-woo' );
491
492
$this->import_end();
493
exit;
494
break;
495
}
@@ -801,89 +805,98 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
801
/**
802
* Create new posts based on import information
803
*/
804
- public function process_product( $post ) {
805
- $processing_product_id = absint( $post['post_id'] );
806
- $processing_product = get_post( $processing_product_id );
807
- $processing_product_title = $processing_product ? $processing_product->post_title : '';
808
- $processing_product_sku = $processing_product ? $processing_product->sku : '';
809
- $merging = ! empty( $post['merging'] );
810
-
811
- if ( ! empty( $post['post_title'] ) ) {
812
- $processing_product_title = $post['post_title'];
813
- }
814
815
- if ( ! empty( $post['sku'] ) ) {
816
- $processing_product_sku = $post['sku'];
817
- }
818
819
- if ( ! empty( $processing_product_id ) && isset( $this->processed_posts[ $processing_product_id ] ) ) {
820
- $this->add_import_result( 'skipped', __( 'Product already processed', 'product-import-export-for-woo' ), $processing_product_id, $processing_product_title, $processing_product_sku );
821
- $this->hf_log_data_change( 'csv-import', __('> Post ID already processed. Skipping.', 'product-import-export-for-woo'), true );
822
- unset( $post );
823
- return;
824
- }
825
826
- if ( ! empty ( $post['post_status'] ) && $post['post_status'] == 'auto-draft' ) {
827
- $this->add_import_result( 'skipped', __( 'Skipping auto-draft', 'product-import-export-for-woo' ), $processing_product_id, $processing_product_title, $processing_product_sku );
828
- $this->hf_log_data_change( 'csv-import', __('> Skipping auto-draft.', 'product-import-export-for-woo'), true );
829
- unset( $post );
830
- return;
831
- }
832
- // Check if post exists when importing
833
-
834
- if ( ! $merging ) {
835
- /* if ( $this->product_exists( $processing_product_title, $processing_product_sku, $post['post_name'] ) ) {
836
- if(!$processing_product_id && empty($processing_product_sku)) {
837
- // if no sku , no id and no merge + is product in db with same title -> just give message
838
- $usr_msg = 'Product with same title already exist.';
839
- }else{
840
- $usr_msg = 'Product already exists.';
841
- }
842
- $this->add_import_result( 'skipped', __( $usr_msg, 'product-import-export-for-woo' ), $processing_product_id, $processing_product_title, $processing_product_sku );
843
- $this->hf_log_data_change( 'csv-import', sprintf( __('> “%s”'.$usr_msg, 'product-import-export-for-woo'), esc_html($processing_product_title) ), true );
844
- unset( $post );
845
- return;
846
- }
847
- */
848
-
849
- $is_post_type_product = get_post_type($processing_product_id);
850
- if (!empty($processing_product_id) && (in_array($is_post_type_product, array('product','product_variation')))) {
851
- $usr_msg = 'Product with same ID already exists.';
852
- $this->add_import_result('skipped', __($usr_msg, 'wf_csv_import_export'), $processing_product_id, $processing_product_title, $processing_product_sku);
853
- $this->hf_log_data_change('csv-import', sprintf(__('> “%s”' . $usr_msg, 'wf_csv_import_export'), esc_html($processing_product_title)), true);
854
- unset($post);
855
- return;
856
- }
857
858
- $existing_product = '';
859
- if (isset($processing_product_sku) && !empty($processing_product_sku)) {
860
- $existing_product = $this->wf_get_product_id_by_sku($processing_product_sku);
861
- }
862
- if ($existing_product) {
863
- if ($this->delete_products == 1) {
864
- $product_to_be_deleted[] =$existing_product;
865
- }
866
- if (!$processing_product_id && empty($processing_product_sku)) {
867
- // if no sku , no id and no merge and has same title in DB -> just give message
868
- $usr_msg = 'Product with same title already exists.';
869
- } else {
870
- $usr_msg = 'Product with same SKU already exists.';
871
- }
872
- $this->add_import_result('skipped', __($usr_msg, 'product-import-export-for-woo'), $existing_product, $processing_product_title, $processing_product_sku);
873
- $this->hf_log_data_change('csv-import', sprintf(__('> “%s”' . $usr_msg, 'product-import-export-for-woo'), esc_html($processing_product_title)).' with post ID:'.$existing_product, true);
874
- unset($post);
875
- return;
876
- }
877
-
878
- if ( $processing_product_id && is_string( get_post_status( $processing_product_id ) ) ) {
879
- $this->add_import_result( 'skipped', __( 'Importing product(ID) conflicts with an existing post.', 'product-import-export-for-woo' ), $processing_product_id, get_the_title( $processing_product_id ), '' );
880
- $this->hf_log_data_change( 'csv-import', sprintf( __('> “%s” ID already exists.', 'product-import-export-for-woo'), esc_html( $processing_product_id ) ), true );
881
- unset( $post );
882
- return;
883
- }
884
- }
885
-
886
-
887
// if ( ! $merging ) {
888
// error_log('<pre>$this->wf_get_product_id_by_sku( $processing_product_sku ):-' . print_r($this->wf_get_product_id_by_sku( $processing_product_sku ), 1) . '</per>', 3, ABSPATH . "/wp-content/uploads/wc-logs/test-log.txt");
889
// if ( $this->wf_get_product_id_by_sku( $processing_product_sku ) ) {
@@ -912,382 +925,376 @@ class WF_ProdImpExpCsv_Product_Import extends WP_Importer {
912
// return;
913
// }
914
// }
915
- // Check post type to avoid conflicts with IDs
916
- $is_post_exist_in_db = get_post_type( $processing_product_id );
917
- if ( $merging && $processing_product_id && !empty($is_post_exist_in_db) && ($is_post_exist_in_db !== $post['post_type'] )) {
918
- $this->add_import_result( 'skipped', __( 'Importing product(ID) conflicts with an existing post which is not a product.', 'product-import-export-for-woo' ), $processing_product_id, $processing_product_title, $processing_product_sku );
919
- $this->hf_log_data_change( 'csv-import', sprintf( __('> &#8220;%s&#8221; is not a product.', 'product-import-export-for-woo'), esc_html($processing_product_id) ), true );
920
- unset( $post );
921
- return;
922
- }
923
924
- if ( $merging && !empty($is_post_exist_in_db) ) {
925
-
926
- // Only merge fields which are set
927
- $post_id = $processing_product_id;
928
929
- $this->hf_log_data_change( 'csv-import', sprintf( __('> Merging post ID %s.', 'product-import-export-for-woo'), $post_id ), true );
930
931
- $postdata = array(
932
- 'ID' => $post_id
933
- );
934
935
- if ( $this->merge_empty_cells ) {
936
- if ( isset( $post['post_content'] ) ) {
937
- $postdata['post_content'] = $post['post_content'];
938
- }
939
- if ( isset( $post['post_excerpt'] ) ) {
940
- $postdata['post_excerpt'] = $post['post_excerpt'];
941
- }
942
- if ( isset( $post['post_password'] ) ) {
943
- $postdata['post_password'] = $post['post_password'];
944
- }
945
- if ( isset( $post['post_parent'] ) ) {
946
- $postdata['post_parent'] = $post['post_parent'];
947
- }
948
- } else {
949
- if ( ! empty( $post['post_content'] ) ) {
950
- $postdata['post_content'] = $post['post_content'];
951
- }
952
- if ( ! empty( $post['post_excerpt'] ) ) {
953
- $postdata['post_excerpt'] = $post['post_excerpt'];
954
- }
955
- if ( ! empty( $post['post_password'] ) ) {
956
- $postdata['post_password'] = $post['post_password'];
957
- }
958
- if ( isset( $post['post_parent'] ) && $post['post_parent'] !== '' ) {
959
- $postdata['post_parent'] = $post['post_parent'];
960
- }
961
- }
962
963
- if ( ! empty( $post['post_title'] ) ) {
964
- $postdata['post_title'] = $post['post_title'];
965
- }
966
967
- if ( ! empty( $post['post_author'] ) ) {
968
- $postdata['post_author'] = absint( $post['post_author'] );
969
- }
970
- if ( ! empty( $post['post_date'] ) ) {
971
- $postdata['post_date'] = date("Y-m-d H:i:s", strtotime( $post['post_date'] ) );
972
- }
973
- if ( ! empty( $post['post_date_gmt'] ) ) {
974
- $postdata['post_date_gmt'] = date("Y-m-d H:i:s", strtotime( $post['post_date_gmt'] ) );
975
- }
976
- if ( ! empty( $post['post_name'] ) ) {
977
- $postdata['post_name'] = $post['post_name'];
978
- }
979
- if ( ! empty( $post['post_status'] ) ) {
980
- $postdata['post_status'] = $post['post_status'];
981
- }
982
- if ( ! empty( $post['menu_order'] ) ) {
983
- $postdata['menu_order'] = $post['menu_order'];
984
- }
985
- if ( ! empty( $post['comment_status'] ) ) {
986
- $postdata['comment_status'] = $post['comment_status'];
987
- }
988
- if ( sizeof( $postdata ) > 1 ) {
989
- $result = wp_update_post( $postdata );
990
-
991
- if ( ! $result ) {
992
- $this->add_import_result( 'failed', __( 'Failed to update product', 'product-import-export-for-woo' ), $post_id, $processing_product_title, $processing_product_sku );
993
- $this->hf_log_data_change( 'csv-import', sprintf( __('> Failed to update product %s', 'product-import-export-for-woo'), $post_id ), true );
994
- unset( $post );
995
- return;
996
- } else {
997
- $this->hf_log_data_change( 'csv-import', __( '> Merged post data: ', 'product-import-export-for-woo' ) . print_r( $postdata, true ) );
998
- }
999
- }
1000
1001
- } else {
1002
- $merging = FALSE;
1003
- // Get parent
1004
- $post_parent = (isset($post['post_parent'])?$post['post_parent']:'');
1005
-
1006
- if ( $post_parent !== "" ) {
1007
- $post_parent = absint( $post_parent );
1008
-
1009
- if ( $post_parent > 0 ) {
1010
- // if we already know the parent, map it to the new local ID
1011
- if ( isset( $this->processed_posts[ $post_parent ] ) ) {
1012
- $post_parent = $this->processed_posts[ $post_parent ];
1013
-
1014
- // otherwise record the parent for later
1015
- } else {
1016
-
1017
- $this->post_orphans[ intval( $processing_product_id ) ] = $post_parent;
1018
- //$post_parent = 0;
1019
-
1020
- }
1021
-
1022
- }
1023
- }
1024
1025
- // Insert product
1026
- $this->hf_log_data_change( 'csv-import', sprintf( __('> Inserting %s', 'product-import-export-for-woo'), esc_html( $processing_product_title ) ), true );
1027
- $postdata = array(
1028
- 'import_id' => $processing_product_id,
1029
- 'post_author' => !empty($post['post_author']) ? absint($post['post_author']) : get_current_user_id(),
1030
- 'post_date' => !empty( $post['post_date'] ) ? date("Y-m-d H:i:s", strtotime($post['post_date'])) : '',
1031
- 'post_date_gmt' => ( !empty($post['post_date_gmt']) && $post['post_date_gmt'] ) ? date('Y-m-d H:i:s', strtotime($post['post_date_gmt'])) : '',
1032
- 'post_content' => !empty($post['post_content'])?$post['post_content']:'',
1033
- 'post_excerpt' => !empty($post['post_excerpt'])?$post['post_excerpt']:'',
1034
- 'post_title' => $processing_product_title,
1035
- 'post_name' => !empty( $post['post_name'] ) ? $post['post_name'] : sanitize_title( $processing_product_title ),
1036
- 'post_status' => !empty( $post['post_status'] ) ? $post['post_status'] : 'publish',
1037
- 'post_parent' => $post_parent,
1038
- 'menu_order' => !empty($post['menu_order'])?$post['menu_order']:'',
1039
- 'post_type' => !empty($post['post_type'])?$post['post_type']:"",
1040
- 'post_password' => !empty($post['post_password'])?$post['post_password']:'',
1041
- 'comment_status' => !empty($post['comment_status'])?$post['comment_status']:'',
1042
- );
1043
-
1044
- $post_id = wp_insert_post( $postdata, true );
1045
-
1046
- if ( is_wp_error( $post_id ) ) {
1047
-
1048
- $this->add_import_result( 'failed', __( 'Failed to import product', 'product-import-export-for-woo' ), $processing_product_id, $processing_product_title, $processing_product_sku );
1049
- $this->hf_log_data_change( 'csv-import', sprintf( __( 'Failed to import product &#8220;%s&#8221;', 'product-import-export-for-woo' ), esc_html($processing_product_title) ) );
1050
- unset( $post );
1051
- return;
1052
1053
- } else {
1054
1055
- $this->hf_log_data_change( 'csv-import', sprintf( __('> Inserted - post ID is %s.', 'product-import-export-for-woo'), $post_id ) );
1056
1057
- }
1058
- }
1059
1060
- unset( $postdata );
1061
1062
- // map pre-import ID to local ID
1063
- if ( empty( $processing_product_id ) ) {
1064
- $processing_product_id = (int) $post_id;
1065
- }
1066
1067
- $this->processed_posts[ intval( $processing_product_id ) ] = (int) $post_id;
1068
1069
- // add categories, tags and other terms
1070
- if ( ! empty( $post['terms'] ) && is_array( $post['terms'] ) ) {
1071
1072
- $terms_to_set = array();
1073
1074
- foreach ( $post['terms'] as $term_group ) {
1075
1076
- $taxonomy = $term_group['taxonomy'];
1077
- $terms = $term_group['terms'];
1078
1079
- if ( ! $taxonomy || ! taxonomy_exists( $taxonomy ) ) {
1080
- continue;
1081
- }
1082
1083
- if ( ! is_array( $terms ) ) {
1084
- $terms = array( $terms );
1085
- }
1086
1087
- $terms_to_set[ $taxonomy ] = array();
1088
1089
- foreach ( $terms as $term_id ) {
1090
1091
- if ( ! $term_id ) continue;
1092
1093
- $terms_to_set[ $taxonomy ][] = intval( $term_id );
1094
- }
1095
1096
- }
1097
1098
- foreach ( $terms_to_set as $tax => $ids ) {
1099
- $tt_ids = wp_set_post_terms( $post_id, $ids, $tax, false );
1100
- }
1101
1102
- unset( $post['terms'], $terms_to_set );
1103
- }
1104
1105
- // add/update post meta
1106
- if ( ! empty( $post['postmeta'] ) && is_array( $post['postmeta'] ) ) {
1107
- foreach ( $post['postmeta'] as $meta ) {
1108
- $key = apply_filters( 'import_post_meta_key', $meta['key'] );
1109
1110
- if ( $key ) {
1111
- update_post_meta( $post_id, $key, maybe_unserialize( $meta['value'] ) );
1112
- }
1113
1114
- if ( $key == '_file_paths' ) {
1115
- do_action( 'woocommerce_process_product_file_download_paths', $post_id, 0, maybe_unserialize( $meta['value'] ) );
1116
- }
1117
1118
- }
1119
1120
- unset( $post['postmeta'] );
1121
- }
1122
1123
- // Import images and add to post
1124
- if ( ! empty( $post['images'] ) && is_array($post['images']) ) {
1125
1126
- $featured = true;
1127
- $gallery_ids = array();
1128
1129
- if ($merging) {
1130
1131
- // Get basenames
1132
- $image_basenames = array();
1133
1134
- foreach( $post['images'] as $image )
1135
- $image_basenames[] = basename( $image );
1136
1137
- // Loop attachments already attached to the product
1138
- //$attachments = get_posts( 'post_parent=' . $post_id . '&post_type=attachment&fields=ids&post_mime_type=image&numberposts=-1' );
1139
-
1140
- $processing_product_object = wc_get_product($post_id);
1141
- $attachments = $processing_product_object->get_gallery_attachment_ids();
1142
- $post_thumbnail_id = get_post_thumbnail_id($post_id);
1143
- if(isset($post_thumbnail_id)&& !empty($post_thumbnail_id)){
1144
- $attachments[]=$post_thumbnail_id;
1145
- }
1146
-
1147
- foreach ( $attachments as $attachment_key => $attachment ) {
1148
1149
- $attachment_url = wp_get_attachment_url( $attachment );
1150
- $attachment_basename = basename( $attachment_url );
1151
1152
- // Don't import existing images
1153
- if ( in_array( $attachment_url, $post['images'] ) || in_array( $attachment_basename, $image_basenames ) ) {
1154
1155
- foreach( $post['images'] as $key => $image ) {
1156
1157
- if ( $image == $attachment_url || basename( $image ) == $attachment_basename ) {
1158
- unset( $post['images'][ $key ] );
1159
1160
- $this->hf_log_data_change( 'csv-import', sprintf( __( '> > Image exists - skipping %s', 'product-import-export-for-woo' ), basename( $image ) ) );
1161
1162
- if ( $key == 0 ) {
1163
- update_post_meta( $post_id, '_thumbnail_id', $attachment );
1164
- $featured = false;
1165
- } else {
1166
- $gallery_ids[ $key ] = $attachment;
1167
- }
1168
- }
1169
1170
- }
1171
1172
- } else {
1173
1174
- // Detach image which is not being merged
1175
- $attachment_post = array();
1176
- $attachment_post['ID'] = $attachment;
1177
- $attachment_post['post_parent'] = '';
1178
- wp_update_post( $attachment_post );
1179
- unset( $attachment_post );
1180
1181
- }
1182
1183
- }
1184
1185
- unset( $attachments );
1186
- }
1187
1188
- if ( $post['images'] ) foreach ( $post['images'] as $image_key => $image ) {
1189
1190
- $this->hf_log_data_change( 'csv-import', sprintf( __( '> > Importing image "%s"', 'product-import-export-for-woo' ), $image ) );
1191
1192
- $filename = basename( $image );
1193
1194
- $attachment = array(
1195
- 'post_title' => preg_replace( '/\.[^.]+#x2F;', '', $processing_product_title . ' ' . ( $image_key + 1 ) ),
1196
- 'post_content' => '',
1197
- 'post_status' => 'inherit',
1198
- 'post_parent' => $post_id
1199
- );
1200
1201
- $attachment_id = $this->process_attachment( $attachment, $image, $post_id );
1202
1203
- if ( ! is_wp_error( $attachment_id ) && $attachment_id ) {
1204
1205
- $this->hf_log_data_change( 'csv-import', sprintf( __( '> > Imported image "%s"', 'product-import-export-for-woo' ), $image ) );
1206
1207
- // Set alt
1208
- update_post_meta( $attachment_id, '_wp_attachment_image_alt', $processing_product_title );
1209
1210
- if ( $featured ) {
1211
- update_post_meta( $post_id, '_thumbnail_id', $attachment_id );
1212
- } else {
1213
- $gallery_ids[ $image_key ] = $attachment_id;
1214
- }
1215
1216
- update_post_meta( $attachment_id, '_woocommerce_exclude_image', 0 );
1217
1218
- $featured = false;
1219
- } else {
1220
- $this->hf_log_data_change( 'csv-import', sprintf( __( '> > Error importing image "%s"', 'product-import-export-for-woo' ), $image ) );
1221
- $this->hf_log_data_change( 'csv-import', '> > ' . $attachment_id->get_error_message() );
1222
- }
1223
1224
- unset( $attachment, $attachment_id );
1225
- }
1226
1227
- $this->hf_log_data_change( 'csv-import', __( '> > Images set', 'product-import-export-for-woo' ) );
1228
1229
- ksort( $gallery_ids );
1230
1231
- update_post_meta( $post_id, '_product_image_gallery', implode( ',', $gallery_ids ) );
1232
1233
- unset( $post['images'], $featured, $gallery_ids );
1234
- }
1235
1236
- // Import attributes
1237
- if ( ! empty( $post['attributes'] ) && is_array($post['attributes']) ) {
1238
1239
- if ($merging) {
1240
- $attributes = array_filter( (array) maybe_unserialize( get_post_meta( $post_id, '_product_attributes', true ) ) );
1241
- $attributes = array_merge( $attributes, $post['attributes'] );
1242
- } else {
1243
- $attributes = $post['attributes'];
1244
- }
1245
1246
- // Sort attribute positions
1247
- if ( ! function_exists( 'attributes_cmp' ) ) {
1248
- function attributes_cmp( $a, $b ) {
1249
- if ( $a['position'] == $b['position'] ) return 0;
1250
- return ( $a['position'] < $b['position'] ) ? -1 : 1;
1251
- }
1252
- }
1253
- uasort( $attributes, 'attributes_cmp' );
1254
1255
- update_post_meta( $post_id, '_product_attributes', $attributes );
1256
1257
- unset( $post['attributes'], $attributes );
1258
- }
1259
1260
- // Import GPF
1261
- if ( ! empty( $post['gpf_data'] ) && is_array( $post['gpf_data'] ) ) {
1262
1263
- update_post_meta( $post_id, '_woocommerce_gpf_data', $post['gpf_data'] );
1264
1265
- unset( $post['gpf_data'] );
1266
- }
1267
1268
- if ( ! empty( $post['upsell_skus'] ) && is_array( $post['upsell_skus'] ) ) {
1269
- $this->upsell_skus[ $post_id ] = $post['upsell_skus'];
1270
- }
1271
1272
- if ( ! empty( $post['crosssell_skus'] ) && is_array( $post['crosssell_skus'] ) ) {
1273
- $this->crosssell_skus[ $post_id ] = $post['crosssell_skus'];
1274
- }
1275
1276
- add_post_meta( $post_id, 'total_sales', 0 );
1277
1278
- if ( $merging ) {
1279
- $this->add_import_result( 'merged', 'Product updated successfully', $post_id, $processing_product_title, $processing_product_sku );
1280
- $this->hf_log_data_change( 'csv-import', sprintf( __('> Finished merging post ID %s.', 'product-import-export-for-woo'), $post_id ) );
1281
- } else {
1282
- $this->add_import_result( 'imported', 'Import successful', $post_id, $processing_product_title, $processing_product_sku );
1283
- $this->hf_log_data_change( 'csv-import', sprintf( __('> Finished importing post ID %s.', 'product-import-export-for-woo'), $post_id ) );
1284
- }
1285
-
1286
- do_action('wf_refresh_after_product_import',$processing_product_object); // hook for forcefully refresh product
1287
- unset( $post );
1288
- }
1289
1290
- /**
1291
* Log a row's import status
1292
*/
1293
protected function add_import_result( $status, $reason, $post_id = '', $post_title = '', $sku = '' ) {
490
_e( 'Finished. Import complete.', 'product-import-export-for-woo' );
491
492
$this->import_end();
493
+ if (WC()->version >= '3.6' && !wc_update_product_lookup_tables_is_running()) {
494
+ wc_update_product_lookup_tables();
495
+ }
496
+
497
exit;
498
break;
499
}
805
/**
806
* Create new posts based on import information
807
*/
808
+ public function process_product($post) {
809
+ $processing_product_id = absint($post['post_id']);
810
+ $processing_product = get_post($processing_product_id);
811
+ $processing_product_title = $processing_product ? $processing_product->post_title : '';
812
+ $processing_product_sku = $processing_product ? $processing_product->sku : '';
813
+ $merging = !empty($post['merging']);
814
+
815
+ if (!empty($post['post_title'])) {
816
+ $processing_product_title = $post['post_title'];
817
+ }
818
819
+ if (!empty($post['sku'])) {
820
+ $id_exist = $this->wf_get_product_id_by_sku($post['sku']);
821
+ if ($id_exist == $processing_product_id || $processing_product_sku == $post['sku'] || empty($id_exist)) {
822
+ $processing_product_sku = $post['sku'];
823
+ } else {
824
+ $usr_msg = 'Invalid or duplicated SKU.';
825
+ $this->add_import_result('skipped', __($usr_msg, 'wf_csv_import_export'), $id_exist, get_the_title($id_exist), $post['sku']);
826
+ $this->hf_log_data_change('csv-import', sprintf(__('> &#8220;%s&#8221;' . $usr_msg, 'wf_csv_import_export'), esc_html($processing_product_title)) . ' with post ID:' . $existing_product, true);
827
+ unset($post);
828
+ return;
829
+ }
830
+ }
831
832
+ if (!empty($processing_product_id) && isset($this->processed_posts[$processing_product_id])) {
833
+ $this->add_import_result('skipped', __('Product already processed', 'product-import-export-for-woo'), $processing_product_id, $processing_product_title, $processing_product_sku);
834
+ $this->hf_log_data_change('csv-import', __('> Post ID already processed. Skipping.', 'product-import-export-for-woo'), true);
835
+ unset($post);
836
+ return;
837
+ }
838
+
839
+ if (!empty($post['post_status']) && $post['post_status'] == 'auto-draft') {
840
+ $this->add_import_result('skipped', __('Skipping auto-draft', 'product-import-export-for-woo'), $processing_product_id, $processing_product_title, $processing_product_sku);
841
+ $this->hf_log_data_change('csv-import', __('> Skipping auto-draft.', 'product-import-export-for-woo'), true);
842
+ unset($post);
843
+ return;
844
+ }
845
+ // Check if post exists when importing
846
+
847
+ if (!$merging) {
848
+ /* if ( $this->product_exists( $processing_product_title, $processing_product_sku, $post['post_name'] ) ) {
849
+ if(!$processing_product_id && empty($processing_product_sku)) {
850
+ // if no sku , no id and no merge + is product in db with same title -> just give message
851
+ $usr_msg = 'Product with same title already exist.';
852
+ }else{
853
+ $usr_msg = 'Product already exists.';
854
+ }
855
+ $this->add_import_result( 'skipped', __( $usr_msg, 'product-import-export-for-woo' ), $processing_product_id, $processing_product_title, $processing_product_sku );
856
+ $this->hf_log_data_change( 'csv-import', sprintf( __('> &#8220;%s&#8221;'.$usr_msg, 'product-import-export-for-woo'), esc_html($processing_product_title) ), true );
857
+ unset( $post );
858
+ return;
859
+ }
860
+ */
861
+
862
+ $is_post_type_product = get_post_type($processing_product_id);
863
+ if (!empty($processing_product_id) && (in_array($is_post_type_product, array('product', 'product_variation')))) {
864
+ $usr_msg = 'Product with same ID already exists.';
865
+ $this->add_import_result('skipped', __($usr_msg, 'wf_csv_import_export'), $processing_product_id, $processing_product_title, $processing_product_sku);
866
+ $this->hf_log_data_change('csv-import', sprintf(__('> &#8220;%s&#8221;' . $usr_msg, 'wf_csv_import_export'), esc_html($processing_product_title)), true);
867
+ unset($post);
868
+ return;
869
+ }
870
+
871
+ $existing_product = '';
872
+ if (isset($processing_product_sku) && !empty($processing_product_sku)) {
873
+ $existing_product = $this->wf_get_product_id_by_sku($processing_product_sku);
874
+ }
875
+ if ($existing_product) {
876
+ /*if ($this->delete_products == 1) {
877
+ $product_to_be_deleted[] = $existing_product;
878
+ }*/
879
+ if (!$processing_product_id && empty($processing_product_sku)) {
880
+ // if no sku , no id and no merge and has same title in DB -> just give message
881
+ $usr_msg = 'Product with same title already exists.';
882
+ } else {
883
+ $usr_msg = 'Product with same SKU already exists.';
884
+ }
885
+ $this->add_import_result('skipped', __($usr_msg, 'product-import-export-for-woo'), $existing_product, $processing_product_title, $processing_product_sku);
886
+ $this->hf_log_data_change('csv-import', sprintf(__('> &#8220;%s&#8221;' . $usr_msg, 'product-import-export-for-woo'), esc_html($processing_product_title)) . ' with post ID:' . $existing_product, true);
887
+ unset($post);
888
+ return;
889
+ }
890
+
891
+ if ($processing_product_id && is_string(get_post_status($processing_product_id))) {
892
+ $this->add_import_result('skipped', __('Importing product(ID) conflicts with an existing post.', 'product-import-export-for-woo'), $processing_product_id, get_the_title($processing_product_id), '');
893
+ $this->hf_log_data_change('csv-import', sprintf(__('> &#8220;%s&#8221; ID already exists.', 'product-import-export-for-woo'), esc_html($processing_product_id)), true);
894
+ unset($post);
895
+ return;
896
+ }
897
+ }
898
899
900
// if ( ! $merging ) {
901
// error_log('<pre>$this->wf_get_product_id_by_sku( $processing_product_sku ):-' . print_r($this->wf_get_product_id_by_sku( $processing_product_sku ), 1) . '</per>', 3, ABSPATH . "/wp-content/uploads/wc-logs/test-log.txt");
902
// if ( $this->wf_get_product_id_by_sku( $processing_product_sku ) ) {
925
// return;
926
// }
927
// }
928
+ // Check post type to avoid conflicts with IDs
929
+ $is_post_exist_in_db = get_post_type($processing_product_id);
930
+ if ($merging && $processing_product_id && !empty($is_post_exist_in_db) && ($is_post_exist_in_db !== $post['post_type'] )) {
931
+ $this->add_import_result('skipped', __('Importing product(ID) conflicts with an existing post which is not a product.', 'product-import-export-for-woo'), $processing_product_id, $processing_product_title, $processing_product_sku);
932
+ $this->hf_log_data_change('csv-import', sprintf(__('> &#8220;%s&#8221; is not a product.', 'product-import-export-for-woo'), esc_html($processing_product_id)), true);
933
+ unset($post);
934
+ return;
935
+ }
936
937
+ if ($merging && !empty($is_post_exist_in_db)) {
938
939
+ // Only merge fields which are set
940
+ $post_id = $processing_product_id;
941
942
+ $this->hf_log_data_change('csv-import', sprintf(__('> Merging post ID %s.', 'product-import-export-for-woo'), $post_id), true);
943
944
+ $postdata = array(
945
+ 'ID' => $post_id
946
+ );
947
948
+ if ($this->merge_empty_cells) {
949
+ if (isset($post['post_content'])) {
950
+ $postdata['post_content'] = $post['post_content'];
951
+ }
952
+ if (isset($post['post_excerpt'])) {
953
+ $postdata['post_excerpt'] = $post['post_excerpt'];
954
+ }
955
+ if (isset($post['post_password'])) {
956
+ $postdata['post_password'] = $post['post_password'];
957
+ }
958
+ if (isset($post['post_parent'])) {
959
+ $postdata['post_parent'] = $post['post_parent'];
960
+ }
961
+ } else {
962
+ if (!empty($post['post_content'])) {
963
+ $postdata['post_content'] = $post['post_content'];
964
+ }
965
+ if (!empty($post['post_excerpt'])) {
966
+ $postdata['post_excerpt'] = $post['post_excerpt'];
967
+ }
968
+ if (!empty($post['post_password'])) {
969
+ $postdata['post_password'] = $post['post_password'];
970
+ }
971
+ if (isset($post['post_parent']) && $post['post_parent'] !== '') {
972
+ $postdata['post_parent'] = $post['post_parent'];
973
+ }
974
+ }
975
976
+ if (!empty($post['post_title'])) {
977
+ $postdata['post_title'] = $post['post_title'];
978
+ }
979
980
+ if (!empty($post['post_author'])) {
981
+ $postdata['post_author'] = absint($post['post_author']);
982
+ }
983
+ if (!empty($post['post_date'])) {
984
+ $postdata['post_date'] = date("Y-m-d H:i:s", strtotime($post['post_date']));
985
+ }
986
+ if (!empty($post['post_date_gmt'])) {
987
+ $postdata['post_date_gmt'] = date("Y-m-d H:i:s", strtotime($post['post_date_gmt']));
988
+ }
989
+ if (!empty($post['post_name'])) {
990
+ $postdata['post_name'] = $post['post_name'];
991
+ }
992
+ if (!empty($post['post_status'])) {
993
+ $postdata['post_status'] = $post['post_status'];
994
+ }
995
+ if (!empty($post['menu_order'])) {
996
+ $postdata['menu_order'] = $post['menu_order'];
997
+ }
998
+ if (!empty($post['comment_status'])) {
999
+ $postdata['comment_status'] = $post['comment_status'];
1000
+ }
1001
+ if (sizeof($postdata) > 1) {
1002
+ $result = wp_update_post($postdata);
1003
1004
+ if (!$result) {
1005
+ $this->add_import_result('failed', __('Failed to update product', 'product-import-export-for-woo'), $post_id, $processing_product_title, $processing_product_sku);
1006
+ $this->hf_log_data_change('csv-import', sprintf(__('> Failed to update product %s', 'product-import-export-for-woo'), $post_id), true);
1007
+ unset($post);
1008
+ return;
1009
+ } else {
1010
+ $this->hf_log_data_change('csv-import', __('> Merged post data: ', 'product-import-export-for-woo') . print_r($postdata, true));
1011
+ }
1012
+ }
1013
+ } else {
1014
+ $merging = FALSE;
1015
+ // Get parent
1016
+ $post_parent = (isset($post['post_parent']) ? $post['post_parent'] : '');
1017
1018
+ if ($post_parent !== "") {
1019
+ $post_parent = absint($post_parent);
1020
1021
+ if ($post_parent > 0) {
1022
+ // if we already know the parent, map it to the new local ID
1023
+ if (isset($this->processed_posts[$post_parent])) {
1024
+ $post_parent = $this->processed_posts[$post_parent];
1025
1026
+ // otherwise record the parent for later
1027
+ } else {
1028
1029
+ $this->post_orphans[intval($processing_product_id)] = $post_parent;
1030
+ //$post_parent = 0;
1031
+ }
1032
+ }
1033
+ }
1034
1035
+ // Insert product
1036
+ $this->hf_log_data_change('csv-import', sprintf(__('> Inserting %s', 'product-import-export-for-woo'), esc_html($processing_product_title)), true);
1037
+ $postdata = array(
1038
+ 'import_id' => $processing_product_id,
1039
+ 'post_author' => !empty($post['post_author']) ? absint($post['post_author']) : get_current_user_id(),
1040
+ 'post_date' => !empty($post['post_date']) ? date("Y-m-d H:i:s", strtotime($post['post_date'])) : '',
1041
+ 'post_date_gmt' => (!empty($post['post_date_gmt']) && $post['post_date_gmt'] ) ? date('Y-m-d H:i:s', strtotime($post['post_date_gmt'])) : '',
1042
+ 'post_content' => !empty($post['post_content']) ? $post['post_content'] : '',
1043
+ 'post_excerpt' => !empty($post['post_excerpt']) ? $post['post_excerpt'] : '',
1044
+ 'post_title' => $processing_product_title,
1045
+ 'post_name' => !empty($post['post_name']) ? $post['post_name'] : sanitize_title($processing_product_title),
1046
+ 'post_status' => !empty($post['post_status']) ? $post['post_status'] : 'publish',
1047
+ 'post_parent' => $post_parent,
1048
+ 'menu_order' => !empty($post['menu_order']) ? $post['menu_order'] : '',
1049
+ 'post_type' => !empty($post['post_type']) ? $post['post_type'] : "",
1050
+ 'post_password' => !empty($post['post_password']) ? $post['post_password'] : '',
1051
+ 'comment_status' => !empty($post['comment_status']) ? $post['comment_status'] : '',
1052
+ );
1053
1054
+ $post_id = wp_insert_post($postdata, true);
1055
1056
+ if (is_wp_error($post_id)) {
1057
1058
+ $this->add_import_result('failed', __('Failed to import product', 'product-import-export-for-woo'), $processing_product_id, $processing_product_title, $processing_product_sku);
1059
+ $this->hf_log_data_change('csv-import', sprintf(__('Failed to import product &#8220;%s&#8221;', 'product-import-export-for-woo'), esc_html($processing_product_title)));
1060
+ unset($post);
1061
+ return;
1062
+ } else {
1063
1064
+ $this->hf_log_data_change('csv-import', sprintf(__('> Inserted - post ID is %s.', 'product-import-export-for-woo'), $post_id));
1065
+ }
1066
+ }
1067
1068
+ unset($postdata);
1069
1070
+ // map pre-import ID to local ID
1071
+ if (empty($processing_product_id)) {
1072
+ $processing_product_id = (int) $post_id;
1073
+ }
1074
1075
+ $this->processed_posts[intval($processing_product_id)] = (int) $post_id;
1076
1077
+ // add categories, tags and other terms
1078
+ if (!empty($post['terms']) && is_array($post['terms'])) {
1079
1080
+ $terms_to_set = array();
1081
1082
+ foreach ($post['terms'] as $term_group) {
1083
1084
+ $taxonomy = $term_group['taxonomy'];
1085
+ $terms = $term_group['terms'];
1086
1087
+ if (!$taxonomy || !taxonomy_exists($taxonomy)) {
1088
+ continue;
1089
+ }
1090
1091
+ if (!is_array($terms)) {
1092
+ $terms = array($terms);
1093
+ }
1094
1095
+ $terms_to_set[$taxonomy] = array();
1096
1097
+ foreach ($terms as $term_id) {
1098
1099
+ if (!$term_id)
1100
+ continue;
1101
1102
+ $terms_to_set[$taxonomy][] = intval($term_id);
1103
+ }
1104
+ }
1105
1106
+ foreach ($terms_to_set as $tax => $ids) {
1107
+ $tt_ids = wp_set_post_terms($post_id, $ids, $tax, false);
1108
+ }
1109
1110
+ unset($post['terms'], $terms_to_set);
1111
+ }
1112
1113
+ // add/update post meta
1114
+ if (!empty($post['postmeta']) && is_array($post['postmeta'])) {
1115
+ foreach ($post['postmeta'] as $meta) {
1116
+ $key = apply_filters('import_post_meta_key', $meta['key']);
1117
1118
+ if ($key) {
1119
+ update_post_meta($post_id, $key, maybe_unserialize($meta['value']));
1120
+ }
1121
1122
+ if ($key == '_file_paths') {
1123
+ do_action('woocommerce_process_product_file_download_paths', $post_id, 0, maybe_unserialize($meta['value']));
1124
+ }
1125
+ }
1126
1127
+ unset($post['postmeta']);
1128
+ }
1129
1130
+ // Import images and add to post
1131
+ if (!empty($post['images']) && is_array($post['images'])) {
1132
1133
+ $featured = true;
1134
+ $gallery_ids = array();
1135
1136
+ if ($merging) {
1137
1138
+ // Get basenames
1139
+ $image_basenames = array();
1140
1141
+ foreach ($post['images'] as $image)
1142
+ $image_basenames[] = basename($image);
1143
1144
+ // Loop attachments already attached to the product
1145
+ //$attachments = get_posts( 'post_parent=' . $post_id . '&post_type=attachment&fields=ids&post_mime_type=image&numberposts=-1' );
1146
1147
+ $processing_product_object = wc_get_product($post_id);
1148
+ $attachments = $processing_product_object->get_gallery_attachment_ids();
1149
+ $post_thumbnail_id = get_post_thumbnail_id($post_id);
1150
+ if (isset($post_thumbnail_id) && !empty($post_thumbnail_id)) {
1151
+ $attachments[] = $post_thumbnail_id;
1152
+ }
1153
1154
+ foreach ($attachments as $attachment_key => $attachment) {
1155
1156
+ $attachment_url = wp_get_attachment_url($attachment);
1157
+ $attachment_basename = basename($attachment_url);
1158
1159
+ // Don't import existing images
1160
+ if (in_array($attachment_url, $post['images']) || in_array($attachment_basename, $image_basenames)) {
1161
1162
+ foreach ($post['images'] as $key => $image) {
1163
1164
+ if ($image == $attachment_url || basename($image) == $attachment_basename) {
1165
+ unset($post['images'][$key]);
1166
1167
+ $this->hf_log_data_change('csv-import', sprintf(__('> > Image exists - skipping %s', 'product-import-export-for-woo'), basename($image)));
1168
1169
+ if ($key == 0) {
1170
+ update_post_meta($post_id, '_thumbnail_id', $attachment);
1171
+ $featured = false;
1172
+ } else {
1173
+ $gallery_ids[$key] = $attachment;
1174
+ }
1175
+ }
1176
+ }
1177
+ } else {
1178
+
1179
+ // Detach image which is not being merged
1180
+ $attachment_post = array();
1181
+ $attachment_post['ID'] = $attachment;
1182
+ $attachment_post['post_parent'] = '';
1183
+ wp_update_post($attachment_post);
1184
+ unset($attachment_post);
1185
+ }
1186
+ }
1187
1188
+ unset($attachments);
1189
+ }
1190
1191
+ if ($post['images'])
1192
+ foreach ($post['images'] as $image_key => $image) {
1193
1194
+ $this->hf_log_data_change('csv-import', sprintf(__('> > Importing image "%s"', 'product-import-export-for-woo'), $image));
1195
1196
+ $filename = basename($image);
1197
1198
+ $attachment = array(
1199
+ 'post_title' => preg_replace('/\.[^.]+#x2F;', '', $processing_product_title . ' ' . ( $image_key + 1 )),
1200
+ 'post_content' => '',
1201
+ 'post_status' => 'inherit',
1202
+ 'post_parent' => $post_id
1203
+ );
1204
1205
+ $attachment_id = $this->process_attachment($attachment, $image, $post_id);
1206
1207
+ if (!is_wp_error($attachment_id) && $attachment_id) {
1208
1209
+ $this->hf_log_data_change('csv-import', sprintf(__('> > Imported image "%s"', 'product-import-export-for-woo'), $image));
1210
1211
+ // Set alt
1212
+ update_post_meta($attachment_id, '_wp_attachment_image_alt', $processing_product_title);
1213
1214
+ if ($featured) {
1215
+ update_post_meta($post_id, '_thumbnail_id', $attachment_id);
1216
+ } else {
1217
+ $gallery_ids[$image_key] = $attachment_id;
1218
+ }
1219
1220
+ update_post_meta($attachment_id, '_woocommerce_exclude_image', 0);
1221
1222
+ $featured = false;
1223
+ } else {
1224
+ $this->hf_log_data_change('csv-import', sprintf(__('> > Error importing image "%s"', 'product-import-export-for-woo'), $image));
1225
+ $this->hf_log_data_change('csv-import', '> > ' . $attachment_id->get_error_message());
1226
+ }
1227
1228
+ unset($attachment, $attachment_id);
1229
+ }
1230
1231
+ $this->hf_log_data_change('csv-import', __('> > Images set', 'product-import-export-for-woo'));
1232
1233
+ ksort($gallery_ids);
1234
1235
+ update_post_meta($post_id, '_product_image_gallery', implode(',', $gallery_ids));
1236
1237
+ unset($post['images'], $featured, $gallery_ids);
1238
+ }
1239
1240
+ // Import attributes
1241
+ if (!empty($post['attributes']) && is_array($post['attributes'])) {
1242
1243
+ if ($merging) {
1244
+ $attributes = array_filter((array) maybe_unserialize(get_post_meta($post_id, '_product_attributes', true)));
1245
+ $attributes = array_merge($attributes, $post['attributes']);
1246
+ } else {
1247
+ $attributes = $post['attributes'];
1248
+ }
1249
1250
+ // Sort attribute positions
1251
+ if (!function_exists('attributes_cmp')) {
1252
1253
+ function attributes_cmp($a, $b) {
1254
+ if ($a['position'] == $b['position'])
1255
+ return 0;
1256
+ return ( $a['position'] < $b['position'] ) ? -1 : 1;
1257
+ }
1258
1259
+ }
1260
+ uasort($attributes, 'attributes_cmp');
1261
1262
+ update_post_meta($post_id, '_product_attributes', $attributes);
1263
1264
+ unset($post['attributes'], $attributes);
1265
+ }
1266
1267
+ // Import GPF
1268
+ if (!empty($post['gpf_data']) && is_array($post['gpf_data'])) {
1269
1270
+ update_post_meta($post_id, '_woocommerce_gpf_data', $post['gpf_data']);
1271
1272
+ unset($post['gpf_data']);
1273
+ }
1274
1275
+ if (!empty($post['upsell_skus']) && is_array($post['upsell_skus'])) {
1276
+ $this->upsell_skus[$post_id] = $post['upsell_skus'];
1277
+ }
1278
1279
+ if (!empty($post['crosssell_skus']) && is_array($post['crosssell_skus'])) {
1280
+ $this->crosssell_skus[$post_id] = $post['crosssell_skus'];
1281
+ }
1282
+
1283
+ add_post_meta($post_id, 'total_sales', 0);
1284
+
1285
+ if ($merging) {
1286
+ $this->add_import_result('merged', 'Product updated successfully', $post_id, $processing_product_title, $processing_product_sku);
1287
+ $this->hf_log_data_change('csv-import', sprintf(__('> Finished merging post ID %s.', 'product-import-export-for-woo'), $post_id));
1288
+ } else {
1289
+ $this->add_import_result('imported', 'Import successful', $post_id, $processing_product_title, $processing_product_sku);
1290
+ $this->hf_log_data_change('csv-import', sprintf(__('> Finished importing post ID %s.', 'product-import-export-for-woo'), $post_id));
1291
+ }
1292
+
1293
+ do_action('wf_refresh_after_product_import', $processing_product_object); // hook for forcefully refresh product
1294
+ unset($post);
1295
+ }
1296
+
1297
+ /**
1298
* Log a row's import status
1299
*/
1300
protected function add_import_result( $status, $reason, $post_id = '', $post_title = '', $sku = '' ) {
product-import-export-for-woo.php CHANGED
@@ -5,8 +5,8 @@
5
Description: Import and Export Products From and To your WooCommerce Store.
6
Author: WebToffee
7
Author URI: https://www.webtoffee.com/product/product-import-export-woocommerce/
8
- Version: 1.6.7
9
- WC tested up to: 3.7.0
10
License: GPLv3
11
License URI: https://www.gnu.org/licenses/gpl-3.0.html
12
Text Domain: product-import-export-for-woo
@@ -18,7 +18,7 @@ if (!defined('ABSPATH') || !is_admin()) {
18
19
20
if (!defined('WF_PIPE_CURRENT_VERSION')) {
21
- define("WF_PIPE_CURRENT_VERSION", "1.6.7");
22
}
23
if (!defined('WF_PROD_IMP_EXP_ID')) {
24
define("WF_PROD_IMP_EXP_ID", "wf_prod_imp_exp");
5
Description: Import and Export Products From and To your WooCommerce Store.
6
Author: WebToffee
7
Author URI: https://www.webtoffee.com/product/product-import-export-woocommerce/
8
+ Version: 1.6.8
9
+ WC tested up to: 3.7.1
10
License: GPLv3
11
License URI: https://www.gnu.org/licenses/gpl-3.0.html
12
Text Domain: product-import-export-for-woo
18
19
20
if (!defined('WF_PIPE_CURRENT_VERSION')) {
21
+ define("WF_PIPE_CURRENT_VERSION", "1.6.8");
22
}
23
if (!defined('WF_PROD_IMP_EXP_ID')) {
24
define("WF_PROD_IMP_EXP_ID", "wf_prod_imp_exp");
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.webtoffee.com/plugins/
4
Tags: woocommerce product import, woocommerce import products, woocommerce export products, export woocommerce products, import products into woocommerce ,product, export, import, woocommerce ,csv
5
Requires at least: 3.0.1
6
Tested up to: 5.2.3
7
- Stable tag: 1.6.7
8
License: GPLv3 or later
9
License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
@@ -20,7 +20,7 @@ Product import export plugin allows you to import or export WooCommerce simple p
20
21
&#128312; Export Simple Products in to a CSV file.
22
&#128312; Import Simple Products in CSV format in to WooCommerce Store.
23
- &#128312; Tested OK with WooCommerce 3.7.0.
24
25
26
Highlights: WooCommerce Product Export, WooCommerce Product CSV Import Suite, WooCommerce bulk product upload, WooCommerce import products with images, import amazon products to WooCommerce, Export Products to xls. Pro Version supports both Simple and Variable products.
@@ -153,7 +153,11 @@ By default, admin and store manager are given access to export orders from your
153
154
== Changelog ==
155
156
- = 1.6.6 =
157
* Content Update.
158
159
= 1.6.6 =
4
Tags: woocommerce product import, woocommerce import products, woocommerce export products, export woocommerce products, import products into woocommerce ,product, export, import, woocommerce ,csv
5
Requires at least: 3.0.1
6
Tested up to: 5.2.3
7
+ Stable tag: 1.6.8
8
License: GPLv3 or later
9
License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
20
21
&#128312; Export Simple Products in to a CSV file.
22
&#128312; Import Simple Products in CSV format in to WooCommerce Store.
23
+ &#128312; Tested OK with WooCommerce 3.7.1.
24
25
26
Highlights: WooCommerce Product Export, WooCommerce Product CSV Import Suite, WooCommerce bulk product upload, WooCommerce import products with images, import amazon products to WooCommerce, Export Products to xls. Pro Version supports both Simple and Variable products.
153
154
== Changelog ==
155
156
+ = 1.6.8 =
157
+ * Bug Fix: Duplicating SKU when updating product with ID
158
+ * Tested OK with WC 3.7.1
159
+
160
+ = 1.6.7 =
161
* Content Update.
162
163
= 1.6.6 =