Product Feed PRO for WooCommerce - Version 9.6.5

Version Description

Do not add Skroutz variable products to the feed when they do not have item_group_id's

Download this release

Release Info

Developer jorisverwater
Plugin Icon 128x128 Product Feed PRO for WooCommerce
Version 9.6.5
Comparing to
See all releases

Code changes from version 9.3.7 to 9.6.5

TODO.txt CHANGED
@@ -5,18 +5,18 @@ Tutorial / Blog posts:
5
  - Explain all the different fields/attributes that can be selected from the drop-downs
6
 
7
  Priority issues:
 
8
  - License key input field needs to be a password field (asterixes)
 
9
  - Add a preview option so only 5-10 products are being generated
10
  - Own hosted plugin updating: https://rudrastyh.com/wordpress/self-hosted-plugin-update.html
11
  - Google local product feed inventory in XML format (not just TXT like it is now)
12
  - Add support for Multisites
13
  - Add a filter on review score (and amount of reviews)
14
  - Make extra woosea fields available for front-end usage
15
- - Only update feed when changes to products have been made
16
  - Add header to extra fields on product edit pages
17
  - Add possibility to create OR rules
18
  - Add support for Google My Business product feeds
19
- - Build a better WP Cron check, current one is not good enough
20
  - AMAZON integration:
21
  - requires a professional seller account, 39 dollar a month, before being able to create a developer account
22
  - only than we can use their MWS service needed to connect our plugin
5
  - Explain all the different fields/attributes that can be selected from the drop-downs
6
 
7
  Priority issues:
8
+ - Add Pinterest Tag; https://help.pinterest.com/nl/business/article/install-the-pinterest-tag
9
  - License key input field needs to be a password field (asterixes)
10
+ - A seperate FB pixel per WPML website / language
11
  - Add a preview option so only 5-10 products are being generated
12
  - Own hosted plugin updating: https://rudrastyh.com/wordpress/self-hosted-plugin-update.html
13
  - Google local product feed inventory in XML format (not just TXT like it is now)
14
  - Add support for Multisites
15
  - Add a filter on review score (and amount of reviews)
16
  - Make extra woosea fields available for front-end usage
 
17
  - Add header to extra fields on product edit pages
18
  - Add possibility to create OR rules
19
  - Add support for Google My Business product feeds
 
20
  - AMAZON integration:
21
  - requires a professional seller account, 39 dollar a month, before being able to create a developer account
22
  - only than we can use their MWS service needed to connect our plugin
