<?php if (!defined('WPINC')) { exit; } if(!class_exists('Wt_Import_Export_For_Woo_Basic_Product_Export')){ class Wt_Import_Export_For_Woo_Basic_Product_Export { public $parent_module = null; public $export_children_sku = ""; public $export_shortcodes = ""; public $export_images_zip = ""; public function __construct($parent_object) { $this->parent_module = $parent_object; } public function prepare_header() { $export_columns = $this->parent_module->get_selected_column_names(); return apply_filters('hf_alter_product_export_csv_columns', $export_columns); } /** * Prepare data that will be exported. */ public function prepare_data_to_export($form_data, $batch_offset,$step) { $include_products = !empty($form_data['filter_form_data']['wt_iew_product']) ? $form_data['filter_form_data']['wt_iew_product'] : ''; $exclude_products = !empty($form_data['filter_form_data']['wt_iew_exclude_product']) ? $form_data['filter_form_data']['wt_iew_exclude_product'] : ''; $exp_stock_status = !empty($form_data['filter_form_data']['wt_iew_stock_status']) ? $form_data['filter_form_data']['wt_iew_stock_status'] : ''; $prod_categories = !empty($form_data['filter_form_data']['wt_iew_product_categories']) ? $form_data['filter_form_data']['wt_iew_product_categories'] : array(); $prod_tags = !empty($form_data['filter_form_data']['wt_iew_product_tags']) ? $form_data['filter_form_data']['wt_iew_product_tags'] : array(); $prod_types = !empty($form_data['filter_form_data']['wt_iew_product_types']) ? $form_data['filter_form_data']['wt_iew_product_types'] : array(); $prod_status = !empty($form_data['filter_form_data']['wt_iew_product_status']) ? $form_data['filter_form_data']['wt_iew_product_status'] : array(); $export_sortby = !empty($form_data['filter_form_data']['wt_iew_sort_columns']) ? $form_data['filter_form_data']['wt_iew_sort_columns'] : 'ID'; $export_sort_order = !empty($form_data['filter_form_data']['wt_iew_order_by']) ? $form_data['filter_form_data']['wt_iew_order_by'] : 'ASC'; $export_limit = !empty($form_data['filter_form_data']['wt_iew_limit']) ? intval($form_data['filter_form_data']['wt_iew_limit']) : 999999999; //user limit $current_offset = !empty($form_data['filter_form_data']['wt_iew_offset']) ? intval($form_data['filter_form_data']['wt_iew_offset']) : 0; //user offset $batch_count = !empty($form_data['advanced_form_data']['wt_iew_batch_count']) ? $form_data['advanced_form_data']['wt_iew_batch_count'] : Wt_Import_Export_For_Woo_Basic_Common_Helper::get_advanced_settings('default_export_batch'); $batch_count = apply_filters('wt_woocommerce_csv_export_limit_per_request', $batch_count); //ajax batch limit $this->export_children_sku = (!empty($form_data['advanced_form_data']['wt_iew_export_children_sku'] ) && $form_data['advanced_form_data']['wt_iew_export_children_sku'] == 'Yes') ? true : false; $this->export_shortcodes = (!empty($form_data['advanced_form_data']['wt_iew_export_shortcode_tohtml']) && $form_data['advanced_form_data']['wt_iew_export_shortcode_tohtml'] == 'Yes') ? true : false; $this->export_images_zip = (!empty($form_data['advanced_form_data']['wt_iew_image_export']) && $form_data['advanced_form_data']['wt_iew_image_export'] == 'Yes') ? true : false; $real_offset = ($current_offset + $batch_offset); if($batch_count<=$export_limit) { if(($batch_offset+$batch_count)>$export_limit) //last offset { $limit=$export_limit-$batch_offset; }else { $limit=$batch_count; } }else { $limit=$export_limit; } $product_array = array(); $total_products = 0; if ($batch_offset < $export_limit) { $args = array( 'status' => array('publish', 'private', 'draft', 'pending', 'future'), 'type' => array('simple','grouped','external'), 'limit' => $limit, 'offset' => $real_offset, 'orderby' => $export_sortby, 'order' => $export_sort_order, // 'return' => 'objects', 'paginate' => true, ); // if(1){ //if(is_woocommerce_prior_to_basic('2.7.0')){ $args['return'] = 'ids'; // } if (!empty($prod_status)) { $args['status'] = $prod_status; } if (!empty($prod_types)) { $args['type'] = $prod_types; } if (!empty($prod_categories)) { $args['category'] = $prod_categories; } if (!empty($prod_tags)) { $args['tag'] = $prod_tags; } if (!empty($include_products)) { $args['include'] = $include_products; } if (!empty($exclude_products)) { $args['exclude'] = $exclude_products; } if (!empty($exp_stock_status)) { $args['stock_status'] = $exp_stock_status; } // Export all language products if WPML is active and the language selected is all. if ( function_exists('icl_object_id') && isset( $_SERVER["HTTP_REFERER"] ) && strpos($_SERVER["HTTP_REFERER"], 'lang=all') !== false ) { $args['suppress_filters'] = true; } $args = apply_filters("woocommerce_csv_product_export_args", $args); $products = wc_get_products($args); $total_products=0; if($batch_offset==0) //first batch { $total_item_args=$args; $total_item_args['limit']=$export_limit; //user given limit $total_item_args['offset']=$current_offset; //user given offset $total_products_count = wc_get_products($total_item_args); $total_products=count($total_products_count->products); } if('export_image' == $step){ $products_ids = $products; }else{ $products_ids = $products->products; } foreach ($products_ids as $key => $product_id) { $product = wc_get_product($product_id); if ($product->is_type('variable') ) { continue; }else{ $product_array[] = $this->generate_row_data_wc_lower($product); } } } $return_products = array( 'total' => $total_products, 'data' => $product_array, ); if( 0 == $batch_offset && 0 == $total_products ){ $return_products['no_post'] = __( 'Nothing to export under the selected criteria. Please check if any supported product type ( simple, grouped or external ) is available in the shop or try adjusting the filters.' ); } return $return_products; } protected function generate_row_data_wc_lower($product_object) { $export_columns = $this->parent_module->get_selected_column_names(); $post_columns = Wt_Import_Export_For_Woo_Basic_Product::get_product_post_columns(); $standard_meta_columns = array_keys(array_slice($post_columns, 12)); $product = get_post($product_object->get_id()); $csv_columns = $export_columns; //Wt_Import_Export_For_Woo_Basic_Product::wt_array_walk($export_columns,'meta:'); // Remove string 'meta:' from keys and values, YOAST support $export_columns = !empty($csv_columns) ? $csv_columns : array(); $row = array(); if ($product->post_parent == 0) $product->post_parent = ''; // Pre-process data $meta_data = get_post_custom($product->ID); $product->meta = new stdClass; $product->attributes = new stdClass; // Meta data foreach ($meta_data as $meta => $value) { if (!$meta) { continue; } $meta_value = maybe_unserialize(maybe_unserialize($value[0])); if (is_array($meta_value)) { $meta_value = json_encode($meta_value); } if (strstr($meta, 'attribute_pa_')) { if ($meta_value) { $get_name_by_slug = get_term_by('slug', $meta_value, str_replace('attribute_', '', $meta)); if ($get_name_by_slug) { $product->meta->$meta = self::format_export_meta($get_name_by_slug->name, $meta); } else { $product->meta->$meta = self::format_export_meta($meta_value, $meta); } } else { $product->meta->$meta = self::format_export_meta($meta_value, $meta); } } else { $formatted_mdata = self::format_export_meta($meta_value, $meta,$product_object); $clean_meta_key = ltrim($meta, '_'); if(in_array($clean_meta_key, $standard_meta_columns)){ $meta = $clean_meta_key; } $product->meta->$meta = $formatted_mdata; } } // Product attributes if (isset($meta_data['_product_attributes'][0])) { $attributes = maybe_unserialize(maybe_unserialize($meta_data['_product_attributes'][0])); if (!empty($attributes) && is_array($attributes)) { foreach ($attributes as $key => $attribute) { if (!$key) { continue; } $key = rawurldecode($key); $key_to_find_default_attribute = $key; if ($attribute['is_taxonomy'] == 1) { $terms = wp_get_post_terms($product->ID, $key, array("fields" => "names")); if (!is_wp_error($terms)) { $attribute_value = implode('|', $terms); } else { $attribute_value = ''; } } else { if (empty($attribute['name'])) { continue; } $key = $attribute['name']; $attribute_value = $attribute['value']; } if (!isset($attribute['position'])) { $attribute['position'] = 0; } if (!isset($attribute['is_visible'])) { $attribute['is_visible'] = 0; } if (!isset($attribute['is_variation'])) { $attribute['is_variation'] = 0; } $attribute_data = $attribute['position'] . '|' . $attribute['is_visible'] . '|' . $attribute['is_variation']; $_default_attributes = isset($meta_data['_default_attributes'][0]) ? maybe_unserialize(maybe_unserialize($meta_data['_default_attributes'][0])) : ''; if (is_array($_default_attributes)) { $default_attribute = isset($_default_attributes[$key_to_find_default_attribute]) ? $_default_attributes[$key_to_find_default_attribute] : ''; $term = get_term_by('slug', $default_attribute, $key_to_find_default_attribute); $_default_attribute = (!is_wp_error($term) && !empty($term) ? $term->name : $default_attribute ); } else { $_default_attribute = ''; } $product->attributes->$key = array( 'value' => $attribute_value, 'data' => $attribute_data, 'default' => $_default_attribute ); } } } foreach ($csv_columns as $column => $value) { if (!$export_columns || in_array($value, $export_columns) || in_array($column, $export_columns)) { if ('_regular_price' == $column && empty($product->meta->$column)) { $column = '_price'; } if (!is_woocommerce_prior_to_basic('2.7')) { if ('_visibility' == $column) { $product_terms = get_the_terms($product->ID, 'product_visibility'); if (!empty($product_terms)) { if (!is_wp_error($product_terms)) { $term_slug = ''; foreach ($product_terms as $i => $term) { $term_slug .= $term->slug . (isset($product_terms[$i + 1]) ? '|' : ''); } $row[$column] = $term_slug; } } else { $row[$column] = ''; } continue; } } if ('Parent' == $column) { if ($product->post_parent) { $post_parent_title = get_the_title($product->post_parent); if ($post_parent_title) { $row[$column] = self::format_data($post_parent_title); } else { $row[$column] = ''; } } else { $row[$column] = ''; } continue; } if ('parent_sku' == $column) { if ($product->post_parent) { $row[$column] = get_post_meta($product->post_parent, '_sku', true); } else { $row[$column] = ''; } continue; } // Export images/gallery if ('images' == $column) { $export_image_metadata = apply_filters('hf_export_image_metadata_flag', TRUE); //filter for disable export image meta datas such as alt,title,content,caption... $image_file_names = array(); // Featured image if (( $featured_image_id = get_post_thumbnail_id($product->ID))) { $image_object = get_post($featured_image_id); $img_url = wp_get_attachment_image_src($featured_image_id, 'full'); $image_meta = ''; if ($image_object && $export_image_metadata) { $image_metadata = get_post_meta($featured_image_id); $image_meta = " ! alt : " . ( isset($image_metadata['_wp_attachment_image_alt'][0]) ? $image_metadata['_wp_attachment_image_alt'][0] : '' ) . " ! title : " . $image_object->post_title . " ! desc : " . $image_object->post_content . " ! caption : " . $image_object->post_excerpt; } if ($image_object && $image_object->guid) { $temp_images_export_to_csv = ($this->export_images_zip ? basename($img_url[0]) : $img_url[0]) . ($export_image_metadata ? $image_meta : ''); } if (!empty($temp_images_export_to_csv)) { $image_file_names[] = $temp_images_export_to_csv; } } // Images $images = isset($meta_data['_product_image_gallery'][0]) ? explode(',', maybe_unserialize(maybe_unserialize($meta_data['_product_image_gallery'][0]))) : false; $results = array(); if ($images) { foreach ($images as $image_id) { if ($featured_image_id == $image_id) { continue; } $temp_gallery_images_export_to_csv = ''; $gallery_image_meta = ''; $gallery_image_object = get_post($image_id); $gallery_img_url = wp_get_attachment_image_src($image_id, 'full'); if ($gallery_image_object && $export_image_metadata) { $gallery_image_metadata = get_post_meta($image_id); $gallery_image_meta = " ! alt : " . ( isset($gallery_image_metadata['_wp_attachment_image_alt'][0]) ? $gallery_image_metadata['_wp_attachment_image_alt'][0] : '' ) . " ! title : " . $gallery_image_object->post_title . " ! desc : " . $gallery_image_object->post_content . " ! caption : " . $gallery_image_object->post_excerpt; } if ($gallery_image_object && $gallery_image_object->guid) { $temp_gallery_images_export_to_csv = ($this->export_images_zip ? basename($gallery_img_url[0]) : $gallery_img_url[0]) . ($export_image_metadata ? $gallery_image_meta : ''); } if (!empty($temp_gallery_images_export_to_csv)) { $image_file_names[] = $temp_gallery_images_export_to_csv; } } } if (!empty($image_file_names)) { $row[$column] = implode(' | ', $image_file_names); } else { $row[$column] = ''; } continue; } // Downloadable files if ('file_paths' == $column || 'downloadable_files' == $column) { $file_paths_to_export = array(); if (!function_exists('wc_get_filename_from_url')) { $file_paths = maybe_unserialize(maybe_unserialize($meta_data['_file_paths'][0])); if ($file_paths) { foreach ($file_paths as $file_path) { $file_paths_to_export[] = $file_path; } } $file_paths_to_export = implode(' | ', $file_paths_to_export); $row[] = self::format_data($file_paths_to_export); } elseif (isset($meta_data['_downloadable_files'][0])) { $file_paths = maybe_unserialize(maybe_unserialize($meta_data['_downloadable_files'][0])); if (is_array($file_paths) || is_object($file_paths)) { foreach ($file_paths as $file_path) { $file_paths_to_export[] = (!empty($file_path['name']) ? $file_path['name'] : Wt_Import_Export_For_Woo_Basic_Common_Helper::wt_wc_get_filename_from_url($file_path['file']) ) . '::' . $file_path['file']; } } $file_paths_to_export = implode(' | ', $file_paths_to_export); } if (!empty($file_paths_to_export)) { $row[$column] = !empty($file_paths_to_export) ? self::format_data($file_paths_to_export) : ''; } else { $row[$column] = ''; } continue; } // Export taxonomies // if ( 'taxonomies' == $column ) { if ('tax:' == substr($column, 0, 4)) { $taxonomy_name = substr($column, 4); if (is_taxonomy_hierarchical($taxonomy_name)) { $terms = wp_get_post_terms($product->ID, $taxonomy_name, array("fields" => "all")); $formatted_terms = array(); foreach ($terms as $term) { $ancestors = array_reverse(get_ancestors($term->term_id, $taxonomy_name)); $formatted_term = array(); foreach ($ancestors as $ancestor) $formatted_term[] = htmlspecialchars_decode( get_term($ancestor, $taxonomy_name)->name ); $formatted_term[] = htmlspecialchars_decode( $term->name ); $formatted_terms[] = implode(' > ', $formatted_term); } $row[$column] = self::format_data(implode('|', $formatted_terms)); } else { $terms = wp_get_post_terms($product->ID, $taxonomy_name, array("fields" => "names")); $row[$column] = self::format_data(implode('|', $terms)); } continue; } // Export meta data // if ( 'meta' == $column ) { if ('meta:' == substr($column, 0, 5)) { $product_meta = substr($column, 5); if (isset($product->meta->$product_meta)) { $row[$column] = self::format_data($product->meta->$product_meta); } else { $row[$column] = ''; } continue; } // Find and export attributes // if ('attributes' == $column ) { if (strstr($column, 'attribute')) { if ('attribute:' == substr($column, 0, 10)) { $attribute = substr($column, 10); if (isset($product->attributes) && isset($product->attributes->$attribute)) { $values = $product->attributes->$attribute; $row[$column] = self::format_data($values['value']); } else { $row[$column] = ''; } continue; } if ('attribute_data:' == substr($column, 0, 15)) { $attribute = substr($column, 15); if (isset($product->attributes) && isset($product->attributes->$attribute)) { $values = $product->attributes->$attribute; $row[$column] = self::format_data($values['data']); } else { $row[$column] = ''; } continue; } if ('attribute_default:' == substr($column, 0, 18)) { $attribute = substr($column, 18); if (isset($product->attributes) && isset($product->attributes->$attribute)) { $values = $product->attributes->$attribute; $row[$column] = self::format_data($values['default']); } else { $row[$column] = ''; } continue; } } // WF: Adding product permalink. if ('product_page_url' == $column) { $product_page_url = ''; if (!empty($product->ID)) { $product_page_url = get_permalink($product->ID); } if (!empty($product->post_parent)) { $product_page_url = get_permalink($product->post_parent); } $row[$column] = !empty($product_page_url) ? $product_page_url : ''; continue; } /** * WPML */ if (apply_filters('wpml_setting', false, 'setup_complete')) { if (in_array($column, array('wpml:language_code', 'wpml:original_product_id', 'wpml:original_product_sku'))) { if ('wpml:language_code' == $column) { $original_post_language_info = Wt_Import_Export_For_Woo_Basic_Common_Helper::wt_get_wpml_original_post_language_info($product->ID); $row[$column] = (isset($original_post_language_info->language_code) && !empty($original_post_language_info->language_code) ? $original_post_language_info->language_code : ''); continue; } /* * To get the ID of the original product post * https://wpml.org/forums/topic/translated-product-get-id-of-original-lang-for-custom-fields/ */ global $sitepress; $original_product_id = icl_object_id($product->ID, 'product', false, $sitepress->get_default_language()); if ('wpml:original_product_id' == $column) { $row[$column] = ($original_product_id ? $original_product_id : ''); continue; } if ('wpml:original_product_sku' == $column) { $sku = get_post_meta($original_product_id, '_sku', true); $row[$column] = ($sku ? $sku : ''); continue; } } } // handling default meta and other columns if (isset($product->meta->$column)) { if (in_array($column, array('_children', 'children', '_upsell_ids','_crosssell_ids'))) { if ($this->export_children_sku) { $children_sku = ''; $children_id_array = str_replace('"', '', explode('|', trim($product->meta->$column, '[' . ']'))); if (!empty($children_id_array) && $children_id_array[0] != '""') { foreach ($children_id_array as $children_id_array_key => $children_id) { $children_sku = !empty($children_sku) ? "{$children_sku}|" . get_post_meta($children_id, '_sku', TRUE) : get_post_meta($children_id, '_sku', TRUE); } } $row[$column] = !empty($children_sku) ? $children_sku : ''; } else { $row[$column] = str_replace('"', '', implode('|', explode(',', trim($product->meta->$column, '[' . ']')))); } } elseif ('_stock_status' == $column) { $stock_status = self::format_data($product->meta->$column); $product_type = ( WC()->version < '3.0' ) ? $product_object->product_type : $product_object->get_type(); $row[$column] = !empty($stock_status) ? $stock_status : ( ( 'variable' == $product_type || 'variable-subscription' == $product_type ) ? '' : 'instock' ); } elseif(('_sku' == $column || 'sku' == $column)) { $row[$column] = $product->meta->$column; }elseif('stock' === $column && 'null' === $product->meta->$column){ $row[$column] = "" ; }else{ $row[$column] = self::format_data($product->meta->$column); } } elseif (isset($product->$column) && !is_array($product->$column)) { if ($this->export_shortcodes && ( 'post_content' == $column || 'post_excerpt' == $column )) { //Convert Shortcodes to html for Description and Short Description $row[$column] = do_shortcode($product->$column); } elseif ('post_title' === $column) { $row[$column] = sanitize_text_field($product->$column); } else { $row[$column] = self::format_data($product->$column); } } else { $row[$column] = ''; } } } return apply_filters('wt_batch_product_export_row_data', $row, $product); } /** * Format the data if required * @param string $meta_value * @param string $meta name of meta key * @return string */ public static function format_export_meta($meta_value, $meta,$product_object=false) { switch ($meta) { case 'sale_price_dates_from' : case '_sale_price_dates_from' : if($product_object){ $sale_price_dates_from_timestamp = $product_object->get_date_on_sale_from( 'edit' ) ? $product_object->get_date_on_sale_from( 'edit' )->getOffsetTimestamp() : false; $sale_price_dates_from = $sale_price_dates_from_timestamp ? date_i18n( 'Y-m-d', $sale_price_dates_from_timestamp ) : ''; return $sale_price_dates_from; } break; case 'sale_price_dates_to' : case '_sale_price_dates_to' : if($product_object){ $sale_price_dates_to_timestamp = $product_object->get_date_on_sale_to( 'edit' ) ? $product_object->get_date_on_sale_to( 'edit' )->getOffsetTimestamp() : false; $sale_price_dates_to = $sale_price_dates_to_timestamp ? date_i18n( 'Y-m-d', $sale_price_dates_to_timestamp ) : ''; return $sale_price_dates_to; } break; case '_upsell_ids' : case '_crosssell_ids' : case 'upsell_ids' : case 'crosssell_ids' : return implode('|', array_filter((array) json_decode($meta_value))); break; default : return $meta_value; break; } } public static function format_data($data) { if (!is_array($data)) $data = (string) rawurldecode($data); // $enc = mb_detect_encoding($data, 'UTF-8, ISO-8859-1', true); $keep_encoding = apply_filters('wt_iew_exporter_keep_encoding', true); $use_mb = function_exists('mb_detect_encoding'); if ($use_mb && $keep_encoding) { $enc = mb_detect_encoding($data, 'UTF-8, ISO-8859-1', true); if('UTF-8' !== $enc){ $data = utf8_encode( $data ); } } return $data; } } }