classes/channels/class-google_local_products.php CHANGED
@@ -12,8 +12,8 @@ class WooSEA_google_local_products {
12
  $google_local_products = array(
13
  "Local products fields" => array(
14
  "Itemid" => array(
15
- "name" => "Itemid",
16
- "feed_name" => "g:itemid",
17
  "format" => "required",
18
  "woo_suggest" => "id",
19
  ),
12
  $google_local_products = array(
13
  "Local products fields" => array(
14
  "Itemid" => array(
15
+ "name" => "Id",
16
+ "feed_name" => "g:id",
17
  "format" => "required",
18
  "woo_suggest" => "id",
19
  ),
classes/channels/class-google_shopping.php CHANGED
@@ -356,6 +356,11 @@ class WooSEA_google_shopping {
356
  "feed_name" => "g:max_handling_time",
357
  "format" => "optional",
358
  ),
 
 
 
 
 
359
  ),
360
  "Tax" => array(
361
  "Tax" => array(
356
  "feed_name" => "g:max_handling_time",
357
  "format" => "optional",
358
  ),
359
+ "Ships from country" => array(
360
+ "name" => "ships_from_country",
361
+ "feed_name" => "g:ships_from_country",
362
+ "format" => "optional",
363
+ ),
364
  ),
365
  "Tax" => array(
366
  "Tax" => array(
classes/class-activate.php CHANGED
@@ -1112,6 +1112,13 @@ class WooSEA_Activation {
1112
  "taxonomy" => "none",
1113
  "utm_source" => "Tweakers.nl",
1114
  "type" => "Comparison shopping engine" ),
 
 
 
 
 
 
 
1115
  "Fashionchick.nl" => array (
1116
  "channel_hash" => md5("Fashionchick.nl"),
1117
  "name" => "Fashionchick.nl",
1112
  "taxonomy" => "none",
1113
  "utm_source" => "Tweakers.nl",
1114
  "type" => "Comparison shopping engine" ),
1115
+ "Boetiek.nl" => array (
1116
+ "channel_hash" => md5("Boetiek.nl"),
1117
+ "name" => "Boetiek.nl",
1118
+ "fields" => "boetiek",
1119
+ "taxonomy" => "none",
1120
+ "utm_source" => "Boetiek.nl",
1121
+ "type" => "Comparison shopping engine" ),
1122
  "Fashionchick.nl" => array (
1123
  "channel_hash" => md5("Fashionchick.nl"),
1124
  "name" => "Fashionchick.nl",
classes/class-attributes.php CHANGED
@@ -48,7 +48,7 @@ private function get_dynamic_attributes(){
48
  global $wpdb;
49
  $list = array();
50
 
51
- $no_taxonomies = array("portfolio_category","portfolio_skills","portfolio_tags","nav_menu","post_format","slide-page","element_category","template_category","portfolio_category","portfolio_skills","portfolio_tags","faq_category","slide-page","yst_prominent_words","category","post_tag","nav_menu","link_category","post_format","product_type","product_visibility","product_cat","product_shipping_class","product_tag");
52
  $taxonomies = get_taxonomies();
53
  $diff_taxonomies = array_diff($taxonomies, $no_taxonomies);
54
 
@@ -208,10 +208,13 @@ public function get_mapping_attributes_dropdown() {
208
  "mother_title" => "Product name parent product",
209
  "title_hyphen" => "Product name hyphen",
210
  "title_lc" => "Product name lowercase",
 
211
  "description" => "Product description",
212
  "short_description" => "Product short description",
213
  "raw_description" => "Unfiltered product description",
214
  "raw_short_description" => "Unfiltered product short description",
 
 
215
  "price" => "Price",
216
  "regular_price" => "Regular price",
217
  "sale_price" => "Sale price",
@@ -247,7 +250,7 @@ public function get_mapping_attributes_dropdown() {
247
  "category_path" => "Category path",
248
  "category_path_short" => "Category path short",
249
  "category_path_skroutz" => "Category path Skroutz",
250
- "one_category" => "Primary category",
251
  "condition" => "Condition",
252
  "availability" => "Availability",
253
  "quantity" => "Quantity [Stock]",
@@ -267,7 +270,8 @@ public function get_mapping_attributes_dropdown() {
267
  "length" => "Length",
268
  "shipping" => "Shipping",
269
  "shipping_price" => "Shipping cost",
270
- "shipping_label" => "Shipping label",
 
271
  "visibility" => "Visibility",
272
  "rating_total" => "Total rating",
273
  "rating_average" => "Average rating",
@@ -350,9 +354,10 @@ public function get_mapping_attributes_dropdown() {
350
 
351
  foreach ($custom_attributes as $key => $value) {
352
  if (!preg_match("/pyre|sbg|fusion/i",$value)){
353
- if (strpos($value, 0, 1) !== "_") {
 
354
  $dropdown .= "<option value='$key'>" . ucfirst($value) . "</option>";
355
- }
356
  }
357
  }
358
 
@@ -402,11 +407,14 @@ public function get_mapping_attributes_dropdown() {
402
  "mother_title" => "Product name parent product",
403
  "title_hyphen" => "Product name hyphen",
404
  "title_lc" => "Product name lowercase",
 
405
  "description" => "Product description",
406
  "short_description" => "Product short description",
407
  "raw_description" => "Unfiltered product description",
408
  "raw_short_description" => "Unfiltered product short description",
409
- "link" => "Link",
 
 
410
  "variable_link" => "Product variable link",
411
  "add_to_cart_link" => "Add to cart link",
412
  "image" => "Main image",
@@ -429,7 +437,7 @@ public function get_mapping_attributes_dropdown() {
429
  "category_path" => "Category path",
430
  "category_path_short" => "Category path short",
431
  "category_path_skroutz" => "Category path Skroutz",
432
- "one_category" => "Primary category",
433
  "condition" => "Condition",
434
  "availability" => "Availability",
435
  "quantity" => "Quantity [Stock]",
@@ -464,7 +472,8 @@ public function get_mapping_attributes_dropdown() {
464
  "length" => "Length",
465
  "shipping" => "Shipping",
466
  "shipping_price" => "Shipping cost",
467
- "shipping_label" => "Shipping label",
 
468
  "visibility" => "Visibility",
469
  "rating_total" => "Total rating",
470
  "rating_average" => "Average rating",
48
  global $wpdb;
49
  $list = array();
50
 
51
+ $no_taxonomies = array("portfolio_category","portfolio_skills","portfolio_tags","nav_menu","post_format","slide-page","element_category","template_category","portfolio_category","portfolio_skills","portfolio_tags","faq_category","slide-page","category","post_tag","nav_menu","link_category","post_format","product_type","product_visibility","product_cat","product_shipping_class","product_tag");
52
  $taxonomies = get_taxonomies();
53
  $diff_taxonomies = array_diff($taxonomies, $no_taxonomies);
54
 
208
  "mother_title" => "Product name parent product",
209
  "title_hyphen" => "Product name hyphen",
210
  "title_lc" => "Product name lowercase",
211
+ "title_lcw" => "Product name uppercase first characters",
212
  "description" => "Product description",
213
  "short_description" => "Product short description",
214
  "raw_description" => "Unfiltered product description",
215
  "raw_short_description" => "Unfiltered product short description",
216
+ "mother_description" => "Product description parent product",
217
+ "mother_short_description" => "Product short description parent product",
218
  "price" => "Price",
219
  "regular_price" => "Regular price",
220
  "sale_price" => "Sale price",
250
  "category_path" => "Category path",
251
  "category_path_short" => "Category path short",
252
  "category_path_skroutz" => "Category path Skroutz",
253
+ "one_category" => "Yoast primary category",
254
  "condition" => "Condition",
255
  "availability" => "Availability",
256
  "quantity" => "Quantity [Stock]",
270
  "length" => "Length",
271
  "shipping" => "Shipping",
272
  "shipping_price" => "Shipping cost",
273
+ "shipping_label" => "Shipping class slug",
274
+ "shipping_label_name" => "Shipping class name",
275
  "visibility" => "Visibility",
276
  "rating_total" => "Total rating",
277
  "rating_average" => "Average rating",
354
 
355
  foreach ($custom_attributes as $key => $value) {
356
  if (!preg_match("/pyre|sbg|fusion/i",$value)){
357
+ $value = ltrim($value);
358
+ if (!empty($value)){
359
  $dropdown .= "<option value='$key'>" . ucfirst($value) . "</option>";
360
+ }
361
  }
362
  }
363
 
407
  "mother_title" => "Product name parent product",
408
  "title_hyphen" => "Product name hyphen",
409
  "title_lc" => "Product name lowercase",
410
+ "title_lcw" => "Product name uppercase first characters",
411
  "description" => "Product description",
412
  "short_description" => "Product short description",
413
  "raw_description" => "Unfiltered product description",
414
  "raw_short_description" => "Unfiltered product short description",
415
+ "mother_description" => "Product description parent product",
416
+ "mother_short_description" => "Product short description parent product",
417
+ "link" => "Link",
418
  "variable_link" => "Product variable link",
419
  "add_to_cart_link" => "Add to cart link",
420
  "image" => "Main image",
437
  "category_path" => "Category path",
438
  "category_path_short" => "Category path short",
439
  "category_path_skroutz" => "Category path Skroutz",
440
+ "one_category" => "Yoast primary category",
441
  "condition" => "Condition",
442
  "availability" => "Availability",
443
  "quantity" => "Quantity [Stock]",
472
  "length" => "Length",
473
  "shipping" => "Shipping",
474
  "shipping_price" => "Shipping cost",
475
+ "shipping_label" => "Shipping class slug",
476
+ "shipping_label_name" => "Shipping class name",
477
  "visibility" => "Visibility",
478
  "rating_total" => "Total rating",
479
  "rating_average" => "Average rating",
classes/class-get-products.php CHANGED
@@ -26,7 +26,6 @@ class WooSEA_Get_Products {
26
  return "<![CDATA[ $string ]]>";
27
  }
28
 
29
-
30
  /**
31
  * Check if a plugin is active
32
  */
@@ -57,6 +56,11 @@ class WooSEA_Get_Products {
57
  * Get all approved product review comments for Google's Product Review Feeds
58
  */
59
  public function woosea_get_reviews ( $product_data, $product ) {
 
 
 
 
 
60
  $approved_reviews = array();
61
  $prod_id = $product_data['id'];
62
 
@@ -84,8 +88,10 @@ class WooSEA_Get_Products {
84
  $cnt = 0;
85
  $name = "";
86
  foreach($name_pieces as $n_piece){
 
 
87
  if($cnt > 0){
88
- $n_piece = substr($n_piece, 0, 1);
89
  }
90
  $name .= $n_piece." ";
91
  $cnt++;
@@ -96,7 +102,7 @@ class WooSEA_Get_Products {
96
  $review['reviewer_name'] = html_entity_decode((str_replace("\r", "", $review['reviewer_name'])), ENT_QUOTES | ENT_XML1, 'UTF-8');
97
  $review['reviewer_name'] = preg_replace( '/\[(.*?)\]/', ' ', $review['reviewer_name'] );
98
  $review['reviewer_name'] = str_replace("&#xa0;", "", $review['reviewer_name']);
99
- $review['reviewer_name'] = $this->woosea_utf8_for_xml( $review['reviewer_name'] );
100
 
101
  $review['reviewer_id'] = $review_raw->user_id;
102
  $review['review_timestamp'] = $review_raw->comment_date;
@@ -931,6 +937,16 @@ class WooSEA_Get_Products {
931
  unset($shipping_cost);
932
  }
933
  }
 
 
 
 
 
 
 
 
 
 
934
  }
935
 
936
  if(isset($zone_details)){
@@ -957,12 +973,9 @@ class WooSEA_Get_Products {
957
  $zone_details['price'] = trim($shipping_cost);
958
  }
959
  } else {
960
- // $shipping_cost = 0;
961
  if(isset($shipping_cost)){
962
  $zone_details['price'] = trim($currency." ".$shipping_cost);
963
  }
964
- //unset($zone_details);
965
- //unset($shipping_cost);
966
  }
967
  }
968
  }
@@ -992,12 +1005,19 @@ class WooSEA_Get_Products {
992
 
993
  // Remove other shipping classes when free shipping is relevant
994
  $free_check = "yes";
995
- //$free_check = get_option ('free_shipping');
996
 
997
  if(in_array($free_check, array_column($shipping_arr, 'free'))) { // search value in the array
998
  foreach($shipping_arr as $k => $v) {
999
  if(!in_array($free_check, $v)){
1000
- unset($shipping_arr[$k]);
 
 
 
 
 
 
 
 
1001
  }
1002
  }
1003
  }
@@ -1005,8 +1025,6 @@ class WooSEA_Get_Products {
1005
  // Fix empty services
1006
  foreach($shipping_arr as $k => $v){
1007
  if(empty($v['service'])){
1008
- // $lalala = get_option( 'woocommerce_default_country' );
1009
- // $shipping_arr[$k]['country'] = get_option( 'woocommerce_default_country' );
1010
  unset($shipping_arr[$k]);
1011
  }
1012
  }
@@ -1145,16 +1163,19 @@ class WooSEA_Get_Products {
1145
  } elseif (preg_match("/g:product_detail/i",$k)){
1146
  if(!empty($v)){
1147
  $product_detail_split = explode("#", $v);
1148
- $product_detail = $product->addChild('g:product_detail', '', $namespace['g']);
1149
- $name = str_replace("_", " ", $product_detail_split[0]);
1150
-
1151
- $section_name = explode(":", $name);
1152
- $section_name_start = ucfirst($section_name[0]);
1153
- $name = ucfirst(trim($section_name[1]));
1154
-
1155
- $section_name = $product_detail->addChild('g:section_name', "General", $namespace['g']);
1156
- $product_detail_name = $product_detail->addChild('g:attribute_name', $section_name_start, $namespace['g']);
1157
- $product_detail_value = $product_detail->addChild('g:attribute_value', $product_detail_split[1], $namespace['g']);
 
 
 
1158
  }
1159
  } elseif ($k == "g:installment"){
1160
  if(!empty($v)){
@@ -1993,7 +2014,7 @@ class WooSEA_Get_Products {
1993
  $xml_piece = "";
1994
 
1995
  // Get taxonomies
1996
- $no_taxonomies = array("element_category","template_category","portfolio_category","portfolio_skills","portfolio_tags","faq_category","slide-page","yst_prominent_words","category","post_tag","nav_menu","link_category","post_format","product_type","product_visibility","product_cat","product_shipping_class","product_tag");
1997
  $taxonomies = get_taxonomies();
1998
  $diff_taxonomies = array_diff($taxonomies, $no_taxonomies);
1999
 
@@ -2325,6 +2346,10 @@ class WooSEA_Get_Products {
2325
  $product_data['raw_description'] = substr($product_data['raw_description'], 0, 5000);
2326
  $product_data['raw_short_description'] = substr($product_data['raw_short_description'], 0, 5000);
2327
 
 
 
 
 
2328
  /**
2329
  * Check of we need to add Google Analytics UTM parameters
2330
  */
@@ -2439,6 +2464,10 @@ class WooSEA_Get_Products {
2439
  }
2440
 
2441
  $product_data['shipping_label'] = $product->get_shipping_class();
 
 
 
 
2442
 
2443
  // Get product prices
2444
  $product_data['price'] = wc_get_price_including_tax($product, array('price'=> $product->get_price()));
@@ -2485,6 +2514,7 @@ class WooSEA_Get_Products {
2485
  if($product->get_type() == "bundle"){
2486
  if ($this->woosea_is_plugin_active('woocommerce-product-bundles/woocommerce-product-bundles.php')){
2487
  $product_data['price'] = get_post_meta($product_data['id'], '_price', true);
 
2488
  if(is_numeric($tax_rates[1]['rate'])){
2489
  $product_data['price_forced'] = round(get_post_meta($product_data['id'], '_price', true) * (100+$tax_rates[1]['rate'])/100,2);
2490
  $product_data['regular_price'] = round(get_post_meta($product_data['id'], '_regular_price', true) * (100+$tax_rates[1]['rate'])/100,2);
@@ -2582,6 +2612,7 @@ class WooSEA_Get_Products {
2582
  $discount = apply_filters('advanced_woo_discount_rules_get_product_discount_price_from_custom_price', false, $product, 1, $product_data['sale_price'], 'discounted_price', true, true);
2583
  if($discount !== false){
2584
  $product_data['sale_price'] = $discount;
 
2585
  $price_incl_tax = get_option( 'woocommerce_prices_include_tax' );
2586
  if($price_incl_tax == "yes"){
2587
  $product_data['price_forced'] = $product_data['price']*($fullrate/100);
@@ -2742,7 +2773,7 @@ class WooSEA_Get_Products {
2742
  }
2743
  }
2744
 
2745
- if ((array_key_exists('shipping', $project_config['attributes'])) OR (array_key_exists('shipping_price', $project_config['attributes'])) OR ($project_config['fields'] == "trovaprezzi")){
2746
  $product_data['shipping'] = $this->woosea_get_shipping_cost($class_cost_id, $project_config, $product_data['price'], $tax_rates, $shipping_zones, $product_data['id'], $product_data['item_group_id']);
2747
  $shipping_str = $product_data['shipping'];
2748
  }
@@ -2838,7 +2869,7 @@ class WooSEA_Get_Products {
2838
 
2839
  foreach($diff_taxonomies as $taxo){
2840
  $term_value = get_the_terms($product_data['id'], $taxo);
2841
- $product_data[$taxo] = "";
2842
 
2843
  if(is_array($term_value)){
2844
  // Do not add variation values to the feed when they are out of stock
@@ -2848,7 +2879,7 @@ class WooSEA_Get_Products {
2848
  $variations = $product_skroutz->get_available_variations();
2849
  $variations_id = wp_list_pluck( $variations, 'variation_id' );
2850
  $skroutz_att_array = array();
2851
-
2852
  foreach($variations_id as $var_id){
2853
  $stock_value = get_post_meta( $var_id, "_stock_status", true );
2854
  if($stock_value == "instock"){
@@ -2862,7 +2893,6 @@ class WooSEA_Get_Products {
2862
  $product_data[$taxo] = rtrim($product_data[$taxo],',');
2863
  }
2864
  }
2865
-
2866
  foreach($skroutz_att_array as $skrtz_value){
2867
  $product_data[$taxo] .= ",". $skrtz_value;
2868
  }
@@ -2977,7 +3007,7 @@ class WooSEA_Get_Products {
2977
  $data = $wpdb->get_results($sql);
2978
  if (count($data)) {
2979
  foreach ($data as $key => $value) {
2980
- $value_display = str_replace("_", " ",$value->name);
2981
  if (preg_match("/_product_attributes/i",$value->name)){
2982
  $product_attr = unserialize($value->type);
2983
  if(!empty($product_attr)){
@@ -2995,14 +3025,14 @@ class WooSEA_Get_Products {
2995
 
2996
  /**
2997
  * Get Product Attributes for Single products
 
2998
  */
2999
- if (($product->is_type('simple')) OR ($product->is_type('external')) OR ($product->is_type('mix-and-match')) OR ($product->is_type('bundle')) OR ($product->is_type('composite')) OR ($product->is_type('auction') OR ($product->is_type('subscription')))){
3000
  $single_attributes = $product->get_attributes();
3001
-
3002
  foreach ($single_attributes as $attribute){
3003
- $attr_name = strtolower($attribute->get_name());
3004
- $attr_value = $product->get_attribute($attr_name);
3005
- $product_data[$attr_name] = $attr_value;
3006
  }
3007
  }
3008
 
@@ -3028,9 +3058,9 @@ class WooSEA_Get_Products {
3028
  $product_variations = new WC_Product_Variation( $product_data['id'] );
3029
  $variations = $product_variations->get_variation_attributes();
3030
 
3031
- // For Skroutz apparal products we can only append colours to the product name
3032
  // When a product has both a size and color attribute we assume its an apparal product
3033
- if($project_config['fields'] == "skroutz"){
3034
  $size_found = "no";
3035
  $color_found = "no";
3036
 
@@ -3106,8 +3136,6 @@ class WooSEA_Get_Products {
3106
  }
3107
  }
3108
 
3109
-
3110
-
3111
  if((isset($project_config['lowest_price_variations'])) OR (isset($project_config['default_variations']))){
3112
 
3113
  // Determine the default variation product
@@ -3260,19 +3288,21 @@ class WooSEA_Get_Products {
3260
  /**
3261
  * Although this is a product variation we also need to grap the Dynamic attributes belonging to the simple mother prodict
3262
  */
 
 
3263
  foreach($diff_taxonomies as $taxo){
3264
  $term_value = get_the_terms($product_data['item_group_id'], $taxo);
3265
  unset($product_data[$taxo]);
3266
  if(is_array($term_value)){
3267
  foreach($term_value as $term){
3268
  if(empty($product_data[$taxo])){
3269
- $product_data[$taxo] = $term->name;
3270
  } else {
3271
- $product_data[$taxo] .= " ".$term->name;
3272
  }
3273
  }
3274
  }
3275
- }
3276
 
3277
  /**
3278
  * Add product tags to the product data array
@@ -3440,6 +3470,8 @@ class WooSEA_Get_Products {
3440
  * we will add CDATA brackets to the title and description attributes
3441
  */
3442
  $product_data['title_lc'] = ucfirst(strtolower($product_data['title']));
 
 
3443
  //$product_data['description'] = $this->woosea_append_cdata ( $product_data['description'] );
3444
  //$product_data['short_description'] = $this->woosea_append_cdata ( $product_data['short_description'] );
3445
 
@@ -3448,6 +3480,17 @@ class WooSEA_Get_Products {
3448
  */
3449
  $product_data['reviews'] = $this->woosea_get_reviews( $product_data, $product );
3450
 
 
 
 
 
 
 
 
 
 
 
 
3451
  /**
3452
  * Check if individual products need to be excluded
3453
  */
@@ -3513,16 +3556,19 @@ class WooSEA_Get_Products {
3513
  // For these channels parent products are allowed
3514
  $allowed_channel_parents = array(
3515
  "skroutz",
 
3516
  "google_dsa",
3517
  "google_product_review",
3518
  );
3519
 
3520
- if (!in_array($project_config['fields'], $allowed_channel_parents)){
3521
- if(($product->is_type('variable')) AND ($product_data['item_group_id'] == 0)){
3522
- $product_data = array();
3523
- $product_data = null;
3524
- }
3525
- }
 
 
3526
 
3527
  /**
3528
  * Remove variation products that are not THE default variation product
@@ -3549,6 +3595,49 @@ class WooSEA_Get_Products {
3549
  }
3550
  }
3551
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3552
  /**
3553
  * When product has passed the filter rules it can continue with the rest
3554
  */
@@ -4404,479 +4493,482 @@ class WooSEA_Get_Products {
4404
  return $product_data;
4405
  }
4406
 
4407
- /**
4408
- * Execute project rules
4409
- */
4410
  private function woocommerce_sea_rules( $project_rules2, $product_data ){
4411
- $aantal_prods = count($product_data);
4412
- if($aantal_prods > 0){
4413
 
4414
- foreach ($project_rules2 as $pr_key => $pr_array){
4415
 
4416
- foreach ($product_data as $pd_key => $pd_value){
4417
 
4418
- // Check is there is a rule on specific attributes
4419
- if($pd_key == $pr_array['attribute']){
4420
 
4421
- // This is because for data manipulation the than attribute is empty
4422
- if(!array_key_exists('than_attribute', $pr_array)){
4423
- $pr_array['than_attribute'] = $pd_key;
4424
- }
4425
 
4426
  // Check if a rule has been set for Google categories
4427
  if (!empty($product_data['categories']) AND ($pr_array['than_attribute'] == "google_category") AND ($product_data[$pr_array['attribute']] == $pr_array['criteria'])){
4428
-
4429
- $pr_array['than_attribute'] = "categories";
4430
  $category_id = explode("-", $pr_array['newvalue']);
4431
  $pr_array['newvalue'] = $category_id[0];
4432
- $product_data['categories'] = $pr_array['newvalue'];
4433
- }
4434
 
4435
- // Make sure that rules on numerics are on true numerics
4436
- if (!is_array($pd_value) AND (!preg_match('/[A-Za-z]/', $pd_value))){
4437
- $pd_value = strtr($pd_value, ',', '.');
4438
- }
4439
 
4440
 
4441
- // Make sure the price or sale price is numeric
4442
- if(($pr_array['attribute'] == "sale_price") OR ($pr_array['attribute'] == "price")){
4443
- settype($pd_value, "double");
4444
- }
4445
 
4446
- if (((is_numeric($pd_value)) AND ($pr_array['than_attribute'] != "shipping"))){
4447
 
4448
- // Rules for numeric values
4449
- switch ($pr_array['condition']) {
4450
- case($pr_array['condition'] = "contains"):
4451
- if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
4452
- $product_data[$pr_array['than_attribute']] = str_replace($pr_array['criteria'], $pr_array['newvalue'], $pd_value);
4453
- }
4454
- break;
4455
- case($pr_array['condition'] = "containsnot"):
4456
- if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
4457
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4458
- }
4459
- break;
4460
- case($pr_array['condition'] = "="):
4461
- if (($pd_value == $pr_array['criteria'])){
4462
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4463
- }
4464
- break;
4465
- case($pr_array['condition'] = "!="):
4466
- if (($pd_value != $pr_array['criteria'])){
4467
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4468
- }
4469
- break;
4470
- case($pr_array['condition'] = ">"):
4471
- if (($pd_value > $pr_array['criteria'])){
4472
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4473
- }
4474
- break;
4475
- case($pr_array['condition'] = ">="):
4476
- if (($pd_value >= $pr_array['criteria'])){
4477
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4478
- }
4479
- break;
4480
- case($pr_array['condition'] = "<"):
4481
- if (($pd_value < $pr_array['criteria'])){
4482
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4483
- }
4484
- break;
4485
- case($pr_array['condition'] = "=<"):
4486
- if (($pd_value <= $pr_array['criteria'])){
4487
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4488
- }
4489
- break;
4490
- case($pr_array['condition'] = "empty"):
4491
- if(empty($product_data[$pr_array['attribute']])){
4492
- if ((strlen($pd_value) < 1)){
4493
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4494
- } else {
4495
- $product_data[$pr_array['attribute']] = $product_data[$pr_array['than_attribute']];
4496
- }
4497
- }
4498
- break;
4499
- case($pr_array['condition'] = "multiply"):
4500
- $pr_array['criteria'] = strtr($pr_array['criteria'], ',', '.');
4501
- $convert_back = "false";
4502
- $pos = strpos($pd_value, ',');
4503
- if($pos !== false){
4504
- $convert_back = "true";
4505
- }
4506
- $pd_value = strtr($pd_value, ',', '.');
4507
- $newvalue = $pd_value*$pr_array['criteria'];
4508
- $newvalue = round($newvalue, 2);
4509
- if($convert_back == "true"){
4510
- $newvalue = strtr($newvalue, '.',',');
4511
- }
4512
- $product_data[$pr_array['attribute']] = $newvalue;
4513
- break;
4514
- case($pr_array['condition'] = "divide"):
4515
- $newvalue = ($pd_value / $pr_array['criteria']);
4516
- $newvalue = round($newvalue, 2);
4517
- $newvalue = strtr($newvalue, '.',',');
4518
- $product_data[$pr_array['attribute']] = $newvalue;
4519
- break;
4520
- case($pr_array['condition'] = "plus"):
4521
- $newvalue = ($pd_value + $pr_array['criteria']);
4522
- $product_data[$pr_array['attribute']] = $newvalue;
4523
- break;
4524
- case($pr_array['condition'] = "minus"):
4525
- $newvalue = ($pd_value - $pr_array['criteria']);
4526
- $product_data[$pr_array['attribute']] = $newvalue;
4527
- break;
4528
- case($pr_array['condition'] = "findreplace"):
4529
- if (strpos($pd_value, $pr_array['criteria']) !== false){
4530
  // Make sure that a new value has been set
4531
- if(!empty($pr_array['newvalue'])){
4532
- // Find and replace only work on same attribute field, otherwise create a contains rule
4533
  if($pr_array['attribute'] == $pr_array['than_attribute']){
4534
  $newvalue = str_replace($pr_array['criteria'],$pr_array['newvalue'], $pd_value);
4535
  $product_data[$pr_array['than_attribute']] = ucfirst($newvalue);
4536
  }
4537
- }
4538
- }
4539
- break;
4540
- default:
4541
- break;
4542
- }
4543
- } elseif (is_array($pd_value)) {
4544
-
4545
- // For now only shipping details are in an array
4546
- foreach ($pd_value as $k => $v){
4547
- if(is_array($v)){
4548
- foreach ($v as $kk => $vv){
4549
- // Only shipping detail rule can be on price for now
4550
- if($kk == "price"){
4551
- switch ($pr_array['condition']) {
4552
- case($pr_array['condition'] = "contains"):
4553
- if ((preg_match('/'.$pr_array['criteria'].'/', $vv))){
4554
- $pd_value[$k]['price'] = str_replace($pr_array['criteria'], $pr_array['newvalue'], $vv);
4555
- $product_data[$pr_array['than_attribute']] = $pd_value;
4556
- }
4557
- break;
4558
- case($pr_array['condition'] = "containsnot"):
4559
- if ((!preg_match('/'.$pr_array['criteria'].'/', $vv))){
4560
- $pd_value[$k]['price'] = $pr_array['newvalue'];
4561
- $product_data[$pr_array['than_attribute']] = $pd_value;
4562
- }
4563
- break;
4564
- case($pr_array['condition'] = "="):
4565
- if (($vv == $pr_array['criteria'])){
4566
- $pd_value[$k]['price'] = $pr_array['newvalue'];
4567
- $product_data[$pr_array['than_attribute']] = $pd_value;
4568
- }
4569
- break;
4570
- case($pr_array['condition'] = "!="):
4571
- if (($vv != $pr_array['criteria'])){
4572
- $pd_value[$k]['price'] = $pr_array['newvalue'];
4573
- $product_data[$pr_array['than_attribute']] = $pd_value;
4574
- }
4575
- break;
4576
- case($pr_array['condition'] = ">"):
4577
- if (($vv > $pr_array['criteria'])){
4578
- $pd_value[$k]['price'] = $pr_array['newvalue'];
4579
- $product_data[$pr_array['than_attribute']] = $pd_value;
4580
- }
4581
- break;
4582
- case($pr_array['condition'] = ">="):
4583
- if (($vv >= $pr_array['criteria'])){
4584
- $pd_value[$k]['price'] = $pr_array['newvalue'];
4585
- $product_data[$pr_array['than_attribute']] = $pd_value;
4586
- }
4587
- break;
4588
- case($pr_array['condition'] = "<"):
4589
- if (($vv < $pr_array['criteria'])){
4590
- $pd_value[$k]['price'] = $pr_array['newvalue'];
4591
- $product_data[$pr_array['than_attribute']] = $pd_value;
4592
- }
4593
- break;
4594
- case($pr_array['condition'] = "=<"):
4595
- if (($vv <= $pr_array['criteria'])){
4596
- $pd_value[$k]['price'] = $pr_array['newvalue'];
4597
- $product_data[$pr_array['than_attribute']] = $pd_value;
4598
- }
4599
- break;
4600
- case($pr_array['condition'] = "empty"):
4601
- if ((strlen($vv) < 1)){
4602
- $pd_value[$k]['price'] = $pr_array['newvalue'];
4603
- $product_data[$pr_array['than_attribute']] = $pd_value;
4604
- }
4605
- break;
4606
- case($pr_array['condition'] = "multiply"):
4607
- // Only shipping array
4608
- if(is_array($pd_value)){
4609
- $pr_array['criteria'] = strtr($pr_array['criteria'], ',', '.');
4610
- foreach ($pd_value as $ship_a_key => $shipping_arr){
4611
- foreach($shipping_arr as $ship_key => $ship_value){
4612
- if($ship_key == "price"){
4613
- $ship_pieces = explode(" ", $ship_value);
4614
- $pd_value = strtr($ship_pieces[1], ',', '.');
4615
- $newvalue = $pd_value*$pr_array['criteria'];
4616
- $newvalue = round($newvalue, 2);
4617
- $newvalue = strtr($newvalue, '.',',');
4618
- $newvalue = $ship_pieces[0]." ".$newvalue;
4619
- $product_data[$pr_array['than_attribute']][$ship_a_key]['price'] = $newvalue;
4620
- }
4621
- }
4622
- }
4623
- }
4624
- break;
4625
- default:
4626
- break;
4627
- }
4628
- }
4629
- }
4630
- } else {
4631
- // Rules on product tags
4632
- foreach ($pd_value as $k => $v){
4633
-
4634
- // Rules for string values
4635
- if (!array_key_exists('cs', $pr_array)){
4636
- $v = strtolower($v);
4637
- $pr_array['criteria'] = strtolower($pr_array['criteria']);
4638
- }
4639
-
4640
- switch ($pr_array['condition']) {
4641
- case($pr_array['condition'] = "contains"):
4642
- if ((preg_match('/'.$pr_array['criteria'].'/', $v))){
4643
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4644
- }
4645
- break;
4646
- case($pr_array['condition'] = "containsnot"):
4647
- if ((!preg_match('/'.$pr_array['criteria'].'/', $v))){
4648
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4649
- }
4650
- break;
4651
- case($pr_array['condition'] = "="):
4652
- if (($v == $pr_array['criteria'])){
4653
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4654
- }
4655
- break;
4656
- case($pr_array['condition'] = "!="):
4657
- if (($v != $pr_array['criteria'])){
4658
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4659
- }
4660
- break;
4661
- case($pr_array['condition'] = ">"):
4662
- if (($v > $pr_array['criteria'])){
4663
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4664
- }
4665
- break;
4666
- case($pr_array['condition'] = ">="):
4667
- if (($v >= $pr_array['criteria'])){
4668
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4669
- }
4670
- break;
4671
- case($pr_array['condition'] = "<"):
4672
- if (($v < $pr_array['criteria'])){
4673
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4674
- }
4675
- break;
4676
- case($pr_array['condition'] = "=<"):
4677
- if (($v <= $pr_array['criteria'])){
4678
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4679
- }
4680
- break;
4681
- case($pr_array['condition'] = "empty"):
4682
- if ((strlen($v) < 1)){
4683
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4684
- }
4685
- break;
4686
- case($pr_array['condition'] = "multiply"):
4687
- // Only shipping array
4688
- if(is_array($v)){
4689
- $pr_array['criteria'] = strtr($pr_array['criteria'], ',', '.');
4690
- foreach ($v as $ship_a_key => $shipping_arr){
4691
- foreach($shipping_arr as $ship_key => $ship_value){
4692
- if($ship_key == "price"){
4693
- $ship_pieces = explode(" ", $ship_value);
4694
- $pd_value = strtr($ship_pieces[1], ',', '.');
4695
- $newvalue = $pd_value*$pr_array['criteria'];
4696
- $newvalue = round($newvalue, 2);
4697
- $newvalue = strtr($newvalue, '.',',');
4698
- $newvalue = $ship_pieces[0]." ".$newvalue;
4699
- $product_data[$pr_array['than_attribute']][$ship_a_key]['price'] = $newvalue;
4700
- }
4701
- }
4702
- }
4703
- }
4704
- break;
4705
- default:
4706
- break;
4707
- }
4708
- }
4709
- }
4710
- }
4711
- } else {
4712
- // Rules for string values
4713
  if (!array_key_exists('cs', $pr_array)){
4714
- $pd_value = strtolower($pd_value);
4715
- $pr_array['criteria'] = strtolower($pr_array['criteria']);
4716
- }
4717
-
4718
- switch ($pr_array['condition']) {
4719
- case($pr_array['condition'] = "contains"):
4720
- if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
4721
- // Specifically for shipping price rules
4722
- if(!empty($product_data[$pr_array['than_attribute']])){
4723
- if(is_array($product_data[$pr_array['than_attribute']])){
4724
- $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4725
- for ($x = 0; $x <= $arr_size; $x++) {
4726
- $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4727
- }
4728
- } else {
4729
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4730
- }
4731
- } else {
4732
- // This attribute value is empty for this product
4733
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4734
- }
4735
- }
4736
- break;
4737
- case($pr_array['condition'] = "containsnot"):
4738
- if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
4739
- // Specifically for shipping price rules
4740
- if(is_array($product_data[$pr_array['than_attribute']])){
4741
- $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4742
- for ($x = 0; $x <= $arr_size; $x++) {
4743
- $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4744
- }
4745
- } else {
4746
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4747
- }
4748
- }
4749
- break;
4750
- case($pr_array['condition'] = "="):
4751
- if (($pr_array['criteria'] == "$pd_value")){
4752
- // Specifically for shipping price rules
4753
- if(is_array($product_data[$pr_array['than_attribute']])){
4754
- $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4755
- for ($x = 0; $x <= $arr_size; $x++) {
4756
- $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4757
- }
4758
- } else {
4759
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4760
- }
4761
- }
4762
- $ship = $product_data['shipping'];
4763
- break;
4764
- case($pr_array['condition'] = "!="):
4765
- if (($pr_array['criteria'] != "$pd_value")){
4766
- // Specifically for shipping price rules
4767
- if(is_array($product_data[$pr_array['than_attribute']])){
4768
- $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4769
- for ($x = 0; $x <= $arr_size; $x++) {
4770
- $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4771
- }
4772
- } else {
4773
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4774
- }
4775
- }
4776
- break;
4777
- case($pr_array['condition'] = ">"):
4778
- // Use a lexical order on relational string operators
4779
- if (($pd_value > $pr_array['criteria'])){
4780
- // Specifically for shipping price rules
4781
- if(is_array($product_data[$pr_array['than_attribute']])){
4782
- $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4783
- for ($x = 0; $x <= $arr_size; $x++) {
4784
- $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4785
- }
4786
- } else {
4787
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4788
- }
4789
- }
4790
- break;
4791
- case($pr_array['condition'] = ">="):
4792
- // Use a lexical order on relational string operators
4793
- if (($pd_value >= $pr_array['criteria'])){
4794
- // Specifically for shipping price rules
4795
- if(is_array($product_data[$pr_array['than_attribute']])){
4796
- $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4797
- for ($x = 0; $x <= $arr_size; $x++) {
4798
- $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4799
- }
4800
- } else {
4801
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4802
- }
4803
- }
4804
- break;
4805
- case($pr_array['condition'] = "<"):
4806
- // Use a lexical order on relational string operators
4807
- if (($pd_value < $pr_array['criteria'])){
4808
- // Specifically for shipping price rules
4809
- if(isset($product_data[$pr_array['than_attribute']]) AND (is_array($product_data[$pr_array['than_attribute']]))){
4810
- $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4811
- for ($x = 0; $x <= $arr_size; $x++) {
4812
- $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4813
- }
4814
- } else {
4815
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4816
- }
4817
- }
4818
- break;
4819
- case($pr_array['condition'] = "=<"):
4820
- // Use a lexical order on relational string operators
4821
- if (($pd_value <= $pr_array['criteria'])){
4822
- // Specifically for shipping price rules
4823
- if(is_array($product_data[$pr_array['than_attribute']])){
4824
- $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4825
- for ($x = 0; $x <= $arr_size; $x++) {
4826
- $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4827
- }
4828
- } else {
4829
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4830
- }
4831
- }
4832
- break;
4833
 
4834
- case($pr_array['condition'] = "empty"):
4835
- if(empty($product_data[$pr_array['attribute']])){
4836
- if(empty($product_data[$pr_array['than_attribute']])){
4837
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4838
- } else {
4839
- $product_data[$pr_array['attribute']] = $product_data[$pr_array['than_attribute']];
4840
- }
4841
- }
4842
- break;
4843
- case($pr_array['condition'] = "replace"):
4844
- $product_data[$pr_array['than_attribute']] = str_replace($pr_array['criteria'], $pr_array['newvalue'], $product_data[$pr_array['than_attribute']]);
4845
- break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4846
  case($pr_array['condition'] = "findreplace"):
4847
  if (strpos($pd_value, $pr_array['criteria']) !== false){
4848
- // Make sure that a new value has been set
4849
- if(!empty($pr_array['newvalue'])){
4850
- // Find and replace only work on same attribute field, otherwise create a contains rule
4851
  if($pr_array['attribute'] == $pr_array['than_attribute']){
4852
- $newvalue = str_replace($pr_array['criteria'],$pr_array['newvalue'], $pd_value);
4853
- $product_data[$pr_array['than_attribute']] = ucfirst($newvalue);
4854
- }
4855
- }
4856
- }
 
4857
  break;
4858
- default:
4859
- break;
4860
- }
4861
- }
4862
- } else {
4863
- // When a rule has been set on an attribute that is not in product_data
4864
- // Add the newvalue to product_data
4865
- if (!array_key_exists($pr_array['attribute'], $product_data)){
4866
- if(!empty($pr_array['newvalue'])){
4867
- $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4868
- } else {
4869
- if(array_key_exists($pr_array['than_attribute'], $product_data)){
4870
- $product_data[$pr_array['attribute']] = $product_data[$pr_array['than_attribute']];
4871
- }
4872
- }
4873
- }
4874
- }
4875
- }
4876
- }
4877
- }
4878
- return $product_data;
4879
- }
4880
 
4881
  /**
4882
  * Function to exclude products based on individual product exclusions
@@ -4899,525 +4991,530 @@ class WooSEA_Get_Products {
4899
  }
4900
  }
4901
 
4902
- /**
4903
- * Execute project filters (include / exclude)
4904
- */
 
4905
  private function woocommerce_sea_filters( $project_rules, $product_data ){
4906
- $allowed = 1;
4907
 
4908
- // Check if product was already excluded from the feed
4909
- $product_excluded = ucfirst( get_post_meta( $product_data['id'], '_woosea_exclude_product', true ) );
4910
 
4911
- if( $product_excluded == "Yes"){
4912
- $allowed = 0;
4913
- }
4914
 
4915
- foreach ($project_rules as $pr_key => $pr_array){
4916
 
4917
- if($pr_array['attribute'] == "categories"){
4918
- $pr_array['attribute'] = "raw_categories";
4919
- }
4920
 
4921
- //if(array_key_exists($pr_array['attribute'], $product_data)){
4922
 
4923
- if(!array_key_exists($pr_array['attribute'], $product_data)) {
4924
- $product_data[$pr_array['attribute']] = ""; // Sets an empty postmeta value in place of a missing one.
4925
- }
4926
 
4927
- foreach ($product_data as $pd_key => $pd_value){
4928
- // Check is there is a rule on specific attributes
 
4929
 
4930
- if(in_array($pd_key, $pr_array, TRUE)){
 
 
 
4931
 
4932
- if($pd_key == "price"){
4933
- //$pd_value = @number_format($pd_value,2);
4934
- $pd_value = wc_format_decimal($pd_value);
4935
- }
4936
-
4937
- if (is_numeric($pd_value)){
4938
- $old_value = $pd_value;
4939
- if($pd_key == "price"){
4940
- $pd_value = @number_format($pd_value,2);
4941
- }
4942
-
4943
- // Rules for numeric values
4944
- switch ($pr_array['condition']) {
4945
- case($pr_array['condition'] = "contains"):
4946
- if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
4947
- $allowed = 0;
4948
- } elseif ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
4949
- $allowed = 0;
4950
- }
4951
- break;
4952
- case($pr_array['condition'] = "containsnot"):
4953
- if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
4954
- $allowed = 0;
4955
- } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
4956
- $allowed = 0;
4957
- }
4958
- break;
4959
  case($pr_array['condition'] = "="):
4960
- if (($old_value == $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
4961
- $allowed = 0;
4962
- } elseif (($old_value != $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
4963
- $allowed = 0;
4964
- }
4965
- break;
4966
- case($pr_array['condition'] = "!="):
4967
- if (($old_value == $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
4968
- if($allowed <> 0){
4969
- $allowed = 1;
4970
- }
4971
- } elseif (($old_value == $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
4972
- $allowed = 0;
4973
- }
4974
- break;
4975
- case($pr_array['condition'] = ">"):
4976
- if (($old_value > $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
4977
- $allowed = 0;
4978
- } elseif (($old_value <= $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
4979
- $allowed = 0;
4980
- }
4981
- break;
4982
- case($pr_array['condition'] = ">="):
4983
- if (($old_value >= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
4984
- $allowed = 0;
4985
- } elseif (($old_value < $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
4986
- $allowed = 0;
4987
- }
4988
- break;
4989
- case($pr_array['condition'] = "<"):
4990
- if (($old_value < $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
4991
- $allowed = 0;
4992
- } elseif (($old_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
4993
- $allowed = 0;
4994
- }
4995
- break;
4996
- case($pr_array['condition'] = "=<"):
4997
- if (($old_value <= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
4998
- $allowed = 0;
4999
- } elseif (($old_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5000
- $allowed = 0;
5001
- }
5002
- break;
5003
- case($pr_array['condition'] = "empty"):
5004
- if ((strlen($pd_value) < 1) && ($pr_array['than'] == "exclude")){
5005
- $allowed = 0;
5006
- } elseif ((strlen($pd_value > 0)) && ($pr_array['than'] == "include_only")){
5007
- $allowed = 0;
5008
- }
5009
- break;
5010
- default:
5011
- break;
5012
- }
5013
- } elseif (is_array($pd_value)){
5014
- // Tis can either be a shipping or product_tag array
5015
- if($pr_array['attribute'] == "product_tag"){
5016
- $in_tag_array = "not";
5017
-
5018
- foreach($pd_value as $pt_key => $pt_value){
5019
- // Rules for string values
5020
- if (!array_key_exists('cs', $pr_array)){
5021
- $pt_value = strtolower($pt_value);
5022
- $pr_array['criteria'] = strtolower($pr_array['criteria']);
5023
- }
5024
-
5025
- if(preg_match('/'.$pr_array['criteria'].'/', $pt_value)){
5026
- $in_tag_array = "yes";
5027
  }
5028
- }
5029
-
5030
- if($in_tag_array == "yes"){
5031
- //if(in_array($pr_array['criteria'], $pd_value, TRUE)) {
5032
- $v = $pr_array['criteria'];
5033
-
5034
- switch ($pr_array['condition']) {
5035
- case($pr_array['condition'] = "contains"):
5036
- if ((preg_match('/'.$pr_array['criteria'].'/', $v))){
5037
- if($pr_array['than'] == "include_only"){
5038
- if($allowed <> 0){
5039
- $allowed = 1;
5040
- }
5041
- } else {
5042
- $allowed = 0;
5043
- }
5044
- } else {
5045
- $allowed = 0;
5046
- }
5047
- break;
5048
- case($pr_array['condition'] = "containsnot"):
5049
- if ((!preg_match('/'.$pr_array['criteria'].'/', $v))){
5050
- if($pr_array['than'] == "include_only"){
5051
- if($allowed <> 0){
5052
- $allowed = 1;
5053
- }
5054
- } else {
5055
- $allowed = 0;
5056
- }
5057
- } else {
5058
- $allowed = 0;
5059
- }
5060
- break;
5061
- case($pr_array['condition'] = "="):
5062
- if (($v == $pr_array['criteria'])){
5063
- if($pr_array['than'] == "include_only"){
5064
- if($allowed <> 0){
5065
- $allowed = 1;
5066
- }
5067
- } else {
5068
- $allowed = 0;
5069
- }
5070
- } else {
5071
- $allowed = 0;
5072
- }
5073
- break;
5074
- case($pr_array['condition'] = "!="):
5075
- if (($v != $pr_array['criteria'])){
5076
- if($pr_array['than'] == "include_only"){
5077
- if($allowed <> 0){
5078
- $allowed = 1;
5079
- }
5080
- } else {
5081
- $allowed = 0;
5082
- }
5083
- }
5084
- break;
5085
- case($pr_array['condition'] = ">"):
5086
- if (($v > $pr_array['criteria'])){
5087
- if($pr_array['than'] == "include_only"){
5088
- if($allowed <> 0){
5089
- $allowed = 1;
5090
- }
5091
- } else {
5092
- $allowed = 0;
5093
- }
5094
- }
5095
- break;
5096
- case($pr_array['condition'] = ">="):
5097
- if (($v >= $pr_array['criteria'])){
5098
- if($pr_array['than'] == "include_only"){
5099
- if($allowed <> 0){
5100
- $allowed = 1;
5101
- }
5102
- } else {
5103
- $allowed = 0;
5104
- }
5105
- }
5106
- break;
5107
- case($pr_array['condition'] = "<"):
5108
- if (($v < $pr_array['criteria'])){
5109
- if($pr_array['than'] == "include_only"){
5110
- if($allowed <> 0){
5111
- $allowed = 1;
5112
- }
5113
- } else {
5114
- $allowed = 0;
5115
- }
5116
- }
5117
- break;
5118
- case($pr_array['condition'] = "=<"):
5119
- if (($v <= $pr_array['criteria'])){
5120
- if($pr_array['than'] == "include_only"){
5121
- if($allowed <> 0){
5122
- $allowed = 1;
5123
- }
5124
- } else {
5125
- $allowed = 0;
5126
- }
5127
- }
5128
- break;
5129
- case($pr_array['condition'] = "empty"):
5130
- if (strlen($v) < 1){
5131
- if($pr_array['than'] == "include_only"){
5132
- if($allowed <> 0){
5133
- $allowed = 1;
5134
- }
5135
- } else {
5136
- $allowed = 0;
5137
- }
5138
- }
5139
- break;
5140
- default:
5141
- break;
5142
- }
5143
- } else {
5144
- switch ($pr_array['condition']) {
5145
- case($pr_array['condition'] = "contains"):
5146
- if($pr_array['than'] == "include_only"){
5147
- $allowed = 0;
5148
- } else {
5149
- if($allowed <> 0){
5150
- $allowed = 1;
5151
- }
5152
- }
5153
- break;
5154
- case($pr_array['condition'] = "containsnot"):
5155
- if($pr_array['than'] == "include_only"){
5156
- if($allowed <> 0){
5157
- $allowed = 1;
5158
- }
5159
- } else {
5160
- $allowed = 0;
5161
- }
5162
- break;
5163
- case($pr_array['condition'] = "="):
5164
- if($pr_array['than'] == "include_only"){
5165
- $allowed = 0;
5166
- } else {
5167
- if($allowed <> 0){
5168
- $allowed = 1;
5169
- }
5170
- }
5171
- break;
5172
- case($pr_array['condition'] = "!="):
5173
- if($pr_array['than'] == "include_only"){
5174
- if($allowed <> 0){
5175
- $allowed = 1;
5176
- }
5177
- } else {
5178
- $allowed = 0;
5179
- }
5180
- break;
5181
- case($pr_array['condition'] = ">"):
5182
- if($pr_array['than'] == "include_only"){
5183
- $allowed = 0;
5184
- } else {
5185
- $allowed = 0;
5186
- }
5187
- break;
5188
- case($pr_array['condition'] = ">="):
5189
- if($pr_array['than'] == "include_only"){
5190
- $allowed = 0;
5191
- } else {
5192
- $allowed = 0;
5193
- }
5194
- break;
5195
- case($pr_array['condition'] = "<"):
5196
- if($pr_array['than'] == "include_only"){
5197
- $allowed = 0;
5198
- } else {
5199
- $allowed = 0;
5200
- }
5201
- break;
5202
- case($pr_array['condition'] = "=<"):
5203
- if($pr_array['than'] == "include_only"){
5204
- $allowed = 0;
5205
- } else {
5206
- $allowed = 0;
5207
- }
5208
- break;
5209
- case($pr_array['condition'] = "empty"):
5210
- if($pr_array['than'] == "include_only"){
5211
- if($allowed <> 0){
5212
- $allowed = 1;
5213
- }
5214
- } else {
5215
- $allowed = 0;
5216
- }
5217
- break;
5218
- default:
5219
- break;
5220
- }
5221
- }
5222
- } else {
5223
- // For now only shipping details are in an array
5224
- foreach ($pd_value as $k => $v){
5225
- foreach ($v as $kk => $vv){
5226
- // Only shipping detail rule can be on price for now
5227
- if($kk == "price"){
5228
- switch ($pr_array['condition']) {
5229
- case($pr_array['condition'] = "contains"):
5230
- if ((preg_match('/'.$pr_array['criteria'].'/', $vv))){
5231
- $allowed = 0;
5232
- }
5233
- break;
5234
- case($pr_array['condition'] = "containsnot"):
5235
- if ((!preg_match('/'.$pr_array['criteria'].'/', $vv))){
5236
- $allowed = 0;
5237
- }
5238
- break;
5239
- case($pr_array['condition'] = "="):
5240
- if (($vv == $pr_array['criteria'])){
5241
- $allowed = 0;
5242
- }
5243
- break;
5244
- case($pr_array['condition'] = "!="):
5245
- if (($vv != $pr_array['criteria'])){
5246
- $allowed = 0;
5247
- }
5248
- break;
5249
- case($pr_array['condition'] = ">"):
5250
- if (($vv > $pr_array['criteria'])){
5251
- $allowed = 0;
5252
- }
5253
- break;
5254
- case($pr_array['condition'] = ">="):
5255
- if (($vv >= $pr_array['criteria'])){
5256
- $allowed = 0;
5257
- }
5258
- break;
5259
- case($pr_array['condition'] = "<"):
5260
- if (($vv < $pr_array['criteria'])){
5261
- $allowed = 0;
5262
- }
5263
- break;
5264
- case($pr_array['condition'] = "=<"):
5265
- if (($vv <= $pr_array['criteria'])){
5266
- $allowed = 0;
5267
- }
5268
- break;
5269
- case($pr_array['condition'] = "empty"):
5270
- if (strlen($vv) < 1){
5271
- $allowed = 0;
5272
- }
5273
- break;
5274
- default:
5275
- break;
5276
- }
5277
- }
5278
- }
5279
- }
5280
- }
5281
- } else {
5282
- // Filters for string values
5283
- // If case-sensitve is off than lowercase both the criteria and attribute value
5284
- if (array_key_exists('cs', $pr_array)){
5285
- if ($pr_array['cs'] != "on"){
5286
- $pd_value = strtolower($pd_value);
5287
- $pr_array['criteria'] = strtolower($pr_array['criteria']);
5288
- }
5289
- }
5290
- $pos = strpos($pd_value, '&amp;');
5291
- $pos_slash = strpos($pr_array['criteria'], '\\');
5292
- if($pos !== false){
5293
- $pd_value = str_replace("&amp;","&",$pd_value);
5294
- }
5295
- if($pos_slash !== false){
5296
- $pr_array['criteria'] = str_replace("\\","",$pr_array['criteria']);
5297
- }
5298
 
5299
- switch ($pr_array['condition']) {
5300
- case($pr_array['condition'] = "contains"):
5301
- if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5302
- $allowed = 0;
5303
- } elseif ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5304
- $allowed = 0;
5305
- } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5306
- if($allowed <> 0){
5307
- $allowed = 1;
5308
- }
5309
- }
5310
- break;
5311
- case($pr_array['condition'] = "containsnot"):
5312
- if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5313
- $allowed = 0;
5314
- } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5315
- $allowed = 0;
5316
- }
5317
- break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5318
  case($pr_array['condition'] = "="):
5319
- if (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "exclude")){
5320
- $allowed = 0;
5321
- } elseif (($pr_array['criteria'] != "$pd_value") && ($pr_array['than'] == "include_only")){
5322
- $found = strpos($pd_value,$pr_array['criteria']);
5323
- if ($found !== false) {
5324
- //for category mapping check if its an array
5325
- if($pr_array['attribute'] == "raw_categories"){
5326
- $raw_cats_arr = explode("||",$pd_value);
5327
- if(is_array($raw_cats_arr)){
5328
- if(in_array($pr_array['criteria'],$raw_cats_arr, TRUE)){
5329
- if($allowed <> 0){
5330
- $allowed = 1;
5331
- }
5332
- } else {
5333
- $allowed = 0;
5334
- }
5335
- }
5336
- } else {
5337
- if($allowed <> 0){
5338
- $allowed = 1;
5339
- }
5340
- }
5341
- } else {
5342
- $allowed = 0;
5343
- }
5344
- } elseif (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "include_only")){
5345
- if($allowed <> 0){
5346
- $allowed = 1;
5347
- }
5348
- } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5349
- $allowed = 0;
5350
- } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5351
- $allowed = 1;
5352
- }
5353
- break;
5354
- case($pr_array['condition'] = "!="):
5355
- if (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "exclude")){
5356
- if($allowed <> 0){
5357
- $allowed = 1;
5358
- }
5359
- } elseif (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "include_only")){
5360
- $allowed = 0;
5361
- } elseif (($pr_array['criteria'] != "$pd_value") && ($pr_array['than'] == "exclude")){
5362
- $allowed = 0;
5363
- }
5364
- break;
5365
- case($pr_array['condition'] = ">"):
5366
- // Use a lexical order on relational string operators
5367
- if (($pd_value > $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5368
- $allowed = 0;
5369
- } elseif (($pd_value < $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5370
- $allowed = 0;
5371
- }
5372
- break;
5373
- case($pr_array['condition'] = ">="):
5374
- // Use a lexical order on relational string operators
5375
- if (($pd_value >= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5376
- $allowed = 0;
5377
- } elseif (($pd_value < $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5378
  $allowed = 0;
5379
- }
5380
- break;
5381
- case($pr_array['condition'] = "<"):
5382
- // Use a lexical order on relational string operators
5383
- if (($pd_value < $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5384
- $allowed = 0;
5385
- } elseif (($pd_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5386
- $allowed = 0;
5387
- }
5388
- break;
5389
- case($pr_array['condition'] = "=<"):
5390
- // Use a lexical order on relational string operators
5391
- if (($pd_value <= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5392
- $allowed = 0;
5393
- } elseif (($pd_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5394
- $allowed = 0;
5395
- }
5396
- break;
5397
- case($pr_array['condition'] = "empty"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5398
  if ((strlen($pd_value) < 1) && ($pr_array['than'] == "exclude")){
5399
- $allowed = 0;
5400
- } elseif ((strlen($pd_value) > 0) && ($pr_array['than'] == "exclude")){
5401
- if($allowed <> 0){
5402
- $allowed = 1;
5403
- }
5404
- } elseif ((strlen($pd_value) > 0) && ($pr_array['than'] == "include_only")){
5405
- $allowed = 0;
5406
- }
5407
- break;
5408
- default:
5409
- break;
5410
- }
5411
- }
5412
- }
5413
- }
5414
- }
5415
 
5416
- if ($allowed < 1){
5417
- $product_data = array();
5418
- $product_data = null;
5419
- } else {
5420
- return $product_data;
5421
- }
5422
- }
5423
  }
26
  return "<![CDATA[ $string ]]>";
27
  }
28
 
 
29
  /**
30
  * Check if a plugin is active
31
  */
56
  * Get all approved product review comments for Google's Product Review Feeds
57
  */
58
  public function woosea_get_reviews ( $product_data, $product ) {
59
+ // Rwviews for the parent variable product itself can be skipped, the review is added for the variation
60
+ if($product_data['product_type'] == "variable"){
61
+ return;
62
+ }
63
+
64
  $approved_reviews = array();
65
  $prod_id = $product_data['id'];
66
 
88
  $cnt = 0;
89
  $name = "";
90
  foreach($name_pieces as $n_piece){
91
+ $n_piece = str_replace("&amp;", "", $n_piece);
92
+
93
  if($cnt > 0){
94
+ $n_piece = ucfirst(substr($n_piece, 0, 1));
95
  }
96
  $name .= $n_piece." ";
97
  $cnt++;
102
  $review['reviewer_name'] = html_entity_decode((str_replace("\r", "", $review['reviewer_name'])), ENT_QUOTES | ENT_XML1, 'UTF-8');
103
  $review['reviewer_name'] = preg_replace( '/\[(.*?)\]/', ' ', $review['reviewer_name'] );
104
  $review['reviewer_name'] = str_replace("&#xa0;", "", $review['reviewer_name']);
105
+ $review['reviewer_name'] = $this->woosea_utf8_for_xml( $review['reviewer_name'] );
106
 
107
  $review['reviewer_id'] = $review_raw->user_id;
108
  $review['review_timestamp'] = $review_raw->comment_date;
937
  unset($shipping_cost);
938
  }
939
  }
940
+
941
+ // User do not want to have free shipping in their feed
942
+ $remove_free_shipping = "no";
943
+ $remove_free_shipping = get_option ('remove_free_shipping');
944
+
945
+ if($remove_free_shipping == "yes"){
946
+ unset($zone_details['service']);
947
+ unset($zone_details['price']);
948
+ unset($shipping_cost);
949
+ }
950
  }
951
 
952
  if(isset($zone_details)){
973
  $zone_details['price'] = trim($shipping_cost);
974
  }
975
  } else {
 
976
  if(isset($shipping_cost)){
977
  $zone_details['price'] = trim($currency." ".$shipping_cost);
978
  }
 
 
979
  }
980
  }
981
  }
1005
 
1006
  // Remove other shipping classes when free shipping is relevant
1007
  $free_check = "yes";
 
1008
 
1009
  if(in_array($free_check, array_column($shipping_arr, 'free'))) { // search value in the array
1010
  foreach($shipping_arr as $k => $v) {
1011
  if(!in_array($free_check, $v)){
1012
+
1013
+ // User do not want to have free shipping in their feed
1014
+ // Only remove the other shipping classes when free shipping is not being removed
1015
+ $remove_free_shipping = "no";
1016
+ $remove_free_shipping = get_option ('remove_free_shipping');
1017
+
1018
+ if($remove_free_shipping == "no"){
1019
+ unset($shipping_arr[$k]);
1020
+ }
1021
  }
1022
  }
1023
  }
1025
  // Fix empty services
1026
  foreach($shipping_arr as $k => $v){
1027
  if(empty($v['service'])){
 
 
1028
  unset($shipping_arr[$k]);
1029
  }
1030
  }
1163
  } elseif (preg_match("/g:product_detail/i",$k)){
1164
  if(!empty($v)){
1165
  $product_detail_split = explode("#", $v);
1166
+ $detail_complete = count($product_detail_split);
1167
+ if($detail_complete == 2){
1168
+ $product_detail = $product->addChild('g:product_detail', '', $namespace['g']);
1169
+ $name = str_replace("_", " ", $product_detail_split[0]);
1170
+
1171
+ $section_name = explode(":", $name);
1172
+ $section_name_start = ucfirst($section_name[0]);
1173
+ $name = ucfirst(trim($section_name[1]));
1174
+
1175
+ $section_name = $product_detail->addChild('g:section_name', "General", $namespace['g']);
1176
+ $product_detail_name = $product_detail->addChild('g:attribute_name', $section_name_start, $namespace['g']);
1177
+ $product_detail_value = $product_detail->addChild('g:attribute_value', $product_detail_split[1], $namespace['g']);
1178
+ }
1179
  }
1180
  } elseif ($k == "g:installment"){
1181
  if(!empty($v)){
2014
  $xml_piece = "";
2015
 
2016
  // Get taxonomies
2017
+ $no_taxonomies = array("element_category","template_category","portfolio_category","portfolio_skills","portfolio_tags","faq_category","slide-page","category","post_tag","nav_menu","link_category","post_format","product_type","product_visibility","product_cat","product_shipping_class","product_tag");
2018
  $taxonomies = get_taxonomies();
2019
  $diff_taxonomies = array_diff($taxonomies, $no_taxonomies);
2020
 
2346
  $product_data['raw_description'] = substr($product_data['raw_description'], 0, 5000);
2347
  $product_data['raw_short_description'] = substr($product_data['raw_short_description'], 0, 5000);
2348
 
2349
+ // Parent variable description
2350
+ $product_data['mother_description'] = $product_data['description'];
2351
+ $product_data['mother_short_description'] = $product_data['short_description'];
2352
+
2353
  /**
2354
  * Check of we need to add Google Analytics UTM parameters
2355
  */
2464
  }
2465
 
2466
  $product_data['shipping_label'] = $product->get_shipping_class();
2467
+ $term = get_term_by( 'slug', $product->get_shipping_class(), 'product_shipping_class' );
2468
+ if(is_object($term)){
2469
+ $product_data['shipping_label_name'] = $term->name;
2470
+ }
2471
 
2472
  // Get product prices
2473
  $product_data['price'] = wc_get_price_including_tax($product, array('price'=> $product->get_price()));
2514
  if($product->get_type() == "bundle"){
2515
  if ($this->woosea_is_plugin_active('woocommerce-product-bundles/woocommerce-product-bundles.php')){
2516
  $product_data['price'] = get_post_meta($product_data['id'], '_price', true);
2517
+ $product_data['sale_price'] = get_post_meta($product_data['id'], '_sale_price', true);
2518
  if(is_numeric($tax_rates[1]['rate'])){
2519
  $product_data['price_forced'] = round(get_post_meta($product_data['id'], '_price', true) * (100+$tax_rates[1]['rate'])/100,2);
2520
  $product_data['regular_price'] = round(get_post_meta($product_data['id'], '_regular_price', true) * (100+$tax_rates[1]['rate'])/100,2);
2612
  $discount = apply_filters('advanced_woo_discount_rules_get_product_discount_price_from_custom_price', false, $product, 1, $product_data['sale_price'], 'discounted_price', true, true);
2613
  if($discount !== false){
2614
  $product_data['sale_price'] = $discount;
2615
+ $product_data['price'] = $discount;
2616
  $price_incl_tax = get_option( 'woocommerce_prices_include_tax' );
2617
  if($price_incl_tax == "yes"){
2618
  $product_data['price_forced'] = $product_data['price']*($fullrate/100);
2773
  }
2774
  }
2775
 
2776
+ if ((array_key_exists('shipping', $project_config['attributes'])) OR (array_key_exists('shipping_price', $project_config['attributes'])) OR ($project_config['fields'] == "trovaprezzi") OR ($project_config['fields'] == "customfeed")){
2777
  $product_data['shipping'] = $this->woosea_get_shipping_cost($class_cost_id, $project_config, $product_data['price'], $tax_rates, $shipping_zones, $product_data['id'], $product_data['item_group_id']);
2778
  $shipping_str = $product_data['shipping'];
2779
  }
2869
 
2870
  foreach($diff_taxonomies as $taxo){
2871
  $term_value = get_the_terms($product_data['id'], $taxo);
2872
+ $product_data["$taxo"] = "";
2873
 
2874
  if(is_array($term_value)){
2875
  // Do not add variation values to the feed when they are out of stock
2879
  $variations = $product_skroutz->get_available_variations();
2880
  $variations_id = wp_list_pluck( $variations, 'variation_id' );
2881
  $skroutz_att_array = array();
2882
+
2883
  foreach($variations_id as $var_id){
2884
  $stock_value = get_post_meta( $var_id, "_stock_status", true );
2885
  if($stock_value == "instock"){
2893
  $product_data[$taxo] = rtrim($product_data[$taxo],',');
2894
  }
2895
  }
 
2896
  foreach($skroutz_att_array as $skrtz_value){
2897
  $product_data[$taxo] .= ",". $skrtz_value;
2898
  }
3007
  $data = $wpdb->get_results($sql);
3008
  if (count($data)) {
3009
  foreach ($data as $key => $value) {
3010
+ $value_display = str_replace("_", " ",$value->name);
3011
  if (preg_match("/_product_attributes/i",$value->name)){
3012
  $product_attr = unserialize($value->type);
3013
  if(!empty($product_attr)){
3025
 
3026
  /**
3027
  * Get Product Attributes for Single products
3028
+ * These are the attributes users create themselves in WooCommerce
3029
  */
3030
+ if (($product->is_type('simple')) OR ($product->is_type('external')) OR ($product->is_type('mix-and-match')) OR ($product->is_type('bundle')) OR ($product->is_type('composite')) OR ($product->is_type('auction') OR ($product->is_type('subscription')) OR ($product->is_type('variable')))){
3031
  $single_attributes = $product->get_attributes();
 
3032
  foreach ($single_attributes as $attribute){
3033
+ $attr_name = strtolower($attribute->get_name());
3034
+ $attr_value = $product->get_attribute($attr_name);
3035
+ $product_data[$attr_name] = $attr_value;
3036
  }
3037
  }
3038
 
3058
  $product_variations = new WC_Product_Variation( $product_data['id'] );
3059
  $variations = $product_variations->get_variation_attributes();
3060
 
3061
+ // For Skroutz and Bestprice apparal products we can only append colours to the product name
3062
  // When a product has both a size and color attribute we assume its an apparal product
3063
+ if(($project_config['fields'] == "skroutz") OR ($project_config['fields'] == "bestprice")){
3064
  $size_found = "no";
3065
  $color_found = "no";
3066
 
3136
  }
3137
  }
3138
 
 
 
3139
  if((isset($project_config['lowest_price_variations'])) OR (isset($project_config['default_variations']))){
3140
 
3141
  // Determine the default variation product
3288
  /**
3289
  * Although this is a product variation we also need to grap the Dynamic attributes belonging to the simple mother prodict
3290
  */
3291
+ $stock_value = get_post_meta( $product_data['id'], "_stock_status", true );
3292
+ //if($stock_value == "instock"){
3293
  foreach($diff_taxonomies as $taxo){
3294
  $term_value = get_the_terms($product_data['item_group_id'], $taxo);
3295
  unset($product_data[$taxo]);
3296
  if(is_array($term_value)){
3297
  foreach($term_value as $term){
3298
  if(empty($product_data[$taxo])){
3299
+ $product_data[$taxo] = $term->name;
3300
  } else {
3301
+ $product_data[$taxo] .= " ".$term->name;
3302
  }
3303
  }
3304
  }
3305
+ }
3306
 
3307
  /**
3308
  * Add product tags to the product data array
3470
  * we will add CDATA brackets to the title and description attributes
3471
  */
3472
  $product_data['title_lc'] = ucfirst(strtolower($product_data['title']));
3473
+ $product_data['title_lcw'] = ucwords(strtolower($product_data['title']));
3474
+
3475
  //$product_data['description'] = $this->woosea_append_cdata ( $product_data['description'] );
3476
  //$product_data['short_description'] = $this->woosea_append_cdata ( $product_data['short_description'] );
3477
 
3480
  */
3481
  $product_data['reviews'] = $this->woosea_get_reviews( $product_data, $product );
3482
 
3483
+ /**
3484
+ * Filter out reviews that do not have text
3485
+ */
3486
+ if(!empty($product_data['reviews'])){
3487
+ foreach($product_data['reviews'] as $review_id => $review_details){
3488
+ if(empty($review_details['content'])){
3489
+ unset($product_data['reviews'][$review_id]);
3490
+ }
3491
+ }
3492
+ }
3493
+
3494
  /**
3495
  * Check if individual products need to be excluded
3496
  */
3556
  // For these channels parent products are allowed
3557
  $allowed_channel_parents = array(
3558
  "skroutz",
3559
+ "bestprice",
3560
  "google_dsa",
3561
  "google_product_review",
3562
  );
3563
 
3564
+ if(array_key_exists('fields', $project_config)){
3565
+ if (!in_array($project_config['fields'], $allowed_channel_parents)){
3566
+ if(($product->is_type('variable')) AND ($product_data['item_group_id'] == 0)){
3567
+ $product_data = array();
3568
+ $product_data = null;
3569
+ }
3570
+ }
3571
+ }
3572
 
3573
  /**
3574
  * Remove variation products that are not THE default variation product
3595
  }
3596
  }
3597
 
3598
+ /**
3599
+ * Do final check on Skroutz out of stock sizes
3600
+ * When a size is not on stock remove it
3601
+ */
3602
+ if($project_config['fields'] == "skroutz"){
3603
+ if(isset($product_data['id'])){
3604
+ foreach($project_config['attributes'] as $ky => $vy){
3605
+ if(isset($vy['attribute'])){
3606
+ if($vy['attribute'] == "size"){
3607
+ $size_found = "yes";
3608
+ $sz_attribute = $vy['mapfrom'];
3609
+ }
3610
+ if($vy['attribute'] == "color"){
3611
+ $color_found = "yes";
3612
+ $clr_attribute = $vy['mapfrom'];
3613
+ }
3614
+ }
3615
+ }
3616
+
3617
+ $stock_value = get_post_meta( $product_data['id'], "_stock_status", true );
3618
+ $sz_attr_value = get_post_meta( $product_data['id'], $sz_attribute, true );
3619
+ $clr_attr_value = get_post_meta( $product_data['id'], "attribute_".$clr_attribute, true );
3620
+ if(isset($product_data['item_group_id']) AND ($product_data['item_group_id'] > 0)){
3621
+ $product_skroutz = wc_get_product($product_data['item_group_id']);
3622
+ $variations = $product_skroutz->get_available_variations();
3623
+ $variations_id = wp_list_pluck( $variations, 'variation_id' );
3624
+
3625
+ foreach($variations_id as $var_id){
3626
+ $clr_variation = get_post_meta( $var_id, "attribute_".$clr_attribute, true );
3627
+ $size_variation = get_post_meta( $var_id, "attribute_".$sz_attribute, true );
3628
+ $stock_variation = get_post_meta( $var_id, "_stock_status", true );
3629
+
3630
+ if($clr_variation == $clr_attr_value){
3631
+ if($stock_variation == "outofstock"){
3632
+ // Remove this size as it is not on stock
3633
+ $product_data[$sz_attribute] = str_replace(ucfirst($size_variation),"",$product_data[$sz_attribute]);
3634
+ }
3635
+ }
3636
+ }
3637
+ }
3638
+ }
3639
+ }
3640
+
3641
  /**
3642
  * When product has passed the filter rules it can continue with the rest
3643
  */
4493
  return $product_data;
4494
  }
4495
 
4496
+ /**
4497
+ * Execute project rules
4498
+ */
4499
  private function woocommerce_sea_rules( $project_rules2, $product_data ){
4500
+ $aantal_prods = count($product_data);
4501
+ if($aantal_prods > 0){
4502
 
4503
+ foreach ($project_rules2 as $pr_key => $pr_array){
4504
 
4505
+ foreach ($product_data as $pd_key => $pd_value){
4506
 
4507
+ // Check is there is a rule on specific attributes
4508
+ if($pd_key == $pr_array['attribute']){
4509
 
4510
+ // This is because for data manipulation the than attribute is empty
4511
+ if(!array_key_exists('than_attribute', $pr_array)){
4512
+ $pr_array['than_attribute'] = $pd_key;
4513
+ }
4514
 
4515
  // Check if a rule has been set for Google categories
4516
  if (!empty($product_data['categories']) AND ($pr_array['than_attribute'] == "google_category") AND ($product_data[$pr_array['attribute']] == $pr_array['criteria'])){
4517
+
4518
+ $pr_array['than_attribute'] = "categories";
4519
  $category_id = explode("-", $pr_array['newvalue']);
4520
  $pr_array['newvalue'] = $category_id[0];
4521
+ $product_data['categories'] = $pr_array['newvalue'];
4522
+ }
4523
 
4524
+ // Make sure that rules on numerics are on true numerics
4525
+ if (!is_array($pd_value) AND (!preg_match('/[A-Za-z]/', $pd_value))){
4526
+ $pd_value = strtr($pd_value, ',', '.');
4527
+ }
4528
 
4529
 
4530
+ // Make sure the price or sale price is numeric
4531
+ if(($pr_array['attribute'] == "sale_price") OR ($pr_array['attribute'] == "price")){
4532
+ settype($pd_value, "double");
4533
+ }
4534
 
4535
+ if (((is_numeric($pd_value)) AND ($pr_array['than_attribute'] != "shipping"))){
4536
 
4537
+ // Rules for numeric values
4538
+ switch ($pr_array['condition']) {
4539
+ case($pr_array['condition'] = "contains"):
4540
+ if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
4541
+ $product_data[$pr_array['than_attribute']] = str_replace($pr_array['criteria'], $pr_array['newvalue'], $pd_value);
4542
+ }
4543
+ break;
4544
+ case($pr_array['condition'] = "containsnot"):
4545
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
4546
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4547
+ }
4548
+ break;
4549
+ case($pr_array['condition'] = "="):
4550
+ if (($pd_value == $pr_array['criteria'])){
4551
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4552
+ }
4553
+ break;
4554
+ case($pr_array['condition'] = "!="):
4555
+ if (($pd_value != $pr_array['criteria'])){
4556
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4557
+ }
4558
+ break;
4559
+ case($pr_array['condition'] = ">"):
4560
+ if (($pd_value > $pr_array['criteria'])){
4561
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4562
+ }
4563
+ break;
4564
+ case($pr_array['condition'] = ">="):
4565
+ if (($pd_value >= $pr_array['criteria'])){
4566
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4567
+ }
4568
+ break;
4569
+ case($pr_array['condition'] = "<"):
4570
+ if (($pd_value < $pr_array['criteria'])){
4571
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4572
+ }
4573
+ break;
4574
+ case($pr_array['condition'] = "=<"):
4575
+ if (($pd_value <= $pr_array['criteria'])){
4576
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4577
+ }
4578
+ break;
4579
+ case($pr_array['condition'] = "empty"):
4580
+ if(empty($product_data[$pr_array['attribute']])){
4581
+ if ((strlen($pd_value) < 1)){
4582
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4583
+ } else {
4584
+ $product_data[$pr_array['attribute']] = $product_data[$pr_array['than_attribute']];
4585
+ }
4586
+ }
4587
+ break;
4588
+ case($pr_array['condition'] = "multiply"):
4589
+ $pr_array['criteria'] = strtr($pr_array['criteria'], ',', '.');
4590
+ $convert_back = "false";
4591
+ $pos = strpos($pd_value, ',');
4592
+ if($pos !== false){
4593
+ $convert_back = "true";
4594
+ }
4595
+ $pd_value = strtr($pd_value, ',', '.');
4596
+ $newvalue = $pd_value*$pr_array['criteria'];
4597
+ $newvalue = round($newvalue, 2);
4598
+ if($convert_back == "true"){
4599
+ $newvalue = strtr($newvalue, '.',',');
4600
+ }
4601
+ $product_data[$pr_array['attribute']] = $newvalue;
4602
+ break;
4603
+ case($pr_array['condition'] = "divide"):
4604
+ $newvalue = ($pd_value / $pr_array['criteria']);
4605
+ $newvalue = round($newvalue, 2);
4606
+ $newvalue = strtr($newvalue, '.',',');
4607
+ $product_data[$pr_array['attribute']] = $newvalue;
4608
+ break;
4609
+ case($pr_array['condition'] = "plus"):
4610
+ $newvalue = ($pd_value + $pr_array['criteria']);
4611
+ $product_data[$pr_array['attribute']] = $newvalue;
4612
+ break;
4613
+ case($pr_array['condition'] = "minus"):
4614
+ $newvalue = ($pd_value - $pr_array['criteria']);
4615
+ $product_data[$pr_array['attribute']] = $newvalue;
4616
+ break;
4617
+ case($pr_array['condition'] = "findreplace"):
4618
+ if (strpos($pd_value, $pr_array['criteria']) !== false){
4619
  // Make sure that a new value has been set
4620
+ if(!empty($pr_array['newvalue'])){
4621
+ // Find and replace only work on same attribute field, otherwise create a contains rule
4622
  if($pr_array['attribute'] == $pr_array['than_attribute']){
4623
  $newvalue = str_replace($pr_array['criteria'],$pr_array['newvalue'], $pd_value);
4624
  $product_data[$pr_array['than_attribute']] = ucfirst($newvalue);
4625
  }
4626
+ }
4627
+ }
4628
+ break;
4629
+ default:
4630
+ break;
4631
+ }
4632
+ } elseif (is_array($pd_value)) {
4633
+
4634
+ // For now only shipping details are in an array
4635
+ foreach ($pd_value as $k => $v){
4636
+ if(is_array($v)){
4637
+ foreach ($v as $kk => $vv){
4638
+ // Only shipping detail rule can be on price for now
4639
+ if($kk == "price"){
4640
+ switch ($pr_array['condition']) {
4641
+ case($pr_array['condition'] = "contains"):
4642
+ if ((preg_match('/'.$pr_array['criteria'].'/', $vv))){
4643
+ $pd_value[$k]['price'] = str_replace($pr_array['criteria'], $pr_array['newvalue'], $vv);
4644
+ $product_data[$pr_array['than_attribute']] = $pd_value;
4645
+ }
4646
+ break;
4647
+ case($pr_array['condition'] = "containsnot"):
4648
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $vv))){
4649
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
4650
+ $product_data[$pr_array['than_attribute']] = $pd_value;
4651
+ }
4652
+ break;
4653
+ case($pr_array['condition'] = "="):
4654
+ if (($vv == $pr_array['criteria'])){
4655
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
4656
+ $product_data[$pr_array['than_attribute']] = $pd_value;
4657
+ }
4658
+ break;
4659
+ case($pr_array['condition'] = "!="):
4660
+ if (($vv != $pr_array['criteria'])){
4661
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
4662
+ $product_data[$pr_array['than_attribute']] = $pd_value;
4663
+ }
4664
+ break;
4665
+ case($pr_array['condition'] = ">"):
4666
+ if (($vv > $pr_array['criteria'])){
4667
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
4668
+ $product_data[$pr_array['than_attribute']] = $pd_value;
4669
+ }
4670
+ break;
4671
+ case($pr_array['condition'] = ">="):
4672
+ if (($vv >= $pr_array['criteria'])){
4673
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
4674
+ $product_data[$pr_array['than_attribute']] = $pd_value;
4675
+ }
4676
+ break;
4677
+ case($pr_array['condition'] = "<"):
4678
+ if (($vv < $pr_array['criteria'])){
4679
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
4680
+ $product_data[$pr_array['than_attribute']] = $pd_value;
4681
+ }
4682
+ break;
4683
+ case($pr_array['condition'] = "=<"):
4684
+ if (($vv <= $pr_array['criteria'])){
4685
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
4686
+ $product_data[$pr_array['than_attribute']] = $pd_value;
4687
+ }
4688
+ break;
4689
+ case($pr_array['condition'] = "empty"):
4690
+ if ((strlen($vv) < 1)){
4691
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
4692
+ $product_data[$pr_array['than_attribute']] = $pd_value;
4693
+ }
4694
+ break;
4695
+ case($pr_array['condition'] = "multiply"):
4696
+ // Only shipping array
4697
+ if(is_array($pd_value)){
4698
+ $pr_array['criteria'] = strtr($pr_array['criteria'], ',', '.');
4699
+ foreach ($pd_value as $ship_a_key => $shipping_arr){
4700
+ foreach($shipping_arr as $ship_key => $ship_value){
4701
+ if($ship_key == "price"){
4702
+ $ship_pieces = explode(" ", $ship_value);
4703
+ $pd_value = strtr($ship_pieces[1], ',', '.');
4704
+ $newvalue = $pd_value*$pr_array['criteria'];
4705
+ $newvalue = round($newvalue, 2);
4706
+ $newvalue = strtr($newvalue, '.',',');
4707
+ $newvalue = $ship_pieces[0]." ".$newvalue;
4708
+ $product_data[$pr_array['than_attribute']][$ship_a_key]['price'] = $newvalue;
4709
+ }
4710
+ }
4711
+ }
4712
+ }
4713
+ break;
4714
+ default:
4715
+ break;
4716
+ }
4717
+ }
4718
+ }
4719
+ } else {
4720
+ // Rules on product tags
4721
+ foreach ($pd_value as $k => $v){
4722
+
4723
+ // Rules for string values
4724
+ if (!array_key_exists('cs', $pr_array)){
4725
+ $v = strtolower($v);
4726
+ $pr_array['criteria'] = strtolower($pr_array['criteria']);
4727
+ }
4728
+
4729
+ switch ($pr_array['condition']) {
4730
+ case($pr_array['condition'] = "contains"):
4731
+ if ((preg_match('/'.$pr_array['criteria'].'/', $v))){
4732
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4733
+ }
4734
+ break;
4735
+ case($pr_array['condition'] = "containsnot"):
4736
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $v))){
4737
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4738
+ }
4739
+ break;
4740
+ case($pr_array['condition'] = "="):
4741
+ if (($v == $pr_array['criteria'])){
4742
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4743
+ }
4744
+ break;
4745
+ case($pr_array['condition'] = "!="):
4746
+ if (($v != $pr_array['criteria'])){
4747
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4748
+ }
4749
+ break;
4750
+ case($pr_array['condition'] = ">"):
4751
+ if (($v > $pr_array['criteria'])){
4752
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4753
+ }
4754
+ break;
4755
+ case($pr_array['condition'] = ">="):
4756
+ if (($v >= $pr_array['criteria'])){
4757
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4758
+ }
4759
+ break;
4760
+ case($pr_array['condition'] = "<"):
4761
+ if (($v < $pr_array['criteria'])){
4762
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4763
+ }
4764
+ break;
4765
+ case($pr_array['condition'] = "=<"):
4766
+ if (($v <= $pr_array['criteria'])){
4767
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4768
+ }
4769
+ break;
4770
+ case($pr_array['condition'] = "empty"):
4771
+ if ((strlen($v) < 1)){
4772
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4773
+ }
4774
+ break;
4775
+ case($pr_array['condition'] = "multiply"):
4776
+ // Only shipping array
4777
+ if(is_array($v)){
4778
+ $pr_array['criteria'] = strtr($pr_array['criteria'], ',', '.');
4779
+ foreach ($v as $ship_a_key => $shipping_arr){
4780
+ foreach($shipping_arr as $ship_key => $ship_value){
4781
+ if($ship_key == "price"){
4782
+ $ship_pieces = explode(" ", $ship_value);
4783
+ $pd_value = strtr($ship_pieces[1], ',', '.');
4784
+ $newvalue = $pd_value*$pr_array['criteria'];
4785
+ $newvalue = round($newvalue, 2);
4786
+ $newvalue = strtr($newvalue, '.',',');
4787
+ $newvalue = $ship_pieces[0]." ".$newvalue;
4788
+ $product_data[$pr_array['than_attribute']][$ship_a_key]['price'] = $newvalue;
4789
+ }
4790
+ }
4791
+ }
4792
+ }
4793
+ break;
4794
+ default:
4795
+ break;
4796
+ }
4797
+ }
4798
+ }
4799
+ }
4800
+ } else {
4801
+ // Rules for string values
4802
  if (!array_key_exists('cs', $pr_array)){
4803
+ if($pr_array['attribute'] != "image"){
4804
+ $pd_value = strtolower($pd_value);
4805
+ $pr_array['criteria'] = strtolower($pr_array['criteria']);
4806
+ }
4807
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4808
 
4809
+ switch ($pr_array['condition']) {
4810
+ case($pr_array['condition'] = "contains"):
4811
+ if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
4812
+ // Specifically for shipping price rules
4813
+ if(!empty($product_data[$pr_array['than_attribute']])){
4814
+ if(is_array($product_data[$pr_array['than_attribute']])){
4815
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4816
+ for ($x = 0; $x <= $arr_size; $x++) {
4817
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4818
+ }
4819
+ } else {
4820
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4821
+ }
4822
+ } else {
4823
+ // This attribute value is empty for this product
4824
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4825
+ }
4826
+ }
4827
+ break;
4828
+ case($pr_array['condition'] = "containsnot"):
4829
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
4830
+ // Specifically for shipping price rules
4831
+ if(is_array($product_data[$pr_array['than_attribute']])){
4832
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4833
+ for ($x = 0; $x <= $arr_size; $x++) {
4834
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4835
+ }
4836
+ } else {
4837
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4838
+ }
4839
+ }
4840
+ break;
4841
+ case($pr_array['condition'] = "="):
4842
+ if (($pr_array['criteria'] == "$pd_value")){
4843
+ // Specifically for shipping price rules
4844
+ if(is_array($product_data[$pr_array['than_attribute']])){
4845
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4846
+ for ($x = 0; $x <= $arr_size; $x++) {
4847
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4848
+ }
4849
+ } else {
4850
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4851
+ }
4852
+ }
4853
+ $ship = $product_data['shipping'];
4854
+ break;
4855
+ case($pr_array['condition'] = "!="):
4856
+ if (($pr_array['criteria'] != "$pd_value")){
4857
+ // Specifically for shipping price rules
4858
+ if(is_array($product_data[$pr_array['than_attribute']])){
4859
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4860
+ for ($x = 0; $x <= $arr_size; $x++) {
4861
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4862
+ }
4863
+ } else {
4864
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4865
+ }
4866
+ }
4867
+ break;
4868
+ case($pr_array['condition'] = ">"):
4869
+ // Use a lexical order on relational string operators
4870
+ if (($pd_value > $pr_array['criteria'])){
4871
+ // Specifically for shipping price rules
4872
+ if(is_array($product_data[$pr_array['than_attribute']])){
4873
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4874
+ for ($x = 0; $x <= $arr_size; $x++) {
4875
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4876
+ }
4877
+ } else {
4878
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4879
+ }
4880
+ }
4881
+ break;
4882
+ case($pr_array['condition'] = ">="):
4883
+ // Use a lexical order on relational string operators
4884
+ if (($pd_value >= $pr_array['criteria'])){
4885
+ // Specifically for shipping price rules
4886
+ if(is_array($product_data[$pr_array['than_attribute']])){
4887
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4888
+ for ($x = 0; $x <= $arr_size; $x++) {
4889
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4890
+ }
4891
+ } else {
4892
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4893
+ }
4894
+ }
4895
+ break;
4896
+ case($pr_array['condition'] = "<"):
4897
+ // Use a lexical order on relational string operators
4898
+ if (($pd_value < $pr_array['criteria'])){
4899
+ // Specifically for shipping price rules
4900
+ if(isset($product_data[$pr_array['than_attribute']]) AND (is_array($product_data[$pr_array['than_attribute']]))){
4901
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4902
+ for ($x = 0; $x <= $arr_size; $x++) {
4903
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4904
+ }
4905
+ } else {
4906
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4907
+ }
4908
+ }
4909
+ break;
4910
+ case($pr_array['condition'] = "=<"):
4911
+ // Use a lexical order on relational string operators
4912
+ if (($pd_value <= $pr_array['criteria'])){
4913
+ // Specifically for shipping price rules
4914
+ if(is_array($product_data[$pr_array['than_attribute']])){
4915
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
4916
+ for ($x = 0; $x <= $arr_size; $x++) {
4917
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
4918
+ }
4919
+ } else {
4920
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4921
+ }
4922
+ }
4923
+ break;
4924
+
4925
+ case($pr_array['condition'] = "empty"):
4926
+ if(empty($product_data[$pr_array['attribute']])){
4927
+ if(empty($product_data[$pr_array['than_attribute']])){
4928
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4929
+ } else {
4930
+ $product_data[$pr_array['attribute']] = $product_data[$pr_array['than_attribute']];
4931
+ }
4932
+ }
4933
+ break;
4934
+ case($pr_array['condition'] = "replace"):
4935
+ $product_data[$pr_array['than_attribute']] = str_replace($pr_array['criteria'], $pr_array['newvalue'], $product_data[$pr_array['than_attribute']]);
4936
+ break;
4937
  case($pr_array['condition'] = "findreplace"):
4938
  if (strpos($pd_value, $pr_array['criteria']) !== false){
4939
+ // Make sure that a new value has been set
4940
+ if(!empty($pr_array['newvalue'])){
4941
+ // Find and replace only work on same attribute field, otherwise create a contains rule
4942
  if($pr_array['attribute'] == $pr_array['than_attribute']){
4943
+ $newvalue = str_replace($pr_array['criteria'],$pr_array['newvalue'], $pd_value);
4944
+ //$product_data[$pr_array['than_attribute']] = ucfirst($newvalue);
4945
+ $product_data[$pr_array['than_attribute']] = $newvalue;
4946
+ }
4947
+ }
4948
+ }
4949
  break;
4950
+ default:
4951
+ break;
4952
+ }
4953
+ }
4954
+ } else {
4955
+ // When a rule has been set on an attribute that is not in product_data
4956
+ // Add the newvalue to product_data
4957
+ if (!array_key_exists($pr_array['attribute'], $product_data)){
4958
+ if(!empty($pr_array['newvalue'])){
4959
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
4960
+ } else {
4961
+ if(array_key_exists($pr_array['than_attribute'], $product_data)){
4962
+ $product_data[$pr_array['attribute']] = $product_data[$pr_array['than_attribute']];
4963
+ }
4964
+ }
4965
+ }
4966
+ }
4967
+ }
4968
+ }
4969
+ }
4970
+ return $product_data;
4971
+ }
4972
 
4973
  /**
4974
  * Function to exclude products based on individual product exclusions
4991
  }
4992
  }
4993
 
4994
+
4995
+ /**
4996
+ * Execute project filters (include / exclude)
4997
+ */
4998
  private function woocommerce_sea_filters( $project_rules, $product_data ){
4999
+ $allowed = 1;
5000
 
5001
+ // Check if product was already excluded from the feed
5002
+ $product_excluded = ucfirst( get_post_meta( $product_data['id'], '_woosea_exclude_product', true ) );
5003
 
5004
+ if( $product_excluded == "Yes"){
5005
+ $allowed = 0;
5006
+ }
5007
 
5008
+ foreach ($project_rules as $pr_key => $pr_array){
5009
 
5010
+ if($pr_array['attribute'] == "categories"){
5011
+ $pr_array['attribute'] = "raw_categories";
5012
+ }
5013
 
5014
+ //if(array_key_exists($pr_array['attribute'], $product_data)){
5015
 
5016
+ if(!array_key_exists($pr_array['attribute'], $product_data)) {
5017
+ $product_data[$pr_array['attribute']] = ""; // Sets an empty postmeta value in place of a missing one.
5018
+ }
5019
 
5020
+ foreach ($product_data as $pd_key => $pd_value){
5021
+ // Check is there is a rule on specific attributes
5022
+ if(in_array($pd_key, $pr_array, TRUE)){
5023
 
5024
+ if($pd_key == "price"){
5025
+ //$pd_value = @number_format($pd_value,2);
5026
+ $pd_value = wc_format_decimal($pd_value);
5027
+ }
5028
 
5029
+ if (is_numeric($pd_value)){
5030
+ $old_value = $pd_value;
5031
+ if($pd_key == "price"){
5032
+ $pd_value = @number_format($pd_value,2);
5033
+ }
5034
+
5035
+ // Rules for numeric values
5036
+ switch ($pr_array['condition']) {
5037
+ case($pr_array['condition'] = "contains"):
5038
+ if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5039
+ $allowed = 0;
5040
+ } elseif ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5041
+ $allowed = 0;
5042
+ }
5043
+ break;
5044
+ case($pr_array['condition'] = "containsnot"):
5045
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5046
+ $allowed = 0;
5047
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5048
+ $allowed = 0;
5049
+ }
5050
+ break;
 
 
 
 
 
5051
  case($pr_array['condition'] = "="):
5052
+ if (($old_value == $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5053
+ $allowed = 0;
5054
+ } elseif (($old_value != $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5055
+ $allowed = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5056
  }
5057
+ break;
5058
+ case($pr_array['condition'] = "!="):
5059
+ if (($old_value == $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5060
+ if($allowed <> 0){
5061
+ $allowed = 1;
5062
+ }
5063
+ } elseif (($old_value == $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5064
+ $allowed = 0;
5065
+ }
5066
+ break;
5067
+ case($pr_array['condition'] = ">"):
5068
+ if (($old_value > $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5069
+ $allowed = 0;
5070
+ } elseif (($old_value <= $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5071
+ $allowed = 0;
5072
+ }
5073
+ break;
5074
+ case($pr_array['condition'] = ">="):
5075
+ if (($old_value >= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5076
+ $allowed = 0;
5077
+ } elseif (($old_value < $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5078
+ $allowed = 0;
5079
+ }
5080
+ break;
5081
+ case($pr_array['condition'] = "<"):
5082
+ if (($old_value < $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5083
+ $allowed = 0;
5084
+ } elseif (($old_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5085
+ $allowed = 0;
5086
+ }
5087
+ break;
5088
+ case($pr_array['condition'] = "=<"):
5089
+ if (($old_value <= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5090
+ $allowed = 0;
5091
+ } elseif (($old_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5092
+ $allowed = 0;
5093
+ }
5094
+ break;
5095
+ case($pr_array['condition'] = "empty"):
5096
+ if ((strlen($pd_value) < 1) && ($pr_array['than'] == "exclude")){
5097
+ $allowed = 0;
5098
+ } elseif ((strlen($pd_value > 0)) && ($pr_array['than'] == "include_only")){
5099
+ $allowed = 0;
5100
+ }
5101
+ break;
5102
+ default:
5103
+ break;
5104
+ }
5105
+ } elseif (is_array($pd_value)){
5106
+ // Tis can either be a shipping or product_tag array
5107
+ if($pr_array['attribute'] == "product_tag"){
5108
+ $in_tag_array = "not";
5109
+
5110
+ foreach($pd_value as $pt_key => $pt_value){
5111
+ // Rules for string values
5112
+ if (!array_key_exists('cs', $pr_array)){
5113
+ $pt_value = strtolower($pt_value);
5114
+ $pr_array['criteria'] = strtolower($pr_array['criteria']);
5115
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5116
 
5117
+ if(preg_match('/'.$pr_array['criteria'].'/', $pt_value)){
5118
+ $in_tag_array = "yes";
5119
+ }
5120
+ }
5121
+
5122
+ if($in_tag_array == "yes"){
5123
+ //if(in_array($pr_array['criteria'], $pd_value, TRUE)) {
5124
+ $v = $pr_array['criteria'];
5125
+ switch ($pr_array['condition']) {
5126
+ case($pr_array['condition'] = "contains"):
5127
+ if ((preg_match('/'.$pr_array['criteria'].'/', $v))){
5128
+ if($pr_array['than'] == "include_only"){
5129
+ if($allowed <> 0){
5130
+ $allowed = 1;
5131
+ }
5132
+ } else {
5133
+ $allowed = 0;
5134
+ }
5135
+ } else {
5136
+ $allowed = 0;
5137
+ }
5138
+ break;
5139
+ case($pr_array['condition'] = "containsnot"):
5140
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $v))){
5141
+ if($pr_array['than'] == "include_only"){
5142
+ if($allowed <> 0){
5143
+ $allowed = 1;
5144
+ }
5145
+ } else {
5146
+ $allowed = 0;
5147
+ }
5148
+ } else {
5149
+ $allowed = 0;
5150
+ }
5151
+ break;
5152
+ case($pr_array['condition'] = "="):
5153
+ if (($v == $pr_array['criteria'])){
5154
+ if($pr_array['than'] == "include_only"){
5155
+ if($allowed <> 0){
5156
+ $allowed = 1;
5157
+ }
5158
+ } else {
5159
+ $allowed = 0;
5160
+ }
5161
+ } else {
5162
+ $allowed = 0;
5163
+ }
5164
+ break;
5165
+ case($pr_array['condition'] = "!="):
5166
+ if (($v != $pr_array['criteria'])){
5167
+ if($pr_array['than'] == "include_only"){
5168
+ if($allowed <> 0){
5169
+ $allowed = 1;
5170
+ }
5171
+ } else {
5172
+ $allowed = 0;
5173
+ }
5174
+ }
5175
+ break;
5176
+ case($pr_array['condition'] = ">"):
5177
+ if (($v > $pr_array['criteria'])){
5178
+ if($pr_array['than'] == "include_only"){
5179
+ if($allowed <> 0){
5180
+ $allowed = 1;
5181
+ }
5182
+ } else {
5183
+ $allowed = 0;
5184
+ }
5185
+ }
5186
+ break;
5187
+ case($pr_array['condition'] = ">="):
5188
+ if (($v >= $pr_array['criteria'])){
5189
+ if($pr_array['than'] == "include_only"){
5190
+ if($allowed <> 0){
5191
+ $allowed = 1;
5192
+ }
5193
+ } else {
5194
+ $allowed = 0;
5195
+ }
5196
+ }
5197
+ break;
5198
+ case($pr_array['condition'] = "<"):
5199
+ if (($v < $pr_array['criteria'])){
5200
+ if($pr_array['than'] == "include_only"){
5201
+ if($allowed <> 0){
5202
+ $allowed = 1;
5203
+ }
5204
+ } else {
5205
+ $allowed = 0;
5206
+ }
5207
+ }
5208
+ break;
5209
+ case($pr_array['condition'] = "=<"):
5210
+ if (($v <= $pr_array['criteria'])){
5211
+ if($pr_array['than'] == "include_only"){
5212
+ if($allowed <> 0){
5213
+ $allowed = 1;
5214
+ }
5215
+ } else {
5216
+ $allowed = 0;
5217
+ }
5218
+ }
5219
+ break;
5220
+ case($pr_array['condition'] = "empty"):
5221
+ if (strlen($v) < 1){
5222
+ if($pr_array['than'] == "include_only"){
5223
+ if($allowed <> 0){
5224
+ $allowed = 1;
5225
+ }
5226
+ } else {
5227
+ if(!empty($pt_value)){
5228
+ $allowed = 1;
5229
+ } else {
5230
+ $allowed = 0;
5231
+ }
5232
+ }
5233
+ }
5234
+ break;
5235
+ default:
5236
+ break;
5237
+ }
5238
+ } else {
5239
+ switch ($pr_array['condition']) {
5240
+ case($pr_array['condition'] = "contains"):
5241
+ if($pr_array['than'] == "include_only"){
5242
+ $allowed = 0;
5243
+ } else {
5244
+ if($allowed <> 0){
5245
+ $allowed = 1;
5246
+ }
5247
+ }
5248
+ break;
5249
+ case($pr_array['condition'] = "containsnot"):
5250
+ if($pr_array['than'] == "include_only"){
5251
+ if($allowed <> 0){
5252
+ $allowed = 1;
5253
+ }
5254
+ } else {
5255
+ $allowed = 0;
5256
+ }
5257
+ break;
5258
+ case($pr_array['condition'] = "="):
5259
+ if($pr_array['than'] == "include_only"){
5260
+ $allowed = 0;
5261
+ } else {
5262
+ if($allowed <> 0){
5263
+ $allowed = 1;
5264
+ }
5265
+ }
5266
+ break;
5267
+ case($pr_array['condition'] = "!="):
5268
+ if($pr_array['than'] == "include_only"){
5269
+ if($allowed <> 0){
5270
+ $allowed = 1;
5271
+ }
5272
+ } else {
5273
+ $allowed = 0;
5274
+ }
5275
+ break;
5276
+ case($pr_array['condition'] = ">"):
5277
+ if($pr_array['than'] == "include_only"){
5278
+ $allowed = 0;
5279
+ } else {
5280
+ $allowed = 0;
5281
+ }
5282
+ break;
5283
+ case($pr_array['condition'] = ">="):
5284
+ if($pr_array['than'] == "include_only"){
5285
+ $allowed = 0;
5286
+ } else {
5287
+ $allowed = 0;
5288
+ }
5289
+ break;
5290
+ case($pr_array['condition'] = "<"):
5291
+ if($pr_array['than'] == "include_only"){
5292
+ $allowed = 0;
5293
+ } else {
5294
+ $allowed = 0;
5295
+ }
5296
+ break;
5297
+ case($pr_array['condition'] = "=<"):
5298
+ if($pr_array['than'] == "include_only"){
5299
+ $allowed = 0;
5300
+ } else {
5301
+ $allowed = 0;
5302
+ }
5303
+ break;
5304
+ case($pr_array['condition'] = "empty"):
5305
+ if($pr_array['than'] == "include_only"){
5306
+ if($allowed <> 0){
5307
+ $allowed = 1;
5308
+ }
5309
+ } else {
5310
+ $allowed = 0;
5311
+ }
5312
+ break;
5313
+ default:
5314
+ break;
5315
+ }
5316
+ }
5317
+ } else {
5318
+ // For now only shipping details are in an array
5319
+ foreach ($pd_value as $k => $v){
5320
+ foreach ($v as $kk => $vv){
5321
+ // Only shipping detail rule can be on price for now
5322
+ if($kk == "price"){
5323
+ switch ($pr_array['condition']) {
5324
+ case($pr_array['condition'] = "contains"):
5325
+ if ((preg_match('/'.$pr_array['criteria'].'/', $vv))){
5326
+ $allowed = 0;
5327
+ }
5328
+ break;
5329
+ case($pr_array['condition'] = "containsnot"):
5330
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $vv))){
5331
+ $allowed = 0;
5332
+ }
5333
+ break;
5334
+ case($pr_array['condition'] = "="):
5335
+ if (($vv == $pr_array['criteria'])){
5336
+ $allowed = 0;
5337
+ }
5338
+ break;
5339
+ case($pr_array['condition'] = "!="):
5340
+ if (($vv != $pr_array['criteria'])){
5341
+ $allowed = 0;
5342
+ }
5343
+ break;
5344
+ case($pr_array['condition'] = ">"):
5345
+ if (($vv > $pr_array['criteria'])){
5346
+ $allowed = 0;
5347
+ }
5348
+ break;
5349
+ case($pr_array['condition'] = ">="):
5350
+ if (($vv >= $pr_array['criteria'])){
5351
+ $allowed = 0;
5352
+ }
5353
+ break;
5354
+ case($pr_array['condition'] = "<"):
5355
+ if (($vv < $pr_array['criteria'])){
5356
+ $allowed = 0;
5357
+ }
5358
+ break;
5359
+ case($pr_array['condition'] = "=<"):
5360
+ if (($vv <= $pr_array['criteria'])){
5361
+ $allowed = 0;
5362
+ }
5363
+ break;
5364
+ case($pr_array['condition'] = "empty"):
5365
+ if (strlen($vv) < 1){
5366
+ $allowed = 0;
5367
+ }
5368
+ break;
5369
+ default:
5370
+ break;
5371
+ }
5372
+ }
5373
+ }
5374
+ }
5375
+ }
5376
+ } else {
5377
+ // Filters for string values
5378
+ // If case-sensitve is off than lowercase both the criteria and attribute value
5379
+ if (array_key_exists('cs', $pr_array)){
5380
+ if ($pr_array['cs'] != "on"){
5381
+ $pd_value = strtolower($pd_value);
5382
+ $pr_array['criteria'] = strtolower($pr_array['criteria']);
5383
+ }
5384
+ }
5385
+ $pos = strpos($pd_value, '&amp;');
5386
+ $pos_slash = strpos($pr_array['criteria'], '\\');
5387
+ if($pos !== false){
5388
+ $pd_value = str_replace("&amp;","&",$pd_value);
5389
+ }
5390
+ if($pos_slash !== false){
5391
+ $pr_array['criteria'] = str_replace("\\","",$pr_array['criteria']);
5392
+ }
5393
+
5394
+ switch ($pr_array['condition']) {
5395
+ case($pr_array['condition'] = "contains"):
5396
+ if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5397
+ $allowed = 0;
5398
+ } elseif ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5399
+ $allowed = 0;
5400
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5401
+ if($allowed <> 0){
5402
+ $allowed = 1;
5403
+ }
5404
+ }
5405
+ break;
5406
+ case($pr_array['condition'] = "containsnot"):
5407
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5408
+ $allowed = 0;
5409
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5410
+ $allowed = 0;
5411
+ }
5412
+ break;
5413
  case($pr_array['condition'] = "="):
5414
+ if (($pr_array['criteria'] == "$pd_value") AND ($pr_array['than'] == "exclude")){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5415
  $allowed = 0;
5416
+ } elseif (($pr_array['criteria'] != "$pd_value") && ($pr_array['than'] == "include_only")){
5417
+ $found = strpos($pd_value,$pr_array['criteria']);
5418
+ if ($found !== false) {
5419
+ //for category mapping check if its an array
5420
+ if($pr_array['attribute'] == "raw_categories"){
5421
+ $raw_cats_arr = explode("||",$pd_value);
5422
+ if(is_array($raw_cats_arr)){
5423
+ if(in_array($pr_array['criteria'],$raw_cats_arr, TRUE)){
5424
+ if($allowed <> 0){
5425
+ $allowed = 1;
5426
+ }
5427
+ } else {
5428
+ $allowed = 0;
5429
+ }
5430
+ }
5431
+ } else {
5432
+ if($allowed <> 0){
5433
+ $allowed = 1;
5434
+ }
5435
+ }
5436
+ } else {
5437
+ $allowed = 0;
5438
+ }
5439
+ } elseif (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "include_only")){
5440
+ if($allowed <> 0){
5441
+ $allowed = 1;
5442
+ }
5443
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5444
+ // $allowed = 0;
5445
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5446
+ $allowed = 1;
5447
+ } else {
5448
+ // $allowed = 1; // Change made on February 24th 2021
5449
+ }
5450
+ break;
5451
+ case($pr_array['condition'] = "!="):
5452
+ if (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "exclude")){
5453
+ if($allowed <> 0){
5454
+ $allowed = 1;
5455
+ }
5456
+ } elseif (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "include_only")){
5457
+ $allowed = 0;
5458
+ } elseif (($pr_array['criteria'] != "$pd_value") && ($pr_array['than'] == "exclude")){
5459
+ $allowed = 0;
5460
+ }
5461
+ break;
5462
+ case($pr_array['condition'] = ">"):
5463
+ // Use a lexical order on relational string operators
5464
+ if (($pd_value > $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5465
+ $allowed = 0;
5466
+ } elseif (($pd_value < $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5467
+ $allowed = 0;
5468
+ }
5469
+ break;
5470
+ case($pr_array['condition'] = ">="):
5471
+ // Use a lexical order on relational string operators
5472
+ if (($pd_value >= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5473
+ $allowed = 0;
5474
+ } elseif (($pd_value < $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5475
+ $allowed = 0;
5476
+ }
5477
+ break;
5478
+ case($pr_array['condition'] = "<"):
5479
+ // Use a lexical order on relational string operators
5480
+ if (($pd_value < $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5481
+ $allowed = 0;
5482
+ } elseif (($pd_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5483
+ $allowed = 0;
5484
+ }
5485
+ break;
5486
+ case($pr_array['condition'] = "=<"):
5487
+ // Use a lexical order on relational string operators
5488
+ if (($pd_value <= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5489
+ $allowed = 0;
5490
+ } elseif (($pd_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5491
+ $allowed = 0;
5492
+ }
5493
+ break;
5494
+ case($pr_array['condition'] = "empty"):
5495
  if ((strlen($pd_value) < 1) && ($pr_array['than'] == "exclude")){
5496
+ $allowed = 0;
5497
+ } elseif ((strlen($pd_value) > 0) && ($pr_array['than'] == "exclude")){
5498
+ if($allowed <> 0){
5499
+ $allowed = 1;
5500
+ }
5501
+ } elseif ((strlen($pd_value) > 0) && ($pr_array['than'] == "include_only")){
5502
+ $allowed = 0;
5503
+ }
5504
+ break;
5505
+ default:
5506
+ break;
5507
+ }
5508
+ }
5509
+ }
5510
+ }
5511
+ }
5512
 
5513
+ if ($allowed < 1){
5514
+ $product_data = array();
5515
+ $product_data = null;
5516
+ } else {
5517
+ return $product_data;
5518
+ }
5519
+ }
5520
  }
js/woosea_key.js CHANGED
@@ -27,7 +27,7 @@ jQuery(document).ready(function($) {
27
  var license_key = $('#license-key').val();
28
 
29
  jQuery.ajax({
30
- url: 'https://www.adtribes.io/check/license.php?key=' + license_key + '&email=' + license_email + '&domain=' + root_domain + '&version=9.3.7',
31
  jsonp: 'callback',
32
  dataType: 'jsonp',
33
  type: 'GET',
27
  var license_key = $('#license-key').val();
28
 
29
  jQuery.ajax({
30
+ url: 'https://www.adtribes.io/check/license.php?key=' + license_key + '&email=' + license_email + '&domain=' + root_domain + '&version=9.6.5',
31
  jsonp: 'callback',
32
  dataType: 'jsonp',
33
  type: 'GET',
js/woosea_manage.js CHANGED
@@ -256,6 +256,26 @@ jQuery(function($) {
256
  }
257
  })
258
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  // Check if user would like to enable debug logging
260
  $('#add_woosea_logging').on('change', function(){ // on change of state
261
  if(this.checked){
256
  }
257
  })
258
 
259
+ // Check if user would like the plugin to remove the free shipping class
260
+ $('#remove_free_shipping').on('change', function(){ // on change of state
261
+ if(this.checked){
262
+
263
+ // Checkbox is on
264
+ jQuery.ajax({
265
+ method: "POST",
266
+ url: ajaxurl,
267
+ data: { 'action': 'woosea_remove_free_shipping', 'status': "on" }
268
+ })
269
+ } else {
270
+ // Checkbox is off
271
+ jQuery.ajax({
272
+ method: "POST",
273
+ url: ajaxurl,
274
+ data: { 'action': 'woosea_remove_free_shipping', 'status': "off" }
275
+ })
276
+ }
277
+ })
278
+
279
  // Check if user would like to enable debug logging
280
  $('#add_woosea_logging').on('change', function(){ // on change of state
281
  if(this.checked){
pages/admin/woosea-manage-feed.php CHANGED
@@ -67,6 +67,7 @@ if(!empty($license_information)){
67
  if (!wp_next_scheduled( 'woosea_cron_hook' ) ) {
68
  $notifications_box = $notifications_obj->get_admin_notifications ( '12', 'false' );
69
  }
 
70
  ?>
71
  <div class="wrap">
72
  <div class="woo-product-feed-pro-form-style-2">
@@ -124,6 +125,18 @@ if (!wp_next_scheduled( 'woosea_cron_hook' ) ) {
124
  <?php
125
  }
126
  }
 
 
 
 
 
 
 
 
 
 
 
 
127
  ?>
128
 
129
  <div class="woo-product-feed-pro-form-style-2-heading"><?php _e( 'Manage feeds','woo-product-feed-pro' );?></div>
67
  if (!wp_next_scheduled( 'woosea_cron_hook' ) ) {
68
  $notifications_box = $notifications_obj->get_admin_notifications ( '12', 'false' );
69
  }
70
+
71
  ?>
72
  <div class="wrap">
73
  <div class="woo-product-feed-pro-form-style-2">
125
  <?php
126
  }
127
  }
128
+
129
+
130
+ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
131
+ ?>
132
+ <div class="notice notice-error is-dismissible">
133
+ <p>
134
+ <strong><?php _e( 'WARNING: Your WP-Cron is disabled', 'woo-product-feed-pro' );?></strong><br/></br/>
135
+ We detected that your WP-cron has been disabled in your wp-config.php file. Our plugin heavily depends on the WP-cron being active otherwise it cannot update and generate your product feeds. <a href="https://adtribes.io/help-my-feed-processing-is-stuck/?utm_source=<?php print"$host";?>&utm_medium=manage-feed&utm_campaign=cron-warning&utm_content=notification" target="_blank"><strong>Please enable your WP-cron first</strong></a>.
136
+ </p>
137
+ </div>
138
+ <?php
139
+ }
140
  ?>
141
 
142
  <div class="woo-product-feed-pro-form-style-2-heading"><?php _e( 'Manage feeds','woo-product-feed-pro' );?></div>
pages/admin/woosea-manage-settings.php CHANGED
@@ -101,6 +101,20 @@ if(isset($_GET["tab"])) {
101
  ?>
102
  </span>
103
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
  <!-- wordpress provides the styling for tabs. -->
106
  <h2 class="nav-tab-wrapper">
@@ -290,6 +304,24 @@ if(isset($_GET["tab"])) {
290
  </label>
291
  </td>
292
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  <tr>
294
  <td>
295
  <span><?php _e( 'Remove the local pickup shipping zone from feed (Google Shopping / Facebook only)', 'woo-product-feed-pro');?></span>
@@ -440,11 +472,11 @@ if(isset($_GET["tab"])) {
440
  $external_path_tsv = $external_base . "/woo-product-feed-pro/";
441
  $external_path_logs = $external_base . "/woo-product-feed-pro/";
442
  $test_file = $external_path . "/tesfile.txt";
443
- $test_file_xml = $external_path . "/xml/tesfile.txt";
444
- $test_file_csv = $external_path . "/csv/tesfile.txt";
445
- $test_file_txt = $external_path . "/txt/tesfile.txt";
446
- $test_file_tsv = $external_path . "/tsv/tesfile.txt";
447
- $test_file_logs = $external_path . "/logs/tesfile.txt";
448
 
449
  if (is_writable($external_path)) {
450
  // Normal root category
@@ -515,6 +547,10 @@ if(isset($_GET["tab"])) {
515
  $cron_enabled = "True";
516
  }
517
 
 
 
 
 
518
  print "<table class=\"woo-product-feed-pro-table\">";
519
  print "<tr><td><strong>System check</strong></td><td><strong>Status</strong></td></tr>";
520
  print "<tr><td>WP-Cron enabled</td><td>$cron_enabled</td></tr>";
101
  ?>
102
  </span>
103
  </div>
104
+
105
+ <?php
106
+ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
107
+ ?>
108
+ <div class="notice notice-error is-dismissible">
109
+ <p>
110
+ <strong><?php _e( 'WARNING: Your WP-Cron is disabled', 'woo-product-feed-pro' );?></strong><br/></br/>
111
+ We detected that your WP-cron has been disabled in your wp-config.php file. Our plugin heavily depends on the WP-cron being active for it to be able to update and generate your product feeds. More information on the inner workings of our plugin and instructions on how to enable your WP-Cron can be found here: <a href="https://adtribes.io/help-my-feed-processing-is-stuck/?utm_source=<?php print"$host";?>&utm_medium=manage-feed&utm_campaign=cron-warning&utm_content=notification" target="_blank"><strong>My feed won't update or is stuck processing</strong></a>.
112
+ </p>
113
+ </div>
114
+ <?php
115
+ }
116
+ ?>
117
+
118
 
119
  <!-- wordpress provides the styling for tabs. -->
120
  <h2 class="nav-tab-wrapper">
304
  </label>
305
  </td>
306
  </tr>
307
+ <tr>
308
+ <td>
309
+ <span><?php _e( 'Remove the free shipping zone from feed (Google Shopping / Facebook only)', 'woo-product-feed-pro');?></span>
310
+ </td>
311
+ <td>
312
+ <label class="woo-product-feed-pro-switch">
313
+ <?php
314
+ $remove_free_shipping = get_option ('remove_free_shipping');
315
+ if($remove_free_shipping == "yes"){
316
+ print "<input type=\"checkbox\" id=\"remove_free_shipping\" name=\"remove_free_shipping\" class=\"checkbox-field\" checked>";
317
+ } else {
318
+ print "<input type=\"checkbox\" id=\"remove_free_shipping\" name=\"remove_free_shipping\" class=\"checkbox-field\">";
319
+ }
320
+ ?>
321
+ <div class="woo-product-feed-pro-slider round"></div>
322
+ </label>
323
+ </td>
324
+ </tr>
325
  <tr>
326
  <td>
327
  <span><?php _e( 'Remove the local pickup shipping zone from feed (Google Shopping / Facebook only)', 'woo-product-feed-pro');?></span>
472
  $external_path_tsv = $external_base . "/woo-product-feed-pro/";
473
  $external_path_logs = $external_base . "/woo-product-feed-pro/";
474
  $test_file = $external_path . "/tesfile.txt";
475
+ $test_file_xml = $external_path . "xml/tesfile.txt";
476
+ $test_file_csv = $external_path . "csv/tesfile.txt";
477
+ $test_file_txt = $external_path . "txt/tesfile.txt";
478
+ $test_file_tsv = $external_path . "tsv/tesfile.txt";
479
+ $test_file_logs = $external_path . "logs/tesfile.txt";
480
 
481
  if (is_writable($external_path)) {
482
  // Normal root category
547
  $cron_enabled = "True";
548
  }
549
 
550
+ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
551
+ $cron_enabled = "<strong>False</strong>";
552
+ }
553
+
554
  print "<table class=\"woo-product-feed-pro-table\">";
555
  print "<tr><td><strong>System check</strong></td><td><strong>Status</strong></td></tr>";
556
  print "<tr><td>WP-Cron enabled</td><td>$cron_enabled</td></tr>";
readme.txt CHANGED
@@ -5,11 +5,11 @@ License URI: http://www.gnu.org/licenses/gpl.html
5
  Tags: Product Feed, Google Shopping, Google Shopping Feed, WooCommerce Product Feed, WooCommerce Product Feed PRO, Bing Shopping, Bing product feed, Bing remarking, Google Merchant Feed, Google DRM Feed, Google Dynamic Remarketing Feed, Facebook feed, Google feed, Bing feed, Facebook Product Feed, Facebook Dynamic remarketing, Data Feed, WooCommerce Feed, XML product feed, CSV product feed, TSV, TXT product feed, comparison shopping engines, comparison shopping websites, vergelijk.nl, vergelijk.be, vertaa.fi, beslist.nl, kieskeurig.nl, bol.com, raketten, pricerunner, pricegrabber, Buy, leGuide, Kelkoo, Twenga, Yandex, Etsy, Dealtime, Shopzilla, Billiger, Google Product Review feed
6
  Requires at least: 4.5
7
  Tested up to: 5.6
8
- Stable tag: 9.3.7
9
 
10
  == Description ==
11
 
12
- Generate WooCommerce product feeds for all your marketing channels, such as Google Shopping (merchant center), Facebook Remarketing, Bing Ads, Billiger.de, Pricerunner, Vergelijk.nl and many more. Next to custom feeds there are over 100 pre-defined templates included for marketplaces, comparison shopping engines and search engines. This plugin provides high-quality product feed for Google Shopping and many many more.
13
 
14
  = Why choose this plugin? =
15
  Simply because this is the most complete plugin offering support for an unlimited number of products and feeds, including features such as category- & field-mapping and advanced, rule-based, filtering and product variables support.
@@ -175,6 +175,7 @@ Some of the above mentioned feature can only be used by users who upgraded to th
175
  * <a href="https://www.beslist.nl" target="_blank" rel="nofollow">Beslist.nl</a>
176
  * <a href="https://www.beslist.be" target="_blank" rel="nofollow">Beslist.be</a>
177
  * <a href="https://www.fashionchick.nl" target="_blank">Fashionchick.nl</a>
 
178
  * Bol.com
179
  * Stylight
180
  * Incurvy
@@ -322,6 +323,95 @@ Questions left or unanswered? Please do not hesitate to contact us at support@ad
322
 
323
  === Changelog ===
324
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
325
  = 9.3.7 (2021-01-12) =
326
  * Added the Bestprice.gr template
327
 
@@ -2988,6 +3078,95 @@ Questions left or unanswered? Please do not hesitate to contact us at support@ad
2988
 
2989
  == Upgrade Notice ==
2990
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2991
  = 9.3.7 =
2992
  Added the Bestprice.gr template
2993
 
5
  Tags: Product Feed, Google Shopping, Google Shopping Feed, WooCommerce Product Feed, WooCommerce Product Feed PRO, Bing Shopping, Bing product feed, Bing remarking, Google Merchant Feed, Google DRM Feed, Google Dynamic Remarketing Feed, Facebook feed, Google feed, Bing feed, Facebook Product Feed, Facebook Dynamic remarketing, Data Feed, WooCommerce Feed, XML product feed, CSV product feed, TSV, TXT product feed, comparison shopping engines, comparison shopping websites, vergelijk.nl, vergelijk.be, vertaa.fi, beslist.nl, kieskeurig.nl, bol.com, raketten, pricerunner, pricegrabber, Buy, leGuide, Kelkoo, Twenga, Yandex, Etsy, Dealtime, Shopzilla, Billiger, Google Product Review feed
6
  Requires at least: 4.5
7
  Tested up to: 5.6
8
+ Stable tag: 9.6.5
9
 
10
  == Description ==
11
 
12
+ Generate WooCommerce product feeds for all your marketing channels, such as Google Shopping (merchant center), Facebook Remarketing, Bing Ads, Billiger.de, Pricerunner, Skroutz and many more. Next to custom feeds there are over 100 pre-defined templates included for marketplaces, comparison shopping engines and search engines. This plugin provides high-quality product feed for Google Shopping and many many more.
13
 
14
  = Why choose this plugin? =
15
  Simply because this is the most complete plugin offering support for an unlimited number of products and feeds, including features such as category- & field-mapping and advanced, rule-based, filtering and product variables support.
175
  * <a href="https://www.beslist.nl" target="_blank" rel="nofollow">Beslist.nl</a>
176
  * <a href="https://www.beslist.be" target="_blank" rel="nofollow">Beslist.be</a>
177
  * <a href="https://www.fashionchick.nl" target="_blank">Fashionchick.nl</a>
178
+ * <a href="https://www.boetiek.nl" target="_blank">Boetiek.nl</a>
179
  * Bol.com
180
  * Stylight
181
  * Incurvy
323
 
324
  === Changelog ===
325
 
326
+ = 9.6.5 (2021-02-24) =
327
+ * Do not add Skroutz variable products to the feed when they do not have item_group_id's
328
+
329
+ = 9.6.4 (2021-02-24) =
330
+ * Fixed an issue with rules and filters
331
+ * When a rule was set on an image link, no longer lowercase the image link
332
+
333
+ = 9.6.3 (2021-02-23) =
334
+ * Fixed a bug, the Facebook pixel is now also measuing revenue for multiple items in Cart, InititiateCheckout and Purchase events
335
+ * Reverted back some changes in filters and rules
336
+
337
+ = 9.6.2 (2021-02-22) =
338
+ * For Skroutz feed removing sizes from feeds when they are out-of-stock
339
+
340
+ = 9.6.1 (2021-02-19) =
341
+ * Added attribute that will allow you to uppercase every first character of a string in product names
342
+
343
+ = 9.6.0 (2021-02-19) =
344
+ * Changed g:itemid to g:id for the Google Local Product Feeds
345
+
346
+ = 9.5.9 (2021-02-19) =
347
+ * Added a fail-safe when users do not select a marketing channel which let to PHP notices in logs
348
+
349
+ = 9.5.8 (2021-02-18) =
350
+ * Added shipping class name attribute
351
+
352
+ = 9.5.7 (2021-02-17) =
353
+ * Dynamic attribute values are now also added to parent variable products for Skroutz feeds
354
+
355
+ = 9.5.6 (2021-02-17) =
356
+ * Changed attribute name primary category to Yoast primary category as it caused lots of confussion
357
+
358
+ = 9.5.5 (2021-02-11) =
359
+ * Fixed a PHP notice that showed when creating a new rule
360
+ * Tested for compatibility with WooCommerce 5.0
361
+
362
+ = 9.5.4 (2021-02-09) =
363
+ * When free shipping zones are removed do not remove the other shipping zones
364
+
365
+ = 9.5.3 (2021-02-08) =
366
+ * Added a feature to remove free shipping zones from Google and Facebook feeds
367
+
368
+ = 9.5.2 (2021-02-08) =
369
+ * Fixed a minor issue in exclude rules for WooCommerce category names
370
+
371
+ = 9.5.1 (2021-02-02) =
372
+ * Dynamic attributes without values that are used for product details should be skipped which not always happened. This is fixed now.
373
+
374
+ = 9.5.0 (2021-02-01) =
375
+ * Discount rules created with the FlyCart plugin did not make it to Skroutz feeds. This has been solved now
376
+
377
+ = 9.4.9 (2021-01-31) =
378
+ * Added a seperate sale price attribute for bundled products
379
+ * Reviews for parent variable products are removed, the reviews are attached to its variations
380
+
381
+ = 9.4.8 (2021-01-30) =
382
+ * Fixed an issue with the ecomm_prodid on the cart page
383
+
384
+ = 9.4.7 (2021-01-29) =
385
+ * Solved an issue that shipping costs to the first product in a custom feed where empty
386
+
387
+ = 9.4.6 (2021-01-28) =
388
+ * Added a new attribute: product description parent product
389
+
390
+ = 9.4.5 (2021-01-28) =
391
+ * Added a Google Shopping field to their template: g:ship_from_country
392
+ * Stripping & characters from review names as it breaks the review feeds
393
+
394
+ = 9.4.4 (2021-01-27) =
395
+ * Fixed an issue where reviews without review text caused the feed to be disapproved by Google. We now remove reviews from feeds that have no review texts.
396
+
397
+ = 9.4.3 (2021-01-27) =
398
+ * Fixed an issue with an undefined ecomm_price variable on product variable pages
399
+
400
+ = 9.4.2 (2021-01-26) =
401
+ * Added the Dutch Boetiek.nl template
402
+
403
+ = 9.4.1 (2021-01-19) =
404
+ * Fixed a bug: exclude filters on empty product tags were broken. This is fixed now.
405
+
406
+ = 9.4.0 (2021-01-14) =
407
+ * Added a WP-cron check and notifications
408
+
409
+ = 9.3.9 (2021-01-14) =
410
+ * Bestprice.gr apparel products are now grouped by color
411
+
412
+ = 9.3.8 (2021-01-13) =
413
+ * Tested for compatibility with WooCommerce 4.9
414
+
415
  = 9.3.7 (2021-01-12) =
416
  * Added the Bestprice.gr template
417
 
3078
 
3079
  == Upgrade Notice ==
3080
 
3081
+ = 9.6.5 =
3082
+ Do not add Skroutz variable products to the feed when they do not have item_group_id's
3083
+
3084
+ = 9.6.4 =
3085
+ Fixed an issue with rules and filters
3086
+ When a rule was set on an image link, no longer lowercase the image link
3087
+
3088
+ = 9.6.3 =
3089
+ Fixed a bug, the Facebook pixel is now also measuing revenue for multiple items in Cart, InititiateCheckout and Purchase events
3090
+ Reverted back some changes in filters and rules
3091
+
3092
+ = 9.6.2 =
3093
+ For Skroutz feed removing sizes from feeds when they are out-of-stock
3094
+
3095
+ = 9.6.1 =
3096
+ Added attribute that will allow you to uppercase every first character of a string in product names
3097
+
3098
+ = 9.6.0 =
3099
+ Changed g:itemid to g:id for the Google Local Product Feeds
3100
+
3101
+ = 9.5.9 =
3102
+ * Added a fail-safe when users do not select a marketing channel which let to PHP notices in logs
3103
+
3104
+ = 9.5.8 =
3105
+ Added shipping class name attribute
3106
+
3107
+ = 9.5.7 =
3108
+ Dynamic attribute values are now also added to parent variable products for Skroutz feeds
3109
+
3110
+ = 9.5.6 =
3111
+ Changed attribute name primary category to Yoast primary category as it caused lots of confussion
3112
+
3113
+ = 9.5.5 =
3114
+ Fixed a PHP notice that showed when creating a new rule
3115
+ Tested for compatibility with WooCommerce 5.0
3116
+
3117
+ = 9.5.4 =
3118
+ When free shipping zones are removed do not remove the other shipping zones
3119
+
3120
+ = 9.5.3 =
3121
+ Added a feature to remove free shipping zones from Google and Facebook feeds
3122
+
3123
+ = 9.5.2 =
3124
+ Fixed a minor issue in exclude rules for WooCommerce category names
3125
+
3126
+ = 9.5.1 =
3127
+ Dynamic attributes without values that are used for product details should be skipped which not always happened. This is fixed now.
3128
+
3129
+ = 9.5.0 =
3130
+ Discount rules created with the FlyCart plugin did not make it to Skroutz feeds. This has been solved now
3131
+
3132
+ = 9.4.9 =
3133
+ Added a seperate sale price attribute for bundled products
3134
+ Reviews for parent variable products are removed, the reviews are attached to its variations
3135
+
3136
+ = 9.4.8 =
3137
+ Fixed an issue with the ecomm_prodid on the cart page
3138
+
3139
+ = 9.4.7 =
3140
+ Solved an issue that shipping costs to the first product in a custom feed where empty
3141
+
3142
+ = 9.4.6 =
3143
+ Added a new attribute: product description parent product
3144
+
3145
+ = 9.4.5 =
3146
+ Added a Google Shopping field to their template: g:ship_from_country
3147
+ Stripping & characters from review names as it breaks the review feeds
3148
+
3149
+ = 9.4.4 =
3150
+ Fixed an issue where reviews without review text caused the feed to be disapproved by Google. We now remove reviews from feeds that have no review texts.
3151
+
3152
+ = 9.4.3 =
3153
+ Fixed an issue with an undefined ecomm_price variable on product variable pages
3154
+
3155
+ = 9.4.2 =
3156
+ Added the Dutch Boetiek.nl template
3157
+
3158
+ = 9.4.1 =
3159
+ Fixed a bug: exclude filters on empty product tags were broken. This is fixed now.
3160
+
3161
+ = 9.4.0 =
3162
+ Added a WP-cron check and notifications
3163
+
3164
+ = 9.3.9 =
3165
+ Bestprice.gr apparel products are now grouped by color
3166
+
3167
+ = 9.3.8 =
3168
+ Tested for compatibility with WooCommerce 4.9
3169
+
3170
  = 9.3.7 =
3171
  Added the Bestprice.gr template
3172
 
woocommerce-sea.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /**
3
  * Plugin Name: Product Feed PRO for WooCommerce
4
- * Version: 9.3.7
5
  * Plugin URI: https://www.adtribes.io/support/?utm_source=wpadmin&utm_medium=plugin&utm_campaign=woosea_product_feed_pro
6
  * Description: Configure and maintain your WooCommerce product feeds for Google Shopping, Facebook, Remarketing, Bing, Yandex, Comparison shopping websites and over a 100 channels more.
7
  * Author: AdTribes.io
@@ -17,7 +17,7 @@
17
  * Domain Path: /languages
18
  *
19
  * WC requires at least: 4.4
20
- * WC tested up to: 4.8
21
  *
22
  * Product Feed PRO for WooCommerce is free software: you can redistribute it and/or modify
23
  * it under the terms of the GNU General Public License as published by
@@ -48,7 +48,7 @@ if (!defined('ABSPATH')) {
48
  * Plugin versionnumber, please do not override.
49
  * Define some constants
50
  */
51
- define( 'WOOCOMMERCESEA_PLUGIN_VERSION', '9.3.7' );
52
  define( 'WOOCOMMERCESEA_PLUGIN_NAME', 'woocommerce-product-feed-pro' );
53
  define( 'WOOCOMMERCESEA_PLUGIN_NAME_SHORT', 'woo-product-feed-pro' );
54
 
@@ -347,7 +347,6 @@ function woosea_add_facebook_pixel( $product = null ){
347
  $cats = str_replace("&amp;","&", $cats);
348
 
349
  if(!empty($fb_prodid)){
350
-
351
  if(!$product) {
352
  return -1;
353
  }
@@ -436,6 +435,8 @@ function woosea_add_facebook_pixel( $product = null ){
436
  $order_real = 0;
437
  $contents = "";
438
 
 
 
439
  if ( !is_wp_error( $order_items )) {
440
  foreach( $order_items as $item_id => $order_item) {
441
  $prod_id = $order_item->get_product_id();
@@ -454,7 +455,7 @@ function woosea_add_facebook_pixel( $product = null ){
454
  }
455
  }
456
  $contents = rtrim($contents, ",");
457
- $viewContent = "fbq('track','Purchase',{currency:'$currency', value:'$order_real', content_type:'product', contents:[$contents]});";
458
  }
459
  } else {
460
  // This is on the cart page itself
@@ -463,6 +464,8 @@ function woosea_add_facebook_pixel( $product = null ){
463
  $cart_real = 0;
464
  $contents = "";
465
 
 
 
466
  $checkoutpage = wc_get_checkout_url();
467
  $current_url = get_permalink(get_the_ID());
468
 
@@ -477,20 +480,15 @@ function woosea_add_facebook_pixel( $product = null ){
477
  //$contents .= "$prod_id,";
478
 
479
  $cart_real = wc_format_localized_price( $cart_item['line_total'] );
480
-
481
- // $line_total = number_format(($cart_item['line_total']),2, '.','');
482
- // $line_tax = number_format(($cart_item['line_tax']),2, '.','');
483
- // $cart_real = number_format($cart_real,2, '.','');
484
- // $cart_real = number_format(($line_total+$line_tax+$cart_real),2,',','');
485
  }
486
  $contents = rtrim($contents, ",");
487
 
488
  // User is on the billing pages
489
  if($checkoutpage == $current_url){
490
- $viewContent = "fbq(\"track\",\"InitiateCheckout\",{currency:\"$currency\", value:\"$cart_real\", content_type:\"product\", content_ids:[$contents]});";
491
  } else {
492
  // User is on the basket page
493
- $viewContent = "fbq(\"track\",\"AddToCart\",{currency:\"$currency\", value:\"$cart_real\", content_type:\"product\", content_ids:[$contents]});";
494
  }
495
  }
496
  }
@@ -622,7 +620,7 @@ function woosea_add_remarketing_tags( $product = null ){
622
  // In that case we need to put in the AggregateOffer structured data
623
  $variation_id = woosea_find_matching_product_variation( $product, $_GET );
624
  $nr_get = count($_GET);
625
-
626
  if($nr_get > 0){
627
  $variable_product = wc_get_product($variation_id);
628
 
@@ -659,7 +657,9 @@ function woosea_add_remarketing_tags( $product = null ){
659
  $ecomm_price = wc_format_decimal( $lowest, wc_get_price_decimals());
660
  } else {
661
  $ecomm_lowprice = wc_format_decimal( $lowest, wc_get_price_decimals() );
662
- $ecomm_highprice = wc_format_decimal( $highest, wc_get_price_decimals() );
 
 
663
  }
664
  }
665
  } else {
@@ -671,14 +671,18 @@ function woosea_add_remarketing_tags( $product = null ){
671
  var google_tag_params = {
672
  ecomm_prodid: <?php print "$ecomm_prodid";?>,
673
  ecomm_pagetype: '<?php print "$ecomm_pagetype";?>',
674
- ecomm_totalvalue: '<?php print "$ecomm_price";?>',
675
  };
676
  </script>
677
 
678
  <?php
679
  }
680
  } elseif ($ecomm_pagetype == "cart"){
681
- $ecomm_prodid = get_the_id();
 
 
 
 
682
  ?>
683
  <script type="text/javascript">
684
  var google_tag_params = {
@@ -804,6 +808,7 @@ function woosea_request_review(){
804
  }
805
  add_action('admin_notices', 'woosea_request_review');
806
 
 
807
  /**
808
  * Create a seperate MySql table for saving conversion information
809
  */
@@ -2285,6 +2290,21 @@ function woosea_local_pickup_shipping (){
2285
  }
2286
  add_action( 'wp_ajax_woosea_local_pickup_shipping', 'woosea_local_pickup_shipping' );
2287
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2288
  /**
2289
  * This function enables the setting to use
2290
  * logging
@@ -4623,8 +4643,11 @@ add_action('wp_dashboard_setup', 'woosea_blog_widgets');
4623
  /**
4624
  * Creates the RSS metabox
4625
  */
 
 
 
 
4626
  function woosea_my_rss_box() {
4627
-
4628
  // Get RSS Feed(s)
4629
  include_once(ABSPATH . WPINC . '/feed.php');
4630
  $domain = $_SERVER['HTTP_HOST'];
@@ -4633,6 +4656,8 @@ function woosea_my_rss_box() {
4633
  $my_feeds = array(
4634
  'https://www.adtribes.io/feed/'
4635
  );
 
 
4636
 
4637
  // Loop through Feeds
4638
  foreach ( $my_feeds as $feed) :
1
  <?php
2
  /**
3
  * Plugin Name: Product Feed PRO for WooCommerce
4
+ * Version: 9.6.5
5
  * Plugin URI: https://www.adtribes.io/support/?utm_source=wpadmin&utm_medium=plugin&utm_campaign=woosea_product_feed_pro
6
  * Description: Configure and maintain your WooCommerce product feeds for Google Shopping, Facebook, Remarketing, Bing, Yandex, Comparison shopping websites and over a 100 channels more.
7
  * Author: AdTribes.io
17
  * Domain Path: /languages
18
  *
19
  * WC requires at least: 4.4
20
+ * WC tested up to: 5.0
21
  *
22
  * Product Feed PRO for WooCommerce is free software: you can redistribute it and/or modify
23
  * it under the terms of the GNU General Public License as published by
48
  * Plugin versionnumber, please do not override.
49
  * Define some constants
50
  */
51
+ define( 'WOOCOMMERCESEA_PLUGIN_VERSION', '9.6.5' );
52
  define( 'WOOCOMMERCESEA_PLUGIN_NAME', 'woocommerce-product-feed-pro' );
53
  define( 'WOOCOMMERCESEA_PLUGIN_NAME_SHORT', 'woo-product-feed-pro' );
54
 
347
  $cats = str_replace("&amp;","&", $cats);
348
 
349
  if(!empty($fb_prodid)){
 
350
  if(!$product) {
351
  return -1;
352
  }
435
  $order_real = 0;
436
  $contents = "";
437
 
438
+ $cart_total_amount = wc_format_localized_price(WC()->cart->get_cart_contents_total());
439
+
440
  if ( !is_wp_error( $order_items )) {
441
  foreach( $order_items as $item_id => $order_item) {
442
  $prod_id = $order_item->get_product_id();
455
  }
456
  }
457
  $contents = rtrim($contents, ",");
458
+ $viewContent = "fbq('track','Purchase',{currency:'$currency', value:'$cart_total_amount', content_type:'product', contents:[$contents]});";
459
  }
460
  } else {
461
  // This is on the cart page itself
464
  $cart_real = 0;
465
  $contents = "";
466
 
467
+ $cart_total_amount = wc_format_localized_price(WC()->cart->get_cart_contents_total());
468
+
469
  $checkoutpage = wc_get_checkout_url();
470
  $current_url = get_permalink(get_the_ID());
471
 
480
  //$contents .= "$prod_id,";
481
 
482
  $cart_real = wc_format_localized_price( $cart_item['line_total'] );
 
 
 
 
 
483
  }
484
  $contents = rtrim($contents, ",");
485
 
486
  // User is on the billing pages
487
  if($checkoutpage == $current_url){
488
+ $viewContent = "fbq(\"track\",\"InitiateCheckout\",{currency:\"$currency\", value:\"$cart_total_amount\", content_type:\"product\", content_ids:[$contents]});";
489
  } else {
490
  // User is on the basket page
491
+ $viewContent = "fbq(\"track\",\"AddToCart\",{currency:\"$currency\", value:\"$cart_total_amount\", content_type:\"product\", content_ids:[$contents]});";
492
  }
493
  }
494
  }
620
  // In that case we need to put in the AggregateOffer structured data
621
  $variation_id = woosea_find_matching_product_variation( $product, $_GET );
622
  $nr_get = count($_GET);
623
+
624
  if($nr_get > 0){
625
  $variable_product = wc_get_product($variation_id);
626
 
657
  $ecomm_price = wc_format_decimal( $lowest, wc_get_price_decimals());
658
  } else {
659
  $ecomm_lowprice = wc_format_decimal( $lowest, wc_get_price_decimals() );
660
+ $ecomm_highprice = wc_format_decimal( $highest, wc_get_price_decimals() );
661
+ $ecomm_price = $ecomm_lowprice;
662
+
663
  }
664
  }
665
  } else {
671
  var google_tag_params = {
672
  ecomm_prodid: <?php print "$ecomm_prodid";?>,
673
  ecomm_pagetype: '<?php print "$ecomm_pagetype";?>',
674
+ ecomm_totalvalue: <?php print "$ecomm_price";?>,
675
  };
676
  </script>
677
 
678
  <?php
679
  }
680
  } elseif ($ecomm_pagetype == "cart"){
681
+ // Get the first product from cart and use that product ID
682
+ foreach( WC()->cart->get_cart() as $cart_item ){
683
+ $ecomm_prodid = $cart_item['product_id'];
684
+ break;
685
+ }
686
  ?>
687
  <script type="text/javascript">
688
  var google_tag_params = {
808
  }
809
  add_action('admin_notices', 'woosea_request_review');
810
 
811
+
812
  /**
813
  * Create a seperate MySql table for saving conversion information
814
  */
2290
  }
2291
  add_action( 'wp_ajax_woosea_local_pickup_shipping', 'woosea_local_pickup_shipping' );
2292
 
2293
+ /**
2294
+ * This function enables the setting to remove
2295
+ * free shipping zones
2296
+ */
2297
+ function woosea_remove_free_shipping (){
2298
+ $status = sanitize_text_field($_POST['status']);
2299
+
2300
+ if ($status == "off"){
2301
+ update_option( 'remove_free_shipping', 'no', 'yes');
2302
+ } else {
2303
+ update_option( 'remove_free_shipping', 'yes', 'yes');
2304
+ }
2305
+ }
2306
+ add_action( 'wp_ajax_woosea_remove_free_shipping', 'woosea_remove_free_shipping' );
2307
+
2308
  /**
2309
  * This function enables the setting to use
2310
  * logging
4643
  /**
4644
  * Creates the RSS metabox
4645
  */
4646
+ function woosea_feed_interval( $seconds ) {
4647
+ return 172800; // Cache the feed for 2 days
4648
+ }
4649
+
4650
  function woosea_my_rss_box() {
 
4651
  // Get RSS Feed(s)
4652
  include_once(ABSPATH . WPINC . '/feed.php');
4653
  $domain = $_SERVER['HTTP_HOST'];
4656
  $my_feeds = array(
4657
  'https://www.adtribes.io/feed/'
4658
  );
4659
+
4660
+ add_filter( 'wp_feed_cache_transient_lifetime' , 'woosea_feed_interval' );
4661
 
4662
  // Loop through Feeds
4663
  foreach ( $my_feeds as $feed) :