Product Feed PRO for WooCommerce - Version 10.8.5

Version Description

Fixed the JSON-lD for the brand details

Download this release

Release Info

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

Code changes from version 9.3.7 to 10.8.5

TODO.txt CHANGED
@@ -3,20 +3,27 @@ Missing some features you might like? Drop me a line at support@adtribes.io and
3
 
4
  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
3
 
4
  Tutorial / Blog posts:
5
  - Explain all the different fields/attributes that can be selected from the drop-downs
6
+ - product highlight / details article
7
 
8
  Priority issues:
9
+ - Add automotive fields for Facebook feed, see: https://developers.facebook.com/docs/marketing-api/dynamic-ads-auto/auto-catalog/
10
+ - Autosuggest for category mapping broken
11
+ - Add AddToCart event on buttons again
12
+ - Add Vivino EXTRA fields, see: https://vivino.slab.com/public/posts/9gq0o3dg
13
+ - Local product feed - store code should also work with an attribute and not just static values
14
+ - Add Pinterest Tag; https://help.pinterest.com/nl/business/article/install-the-pinterest-tag
15
  - License key input field needs to be a password field (asterixes)
16
+ - Allow adding multiple pictures to Yandex feeds, see:https://wordpress.org/support/topic/yandex-yml-support/#post-14344829
17
+ - A seperate FB pixel per WPML website / language
18
  - Add a preview option so only 5-10 products are being generated
19
  - Own hosted plugin updating: https://rudrastyh.com/wordpress/self-hosted-plugin-update.html
20
  - Google local product feed inventory in XML format (not just TXT like it is now)
21
  - Add support for Multisites
22
  - Add a filter on review score (and amount of reviews)
23
  - Make extra woosea fields available for front-end usage
 
24
  - Add header to extra fields on product edit pages
25
  - Add possibility to create OR rules
26
  - Add support for Google My Business product feeds
 
27
  - AMAZON integration:
28
  - requires a professional seller account, 39 dollar a month, before being able to create a developer account
29
+ - only then we can use their MWS service needed to connect our plugin
classes/channels/class-bing_shopping_promotions.php ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Settings for Bing Shopping Promotions feeds
4
+ */
5
+ class WooSEA_bing_shopping_promotions {
6
+ public $bing_attributes_promotions;
7
+
8
+ public static function get_channel_attributes() {
9
+ $sitename = get_option('blogname');
10
+
11
+ $bing_attributes_promotions = array(
12
+ "Feed fields" => array(
13
+ "promotion_id" => array(
14
+ "name" => "promotion_id",
15
+ "feed_name" => "promotion_id",
16
+ "format" => "required",
17
+ ),
18
+ "product_applicability" => array(
19
+ "name" => "product_applicability",
20
+ "feed_name" => "product_applicability",
21
+ "format" => "required",
22
+ ),
23
+ "offer_type" => array(
24
+ "name" => "offer_type",
25
+ "feed_name" => "offer_type",
26
+ "format" => "required",
27
+ ),
28
+ "long_title" => array(
29
+ "name" => "long_title",
30
+ "feed_name" => "long_title",
31
+ "format" => "required",
32
+ ),
33
+ "promotion_effective_dates" => array(
34
+ "name" => "promotion_effective_dates",
35
+ "feed_name" => "promotion_effective_dates",
36
+ "format" => "required",
37
+ ),
38
+ "redemption_channel" => array(
39
+ "name" => "redemption_channel",
40
+ "feed_name" => "redemption_channel",
41
+ "format" => "required",
42
+ ),
43
+ "promotional_display_dates" => array(
44
+ "name" => "promotional_display_dates",
45
+ "feed_name" => "promotional_display_dates",
46
+ "format" => "optional",
47
+ ),
48
+ "minimum_purchase_amount" => array(
49
+ "name" => "minimum_purchase_amount",
50
+ "feed_name" => "minimum_purchase_amount",
51
+ "format" => "optional",
52
+ ),
53
+ "generic_redemption_code" => array(
54
+ "name" => "generic_redemption_code",
55
+ "feed_name" => "generic_redemption_code",
56
+ "format" => "optional",
57
+ ),
58
+ ),
59
+ "Structured data attributes" => array(
60
+ "percent_off" => array(
61
+ "name" => "percent_off",
62
+ "feed_name" => "percent_off",
63
+ "format" => "optional",
64
+ ),
65
+ "money_off_amount" => array(
66
+ "name" => "percent_off_amount",
67
+ "feed_name" => "percent_off_amount",
68
+ "format" => "optional",
69
+ ),
70
+ "buy_this_quantity" => array(
71
+ "name" => "buy_this_quantity",
72
+ "feed_name" => "buy_this_quantity",
73
+ "format" => "optional",
74
+ ),
75
+ "get_this_quantity_discounted" => array(
76
+ "name" => "get_this_quantity_discounted",
77
+ "feed_name" => "get_this_quantity_discounted",
78
+ "format" => "optional",
79
+ ),
80
+ "free_shipping" => array(
81
+ "name" => "free_shipping",
82
+ "feed_name" => "free_shipping",
83
+ "format" => "optional",
84
+ ),
85
+ "free_gift_value" => array(
86
+ "name" => "free_gift_value",
87
+ "feed_name" => "free_gift_value",
88
+ "format" => "optional",
89
+ ),
90
+ "free_gift_description" => array(
91
+ "name" => "free_gift_description",
92
+ "feed_name" => "free_gift_description",
93
+ "format" => "optional",
94
+ ),
95
+ "free_gift_item_id" => array(
96
+ "name" => "free_gift_item_id",
97
+ "feed_name" => "free_gift_item_id",
98
+ "format" => "optional",
99
+ ),
100
+ ),
101
+ );
102
+ return $bing_attributes_promotions;
103
+ }
104
+ }
105
+ ?>
classes/channels/class-facebook_drm.php CHANGED
@@ -56,7 +56,7 @@ class WooSEA_facebook_drm {
56
  "name" => "title",
57
  "feed_name" => "g:title",
58
  "format" => "required",
59
- "woo_suggest" => "title",
60
  ),
61
  "price" => array(
62
  "name" => "price",
@@ -79,6 +79,12 @@ class WooSEA_facebook_drm {
79
  "feed_name" => "g:brand",
80
  "format" => "required",
81
  ),
 
 
 
 
 
 
82
  "additional_image_link" => array(
83
  "name" => "additional_image_link",
84
  "feed_name" => "g:additional_image_link",
@@ -116,6 +122,12 @@ class WooSEA_facebook_drm {
116
  "format" => "required",
117
  "woo_suggest" => "categories",
118
  ),
 
 
 
 
 
 
119
  "fb_product_category" => array(
120
  "name" => "fb_product_category",
121
  "feed_name" => "g:fb_product_category",
@@ -271,6 +283,11 @@ class WooSEA_facebook_drm {
271
  "feed_name" => "g:inventory",
272
  "format" => "optional",
273
  ),
 
 
 
 
 
274
  "ingredients" => array(
275
  "name" => "ingredients",
276
  "feed_name" => "g:ingredients",
56
  "name" => "title",
57
  "feed_name" => "g:title",
58
  "format" => "required",
59
+ "woo_suggest" => "mother_title",
60
  ),
61
  "price" => array(
62
  "name" => "price",
79
  "feed_name" => "g:brand",
80
  "format" => "required",
81
  ),
82
+ "identifier exists" => array(
83
+ "name" => "identifier_exists",
84
+ "feed_name" => "g:identifier_exists",
85
+ "woo_suggest" => "calculated",
86
+ "format" => "required",
87
+ ),
88
  "additional_image_link" => array(
89
  "name" => "additional_image_link",
90
  "feed_name" => "g:additional_image_link",
122
  "format" => "required",
123
  "woo_suggest" => "categories",
124
  ),
125
+ "product_type" => array(
126
+ "name" => "product_type",
127
+ "feed_name" => "g:product_type",
128
+ "format" => "required",
129
+ "woo_suggest" => "category_path",
130
+ ),
131
  "fb_product_category" => array(
132
  "name" => "fb_product_category",
133
  "feed_name" => "g:fb_product_category",
283
  "feed_name" => "g:inventory",
284
  "format" => "optional",
285
  ),
286
+ "quantity_to_sell_on_facebook" => array(
287
+ "name" => "quantity_to_sell_on_facebook",
288
+ "feed_name" => "g:quantity_to_sell_on_facebook",
289
+ "format" => "optional",
290
+ ),
291
  "ingredients" => array(
292
  "name" => "ingredients",
293
  "feed_name" => "g:ingredients",
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
@@ -132,8 +132,8 @@ class WooSEA_google_shopping {
132
  "Product type" => array(
133
  "name" => "product_type",
134
  "feed_name" => "g:product_type",
135
- "format" => "optional",
136
- "woo_suggest" => "product_type",
137
  ),
138
  ),
139
  "Product identifiers" => array(
@@ -244,11 +244,6 @@ class WooSEA_google_shopping {
244
  ),
245
  ),
246
  "Shopping campaigns" => array(
247
- "Adwords redirect (old)" => array(
248
- "name" => "adwords_redirect",
249
- "feed_name" => "g:adwords_redirect",
250
- "format" => "optional",
251
- ),
252
  "Ads redirect (new)" => array(
253
  "name" => "ads_redirect",
254
  "feed_name" => "g:ads_redirect",
@@ -309,6 +304,21 @@ class WooSEA_google_shopping {
309
  "feed_name" => "g:ads_labels",
310
  "format" => "optional",
311
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  ),
313
  "Shipping" => array(
314
  "Shipping" => array(
@@ -356,6 +366,16 @@ class WooSEA_google_shopping {
356
  "feed_name" => "g:max_handling_time",
357
  "format" => "optional",
358
  ),
 
 
 
 
 
 
 
 
 
 
359
  ),
360
  "Tax" => array(
361
  "Tax" => array(
@@ -425,6 +445,136 @@ class WooSEA_google_shopping {
425
  "feed_name" => "g:google_funded_promotion_eligibility",
426
  "format" => "optional",
427
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
428
  ),
429
  );
430
  return $google_attributes;
132
  "Product type" => array(
133
  "name" => "product_type",
134
  "feed_name" => "g:product_type",
135
+ "format" => "required",
136
+ "woo_suggest" => "raw_categories",
137
  ),
138
  ),
139
  "Product identifiers" => array(
244
  ),
245
  ),
246
  "Shopping campaigns" => array(
 
 
 
 
 
247
  "Ads redirect (new)" => array(
248
  "name" => "ads_redirect",
249
  "feed_name" => "g:ads_redirect",
304
  "feed_name" => "g:ads_labels",
305
  "format" => "optional",
306
  ),
307
+ "Adwords grouping (BING)" => array(
308
+ "name" => "adwords_grouping",
309
+ "feed_name" => "g:adwords_grouping",
310
+ "format" => "optional",
311
+ ),
312
+ "Adwords labels (BING)" => array(
313
+ "name" => "adwords_labels",
314
+ "feed_name" => "g:adwords_labels",
315
+ "format" => "optional",
316
+ ),
317
+ "Adwords redirect (BING)" => array(
318
+ "name" => "adwords_redirect",
319
+ "feed_name" => "g:adwords_redirect",
320
+ "format" => "optional",
321
+ ),
322
  ),
323
  "Shipping" => array(
324
  "Shipping" => array(
366
  "feed_name" => "g:max_handling_time",
367
  "format" => "optional",
368
  ),
369
+ "Ships from country" => array(
370
+ "name" => "ships_from_country",
371
+ "feed_name" => "g:ships_from_country",
372
+ "format" => "optional",
373
+ ),
374
+ "Region Id" => array(
375
+ "name" => "region_id",
376
+ "feed_name" => "g:region_id",
377
+ "format" => "optional",
378
+ ),
379
  ),
380
  "Tax" => array(
381
  "Tax" => array(
445
  "feed_name" => "g:google_funded_promotion_eligibility",
446
  "format" => "optional",
447
  ),
448
+ "Pickup method" => array(
449
+ "name" => "pickup_method",
450
+ "feed_name" => "g:pickup_method",
451
+ "format" => "optional",
452
+ ),
453
+ "Pickup SLA" => array(
454
+ "name" => "pickup_SLA",
455
+ "feed_name" => "g:pickup_SLA",
456
+ "format" => "optional",
457
+ ),
458
+ "Pickup link template" => array(
459
+ "name" => "pickup_link_template",
460
+ "feed_name" => "g:pickup_link_template",
461
+ "format" => "optional",
462
+ ),
463
+ "Store code" => array(
464
+ "name" => "store_code",
465
+ "feed_name" => "g:store_code",
466
+ "format" => "optional",
467
+ ),
468
+ "Mobile pickup link template" => array(
469
+ "name" => "mobile_pickup_link_template",
470
+ "feed_name" => "g:mobile_pickup_link_template",
471
+ "format" => "optional",
472
+ ),
473
+ "Seller name" => array(
474
+ "name" => "seller_name",
475
+ "feed_name" => "g:seller_name",
476
+ "format" => "optional",
477
+ ),
478
+ "Count" => array(
479
+ "name" => "count",
480
+ "feed_name" => "g:count",
481
+ "format" => "optional",
482
+ ),
483
+ "Disclosure date" => array(
484
+ "name" => "disclosure_date",
485
+ "feed_name" => "g:disclosure_date",
486
+ "format" => "optional",
487
+ ),
488
+ "Feature description" => array(
489
+ "name" => "feature_description",
490
+ "feed_name" => "g:feature_description",
491
+ "format" => "optional",
492
+ ),
493
+ "Flavor" => array(
494
+ "name" => "flavor",
495
+ "feed_name" => "g:flavor",
496
+ "format" => "optional",
497
+ ),
498
+ "Scent" => array(
499
+ "name" => "scent",
500
+ "feed_name" => "g:scent",
501
+ "format" => "optional",
502
+ ),
503
+ "Format" => array(
504
+ "name" => "format",
505
+ "feed_name" => "g:format",
506
+ "format" => "optional",
507
+ ),
508
+ "Product line" => array(
509
+ "name" => "product_line",
510
+ "feed_name" => "g:product_line",
511
+ "format" => "optional",
512
+ ),
513
+ "Product name" => array(
514
+ "name" => "product_name",
515
+ "feed_name" => "g:product_name",
516
+ "format" => "optional",
517
+ ),
518
+ "Product page url" => array(
519
+ "name" => "product_page_url",
520
+ "feed_name" => "g:product_page_url",
521
+ "format" => "optional",
522
+ ),
523
+ "Size system" => array(
524
+ "name" => "size_system",
525
+ "feed_name" => "g:size_system",
526
+ "format" => "optional",
527
+ ),
528
+ "Size type" => array(
529
+ "name" => "size_type",
530
+ "feed_name" => "g:size_type",
531
+ "format" => "optional",
532
+ ),
533
+ "Capacity" => array(
534
+ "name" => "capacity",
535
+ "feed_name" => "g:capacity",
536
+ "format" => "optional",
537
+ ),
538
+ "Suggested retail price" => array(
539
+ "name" => "suggested_retail_price",
540
+ "feed_name" => "g:suggested_retail_price",
541
+ "format" => "optional",
542
+ ),
543
+ "Theme" => array(
544
+ "name" => "theme",
545
+ "feed_name" => "g:theme",
546
+ "format" => "optional",
547
+ ),
548
+ "Video link" => array(
549
+ "name" => "video_link",
550
+ "feed_name" => "g:video_link",
551
+ "format" => "optional",
552
+ ),
553
+ "Display ads ID" => array(
554
+ "name" => "display_ads_id",
555
+ "feed_name" => "g:display_ads_id",
556
+ "format" => "optional",
557
+ ),
558
+ "Display ads Similar ID" => array(
559
+ "name" => "display_ads_similar_id",
560
+ "feed_name" => "g:display_ads_similar_id",
561
+ "format" => "optional",
562
+ ),
563
+ "Display ads Title" => array(
564
+ "name" => "display_ads_title",
565
+ "feed_name" => "g:display_ads_title",
566
+ "format" => "optional",
567
+ ),
568
+ "Display ads Link" => array(
569
+ "name" => "display_ads_link",
570
+ "feed_name" => "g:display_ads_link",
571
+ "format" => "optional",
572
+ ),
573
+ "Display ads Value" => array(
574
+ "name" => "display_ads_value",
575
+ "feed_name" => "g:display_ads_value",
576
+ "format" => "optional",
577
+ ),
578
  ),
579
  );
580
  return $google_attributes;
classes/channels/class-idealo.php ADDED
@@ -0,0 +1,446 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Settings for Idealo feeds
4
+ */
5
+ class WooSEA_idealo {
6
+ public $idealo;
7
+
8
+ public static function get_channel_attributes() {
9
+
10
+ $sitename = get_option('blogname');
11
+
12
+ $idealo = array(
13
+ "Feed fields" => array(
14
+ "SKU" => array(
15
+ "name" => "SKU",
16
+ "feed_name" => "sku",
17
+ "format" => "required",
18
+ "woo_suggest" => "sku",
19
+ ),
20
+ "Brand" => array(
21
+ "name" => "brand",
22
+ "feed_name" => "brand",
23
+ "format" => "required",
24
+ ),
25
+ "Title" => array(
26
+ "name" => "title",
27
+ "feed_name" => "title",
28
+ "format" => "required",
29
+ "woo_suggest" => "title",
30
+ ),
31
+ "CategoryPath" => array(
32
+ "name" => "categoryPath",
33
+ "feed_name" => "categoryPath",
34
+ "format" => "required",
35
+ "woo_suggest" => "category_path",
36
+ ),
37
+ "url" => array(
38
+ "name" => "url",
39
+ "feed_name" => "url",
40
+ "format" => "required",
41
+ "woo_suggest" => "link",
42
+ ),
43
+ "hans" => array(
44
+ "name" => "hans",
45
+ "feed_name" => "hans",
46
+ "format" => "optional",
47
+ ),
48
+ "Description" => array(
49
+ "name" => "description",
50
+ "feed_name" => "description",
51
+ "format" => "required",
52
+ "woo_suggest" => "description",
53
+ ),
54
+ "ImageUrls" => array(
55
+ "name" => "imageUrls",
56
+ "feed_name" => "imageUrls",
57
+ "format" => "optional",
58
+ "woo_suggest" => "image",
59
+ ),
60
+ "eec" => array(
61
+ "name" => "eec",
62
+ "feed_name" => "eec",
63
+ "format" => "optional",
64
+ ),
65
+ "merchantName" => array(
66
+ "name" => "merchantName",
67
+ "feed_name" => "merchantName",
68
+ "format" => "optional",
69
+ ),
70
+ "merchantId" => array(
71
+ "name" => "merchantId",
72
+ "feed_name" => "merchanId",
73
+ "format" => "optional",
74
+ ),
75
+ "price" => array(
76
+ "name" => "price",
77
+ "feed_name" => "price",
78
+ "format" => "required",
79
+ "woo_suggest" => "price",
80
+ ),
81
+ "basePrice" => array(
82
+ "name" => "basePrice",
83
+ "feed_name" => "basePrice",
84
+ "format" => "optional",
85
+ ),
86
+ "formerPrice" => array(
87
+ "name" => "formerPrice",
88
+ "feed_name" => "formerPrice",
89
+ "format" => "optional",
90
+ ),
91
+ "voucherCode" => array(
92
+ "name" => "voucherCode",
93
+ "feed_name" => "voucherCode",
94
+ "format" => "optional",
95
+ ),
96
+ "deposit" => array(
97
+ "name" => "deposit",
98
+ "feed_name" => "deposit",
99
+ "format" => "optional",
100
+ ),
101
+ "deliveryTime" => array(
102
+ "name" => "deliveryTime",
103
+ "feed_name" => "deliveryTime",
104
+ "format" => "optional",
105
+ ),
106
+ "deliveryComment" => array(
107
+ "name" => "deliveryComment",
108
+ "feed_name" => "deliveryComment",
109
+ "format" => "optional",
110
+ ),
111
+ "maxOrderProcessingTime" => array(
112
+ "name" => "maxOrderProcessingTime",
113
+ "feed_name" => "maxOrderProcessingTime",
114
+ "format" => "optional",
115
+ ),
116
+ "freeReturnDays" => array(
117
+ "name" => "freeReturnDays",
118
+ "feed_name" => "freeReturnDays",
119
+ "format" => "optional",
120
+ ),
121
+ "checkout" => array(
122
+ "name" => "checkout",
123
+ "feed_name" => "checkout",
124
+ "format" => "required",
125
+ ),
126
+ "minimumPrice" => array(
127
+ "name" => "minimumPrice",
128
+ "feed_name" => "minimumPrice",
129
+ "format" => "required",
130
+ ),
131
+ "fullfillmentType" => array(
132
+ "name" => "fulfillmentType",
133
+ "feed_name" => "fulfillmentType",
134
+ "format" => "required",
135
+ ),
136
+ "checkoutLimitPerPeriod" => array(
137
+ "name" => "checkoutLimitPerPeriod",
138
+ "feed_name" => "checkoutLimitPerPeriod",
139
+ "format" => "required",
140
+ ),
141
+ "quantityPerOrder" => array(
142
+ "name" => "quantityPerOrder",
143
+ "feed_name" => "quantityPerOrder",
144
+ "format" => "optional",
145
+ ),
146
+ "twoManHandlingFee" => array(
147
+ "name" => "twoManHandlingFee",
148
+ "feed_name" => "twoManHandlingFee",
149
+ "format" => "optional",
150
+ ),
151
+ "disposalFee" => array(
152
+ "name" => "disposalFee",
153
+ "feed_name" => "disposalFee",
154
+ "format" => "optional",
155
+ ),
156
+ "eans" => array(
157
+ "name" => "eans",
158
+ "feed_name" => "eans",
159
+ "format" => "required",
160
+ ),
161
+ "packagingUnit" => array(
162
+ "name" => "packagingUnit",
163
+ "feed_name" => "packagingUnit",
164
+ "format" => "optional",
165
+ ),
166
+ "deliveryCost_ups" => array(
167
+ "name" => "deliveryCost_ups",
168
+ "feed_name" => "deliveryCost_ups",
169
+ "format" => "optional",
170
+ ),
171
+ "deliveryCost_fedex" => array(
172
+ "name" => "deliveryCost_fedex",
173
+ "feed_name" => "deliveryCost_fedex",
174
+ "format" => "optional",
175
+ ),
176
+ "deliveryCost_deutsche_post" => array(
177
+ "name" => "deliveryCost_deutsche_post",
178
+ "feed_name" => "deliveryCost_deutsche_post",
179
+ "format" => "optional",
180
+ ),
181
+ "deliveryCost_dhl" => array(
182
+ "name" => "deliveryCost_dhl",
183
+ "feed_name" => "deliveryCost_dhl",
184
+ "format" => "optional",
185
+ ),
186
+ "deliveryCost_dhl_go_green" => array(
187
+ "name" => "deliveryCost_dhl_go_green",
188
+ "feed_name" => "deliveryCost_dhl_go_green",
189
+ "format" => "optional",
190
+ ),
191
+ "deliveryCost_download" => array(
192
+ "name" => "deliveryCost_download",
193
+ "feed_name" => "deliveryCost_download",
194
+ "format" => "optional",
195
+ ),
196
+ "deliveryCost_dpd" => array(
197
+ "name" => "deliveryCost_dpd",
198
+ "feed_name" => "deliveryCost_dpd",
199
+ "format" => "optional",
200
+ ),
201
+ "deliveryCost_german_express_logistics" => array(
202
+ "name" => "deliveryCost_german_express_logistics",
203
+ "feed_name" => "deliveryCost_german_express_logistics",
204
+ "format" => "optional",
205
+ ),
206
+ "deliveryCost_gls" => array(
207
+ "name" => "deliveryCost_gls",
208
+ "feed_name" => "deliveryCost_gls",
209
+ "format" => "optional",
210
+ ),
211
+ "deliveryCost_gls_think_green" => array(
212
+ "name" => "deliveryCost_gls_think_green",
213
+ "feed_name" => "deliveryCost_gls_think_green",
214
+ "format" => "optional",
215
+ ),
216
+ "deliveryCost_hermes" => array(
217
+ "name" => "deliveryCost_hermes",
218
+ "feed_name" => "deliveryCost_hermes",
219
+ "format" => "optional",
220
+ ),
221
+ "deliveryCost_pick_point" => array(
222
+ "name" => "deliveryCost_pick_points",
223
+ "feed_name" => "deliveryCost_pick_point",
224
+ "format" => "optional",
225
+ ),
226
+ "deliveryCost_spedition" => array(
227
+ "name" => "deliveryCost_spedition",
228
+ "feed_name" => "deliveryCost_spedition",
229
+ "format" => "optional",
230
+ ),
231
+ "deliveryCost_tnt" => array(
232
+ "name" => "deliveryCost_tnt",
233
+ "feed_name" => "deliveryCost_tnt",
234
+ "format" => "optional",
235
+ ),
236
+ "deliveryCost_trans_o_flex" => array(
237
+ "name" => "deliveryCost_trans_o_flex",
238
+ "feed_name" => "deliveryCost_trand_o_flex",
239
+ "format" => "optional",
240
+ ),
241
+ "paymentCosts_credit_card" => array(
242
+ "name" => "paymentCosts_credit_card",
243
+ "feed_name" => "paymentCosts_credit_card",
244
+ "format" => "optional",
245
+ ),
246
+ "paymentCosts_cash_in_advance" => array(
247
+ "name" => "paymentCosts_cash_in_advance",
248
+ "feed_name" => "paymentCosts_cash_in_advance",
249
+ "format" => "optional",
250
+ ),
251
+ "paymentCosts_cash_on_delivery" => array(
252
+ "name" => "paymentCosts_cash_on_delivery",
253
+ "feed_name" => "paymentCosts_cash_on_delivery",
254
+ "format" => "optional",
255
+ ),
256
+ "paymentCosts_paypal" => array(
257
+ "name" => "paymentCosts_paypal",
258
+ "feed_name" => "paymentCosts_paypal",
259
+ "format" => "optional",
260
+ ),
261
+ "paymentCosts_giropay" => array(
262
+ "name" => "paymentCosts_giropay",
263
+ "feed_name" => "paymentCosts_giropay",
264
+ "format" => "optional",
265
+ ),
266
+ "paymentCosts_direct_debit" => array(
267
+ "name" => "paymentCosts_direct_debit",
268
+ "feed_name" => "paymentCosts_direct_debit",
269
+ "format" => "optional",
270
+ ),
271
+ "paymentCosts_google_checkout" => array(
272
+ "name" => "paymentCosts_google_checkout",
273
+ "feed_name" => "paymentCosts_google_checkout",
274
+ "format" => "optional",
275
+ ),
276
+ "paymentCosts_invoice" => array(
277
+ "name" => "paymentCosts_invoice",
278
+ "feed_name" => "paymentCosts_invoice",
279
+ "format" => "optional",
280
+ ),
281
+ "paymentCosts_postal_order" => array(
282
+ "name" => "paymentCosts_postal_order",
283
+ "feed_name" => "paymentCosts_postal_order",
284
+ "format" => "optional",
285
+ ),
286
+ "paymentCosts_paysafecard" => array(
287
+ "name" => "paymentCosts_paysafecard",
288
+ "feed_name" => "paymentCosts_paysafecard",
289
+ "format" => "optional",
290
+ ),
291
+ "paymentCosts_sofortueberweisung" => array(
292
+ "name" => "paymentCosts_sofortueberweisung",
293
+ "feed_name" => "paymentCosts_sofortueberweisung",
294
+ "format" => "optional",
295
+ ),
296
+ "paymentCosts_amazon_payment" => array(
297
+ "name" => "paymentCosts_amazon_payment",
298
+ "feed_name" => "paymentCosts_amazon_payment",
299
+ "format" => "optional",
300
+ ),
301
+ "paymentCosts_electronical_payment_standard" => array(
302
+ "name" => "paymentCosts_electronical_payment_standard",
303
+ "feed_name" => "paymentCosts_electronical_payment_standard",
304
+ "format" => "optional",
305
+ ),
306
+ "paymentCosts_ecotax" => array(
307
+ "name" => "paymentCosts_ecotax",
308
+ "feed_name" => "paymentCosts_ecotax",
309
+ "format" => "optional",
310
+ ),
311
+ "used" => array(
312
+ "name" => "used",
313
+ "feed_name" => "used",
314
+ "format" => "optional",
315
+ ),
316
+ "download" => array(
317
+ "name" => "download",
318
+ "feed_name" => "download",
319
+ "format" => "optional",
320
+ ),
321
+ "replica" => array(
322
+ "name" => "replica",
323
+ "feed_name" => "replica",
324
+ "format" => "optional",
325
+ ),
326
+ "size" => array(
327
+ "name" => "size",
328
+ "feed_name" => "size",
329
+ "format" => "optional",
330
+ ),
331
+ "colour" => array(
332
+ "name" => "colour",
333
+ "feed_name" => "colour",
334
+ "format" => "optional",
335
+ ),
336
+ "gender" => array(
337
+ "name" => "gender",
338
+ "feed_name" => "gender",
339
+ "format" => "optional",
340
+ ),
341
+ "material" => array(
342
+ "name" => "material",
343
+ "feed_name" => "material",
344
+ "format" => "optional",
345
+ ),
346
+ "oens" => array(
347
+ "name" => "oens",
348
+ "feed_name" => "oens",
349
+ "format" => "optional",
350
+ ),
351
+ "kbas" => array(
352
+ "name" => "kbas",
353
+ "feed_name" => "kbas",
354
+ "format" => "optional",
355
+ ),
356
+ "diopter" => array(
357
+ "name" => "diopter",
358
+ "feed_name" => "diopter",
359
+ "format" => "optional",
360
+ ),
361
+ "baseCurve" => array(
362
+ "name" => "baseCurve",
363
+ "feed_name" => "baseCurve",
364
+ "format" => "optional",
365
+ ),
366
+ "diameter" => array(
367
+ "name" => "diameter",
368
+ "feed_name" => "diameter",
369
+ "format" => "optional",
370
+ ),
371
+ "cylinder" => array(
372
+ "name" => "cylinder",
373
+ "feed_name" => "cylinder",
374
+ "format" => "optional",
375
+ ),
376
+ "axis" => array(
377
+ "name" => "axis",
378
+ "feed_name" => "axis",
379
+ "format" => "optional",
380
+ ),
381
+ "addition" => array(
382
+ "name" => "addition",
383
+ "feed_name" => "addition",
384
+ "format" => "optional",
385
+ ),
386
+ "pzns" => array(
387
+ "name" => "pzns",
388
+ "feed_name" => "pzns",
389
+ "format" => "optional",
390
+ ),
391
+ "quantity" => array(
392
+ "name" => "quantity",
393
+ "feed_name" => "quantity",
394
+ "format" => "optional",
395
+ ),
396
+ "fuelEfficiency" => array(
397
+ "name" => "fuelEfficiency",
398
+ "feed_name" => "fuelEfficiency",
399
+ "format" => "optional",
400
+ ),
401
+ "wetGrip" => array(
402
+ "name" => "wetGrip",
403
+ "feed_name" => "wetGrip",
404
+ "format" => "optional",
405
+ ),
406
+ "externalRollingNoise" => array(
407
+ "name" => "externalRollingNoise",
408
+ "feed_name" => "externalRollingNoise",
409
+ "format" => "optional",
410
+ ),
411
+ "rollingNoiseClass" => array(
412
+ "name" => "rollingNoiseClass",
413
+ "feed_name" => "rollingNoiseClass",
414
+ "format" => "optional",
415
+ ),
416
+ "alcoholicContent" => array(
417
+ "name" => "alcoholicContent",
418
+ "feed_name" => "alcoholicConent",
419
+ "format" => "optional",
420
+ ),
421
+ "allergenInformation" => array(
422
+ "name" => "allergenInformation",
423
+ "feed_name" => "allergenInformation",
424
+ "format" => "optional",
425
+ ),
426
+ "countryOfOrigin" => array(
427
+ "name" => "countryOfOrigin",
428
+ "feed_name" => "countryOfOrigin",
429
+ "format" => "optional",
430
+ ),
431
+ "bottler" => array(
432
+ "name" => "bottler",
433
+ "feed_name" => "bottler",
434
+ "format" => "optional",
435
+ ),
436
+ "importer" => array(
437
+ "name" => "importer",
438
+ "feed_name" => "importer",
439
+ "format" => "optional",
440
+ ),
441
+ ),
442
+ );
443
+ return $idealo;
444
+ }
445
+ }
446
+ ?>
classes/channels/class-vivino.php ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Settings for Vivino feeds
4
+ */
5
+ class WooSEA_vivino {
6
+ public $vivino;
7
+
8
+ public static function get_channel_attributes() {
9
+
10
+ $sitename = get_option('blogname');
11
+
12
+ $vivino = array(
13
+ "Feed fields" => array(
14
+ "Product ID" => array(
15
+ "name" => "product-id",
16
+ "feed_name" => "product-id",
17
+ "format" => "required",
18
+ "woo_suggest" => "id"
19
+ ),
20
+ "Product Name" => array(
21
+ "name" => "product-name",
22
+ "feed_name" => "product-name",
23
+ "format" => "required",
24
+ "woo_suggest" => "title",
25
+ ),
26
+ "Price" => array(
27
+ "name" => "price",
28
+ "feed_name" => "price",
29
+ "format" => "required",
30
+ "woo_suggest" => "vivino_price",
31
+ ),
32
+ "Bottle Size" => array(
33
+ "name" => "bottle_size",
34
+ "feed_name" => "bottle_size",
35
+ "format" => "required",
36
+ ),
37
+ "Bottle Quantity" => array(
38
+ "name" => "bottle_quantity",
39
+ "feed_name" => "bottle_quantity",
40
+ "format" => "required",
41
+ ),
42
+ "Inventory Count" => array(
43
+ "name" => "inventory_count",
44
+ "feed_name" => "inventory_count",
45
+ "format" => "required",
46
+ "woo_suggest" => "quantity",
47
+ ),
48
+ "Quantity is minimum" => array(
49
+ "name" => "quantity-is-minimum",
50
+ "feed_name" => "quantity-is-minimum",
51
+ "format" => "required",
52
+ ),
53
+ "Link" => array(
54
+ "name" => "link",
55
+ "feed_name" => "link",
56
+ "format" => "required",
57
+ "woo_suggest" => "link",
58
+ ),
59
+ "Image" => array(
60
+ "name" => "image",
61
+ "feed_name" => "image",
62
+ "format" => "required",
63
+ "woo_suggest" => "image",
64
+ ),
65
+ "Producer" => array(
66
+ "name" => "producer",
67
+ "feed_name" => "producer",
68
+ "format" => "optional",
69
+ ),
70
+ "Wine Name" => array(
71
+ "name" => "wine-name",
72
+ "feed_name" => "wine-name",
73
+ "format" => "optional",
74
+ ),
75
+ "Appellation" => array(
76
+ "name" => "appellation",
77
+ "feed_name" => "appellation",
78
+ "format" => "optional",
79
+ ),
80
+ "Vintage" => array(
81
+ "name" => "vintage",
82
+ "feed_name" => "vintage",
83
+ "format" => "optional",
84
+ ),
85
+ "Country" => array(
86
+ "name" => "country",
87
+ "feed_name" => "country",
88
+ "format" => "optional",
89
+ ),
90
+ "Color" => array(
91
+ "name" => "color",
92
+ "feed_name" => "color",
93
+ "format" => "optional",
94
+ ),
95
+ "EAN" => array(
96
+ "name" => "ean",
97
+ "feed_name" => "ean",
98
+ "format" => "optional",
99
+ ),
100
+ "UPC" => array(
101
+ "name" => "upc",
102
+ "feed_name" => "upc",
103
+ "format" => "optional",
104
+ ),
105
+ "JAN" => array(
106
+ "name" => "jan",
107
+ "feed_name" => "jan",
108
+ "format" => "optional",
109
+ ),
110
+ "Description" => array(
111
+ "name" => "description",
112
+ "feed_name" => "description",
113
+ "format" => "optional",
114
+ ),
115
+ "Alcohol" => array(
116
+ "name" => "alcohol",
117
+ "feed_name" => "alcohol",
118
+ "format" => "optional",
119
+ ),
120
+ "Producer Address" => array(
121
+ "name" => "producer-address",
122
+ "feed_name" => "producer-address",
123
+ "format" => "optional",
124
+ ),
125
+ "Importer Address" => array(
126
+ "name" => "importer-address",
127
+ "feed_name" => "importer-address",
128
+ "format" => "optional",
129
+ ),
130
+ "Varietal" => array(
131
+ "name" => "varietal",
132
+ "feed_name" => "varietal",
133
+ "format" => "optional",
134
+ ),
135
+ "Ageing" => array(
136
+ "name" => "ageing",
137
+ "feed_name" => "ageing",
138
+ "format" => "optional",
139
+ ),
140
+ "Closure" => array(
141
+ "name" => "closure",
142
+ "feed_name" => "closure",
143
+ "format" => "optional",
144
+ ),
145
+ "Production Size Unit" => array(
146
+ "name" => "production-size",
147
+ "feed_name" => "production-size",
148
+ "format" => "optional",
149
+ ),
150
+ "Residual Sugar Unit" => array(
151
+ "name" => "residual-sugar",
152
+ "feed_name" => "residual-sugar",
153
+ "format" => "optional",
154
+ ),
155
+ "Acidity Unit" => array(
156
+ "name" => "acidity",
157
+ "feed_name" => "acidity",
158
+ "format" => "optional",
159
+ ),
160
+ "Ph" => array(
161
+ "name" => "ph",
162
+ "feed_name" => "ph",
163
+ "format" => "optional",
164
+ ),
165
+ "Winemaker" => array(
166
+ "name" => "winemaker",
167
+ "feed_name" => "winemaker",
168
+ "format" => "optional",
169
+ ),
170
+ "Contains Milk Allergens" => array(
171
+ "name" => "contains-milk-allergens",
172
+ "feed_name" => "contains-milk-allergens",
173
+ "format" => "optional",
174
+ ),
175
+ "Contains Egg Allergens" => array(
176
+ "name" => "contains-egg-allergens",
177
+ "feed_name" => "contains-egg-allergens",
178
+ "format" => "optional",
179
+ ),
180
+ "Non Alcoholic" => array(
181
+ "name" => "non-alcoholic",
182
+ "feed_name" => "non-alcoholic",
183
+ "format" => "optional",
184
+ ),
185
+ ),
186
+ );
187
+ return $vivino;
188
+ }
189
+ }
190
+ ?>
classes/class-activate.php CHANGED
@@ -64,7 +64,14 @@ class WooSEA_Activation {
64
  "fields" => "google_shopping",
65
  "taxonomy" => "google_shopping",
66
  "utm_source" => "Bing Shopping",
67
- "type" => "Advertising" ),
 
 
 
 
 
 
 
68
  "Facebook Catalog Feed / Instagram" => array (
69
  "channel_hash" => md5("Facebook Remarketing"),
70
  "name" => "Facebook Catalog Feed / Instagram",
@@ -90,9 +97,16 @@ class WooSEA_Activation {
90
  "channel_hash" => md5("Snapchat Product Catalog"),
91
  "name" => "Snapchat Product Catalog",
92
  "fields" => "snapchat",
93
- "taxonomy" => "none",
94
  "utm_source" => "snapchat",
95
- "type" => "Advertising" ),
 
 
 
 
 
 
 
96
  ),
97
  "Custom Feed" => array (
98
  "Custom Feed" => array (
@@ -432,8 +446,8 @@ class WooSEA_Activation {
432
  "Prisjakt" => array (
433
  "channel_hash" => md5("Prisjakt"),
434
  "name" => "Prisjakt",
435
- "fields" => "customfeed",
436
- "taxonomy" => "none",
437
  "utm_source" => "Prisjakt",
438
  "type" => "Comparison shopping engine" ),
439
  "Hintaseuranta" => array (
@@ -529,7 +543,14 @@ class WooSEA_Activation {
529
  "taxonomy" => "none",
530
  "utm_source" => "LeGuide.fr",
531
  "type" => "Comparison shopping engine" ),
532
- "Priceminister.fr" => array (
 
 
 
 
 
 
 
533
  "channel_hash" => md5("Priceminister.fr"),
534
  "name" => "Priceminister.fr",
535
  "fields" => "customfeed",
@@ -740,7 +761,7 @@ class WooSEA_Activation {
740
  "Idealo.de" => array (
741
  "channel_hash" => md5("Idealo.de"),
742
  "name" => "Idealo.de",
743
- "fields" => "customfeed",
744
  "taxonomy" => "none",
745
  "utm_source" => "Idealo.de",
746
  "type" => "Comparison shopping engine" ),
@@ -1112,6 +1133,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",
@@ -1226,8 +1254,8 @@ class WooSEA_Activation {
1226
  "Prisjakt" => array (
1227
  "channel_hash" => md5("Prisjakt.no"),
1228
  "name" => "Prisjakt.no",
1229
- "fields" => "customfeed",
1230
- "taxonomy" => "none",
1231
  "utm_source" => "Prisjakt.no",
1232
  "type" => "Comparison shopping engine" ),
1233
  ),
@@ -1321,8 +1349,7 @@ class WooSEA_Activation {
1321
  "fields" => "compari_ro",
1322
  "taxonomy" => "none",
1323
  "utm_source" => "Compari.ro",
1324
- "type" => "Comparison shopping engine" ),
1325
-
1326
  ),
1327
  "Russian Federation" => array (
1328
  "Yandex" => array (
@@ -1455,8 +1482,8 @@ class WooSEA_Activation {
1455
  "Prisjakt" => array (
1456
  "channel_hash" => md5("Prisjakt.se"),
1457
  "name" => "Prisjakt.se",
1458
- "fields" => "customfeed",
1459
- "taxonomy" => "none",
1460
  "utm_source" => "Pricerunner.se",
1461
  "type" => "Comparison shopping engine" ),
1462
  ),
64
  "fields" => "google_shopping",
65
  "taxonomy" => "google_shopping",
66
  "utm_source" => "Bing Shopping",
67
+ "type" => "Advertising" ),
68
+ "Bing Shopping Promotions" => array (
69
+ "channel_hash" => md5("Bing Shopping Promotions"),
70
+ "name" => "Bing Shopping Promotions",
71
+ "fields" => "google_shopping_promotions",
72
+ "taxonomy" => "google_shopping_promotions",
73
+ "utm_source" => "Bing Shopping Promotions",
74
+ "type" => "Advertising" ),
75
  "Facebook Catalog Feed / Instagram" => array (
76
  "channel_hash" => md5("Facebook Remarketing"),
77
  "name" => "Facebook Catalog Feed / Instagram",
97
  "channel_hash" => md5("Snapchat Product Catalog"),
98
  "name" => "Snapchat Product Catalog",
99
  "fields" => "snapchat",
100
+ "taxonomy" => "google_shopping",
101
  "utm_source" => "snapchat",
102
+ "type" => "Advertising" ),
103
+ "Vivino" => array (
104
+ "channel_hash" => md5("Vivino"),
105
+ "name" => "Vivino",
106
+ "fields" => "vivino",
107
+ "taxonomy" => "none",
108
+ "utm_source" => "Vivino",
109
+ "type" => "Advertising" ),
110
  ),
111
  "Custom Feed" => array (
112
  "Custom Feed" => array (
446
  "Prisjakt" => array (
447
  "channel_hash" => md5("Prisjakt"),
448
  "name" => "Prisjakt",
449
+ "fields" => "google_shopping",
450
+ "taxonomy" => "google_shopping",
451
  "utm_source" => "Prisjakt",
452
  "type" => "Comparison shopping engine" ),
453
  "Hintaseuranta" => array (
543
  "taxonomy" => "none",
544
  "utm_source" => "LeGuide.fr",
545
  "type" => "Comparison shopping engine" ),
546
+ "Miinto" => array (
547
+ "channel_hash" => md5("Miinto.fr"),
548
+ "name" => "Miinto.fr",
549
+ "fields" => "miinto_fr",
550
+ "taxonomy" => "none",
551
+ "utm_source" => "Miinto.fr",
552
+ "type" => "Comparison shopping engine" ),
553
+ "Priceminister.fr" => array (
554
  "channel_hash" => md5("Priceminister.fr"),
555
  "name" => "Priceminister.fr",
556
  "fields" => "customfeed",
761
  "Idealo.de" => array (
762
  "channel_hash" => md5("Idealo.de"),
763
  "name" => "Idealo.de",
764
+ "fields" => "idealo",
765
  "taxonomy" => "none",
766
  "utm_source" => "Idealo.de",
767
  "type" => "Comparison shopping engine" ),
1133
  "taxonomy" => "none",
1134
  "utm_source" => "Tweakers.nl",
1135
  "type" => "Comparison shopping engine" ),
1136
+ "Boetiek.nl" => array (
1137
+ "channel_hash" => md5("Boetiek.nl"),
1138
+ "name" => "Boetiek.nl",
1139
+ "fields" => "boetiek",
1140
+ "taxonomy" => "none",
1141
+ "utm_source" => "Boetiek.nl",
1142
+ "type" => "Comparison shopping engine" ),
1143
  "Fashionchick.nl" => array (
1144
  "channel_hash" => md5("Fashionchick.nl"),
1145
  "name" => "Fashionchick.nl",
1254
  "Prisjakt" => array (
1255
  "channel_hash" => md5("Prisjakt.no"),
1256
  "name" => "Prisjakt.no",
1257
+ "fields" => "google_shopping",
1258
+ "taxonomy" => "google_shopping",
1259
  "utm_source" => "Prisjakt.no",
1260
  "type" => "Comparison shopping engine" ),
1261
  ),
1349
  "fields" => "compari_ro",
1350
  "taxonomy" => "none",
1351
  "utm_source" => "Compari.ro",
1352
+ "type" => "Comparison shopping engine" ),
 
1353
  ),
1354
  "Russian Federation" => array (
1355
  "Yandex" => array (
1482
  "Prisjakt" => array (
1483
  "channel_hash" => md5("Prisjakt.se"),
1484
  "name" => "Prisjakt.se",
1485
+ "fields" => "google_shopping",
1486
+ "taxonomy" => "google_shopping",
1487
  "utm_source" => "Pricerunner.se",
1488
  "type" => "Comparison shopping engine" ),
1489
  ),
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
 
@@ -205,13 +205,17 @@ public function get_mapping_attributes_dropdown() {
205
  "sku_item_group_id" => "SKU_ITEM_GROUP_ID (Facebook)",
206
  "wc_post_id_product_id" => "Wc_post_id_product_id (Facebook)",
207
  "title" => "Product name",
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",
@@ -235,8 +239,13 @@ public function get_mapping_attributes_dropdown() {
235
  "vivino_sale_price" => "Pinterest / Vivino sale price",
236
  "vivino_regular_price" => "Pinterest / Vivino regular price",
237
  "non_geo_wcml_price" => "Non GEO WCML price",
 
 
 
 
238
  "discount_percentage" => "Discount percentage",
239
  "link" => "Link",
 
240
  "variable_link" => "Product variable link",
241
  "add_to_cart_link" => "Add to cart link",
242
  "product_creation_date" => "Product creation date",
@@ -247,9 +256,20 @@ 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]",
254
  "product_type" => "Product Type",
255
  "content_type" => "Content Type",
@@ -267,7 +287,9 @@ 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 +372,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
 
@@ -398,15 +421,20 @@ public function get_mapping_attributes_dropdown() {
398
  "parent_sku" => "SKU parent variable product",
399
  "sku_item_group_id" => "SKU_ITEM_GROUP_ID (Facebook)",
400
  "wc_post_id_product_id" => "Wc_post_id_product_id (Facebook)",
401
- "title" => "Product name",
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,10 +457,21 @@ 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]",
 
 
 
436
  "price" => "Price",
437
  "regular_price" => "Regular price",
438
  "sale_price" => "Sale price",
@@ -456,7 +495,11 @@ public function get_mapping_attributes_dropdown() {
456
  "vivino_sale_price" => "Pinterest / Vivino sale price",
457
  "vivino_regular_price" => "Pinterest / Vivino regular price",
458
  "non_geo_wcml_price" => "Non GEO WCML price",
459
- "discount_percentage" => "Discount percentage",
 
 
 
 
460
  "item_group_id" => "Item group ID",
461
  "weight" => "Weight",
462
  "width" => "Width",
@@ -464,7 +507,9 @@ 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
 
205
  "sku_item_group_id" => "SKU_ITEM_GROUP_ID (Facebook)",
206
  "wc_post_id_product_id" => "Wc_post_id_product_id (Facebook)",
207
  "title" => "Product name",
 
208
  "title_hyphen" => "Product name hyphen",
209
+ "mother_title" => "Product name parent product",
210
+ "mother_title_hyphen" => "Product name parent product hyphen",
211
  "title_lc" => "Product name lowercase",
212
+ "title_lcw" => "Product name uppercase first characters",
213
  "description" => "Product description",
214
  "short_description" => "Product short description",
215
  "raw_description" => "Unfiltered product description",
216
  "raw_short_description" => "Unfiltered product short description",
217
+ "mother_description" => "Product description parent product",
218
+ "mother_short_description" => "Product short description parent product",
219
  "price" => "Price",
220
  "regular_price" => "Regular price",
221
  "sale_price" => "Sale price",
239
  "vivino_sale_price" => "Pinterest / Vivino sale price",
240
  "vivino_regular_price" => "Pinterest / Vivino regular price",
241
  "non_geo_wcml_price" => "Non GEO WCML price",
242
+ "mm_min_price" => "Mix & Match minimum price",
243
+ "mm_min_regular_price" => "Mix & Match minimum regular price",
244
+ "mm_max_price" => "Mix & Match maximum price",
245
+ "mm_max_regular_price" => "Mix & Match maximum regular price",
246
  "discount_percentage" => "Discount percentage",
247
  "link" => "Link",
248
+ "link_no_tracking" => "Link without parameters",
249
  "variable_link" => "Product variable link",
250
  "add_to_cart_link" => "Add to cart link",
251
  "product_creation_date" => "Product creation date",
256
  "category_path" => "Category path",
257
  "category_path_short" => "Category path short",
258
  "category_path_skroutz" => "Category path Skroutz",
259
+ "one_category" => "Yoast / Rankmath primary category",
260
+ "nr_variations" => "Number of variations",
261
+ "nr_variations_stock" => "Number of variations on stock",
262
+ "yoast_gtin8" => "Yoast WooCommerce GTIN8",
263
+ "yoast_gtin12" => "Yoast WooCommerce GTIN12",
264
+ "yoast_gtin13" => "Yoast WooCommerce GTIN13",
265
+ "yoast_gtin14" => "Yoast WooCommerce GTIN14",
266
+ "yoast_isbn" => "Yoast WooCommerce ISBN",
267
+ "yoast_mpn" => "Yoast WooCommerce MPN",
268
  "condition" => "Condition",
269
+ "purchase_note" => "Purchase note",
270
+ "availability" => "Availability",
271
+ "region_id" => "Region Id",
272
+ "stock_status" => "Stock Status WooCommerce",
273
  "quantity" => "Quantity [Stock]",
274
  "product_type" => "Product Type",
275
  "content_type" => "Content Type",
287
  "length" => "Length",
288
  "shipping" => "Shipping",
289
  "shipping_price" => "Shipping cost",
290
+ "lowest_shipping_costs" => "Lowest shipping costs",
291
+ "shipping_label" => "Shipping class slug",
292
+ "shipping_label_name" => "Shipping class name",
293
  "visibility" => "Visibility",
294
  "rating_total" => "Total rating",
295
  "rating_average" => "Average rating",
372
 
373
  foreach ($custom_attributes as $key => $value) {
374
  if (!preg_match("/pyre|sbg|fusion/i",$value)){
375
+ $value = ltrim($value);
376
+ if (!empty($value)){
377
  $dropdown .= "<option value='$key'>" . ucfirst($value) . "</option>";
378
+ }
379
  }
380
  }
381
 
421
  "parent_sku" => "SKU parent variable product",
422
  "sku_item_group_id" => "SKU_ITEM_GROUP_ID (Facebook)",
423
  "wc_post_id_product_id" => "Wc_post_id_product_id (Facebook)",
424
+ "title" => "Product name",
425
+ "title_hyphen" => "Product name hyphen",
426
+ "mother_title" => "Product name parent product",
427
+ "mother_title_hyphen" => "Product name parent product hyphen",
428
  "title_lc" => "Product name lowercase",
429
+ "title_lcw" => "Product name uppercase first characters",
430
  "description" => "Product description",
431
  "short_description" => "Product short description",
432
  "raw_description" => "Unfiltered product description",
433
  "raw_short_description" => "Unfiltered product short description",
434
+ "mother_description" => "Product description parent product",
435
+ "mother_short_description" => "Product short description parent product",
436
+ "link" => "Link",
437
+ "link_no_tracking" => "Link without parameters",
438
  "variable_link" => "Product variable link",
439
  "add_to_cart_link" => "Add to cart link",
440
  "image" => "Main image",
457
  "category_path" => "Category path",
458
  "category_path_short" => "Category path short",
459
  "category_path_skroutz" => "Category path Skroutz",
460
+ "one_category" => "Yoast / Rankmath primary category",
461
+ "nr_variations" => "Number of variations",
462
+ "nr_variations_stock" => "Number of variations on stock",
463
+ "yoast_gtin8" => "Yoast WooCommerce GTIN8",
464
+ "yoast_gtin12" => "Yoast WooCommerce GTIN12",
465
+ "yoast_gtin13" => "Yoast WooCommerce GTIN13",
466
+ "yoast_gtin14" => "Yoast WooCommerce GTIN14",
467
+ "yoast_isbn" => "Yoast WooCommerce ISBN",
468
+ "yoast_mpn" => "Yoast WooCommerce MPN",
469
  "condition" => "Condition",
470
+ "purchase_note" => "Purchase note",
471
+ "availability" => "Availability",
472
+ "region_id" => "Region Id",
473
+ "stock_status" => "Stock Status WooCommerce",
474
+ "quantity" => "Quantity [Stock]",
475
  "price" => "Price",
476
  "regular_price" => "Regular price",
477
  "sale_price" => "Sale price",
495
  "vivino_sale_price" => "Pinterest / Vivino sale price",
496
  "vivino_regular_price" => "Pinterest / Vivino regular price",
497
  "non_geo_wcml_price" => "Non GEO WCML price",
498
+ "mm_min_price" => "Mix & Match minimum price",
499
+ "mm_min_regular_price" => "Mix & Match minimum regular price",
500
+ "mm_max_price" => "Mix & Match maximum price",
501
+ "mm_max_regular_price" => "Mix & Match maximum regular price",
502
+ "discount_percentage" => "Discount percentage",
503
  "item_group_id" => "Item group ID",
504
  "weight" => "Weight",
505
  "width" => "Width",
507
  "length" => "Length",
508
  "shipping" => "Shipping",
509
  "shipping_price" => "Shipping cost",
510
+ "lowest_shipping_costs" => "Lowest shipping costs",
511
+ "shipping_label" => "Shipping class slug",
512
+ "shipping_label_name" => "Shipping class name",
513
  "visibility" => "Visibility",
514
  "rating_total" => "Total rating",
515
  "rating_average" => "Average rating",
classes/class-get-products.php CHANGED
@@ -23,10 +23,11 @@ class WooSEA_Get_Products {
23
  * Function to add CDATA brackets to title, short_description and description attributes
24
  */
25
  protected function woosea_append_cdata( $string ){
26
- return "<![CDATA[ $string ]]>";
 
 
27
  }
28
 
29
-
30
  /**
31
  * Check if a plugin is active
32
  */
@@ -57,6 +58,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
 
@@ -73,54 +79,62 @@ class WooSEA_Get_Products {
73
 
74
  // Loop through all product reviews for this specific products (ternary operators)
75
  foreach($reviews as $review_raw){
76
- $review = array();
77
- $review['review_reviewer_image'] = empty($product_data['reviewer_image']) ? '' : $product_data['reviewer_image'];
78
- $review['review_ratings'] = get_comment_meta( $review_raw->comment_ID, 'rating', true);
79
- $review['review_id'] = $review_raw->comment_ID;
80
-
81
- // Names need to be anonomyzed
82
- $name_pieces = explode(" ", $review_raw->comment_author);
83
- $nr_name_pieces = count($name_pieces);
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++;
92
- }
93
 
94
- // Remove strange charachters from reviewer name
95
- $review['reviewer_name'] = $this->rip_tags(trim(ucfirst($name)));
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;
103
-
104
- // Remove strange characters from review title
105
- $review['title'] = empty($product_data['title']) ? '' : $product_data['title'];
106
- $review['title'] = $this->rip_tags($review['title']);
107
- $review['title'] = html_entity_decode((str_replace("\r", "", $review['title'])), ENT_QUOTES | ENT_XML1, 'UTF-8');
108
- $review['title'] = preg_replace( '/\[(.*?)\]/', ' ', $review['title'] );
109
- $review['title'] = str_replace("&#xa0;", "", $review['title']);
110
- $review['title'] = $this->woosea_utf8_for_xml( $review['title'] );
111
-
112
- // Remove strange charchters from review content
113
- $review['content'] = $review_raw->comment_content;
114
- $review['content'] = $this->rip_tags($review['content']);
115
- $review['content'] = html_entity_decode((str_replace("\r", "", $review['content'])), ENT_QUOTES | ENT_XML1, 'UTF-8');
116
- $review['content'] = preg_replace( '/\[(.*?)\]/', ' ', $review['content'] );
117
- $review['content'] = str_replace("&#xa0;", "", $review['content']);
118
- $review['content'] = $this->woosea_utf8_for_xml( $review['content'] );
119
-
120
- $review['review_product_name'] = $product_data['title'];
121
- $review['review_url'] = $product_data['link'];
122
- $review['review_product_url'] = $product_data['link'];
123
- array_push($approved_reviews, $review);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  }
125
  $review_count = $product->get_review_count();
126
  $review_average = $product->get_average_rating();
@@ -174,7 +188,7 @@ class WooSEA_Get_Products {
174
  if($feed_config['fields'] == "google_drm"){
175
  $utm_part .= "&$key=$value";
176
  } else {
177
- $utm_part .= "&amp;$key=$value";
178
  }
179
  }
180
 
@@ -200,7 +214,7 @@ class WooSEA_Get_Products {
200
  if($parentId > 0){
201
  # Even though variation products always have parameters in the URL we still need to check and make sure they are there
202
  if(strpos($link, '?') !== false){
203
- $utm_part = "&amp;".ltrim($utm_part, '&amp;');
204
  } else {
205
  $utm_part = "?".ltrim($utm_part, '&amp;');
206
  }
@@ -248,21 +262,43 @@ class WooSEA_Get_Products {
248
  $data = $wpdb->get_results($sql);
249
 
250
  if (count($data)) {
251
-
252
  foreach ($data as $key => $value) {
253
  $value_display = str_replace("_", " ",$value->name);
254
- if (!preg_match("/_product_attributes/i",$value->name)){
255
  $list[$value->name] = ucfirst($value_display);
256
- } else {
257
- $product_attr = unserialize($value->type);
258
- if(!empty($product_attr)){
259
- foreach ($product_attr as $key_inner => $arr_value) {
260
- $value_display = @str_replace("_", " ",$arr_value['name']);
261
- $list[$key_inner] = ucfirst($value_display);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
  }
263
  }
264
  }
265
- }
266
  return $list;
267
  }
268
  return false;
@@ -324,7 +360,7 @@ class WooSEA_Get_Products {
324
  /**
325
  * Get category path (needed for Prisjakt)
326
  */
327
- public function woosea_get_term_parents( $id, $taxonomy, $link = false, $project_taxonomy, $nicename = false, $visited = array() ) {
328
  // Only add Home to the beginning of the chain when we start buildin the chain
329
  if(empty($visited)){
330
  $chain = 'Home';
@@ -363,6 +399,15 @@ class WooSEA_Get_Products {
363
  return $chain;
364
  }
365
 
 
 
 
 
 
 
 
 
 
366
  /**
367
  * Get all configured shipping zones
368
  */
@@ -652,8 +697,8 @@ class WooSEA_Get_Products {
652
  /**
653
  * Get shipping cost for product
654
  */
655
- public function woosea_get_shipping_cost ($class_cost_id, $project_config, $price, $tax_rates, $shipping_zones, $product_id, $item_group_id) {
656
- $shipping_cost = 0;
657
  $shipping_arr = array();
658
  $zone_count = 0;
659
  $nr_shipping_zones = count($shipping_zones);
@@ -712,6 +757,8 @@ class WooSEA_Get_Products {
712
  $shipping_methods = $zone['shipping_methods'];
713
 
714
  foreach ($shipping_methods as $k => $v){
 
 
715
 
716
  if($v->enabled == "yes"){
717
  if(empty($zone_details['country'])){
@@ -721,55 +768,57 @@ class WooSEA_Get_Products {
721
  }
722
  $taxable = $v->tax_status;
723
 
724
- if(isset($v->instance_settings['cost'])){
725
- $shipping_cost = $v->instance_settings['cost'];
726
- if(!$shipping_cost){
727
- $shipping_cost = 0;
728
- }
729
 
730
- // Do we need to convert the shipping costs with the Aelia Currency Switcher
731
- if((isset($project_config['AELIA'])) AND (!empty($GLOBALS['woocommerce-aelia-currencyswitcher'])) AND (get_option ('add_aelia_support') == "yes")){
 
 
732
 
733
- if(!array_key_exists('base_currency', $project_config)){
734
- $from_currency = get_woocommerce_currency();
735
- } else {
736
- $from_currency = $project_config['base_currency'];
737
- }
738
-
739
- // Get Aelia currency conversion prices
740
- $shipping_cost = apply_filters('wc_aelia_cs_convert', $shipping_cost, $from_currency, $project_config['AELIA']);
741
- }
742
 
743
- if($taxable == "taxable"){
744
- foreach ($tax_rates as $k_inner => $w){
745
- if((isset($w['shipping'])) and ($w['shipping'] == "yes")){
746
- $rate = (($w['rate']+100)/100);
747
 
748
- $shipping_cost = str_replace(",", ".", $shipping_cost);
749
- $shipping_cost = $shipping_cost*$rate;
750
- $shipping_cost = round($shipping_cost, 2);
751
- $shipping_cost = wc_format_localized_price($shipping_cost);
 
752
  }
753
  }
754
  }
755
- }
756
-
757
- // WooCommerce Table Rate Bolder Elements
758
- if($this->woosea_is_plugin_active( 'woocommerce-table-rate-shipping/woocommerce-table-rate-shipping.php' )) {
759
- // Set shipping cost
760
- $shipping_cost = 0;
761
- if(!empty($product_id)){
762
- // Add product to cart
763
- if ((isset($product_id)) AND ($product_id > 0)){
764
- $quantity = 1;
765
- if(!empty($code_from_config)){
766
- defined( 'WC_ABSPATH' ) || exit;
767
-
768
- // Load cart functions which are loaded only on the front-end.
769
- include_once WC_ABSPATH . 'includes/wc-cart-functions.php';
770
- include_once WC_ABSPATH . 'includes/class-wc-cart.php';
771
-
772
- // if ( is_null( WC()->cart ) ) {
773
  wc_load_cart();
774
 
775
  WC()->customer->set_shipping_country( $code_from_config );
@@ -787,17 +836,85 @@ class WooSEA_Get_Products {
787
  // Read cart and get schipping costs
788
  foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
789
  $total_cost = WC()->cart->get_total();
790
- $shipping_cost = WC()->cart->get_shipping_total();
 
 
791
  $shipping_cost = wc_format_localized_price($shipping_cost);
792
-
793
- }
794
  // Make sure to empty the cart again
795
  WC()->cart->empty_cart();
796
- // }
797
- }
798
- }
799
- }
800
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
801
 
802
  // CLASS SHIPPING COSTS
803
  if((isset($v->instance_settings[$class_cost_id])) AND ($class_cost_id != "no_class_cost")){
@@ -931,6 +1048,16 @@ class WooSEA_Get_Products {
931
  unset($shipping_cost);
932
  }
933
  }
 
 
 
 
 
 
 
 
 
 
934
  }
935
 
936
  if(isset($zone_details)){
@@ -948,7 +1075,12 @@ class WooSEA_Get_Products {
948
  }
949
  }
950
  }
951
-
 
 
 
 
 
952
  if(isset($shipping_cost)){
953
  if(strlen($shipping_cost) > 0){
954
  if($project_config['ship_suffix'] == "false"){
@@ -957,12 +1089,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 +1121,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 +1141,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
  }
@@ -1141,20 +1275,24 @@ class WooSEA_Get_Products {
1141
  $link = $product->addChild('g:additional_image_link', $v, $namespace['g']);
1142
  //$product->$k = $v;
1143
  } elseif (preg_match("/g:product_highlight/i",$k)){
 
1144
  $product_highlight = $product->addChild('g:product_highlight', $v, $namespace['g']);
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)){
@@ -1259,6 +1397,9 @@ class WooSEA_Get_Products {
1259
  } elseif ($feed_config['name'] == "Glami.gr") {
1260
  $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><SHOP></SHOP>');
1261
  $xml->asXML($file);
 
 
 
1262
  } elseif ($feed_config['name'] == "Pricecheck.co.za") {
1263
  $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><Offers></Offers>');
1264
  $xml->asXML($file);
@@ -1267,7 +1408,6 @@ class WooSEA_Get_Products {
1267
  $xml->addAttribute('xmlns:content', 'http://purl.org/rss/1.0/modules/content/');
1268
  $xml->addAttribute('xmlns:wfw', 'http://wellformedweb.org/CommentAPI/');
1269
  $xml->addAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/');
1270
- // $xml->addAttribute('xmlns:atom', 'http://www.w3.org/2005/Atom');
1271
  $xml->addAttribute('xmlns:sy', 'http://purl.org/rss/1.0/modules/syndication/');
1272
  $xml->addAttribute('xmlns:slash', 'http://purl.org/rss/1.0/modules/slash/');
1273
  $xml->addAttribute('version', '2.0');
@@ -1317,10 +1457,10 @@ class WooSEA_Get_Products {
1317
  $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><products></products>');
1318
  $xml->addAttribute('version', '1.0');
1319
  $xml->addAttribute('standalone', 'yes');
1320
- $xml->addChild('datetime', date('Y-m-d H:i:s'));
1321
- $xml->addChild('title', htmlspecialchars($feed_config['projectname']));
1322
- $xml->addChild('link', site_url());
1323
- $xml->addChild('description', 'WooCommerce Product Feed PRO - This product feed is created with the free Advanced Product Feed PRO for WooCommerce plugin from AdTribes.io. For all your support questions check out our FAQ on https://www.adtribes.io or e-mail to: support@adtribes.io ');
1324
  $xml->asXML($file);
1325
  }
1326
  } else {
@@ -1355,194 +1495,204 @@ class WooSEA_Get_Products {
1355
 
1356
  // For Google Product review template
1357
  if (($feed_config['name'] == "Google Product Review") AND (empty($xml->channel))) {
1358
- $product = $xml->addChild('reviews');
 
 
1359
 
1360
- foreach ($products as $key => $value){
 
 
1361
 
1362
- $expl = "||";
1363
- if(strpos($value['reviews'], $expl)) {
1364
- $review_data = explode("||", $value['reviews']);
1365
- foreach($review_data as $rk => $rv){
1366
 
1367
- $review_comp = explode(":::", $rv);
1368
- $nr_reviews = count($review_comp);
1369
 
1370
- if($nr_reviews > 1){
1371
- $productz = $xml->reviews->addChild('review');
1372
 
1373
- foreach($review_comp as $rck => $rcv){
1374
- $nodes = explode("##", $rcv);
1375
- $nodes = str_replace("::", "", $nodes);
1376
 
1377
- if($nodes[0] == "REVIEW_RATINGS"){
1378
- // Do nothing
1379
- } elseif($nodes[0] == "REVIEW_URL"){
1380
- $rev_url = $productz->addChild(strtolower($nodes[0]), htmlspecialchars($nodes[1]));
1381
- $rev_url->addAttribute('type', 'singleton');
1382
- } elseif(($nodes[0] == "REVIEWER_NAME") OR ($nodes[0] == "REVIEWER_ID")){
1383
- if(isset($productz->reviewer)){
1384
- if($nodes[0] == "REVIEWER_NAME"){
1385
- $name = $nodes[1];
1386
- if(empty($name)){
1387
- $reviewer->addChild('name','Anonymous');
1388
- $reviewer->name->addAttribute('is_anonymous', 'true');
 
 
 
1389
  } else {
1390
- $reviewer->addChild('name',$name);
 
 
1391
  }
1392
  } else {
1393
- $reviewer->addChild('reviewer_id',$nodes[1]);
1394
- }
1395
- } else {
1396
- $reviewer = $productz->addChild('reviewer');
1397
- if($nodes[0] == "REVIEWER_NAME"){
1398
- $name = $nodes[1];
1399
- if(empty($name)){
1400
- $reviewer->addChild('name','Anonymous');
1401
- $reviewer->name->addAttribute('is_anonymous', 'true');
1402
  } else {
1403
- $reviewer->addChild('name',$name);
 
 
1404
  }
1405
- } else {
1406
- $reviewer->addChild('reviewer_id',$nodes[1]);
1407
  }
1408
- }
1409
- } else {
1410
- if(isset($nodes[1])){
1411
- $content = html_entity_decode($nodes[1]);
1412
- $content = htmlspecialchars($content);
1413
- $rev = $productz->addChild(strtolower($nodes[0]), $content);
1414
  }
1415
  }
1416
- }
1417
 
1418
- foreach($review_comp as $rck => $rcv){
1419
- $nodes = explode("##", $rcv);
1420
- $nodes = str_replace("::", "", $nodes);
1421
 
1422
- if($nodes[0] == "REVIEW_RATINGS"){
1423
- $rev = $productz->addChild('ratings');
1424
- $over = $productz->ratings->addChild('overall', $nodes[1]);
1425
- $over->addAttribute('min', '1');
1426
- $over->addAttribute('max', '5');
 
1427
  }
1428
- }
1429
-
1430
 
1431
- $yo = $productz->addChild('products');
1432
- $po = $yo->addChild('product');
1433
 
1434
- $identifiers = array("gtin","mpn","sku","brand");
1435
 
1436
- // Start determining order of product_ids in the Google review feed
1437
- $proper_order = array("product_name","gtin","mpn","sku","brand","product_url","review_url","reviews");
1438
- $order_sorted = array();
1439
- foreach ($proper_order as &$order_value){
1440
- if(isset($value[$order_value])){
1441
- $order_sorted[$order_value] = $value[$order_value];
 
1442
  }
1443
- }
1444
- // End
1445
-
1446
- foreach($order_sorted as $k => $v) {
1447
- if(($k != "product_name") AND ($k != "product_url")){
1448
- if(!in_array($k, $identifiers)){
1449
- if(($k != "reviews") AND ($k != "review_url")){
1450
- $v = str_replace("&", "and", $v);
1451
- $poa = $po->addChild($k,htmlspecialchars($v));
1452
- }
1453
- } else {
1454
- if(isset($po->product_ids)){
1455
- if ($k == "gtin"){
1456
- $poig = $poi->addChild('gtins');
1457
- $poig->$k = $v;
1458
- } elseif ($k == "mpn"){
1459
- $poim = $poi->addChild('mpns');
1460
- $poim->$k = $v;
1461
- } elseif ($k == "sku"){
1462
- $poix = $poi->addChild('skus');
1463
- $poix->$k = $v;
1464
- } elseif($k == "brand"){
1465
- $poib = $poi->addChild('brands');
1466
- $poib->$k = $v;
1467
- } else {
1468
- // Do nothing
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1469
  }
1470
- } else {
1471
- $poi = $po->addChild('product_ids');
1472
- if ($k == "gtin"){
1473
- $poig = $poi->addChild('gtins');
1474
- $poig->$k = $v;
1475
- } elseif ($k == "mpn"){
1476
- $poim = $poi->addChild('mpns');
1477
- $poim->$k = $v;
1478
- } elseif ($k == "sku"){
1479
- $poix = $poi->addChild('skus');
1480
- $poix->$k = $v;
1481
- } elseif($k == "brand"){
1482
- $poib = $poi->addChild('brands');
1483
- $poib->$k = $v;
1484
- } else {
1485
- // Do nothing
1486
- }
1487
- }
1488
- }
1489
- }
1490
- }
1491
 
1492
- // foreach for product name and product url as order seems to mather to Google
1493
- foreach($value as $k => $v) {
1494
- if(($k == "product_name") OR ($k == "product_url")){
1495
- if(!in_array($k, $identifiers)){
1496
- if(($k != "reviews") AND ($k != "review_url")){
1497
- $v = str_replace("&", "and", $v);
1498
- $poa = $po->addChild($k,htmlspecialchars($v));
1499
- }
1500
- } else {
1501
- if(isset($po->product_ids)){
1502
- if ($k == "gtin"){
1503
- $poig = $poi->addChild('gtins');
1504
- $poig->$k = $v;
1505
- } elseif ($k == "mpn"){
1506
- $poim = $poi->addChild('mpns');
1507
- $poim->$k = $v;
1508
- } elseif($k == "sku"){
1509
- $poix = $poi->addChild('skus');
1510
- $poix->$k = $v;
1511
- } elseif($k == "brand"){
1512
- $poib = $poi->addChild('brands');
1513
- $poib->$k = $v;
1514
- } else {
1515
- // Do nothing
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1516
  }
1517
- } else {
1518
- $poi = $po->addChild('product_ids');
1519
- if ($k == "gtin"){
1520
- $poig = $poi->addChild('gtins');
1521
- $poig->$k = $v;
1522
- } elseif ($k == "mpn"){
1523
- $poim = $poi->addChild('mpns');
1524
- $poim->$k = $v;
1525
- } elseif ($k == "sku"){
1526
- $poix = $poi->addChild('skus');
1527
- $poix->$k = $v;
1528
- } elseif($k == "brand"){
1529
- $poib = $poi->addChild('brands');
1530
- $poib->$k = $v;
1531
- } else {
1532
- // Do nothing
1533
- }
1534
- }
1535
- }
1536
- }
1537
- }
1538
- }
1539
  }
1540
  }
1541
  }
1542
  }
1543
 
1544
  foreach ($products as $key => $value){
1545
-
1546
  if ((is_array ( $value )) and (!empty( $value ))) {
1547
  if ($feed_config['name'] == "Yandex") {
1548
  $product = $xml->shop->offers->addChild('offer');
@@ -1566,7 +1716,9 @@ class WooSEA_Get_Products {
1566
 
1567
  } else {
1568
  if(count($value) > 0){
1569
- $product = $xml->addChild('product');
 
 
1570
  }
1571
  }
1572
 
@@ -1676,11 +1828,10 @@ class WooSEA_Get_Products {
1676
  $product->addChild("$k");
1677
  $product->$k = $v;
1678
  } else {
1679
- if ($feed_config['fields'] != 'standard'){
1680
  $k = $this->get_alternative_key ($channel_attributes, $k);
1681
  }
1682
  if(!empty($k)){
1683
-
1684
  /**
1685
  * Some Zbozi and Heureka attributes need some extra XML nodes
1686
  */
@@ -1715,7 +1866,34 @@ class WooSEA_Get_Products {
1715
  $productp = $product->addChild($p,$v);
1716
  $productp->addAttribute('name', $pieces[1]);
1717
  } elseif ($feed_config['name'] == "Google Product Review") {
 
 
 
1718
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1719
  } elseif ($feed_config['name'] == "Fruugo.nl") {
1720
  $desc_arr = array('Language','Title','Description');
1721
  $price_arr = array('Currency','NormalPriceWithoutVAT','NormalPriceWithVAT','VATRate');
@@ -1747,6 +1925,7 @@ class WooSEA_Get_Products {
1747
  }
1748
 
1749
  if(is_object($xml)){
 
1750
  $xml->asXML($file);
1751
  }
1752
  unset($product);
@@ -1798,7 +1977,7 @@ class WooSEA_Get_Products {
1798
  $channel_attributes = get_option('channel_attributes');
1799
  }
1800
  }
1801
-
1802
  // Append or write to file
1803
  $fp = fopen($file, 'a+');
1804
 
@@ -1815,7 +1994,7 @@ class WooSEA_Get_Products {
1815
  $pieces = str_replace("'", "", $pieces);
1816
 
1817
  foreach ($pieces as $k_inner => $v){
1818
- if ($feed_config['fields'] != 'standard'){
1819
  $v = $this->get_alternative_key ($channel_attributes, $v);
1820
  }
1821
 
@@ -1880,6 +2059,7 @@ class WooSEA_Get_Products {
1880
  fwrite($fp, $tab_line);
1881
  }
1882
  } else {
 
1883
  $tofile = fputcsv($fp, $pieces, $csv_delimiter, '"');
1884
  }
1885
 
@@ -1993,7 +2173,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
 
@@ -2041,6 +2221,33 @@ class WooSEA_Get_Products {
2041
  }
2042
  }
2043
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2044
  // Construct WP query
2045
  $wp_query = array(
2046
  'posts_per_page' => $offset_step_size,
@@ -2048,8 +2255,10 @@ class WooSEA_Get_Products {
2048
  'post_type' => $post_type,
2049
  'post_status' => 'publish',
2050
  'fields' => 'ids',
2051
- 'no_found_rows' => true,
2052
- );
 
 
2053
  $prods = new WP_Query($wp_query);
2054
  $shipping_zones = $this->woosea_get_shipping_zones();
2055
 
@@ -2086,9 +2295,8 @@ class WooSEA_Get_Products {
2086
  if(!in_array($product_data['id'], $allowed_product_orders)){ continue; }
2087
  }
2088
  }
2089
-
2090
  $product_data['title'] = $product->get_title();
2091
- $product_data['title'] = $this->woosea_utf8_for_xml( $product_data['title'] );
2092
  $product_data['mother_title'] = $product->get_title();
2093
  $product_data['mother_title'] = $this->woosea_utf8_for_xml( $product_data['mother_title'] );
2094
  $product_data['title_hyphen'] = $product_data['title'];
@@ -2248,10 +2456,9 @@ class WooSEA_Get_Products {
2248
  // Check if there are mother categories
2249
  if(!empty($product_cat)){
2250
  $category_path = $this->woosea_get_term_parents( $product_cat->term_id, 'product_cat', $link = false, $project_taxonomy = $project_config['taxonomy'], $nicename = false, $visited = array() );
2251
- $category_path_skroutz = preg_replace('/&gt;/', '>', $category_path);
2252
- //$category_path_skroutz = str_replace('&gt;','>',$category_path);
2253
 
2254
- if(!is_object($category_path)){
 
2255
  $product_data['category_path'] = $category_path;
2256
  $product_data['category_path_skroutz'] = $category_path_skroutz;
2257
  $product_data['category_path_skroutz'] = str_replace("Home >","",$product_data['category_path_skroutz']);
@@ -2290,6 +2497,21 @@ class WooSEA_Get_Products {
2290
  }
2291
  }
2292
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2293
  $product_data['category_path_short'] = str_replace("Home &gt;","",$product_data['category_path']);
2294
  $product_data['category_path_short'] = str_replace("&gt;",">",$product_data['category_path_short']);
2295
  $product_data['category_link'] = $catlink;
@@ -2325,6 +2547,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
  */
@@ -2335,6 +2561,7 @@ class WooSEA_Get_Products {
2335
  }
2336
 
2337
  $product_data['link'] = get_permalink( $product_data['id'])."$utm_part";
 
2338
  $variable_link = htmlspecialchars(get_permalink( $product_data['id']));
2339
  $vlink_piece = explode("?", $variable_link);
2340
  $qutm_part = ltrim($utm_part, "&amp;");
@@ -2342,14 +2569,20 @@ class WooSEA_Get_Products {
2342
  $qutm_part = ltrim($qutm_part, "?");
2343
  if($qutm_part){
2344
  $product_data['variable_link'] = $vlink_piece[0]."?".$qutm_part;
 
2345
  } else {
2346
  $product_data['variable_link'] = $vlink_piece[0];
 
2347
  }
2348
 
2349
  $product_data['condition'] = ucfirst( get_post_meta( $product_data['id'], '_woosea_condition', true ) );
 
 
2350
  if(empty($product_data['condition']) || $product_data['condition'] == "Array"){
2351
  $product_data['condition'] = "New";
2352
  }
 
 
2353
  $product_data['availability'] = $this->get_stock( $this->childID );
2354
 
2355
  /**
@@ -2357,18 +2590,33 @@ class WooSEA_Get_Products {
2357
  * availability will always return out of stock, even when the stock quantity > 0
2358
  * Therefor, we need to check the stock_status and overwrite te availability value
2359
  */
2360
- $stock_status = $product->get_stock_status();
 
 
 
 
 
 
2361
  if ($stock_status == "outofstock"){
2362
  $product_data['availability'] = "out of stock";
 
 
 
2363
  } elseif ($stock_status == "onbackorder") {
2364
  $product_data['availability'] = "on backorder";
 
 
 
2365
  } else {
2366
  $product_data['availability'] = "in stock";
 
 
 
2367
  }
2368
 
2369
  $product_data['author'] = get_the_author();
2370
  $product_data['quantity'] = $this->clean_quantity( $this->childID, "_stock" );
2371
- $product_data['visibility'] = $this->get_attribute_value( $this->childID,"_visibility" );
2372
  $product_data['menu_order'] = get_post_field( 'menu_order', $product_data['id'] );
2373
  $product_data['currency'] = get_woocommerce_currency();
2374
  if(isset($project_config['WCML'])){
@@ -2385,10 +2633,38 @@ class WooSEA_Get_Products {
2385
  $product_data['image_all'] = $product_data['image'];
2386
  $product_data['all_images'] = $product_data['image'];
2387
  $product_data['all_gallery_images'] = "";
2388
-
2389
- // For variable products I need to get the product gallery images of the simple mother product
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2390
  if($product_data['item_group_id'] > 0){
2391
  $parent_product = wc_get_product( $product_data['item_group_id'] );
 
2392
  if(is_object($parent_product)){
2393
  $gallery_ids = $parent_product->get_gallery_image_ids();
2394
  $product_data['image_all'] = wp_get_attachment_url($parent_product->get_image_id());
@@ -2414,7 +2690,6 @@ class WooSEA_Get_Products {
2414
  $product_data['all_images'] = ltrim($product_data['all_images'],',');
2415
  $product_data['all_images_kogan'] = preg_replace( '/,/', '|', $product_data['all_images'] );
2416
  $product_data['all_gallery_images'] = ltrim($product_data['all_gallery_images'],',');
2417
- $product_data['product_type'] = $product->get_type();
2418
 
2419
  $product_data['content_type'] = "product";
2420
  if($product_data['product_type'] == "variation"){
@@ -2430,6 +2705,8 @@ class WooSEA_Get_Products {
2430
 
2431
  $product_data['shipping'] = 0;
2432
  $tax_rates = WC_Tax::get_base_tax_rates( $product->get_tax_class() );
 
 
2433
  $shipping_class_id = $product->get_shipping_class_id();
2434
  $shipping_class= $product->get_shipping_class();
2435
 
@@ -2439,6 +2716,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()));
@@ -2448,32 +2729,57 @@ class WooSEA_Get_Products {
2448
  $product_data['regular_price'] = wc_get_price_including_tax($product, array('price'=> $product->get_regular_price()));
2449
  $product_data['regular_price'] = wc_format_decimal($product_data['regular_price'],2);
2450
 
2451
- // Untouched raw system pricing - DO NOT CHANGE THESE
2452
- $product_data['system_net_price'] = round(wc_get_price_excluding_tax( $product ), 2);
2453
- $product_data['system_net_price'] = wc_format_decimal($product_data['system_net_price'],2);
2454
- $product_data['system_regular_price'] = round($product->get_regular_price(),2);
2455
- $product_data['system_regular_price'] = wc_format_decimal($product_data['system_regular_price'],2);
2456
-
2457
- $product_data['system_price'] = wc_get_price_including_tax($product, array('price'=> $product->get_price()));
2458
- $product_data['system_price'] = ($product->get_regular_price()) ? $this->get_product_price($product, $product->get_regular_price()) : '';
2459
- $product_data['system_price'] = wc_format_decimal($product_data['system_price'],2);
2460
-
2461
- $product_data['system_sale_price'] = wc_get_price_excluding_tax($product, array('price'=> $product->get_sale_price()));
2462
- $sale_price = $product_data['system_sale_price'];
2463
- //$product_data['system_sale_price'] = ($product->get_sale_price() != $sale_price) ? $this->get_product_price($product, $sale_price ) : '';
2464
- $product_data['system_sale_price'] = wc_format_decimal($product_data['system_sale_price'],2);
 
 
 
2465
 
2466
- if(!empty($tax_rates)){
2467
 
2468
- foreach ($tax_rates as $tk => $tv){
2469
- if($tv['rate'] > 0){
2470
- $tax_rates[1]['rate'] = $tv['rate'];
2471
- } else {
2472
- $tax_rates[1]['rate'] = 0;
 
 
 
 
 
 
 
 
 
 
 
2473
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
2474
  }
2475
- } else {
2476
- $tax_rates[1]['rate'] = 0;
2477
  }
2478
 
2479
  $fullrate = 100+$tax_rates[1]['rate'];
@@ -2485,6 +2791,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);
@@ -2525,9 +2832,19 @@ class WooSEA_Get_Products {
2525
 
2526
  // Make sure the product ID is not NULL either
2527
  global $woocommerce_wpml;
2528
- if(!is_null($product_data['WCML'])){
2529
- $product_data['non_geo_wcml_price'] = $woocommerce_wpml->multi_currency->prices->get_product_price_in_currency( $product_data['id'], $project_config['WCML'] );
2530
- }
 
 
 
 
 
 
 
 
 
 
2531
 
2532
  // When WCML manual prices have been entered
2533
  if(!is_null($product_data['id'])){
@@ -2541,9 +2858,17 @@ class WooSEA_Get_Products {
2541
  $product_data['regular_price'] = $custom_prices['_regular_price'];
2542
  }
2543
 
2544
- if($custom_prices['_sale_price'] > 0){
2545
- $product_data['sale_price'] = $custom_prices['_sale_price'];
2546
- }
 
 
 
 
 
 
 
 
2547
  }
2548
  }
2549
 
@@ -2557,21 +2882,23 @@ class WooSEA_Get_Products {
2557
  }
2558
  if($product->get_regular_price()){
2559
  $product_data['regular_price_forced'] = round(wc_get_price_excluding_tax($product, array('price'=> $product->get_regular_price())) * (100+$tax_rates[1]['rate'])/100,2);
2560
- $product_data['net_regular_price'] = ($product->get_regular_price()/$fullrate)*100;
2561
- $product_data['net_regular_price'] = round($product_data['net_regular_price'],2);
 
2562
  }
2563
  if($product->get_sale_price()){
2564
  $product_data['sale_price_forced'] = round(wc_get_price_excluding_tax($product, array('price'=> $product->get_sale_price())) * (100+$tax_rates[1]['rate'])/100,2);
2565
- $product_data['net_sale_price'] = ($product->get_sale_price()/$fullrate)*100;
2566
- $product_data['net_sale_price'] = round($product_data['net_sale_price'],2);
2567
-
2568
  // We do not want to have 0 sale price values in the feed
2569
  if($product_data['net_sale_price'] == 0){
2570
  $product_data['net_sale_price'] = "";
2571
  }
2572
  }
2573
- $product_data['net_price'] = round(wc_get_price_excluding_tax( $product ), 2);
2574
-
 
 
2575
  $price = wc_get_price_including_tax($product,array('price'=> $product->get_price()));
2576
  if($product_data['sale_price'] > 0){
2577
  $price = $product_data['sale_price'];
@@ -2581,7 +2908,11 @@ class WooSEA_Get_Products {
2581
  if ($this->woosea_is_plugin_active('woo-discount-rules/woo-discount-rules.php')){
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);
@@ -2690,6 +3021,24 @@ class WooSEA_Get_Products {
2690
  }
2691
  }
2692
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2693
  // Localize the price attributes
2694
  $decimal_separator = wc_get_price_decimal_separator();
2695
  $product_data['price'] = wc_format_localized_price($product_data['price']);
@@ -2697,12 +3046,18 @@ class WooSEA_Get_Products {
2697
  $product_data['sale_price'] = wc_format_localized_price($product_data['sale_price']);
2698
  if($product->get_price()){
2699
  $product_data['price_forced'] = wc_format_localized_price($product_data['price_forced']);
 
 
2700
  }
2701
  if($product->get_regular_price()){
2702
  $product_data['regular_price_forced'] = wc_format_localized_price($product_data['regular_price_forced']);
 
 
2703
  }
2704
  if($product->get_sale_price()){
2705
  $product_data['sale_price_forced'] = wc_format_localized_price($product_data['sale_price_forced']);
 
 
2706
  }
2707
  $product_data['net_price'] = wc_format_localized_price($product_data['net_price']);
2708
 
@@ -2716,34 +3071,66 @@ class WooSEA_Get_Products {
2716
  $product_data['net_sale_price'] = wc_format_localized_price($product_data['net_sale_price']);
2717
  }
2718
 
2719
- $product_data['system_price'] = wc_format_localized_price($product_data['system_price']);
2720
- $product_data['system_net_price'] = wc_format_localized_price($product_data['system_net_price']);
2721
- $product_data['system_regular_price'] = wc_format_localized_price($product_data['system_regular_price']);
2722
- $product_data['system_sale_price'] = wc_format_localized_price($product_data['system_sale_price']);
 
 
 
 
 
 
 
 
 
 
 
2723
 
2724
  // Add rounded price options
2725
- $product_data['rounded_price'] = round($product_data['price']);
2726
- $product_data['rounded_regular_price'] = round($product_data['regular_price']);
2727
- $product_data['rounded_sale_price'] = round($product_data['sale_price']);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2728
 
2729
  // Calculate discount percentage
2730
- if($product_data['sale_price'] > 0){
2731
- $product_data['discount_percentage'] = round(100-(((float)$product_data['sale_price']/(float)$product_data['regular_price'])*100),2);
 
 
 
 
2732
  }
2733
 
2734
  foreach($project_config['attributes'] as $attr_key => $attr_arr){
2735
  if(is_array($attr_arr)){
2736
  if($attr_arr['attribute'] == "g:shipping"){
2737
  if($product_data['price'] > 0){
2738
- $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']);
2739
  $shipping_str = $product_data['shipping'];
2740
  }
2741
  }
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
  }
2749
 
@@ -2751,7 +3138,8 @@ class WooSEA_Get_Products {
2751
  if(!empty($shipping_str)){
2752
  $product_data['shipping_price'] = 0;
2753
  }
2754
- $shipping_arr = $product_data['shipping'];
 
2755
 
2756
  if(is_array($shipping_arr)){
2757
  foreach($shipping_arr as $akey => $arr){
@@ -2759,6 +3147,7 @@ class WooSEA_Get_Products {
2759
  $pieces_ship = explode (" ", $arr['price']);
2760
  if(isset($pieces_ship['1'])){
2761
  $product_data['shipping_price'] = $pieces_ship['1'];
 
2762
  }
2763
  }
2764
 
@@ -2773,6 +3162,28 @@ class WooSEA_Get_Products {
2773
  }
2774
  }
2775
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2776
  // Google Dynamic Remarketing feeds require the English price notation
2777
  if ($project_config['name'] == "Google Remarketing - DRM"){
2778
  $thousand_separator = wc_get_price_thousand_separator();
@@ -2838,7 +3249,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 +3259,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,12 +3273,13 @@ 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
  }
2869
  $product_data[$taxo] = ltrim($product_data[$taxo],',');
2870
  $product_data[$taxo] = rtrim($product_data[$taxo],',');
 
2871
  } else {
2872
  // Simple Skroutz product
2873
  foreach($term_value as $term){
@@ -2910,64 +3322,100 @@ class WooSEA_Get_Products {
2910
  /**
2911
  * Get Custom Attributes for Single, Bundled and Composite products
2912
  */
2913
- if (($product->is_type('simple')) OR ($product->is_type('mix-and-match')) OR ($product->is_type('external')) OR ($product->is_type('bundle')) OR ($product->is_type('composite')) OR ($product_data['product_type'] == "variable") OR ($product_data['product_type'] == "auction") OR ($product->is_type('subscription'))){
2914
  $custom_attributes = $this->get_custom_attributes( $product_data['id'] );
2915
 
2916
- if(!in_array("woosea optimized title", $custom_attributes)){
2917
- $woosea_opt = array (
2918
- "_woosea_optimized_title" => "woosea optimized title",
2919
- );
2920
- $custom_attributes = array_merge($custom_attributes, $woosea_opt);
2921
- }
2922
 
2923
- if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
2924
- $custom_attributes['_aioseop_title'] = "All in one seo pack title";
2925
- $custom_attributes['_aioseop_description'] = "All in one seo pack description";
2926
- }
2927
 
2928
- foreach($custom_attributes as $custom_kk => $custom_vv){
2929
- $custom_value = get_post_meta( $product_data['id'], $custom_kk, true );
2930
- $new_key ="custom_attributes_" . $custom_kk;
2931
-
2932
- // Just to make sure the title is never empty
2933
- if(($custom_kk == "_aioseop_title") && ($custom_value == "")){
2934
- $custom_value = $product_data['title'];
2935
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2936
 
2937
- // Just to make sure the description is never empty
2938
- if(($custom_kk == "_aioseop_description") && ($custom_value == "")){
2939
- $custom_value = $product_data['description'];
2940
- }
2941
 
2942
- // Just to make sure product names are never empty
2943
- if(($custom_kk == "_woosea_optimized_title") && ($custom_value == "")){
2944
- $custom_value = $product_data['title'];
2945
- }
2946
 
2947
- // Just to make sure the condition field is never empty
2948
- if(($custom_kk == "_woosea_condition") && ($custom_value == "")){
2949
- $custom_value = $product_data['condition'];
2950
- }
2951
 
2952
- // Need to clean up the strange price Rightpress is returning
2953
- if ($this->woosea_is_plugin_active('wc-dynamic-pricing-and-discounts/wc-dynamic-pricing-and-discounts.php')){
2954
- if($custom_kk == "rp_wcdpd_price_cache"){
2955
- if((isset($project_config['AELIA'])) AND (!empty($GLOBALS['woocommerce-aelia-currencyswitcher'])) AND (get_option ('add_aelia_support') == "yes")){
2956
- $product_data['price'] = do_shortcode('[aelia_cs_product_price product_id="'.$product_data['id'].'" formatted="0" currency="'.$project_config['AELIA'].'"]');
2957
- $product_data['sale_price'] = apply_filters('wc_aelia_cs_convert', $custom_value['sale_price']['p'], $from_currency, $project_config['AELIA']);
2958
- } else {
2959
- if(array_key_exists("price", $custom_value)){
2960
- $product_data['price'] = $custom_value['price']['p'];
2961
- }
2962
 
2963
- if(array_key_exists("sale_price", $custom_value)){
2964
- $product_data['sale_price'] = $custom_value['sale_price']['p'];
2965
- }
 
2966
  }
2967
  }
 
 
2968
  }
2969
- $product_data[$new_key] = $custom_value;
2970
- }
2971
 
2972
  /**
2973
  * We need to check if this product has individual custom product attributes
@@ -2977,7 +3425,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 +3443,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
 
@@ -3015,9 +3463,6 @@ class WooSEA_Get_Products {
3015
  }
3016
  }
3017
 
3018
- // Get product reviews for Google Product Review Feeds
3019
- // $product_data['reviews'] = $this->woosea_get_reviews( $product_data, $product );
3020
-
3021
  /**
3022
  * Versioned products need a seperate approach
3023
  * Get data for these products based on the mother products item group id
@@ -3028,9 +3473,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
 
@@ -3064,7 +3509,7 @@ class WooSEA_Get_Products {
3064
  if(isset($sz_attribute)){
3065
  $skroutz_size = get_post_meta( $product_data['id'], "attribute_".$sz_attribute, true );
3066
  }
3067
-
3068
  if((!empty($skroutz_color)) AND (!empty($skroutz_size))){
3069
 
3070
  foreach($variations as $kvar => $vvar){
@@ -3106,23 +3551,31 @@ 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
3114
  if( ($product_data['item_group_id'] > 0) AND (is_object(wc_get_product( $product_data['item_group_id']))) AND (($product_data['product_type'] == "variation") OR ($product_data['product_type'] == "subscription_variation"))){
3115
- $mother_product = wc_get_product($product_data['item_group_id']);
3116
- $def_attributes = $mother_product->get_default_attributes();
 
3117
 
3118
  if(isset($project_config['lowest_price_variations'])){
3119
-
3120
  // Determine lowest priced variation
3121
  $variation_min_price = $mother_product->get_variation_price('min');
3122
  $variation_min_price = wc_format_decimal($variation_min_price,2);
3123
  $variation_min_price = wc_format_localized_price($variation_min_price);
 
 
 
 
 
 
 
 
 
 
3124
 
3125
- if($product_data['system_net_price'] == $variation_min_price){
3126
  $variation_pass = "true";
3127
  } else {
3128
  $variation_pass = "false";
@@ -3260,19 +3713,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
@@ -3292,6 +3747,7 @@ class WooSEA_Get_Products {
3292
 
3293
  // Add attribute values to the variation product names to make them unique
3294
  $product_data['title_hyphen'] = $product_data['title']." - ";
 
3295
 
3296
  foreach($variations as $kk => $vv){
3297
  $custom_key = $kk;
@@ -3325,7 +3781,6 @@ class WooSEA_Get_Products {
3325
  /**
3326
  * Get Custom Attributes for this variable product
3327
  */
3328
-
3329
  $custom_attributes = $this->get_custom_attributes( $product_data['id'] );
3330
 
3331
  if(!in_array("woosea optimized title", $custom_attributes)){
@@ -3339,7 +3794,28 @@ class WooSEA_Get_Products {
3339
  $custom_attributes['_aioseop_title'] = "All in one seo pack title";
3340
  $custom_attributes['_aioseop_description'] = "All in one seo pack description";
3341
  }
3342
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3343
  foreach($custom_attributes as $custom_kk => $custom_vv){
3344
  $custom_value = get_post_meta( $product_data['id'], $custom_kk, true );
3345
 
@@ -3371,7 +3847,7 @@ class WooSEA_Get_Products {
3371
  $new_key = str_replace("var","product",$new_key);
3372
  if(!empty( $custom_value )){
3373
  $product_data[$new_key] = $custom_value;
3374
- }
3375
  }
3376
  }
3377
 
@@ -3386,7 +3862,7 @@ class WooSEA_Get_Products {
3386
  $value_display = str_replace("_", " ",$value->name);
3387
  if (preg_match("/_product_attributes/i",$value->name)){
3388
  $product_attr = unserialize($value->type);
3389
- if(!empty($product_attr)){
3390
  foreach ($product_attr as $key => $arr_value) {
3391
  $new_key ="custom_attributes_" . $key;
3392
  $product_data[$new_key] = $arr_value['value'];
@@ -3401,6 +3877,27 @@ class WooSEA_Get_Products {
3401
  */
3402
  $custom_attributes_mother = $this->get_custom_attributes( $product_data['item_group_id'] );
3403
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3404
  foreach($custom_attributes_mother as $custom_kk_m => $custom_value_m){
3405
 
3406
  if(!array_key_exists($custom_kk_m, $product_data)){
@@ -3440,14 +3937,61 @@ 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
 
3446
  /**
3447
  * Get product reviews for Google Product Review Feeds
3448
  */
3449
  $product_data['reviews'] = $this->woosea_get_reviews( $product_data, $product );
3450
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3451
  /**
3452
  * Check if individual products need to be excluded
3453
  */
@@ -3492,6 +4036,10 @@ class WooSEA_Get_Products {
3492
  $product_data = $this->woocommerce_sea_filters( $project_config['rules'], $product_data );
3493
  }
3494
  }
 
 
 
 
3495
 
3496
  // Check if the sale price is effective
3497
  if(isset($product_data['sale_price_start_date'])){
@@ -3513,16 +4061,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
@@ -3535,7 +4086,7 @@ class WooSEA_Get_Products {
3535
  /**
3536
  * And item_group_id is not allowed for simple products, prevent users from adding this to the feedd
3537
  */
3538
- if($product->is_type('simple') OR ($product->is_type('auction'))){
3539
  unset($product_data['item_group_id']);
3540
  }
3541
 
@@ -3549,6 +4100,93 @@ class WooSEA_Get_Products {
3549
  }
3550
  }
3551
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3552
  /**
3553
  * When product has passed the filter rules it can continue with the rest
3554
  */
@@ -3582,7 +4220,7 @@ class WooSEA_Get_Products {
3582
  }
3583
  } else {
3584
  if((strlen($attr_value['mapfrom'])) AND (array_key_exists($attr_value['mapfrom'], $product_data))){
3585
- if(($attr_value['attribute'] == "g:link") OR ($attr_value['attribute'] == "g:link_template") OR ($attr_value['attribute'] == "g:image_link") OR ($attr_value['attribute'] == "link") OR ($attr_value['attribute'] == "Final URL") OR ($attr_value['attribute'] == "SKU")){
3586
  $attr_line = "'".$attr_value['prefix']."".$product_data[$attr_value['mapfrom']]."".$attr_value['suffix']."'";
3587
  } else {
3588
  $attr_line = "'".$attr_value['prefix']. "".$product_data[$attr_value['mapfrom']]."" .$attr_value['suffix']."'";
@@ -3654,7 +4292,7 @@ class WooSEA_Get_Products {
3654
  }
3655
  } else {
3656
  if(strlen($product_data[$attr_value['mapfrom']])){
3657
- if(($attr_value['attribute'] == "g:link") OR ($attr_value['attribute'] == "g:link_template") OR ($attr_value['attribute'] == "g:image_link") OR ($attr_value['attribute'] == "link") OR ($attr_value['attribute'] == "Final URL") OR ($attr_value['attribute'] == "SKU")){
3658
  if(($product_data['product_type'] == "variation") AND (preg_match("/aelia_cs_currency/", $attr_value['suffix']))){
3659
  $attr_value['suffix'] = str_replace("?","&",$attr_value['suffix']);
3660
  $attr_line .= ",'".$attr_value['prefix']."".$product_data[$attr_value['mapfrom']]."".$attr_value['suffix']."'";
@@ -3838,6 +4476,7 @@ class WooSEA_Get_Products {
3838
  $shipping_str .= ":WOOSEA_POSTAL_CODE##$v";
3839
  } elseif ($k == "price"){
3840
  $shipping_str .= ":WOOSEA_PRICE##$attr_value[prefix] $v $attr_value[suffix]";
 
3841
  } else {
3842
  // UNKNOWN, DO NOT ADD
3843
  }
@@ -3874,7 +4513,7 @@ class WooSEA_Get_Products {
3874
  }
3875
  } else {
3876
  if(strlen($product_data[$attr_value['mapfrom']])){
3877
- if(($attr_value['attribute'] == "g:link") OR ($attr_value['attribute'] == "link") OR ($attr_value['attribute'] == "g:link_template")){
3878
  if(($product_data['product_type'] == "variation") AND (preg_match("/aelia_cs_currency/", $attr_value['suffix']))){
3879
  $attr_value['suffix'] = str_replace("?","&",$attr_value['suffix']);
3880
  $xml_product[$attr_value['attribute']] = "$attr_value[prefix]". $product_data[$attr_value['mapfrom']] ."$attr_value[suffix]";
@@ -4144,9 +4783,9 @@ class WooSEA_Get_Products {
4144
  }
4145
  // New policy of Google, only when the value is yes add it to the feed
4146
  // 28 October 2019
4147
- // if($identifier_exists == "yes"){
4148
  $xml_product['g:identifier_exists'] = $identifier_exists;
4149
- //}
4150
  }
4151
  return $xml_product;
4152
  }
@@ -4404,479 +5043,485 @@ 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 +5544,574 @@ 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
  }
23
  * Function to add CDATA brackets to title, short_description and description attributes
24
  */
25
  protected function woosea_append_cdata( $string ){
26
+ if(!empty($string)){
27
+ return "<![CDATA[$string]]>";
28
+ }
29
  }
30
 
 
31
  /**
32
  * Check if a plugin is active
33
  */
58
  * Get all approved product review comments for Google's Product Review Feeds
59
  */
60
  public function woosea_get_reviews ( $product_data, $product ) {
61
+ // Rwviews for the parent variable product itself can be skipped, the review is added for the variation
62
+ if($product_data['product_type'] == "variable"){
63
+ return;
64
+ }
65
+
66
  $approved_reviews = array();
67
  $prod_id = $product_data['id'];
68
 
79
 
80
  // Loop through all product reviews for this specific products (ternary operators)
81
  foreach($reviews as $review_raw){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
83
+ // Only reviews that are approved will make it to the feed
84
+ if($review_raw->comment_approved == 1){
85
+
86
+ $review = array();
87
+ $review['review_reviewer_image'] = empty($product_data['reviewer_image']) ? '' : $product_data['reviewer_image'];
88
+ $review['review_ratings'] = get_comment_meta( $review_raw->comment_ID, 'rating', true);
89
+ $review['review_id'] = $review_raw->comment_ID;
90
+
91
+ // Names need to be anonomyzed
92
+ $name_pieces = explode(" ", $review_raw->comment_author);
93
+ $nr_name_pieces = count($name_pieces);
94
+ $cnt = 0;
95
+ $name = "";
96
+ foreach($name_pieces as $n_piece){
97
+ $n_piece = str_replace("&amp;", "", $n_piece);
98
+
99
+ if($cnt > 0){
100
+ $n_piece = ucfirst(substr($n_piece, 0, 1));
101
+ }
102
+ $name .= $n_piece." ";
103
+ $cnt++;
104
+ }
105
+
106
+ // Remove strange charachters from reviewer name
107
+ $review['reviewer_name'] = $this->rip_tags(trim(ucfirst($name)));
108
+ $review['reviewer_name'] = html_entity_decode((str_replace("\r", "", $review['reviewer_name'])), ENT_QUOTES | ENT_XML1, 'UTF-8');
109
+ $review['reviewer_name'] = preg_replace( '/\[(.*?)\]/', ' ', $review['reviewer_name'] );
110
+ $review['reviewer_name'] = str_replace("&#xa0;", "", $review['reviewer_name']);
111
+ $review['reviewer_name'] = str_replace(":", "", $review['reviewer_name']);
112
+ $review['reviewer_name'] = $this->woosea_utf8_for_xml( $review['reviewer_name'] );
113
+
114
+ $review['reviewer_id'] = $review_raw->user_id;
115
+ $review['review_timestamp'] = $review_raw->comment_date;
116
+
117
+ // Remove strange characters from review title
118
+ $review['title'] = empty($product_data['title']) ? '' : $product_data['title'];
119
+ $review['title'] = $this->rip_tags($review['title']);
120
+ $review['title'] = html_entity_decode((str_replace("\r", "", $review['title'])), ENT_QUOTES | ENT_XML1, 'UTF-8');
121
+ $review['title'] = preg_replace( '/\[(.*?)\]/', ' ', $review['title'] );
122
+ $review['title'] = str_replace("&#xa0;", "", $review['title']);
123
+ $review['title'] = $this->woosea_utf8_for_xml( $review['title'] );
124
+
125
+ // Remove strange charchters from review content
126
+ $review['content'] = $review_raw->comment_content;
127
+ $review['content'] = $this->rip_tags($review['content']);
128
+ $review['content'] = html_entity_decode((str_replace("\r", "", $review['content'])), ENT_QUOTES | ENT_XML1, 'UTF-8');
129
+ $review['content'] = preg_replace( '/\[(.*?)\]/', ' ', $review['content'] );
130
+ $review['content'] = str_replace("&#xa0;", "", $review['content']);
131
+ $review['content'] = $this->woosea_utf8_for_xml( $review['content'] );
132
+
133
+ $review['review_product_name'] = $product_data['title'];
134
+ $review['review_url'] = $product_data['link'];
135
+ $review['review_product_url'] = $product_data['link'];
136
+ array_push($approved_reviews, $review);
137
+ }
138
  }
139
  $review_count = $product->get_review_count();
140
  $review_average = $product->get_average_rating();
188
  if($feed_config['fields'] == "google_drm"){
189
  $utm_part .= "&$key=$value";
190
  } else {
191
+ $utm_part .= "&$key=$value";
192
  }
193
  }
194
 
214
  if($parentId > 0){
215
  # Even though variation products always have parameters in the URL we still need to check and make sure they are there
216
  if(strpos($link, '?') !== false){
217
+ $utm_part = "&".ltrim($utm_part, '&amp;');
218
  } else {
219
  $utm_part = "?".ltrim($utm_part, '&amp;');
220
  }
262
  $data = $wpdb->get_results($sql);
263
 
264
  if (count($data)) {
 
265
  foreach ($data as $key => $value) {
266
  $value_display = str_replace("_", " ",$value->name);
267
+ if (!preg_match("/_product_attributes/i",$value->name)){
268
  $list[$value->name] = ucfirst($value_display);
269
+
270
+ // Adding support for the Yoast WooCommerce SEO unique identifiers
271
+ if($value->name == "wpseo_global_identifier_values"){
272
+ $type_expl = explode("\";", $value->type);
273
+
274
+ $yoast_gtin8_value = explode(":\"", $type_expl[1]);
275
+ $yoast_gtin12_value = explode(":\"", $type_expl[3]);
276
+ $yoast_gtin13_value = explode(":\"", $type_expl[5]);
277
+ $yoast_gtin14_value = explode(":\"", $type_expl[7]);
278
+ $yoast_isbn_value = explode(":\"", $type_expl[9]);
279
+ $yoast_mpn_value = explode(":\"", $type_expl[11]);
280
+
281
+ $list["yoast_gtin8"] = $yoast_gtin8_value[1];
282
+ $list["yoast_gtin12"] = $yoast_gtin12_value[1];
283
+ $list["yoast_gtin13"] = $yoast_gtin13_value[1];
284
+ $list["yoast_gtin14"] = $yoast_gtin14_value[1];
285
+ $list["yoast_isbn"] = $yoast_isbn_value[1];
286
+ $list["yoast_mpn"] = $yoast_mpn_value[1];
287
+ }
288
+ } else {
289
+ $product_attr = unserialize($value->type);
290
+ if((!empty($product_attr)) AND (is_array($product_attr))){
291
+ foreach ($product_attr as $key_inner => $arr_value) {
292
+ if(is_array($arr_value)){
293
+ if(!array_key_exists('name', $arr_value)){
294
+ $value_display = @str_replace("_", " ",$arr_value['name']);
295
+ $list[$key_inner] = ucfirst($value_display);
296
+ }
297
+ }
298
  }
299
  }
300
  }
301
+ }
302
  return $list;
303
  }
304
  return false;
360
  /**
361
  * Get category path (needed for Prisjakt)
362
  */
363
+ public function woosea_get_term_parents( $id, $taxonomy, string $link = null, $project_taxonomy, $nicename = false, $visited = array() ) {
364
  // Only add Home to the beginning of the chain when we start buildin the chain
365
  if(empty($visited)){
366
  $chain = 'Home';
399
  return $chain;
400
  }
401
 
402
+ /**
403
+ * Create a floatval for prices
404
+ */
405
+ public function woosea_floatvalue($val){
406
+ $val = str_replace(",",".",$val);
407
+ $val = preg_replace('/\.(?=.*\.)/', '', $val);
408
+ return floatval($val);
409
+ }
410
+
411
  /**
412
  * Get all configured shipping zones
413
  */
697
  /**
698
  * Get shipping cost for product
699
  */
700
+ public function woosea_get_shipping_cost ($class_cost_id, $project_config, $price, $tax_rates, $fullrate, $shipping_zones, $product_id, $item_group_id) {
701
+ $shipping_cost = "";
702
  $shipping_arr = array();
703
  $zone_count = 0;
704
  $nr_shipping_zones = count($shipping_zones);
757
  $shipping_methods = $zone['shipping_methods'];
758
 
759
  foreach ($shipping_methods as $k => $v){
760
+ $method = $v->method_title;
761
+ $shipping_rate_id = $v->instance_id;
762
 
763
  if($v->enabled == "yes"){
764
  if(empty($zone_details['country'])){
768
  }
769
  $taxable = $v->tax_status;
770
 
771
+ if(isset($v->instance_settings['cost'])){
772
+ $shipping_cost = $v->instance_settings['cost'];
773
+ $shipping_cost = str_replace("* [qty]", "", $shipping_cost);
774
+ $shipping_cost = trim($shipping_cost); // trim white spaces
 
775
 
776
+ if($shipping_cost > 0){
777
+
778
+ // Do we need to convert the shipping costs with the Aelia Currency Switcher
779
+ if((isset($project_config['AELIA'])) AND (!empty($GLOBALS['woocommerce-aelia-currencyswitcher'])) AND (get_option ('add_aelia_support') == "yes")){
780
 
781
+ if(!array_key_exists('base_currency', $project_config)){
782
+ $from_currency = get_woocommerce_currency();
783
+ } else {
784
+ $from_currency = $project_config['base_currency'];
785
+ }
786
+
787
+ // Get Aelia currency conversion prices
788
+ $shipping_cost = apply_filters('wc_aelia_cs_convert', $shipping_cost, $from_currency, $project_config['AELIA']);
789
+ }
790
 
791
+ if($taxable == "taxable"){
792
+ foreach ($tax_rates as $k_inner => $w){
793
+ if((isset($w['shipping'])) and ($w['shipping'] == "yes")){
794
+ $rate = (($fullrate)/100);
795
 
796
+ $shipping_cost = str_replace(",", ".", $shipping_cost);
797
+ $shipping_cost = $shipping_cost*$rate;
798
+ $shipping_cost = round($shipping_cost, 2);
799
+ $shipping_cost = wc_format_localized_price($shipping_cost);
800
+ }
801
  }
802
  }
803
  }
804
+ }
805
+
806
+ // WooCommerce Table Rate - Bolder Elements
807
+ if($method == "Table Rate"){
808
+ if($this->woosea_is_plugin_active( 'woocommerce-table-rate-shipping/woocommerce-table-rate-shipping.php' )) {
809
+ // Set shipping cost
810
+ $shipping_cost = 0;
811
+ if(!empty($product_id)){
812
+ // Add product to cart
813
+ if ((isset($product_id)) AND ($product_id > 0)){
814
+ $quantity = 1;
815
+ if(!empty($code_from_config)){
816
+ defined( 'WC_ABSPATH' ) || exit;
817
+
818
+ // Load cart functions which are loaded only on the front-end.
819
+ include_once WC_ABSPATH . 'includes/wc-cart-functions.php';
820
+ include_once WC_ABSPATH . 'includes/class-wc-cart.php';
821
+
822
  wc_load_cart();
823
 
824
  WC()->customer->set_shipping_country( $code_from_config );
836
  // Read cart and get schipping costs
837
  foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
838
  $total_cost = WC()->cart->get_total();
839
+ $shipping_cost = WC()->cart->get_shipping_total();
840
+ $shipping_tax = WC()->cart->get_shipping_tax();
841
+ $shipping_cost = ($shipping_cost+$shipping_tax);
842
  $shipping_cost = wc_format_localized_price($shipping_cost);
843
+ }
 
844
  // Make sure to empty the cart again
845
  WC()->cart->empty_cart();
846
+ }
847
+ }
848
+ }
849
+ }
850
+ }
851
+
852
+ // Official WooCommerce Table Rate plugin
853
+ if($method == "Table rates"){
854
+ if($this->woosea_is_plugin_active( 'woocommerce-table-rate-shipping/woocommerce-table-rate-shipping.php' )) {
855
+ // Set shipping cost
856
+ $shipping_cost = 0;
857
+ if(!empty($product_id)){
858
+ // Add product to cart
859
+ if ((isset($product_id)) AND ($product_id > 0)){
860
+ $quantity = 1;
861
+ if(!empty($code_from_config)){
862
+ defined( 'WC_ABSPATH' ) || exit;
863
+
864
+ // Load cart functions which are loaded only on the front-end.
865
+ include_once WC_ABSPATH . 'includes/wc-cart-functions.php';
866
+ include_once WC_ABSPATH . 'includes/class-wc-cart.php';
867
+
868
+ wc_load_cart();
869
+
870
+ WC()->shipping()->reset_shipping();
871
+ WC()->customer->set_shipping_country( $code_from_config );
872
+
873
+ if(isset($zone_details['region'])){
874
+ WC()->customer->set_shipping_state(wc_clean( $zone_details['region'] ));
875
+ }
876
+
877
+ if(isset($zone_details['postal_code'])){
878
+ WC()->customer->set_shipping_postcode(wc_clean( $zone_details['postal_code'] ));
879
+ }
880
+ WC()->cart->add_to_cart( $product_id, $quantity );
881
+
882
+ // Read cart and get schipping costs
883
+ foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
884
+ // Loop though shipping packages
885
+ foreach ( WC()->shipping->get_packages() as $key => $package ) {
886
+ // Loop through Shipping rates
887
+ foreach($package['rates'] as $rate_id => $rate ){
888
+ if($rate->instance_id == $shipping_rate_id){
889
+ $shipping_cost = $rate->cost;
890
+ }
891
+ }
892
+ }
893
+ $shipping_tax = WC()->cart->get_shipping_tax();
894
+ $shipping_cost = ($shipping_cost+$shipping_tax);
895
+ $shipping_cost = wc_format_localized_price($shipping_cost);
896
+ }
897
+
898
+ if($taxable == "taxable"){
899
+ foreach ($tax_rates as $k_inner => $w){
900
+ if((isset($w['shipping'])) and ($w['shipping'] == "yes")){
901
+ $rate = (($w['rate']+100)/100);
902
+
903
+ $shipping_cost = str_replace(",", ".", $shipping_cost);
904
+ $shipping_cost = $shipping_cost*$rate;
905
+ $shipping_cost = round($shipping_cost, 2);
906
+ $shipping_cost = wc_format_localized_price($shipping_cost);
907
+ }
908
+ }
909
+ }
910
+
911
+ // Make sure to empty the cart again
912
+ WC()->cart->empty_cart();
913
+ }
914
+ }
915
+ }
916
+ }
917
+ }
918
 
919
  // CLASS SHIPPING COSTS
920
  if((isset($v->instance_settings[$class_cost_id])) AND ($class_cost_id != "no_class_cost")){
1048
  unset($shipping_cost);
1049
  }
1050
  }
1051
+
1052
+ // User do not want to have free shipping in their feed
1053
+ $remove_free_shipping = "no";
1054
+ $remove_free_shipping = get_option ('remove_free_shipping');
1055
+
1056
+ if($remove_free_shipping == "yes"){
1057
+ unset($zone_details['service']);
1058
+ unset($zone_details['price']);
1059
+ unset($shipping_cost);
1060
+ }
1061
  }
1062
 
1063
  if(isset($zone_details)){
1075
  }
1076
  }
1077
  }
1078
+
1079
+ // For Heureka remove currency
1080
+ if($project_config['fields'] == "heureka"){
1081
+ $currency = "";
1082
+ }
1083
+
1084
  if(isset($shipping_cost)){
1085
  if(strlen($shipping_cost) > 0){
1086
  if($project_config['ship_suffix'] == "false"){
1089
  $zone_details['price'] = trim($shipping_cost);
1090
  }
1091
  } else {
 
1092
  if(isset($shipping_cost)){
1093
  $zone_details['price'] = trim($currency." ".$shipping_cost);
1094
  }
 
 
1095
  }
1096
  }
1097
  }
1121
 
1122
  // Remove other shipping classes when free shipping is relevant
1123
  $free_check = "yes";
 
1124
 
1125
  if(in_array($free_check, array_column($shipping_arr, 'free'))) { // search value in the array
1126
  foreach($shipping_arr as $k => $v) {
1127
  if(!in_array($free_check, $v)){
1128
+
1129
+ // User do not want to have free shipping in their feed
1130
+ // Only remove the other shipping classes when free shipping is not being removed
1131
+ $remove_free_shipping = "no";
1132
+ $remove_free_shipping = get_option ('remove_free_shipping');
1133
+
1134
+ if($remove_free_shipping == "no"){
1135
+ unset($shipping_arr[$k]);
1136
+ }
1137
  }
1138
  }
1139
  }
1141
  // Fix empty services
1142
  foreach($shipping_arr as $k => $v){
1143
  if(empty($v['service'])){
 
 
1144
  unset($shipping_arr[$k]);
1145
  }
1146
  }
1275
  $link = $product->addChild('g:additional_image_link', $v, $namespace['g']);
1276
  //$product->$k = $v;
1277
  } elseif (preg_match("/g:product_highlight/i",$k)){
1278
+ $v = preg_replace('/&/', '&#38;', $v);
1279
  $product_highlight = $product->addChild('g:product_highlight', $v, $namespace['g']);
1280
  } elseif (preg_match("/g:product_detail/i",$k)){
1281
  if(!empty($v)){
1282
  $product_detail_split = explode("#", $v);
1283
+ $detail_complete = count($product_detail_split);
1284
+ if($detail_complete == 2){
1285
+ $product_detail = $product->addChild('g:product_detail', '', $namespace['g']);
1286
+ $name = str_replace("_", " ", $product_detail_split[0]);
1287
+
1288
+ $section_name = explode(":", $name);
1289
+ $section_name_start = ucfirst($section_name[0]);
1290
+ $name = ucfirst(trim($section_name[1]));
1291
+
1292
+ $section_name = $product_detail->addChild('g:section_name', "General", $namespace['g']);
1293
+ $product_detail_name = $product_detail->addChild('g:attribute_name', $section_name_start, $namespace['g']);
1294
+ $product_detail_value = $product_detail->addChild('g:attribute_value', $product_detail_split[1], $namespace['g']);
1295
+ }
1296
  }
1297
  } elseif ($k == "g:installment"){
1298
  if(!empty($v)){
1397
  } elseif ($feed_config['name'] == "Glami.gr") {
1398
  $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><SHOP></SHOP>');
1399
  $xml->asXML($file);
1400
+ } elseif ($feed_config['name'] == "Vivino") {
1401
+ $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><vivino-product-list></vivino-product-list>');
1402
+ $xml->asXML($file);
1403
  } elseif ($feed_config['name'] == "Pricecheck.co.za") {
1404
  $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><Offers></Offers>');
1405
  $xml->asXML($file);
1408
  $xml->addAttribute('xmlns:content', 'http://purl.org/rss/1.0/modules/content/');
1409
  $xml->addAttribute('xmlns:wfw', 'http://wellformedweb.org/CommentAPI/');
1410
  $xml->addAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/');
 
1411
  $xml->addAttribute('xmlns:sy', 'http://purl.org/rss/1.0/modules/syndication/');
1412
  $xml->addAttribute('xmlns:slash', 'http://purl.org/rss/1.0/modules/slash/');
1413
  $xml->addAttribute('version', '2.0');
1457
  $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><products></products>');
1458
  $xml->addAttribute('version', '1.0');
1459
  $xml->addAttribute('standalone', 'yes');
1460
+ //$xml->addChild('datetime', date('Y-m-d H:i:s'));
1461
+ //$xml->addChild('title', htmlspecialchars($feed_config['projectname']));
1462
+ //$xml->addChild('link', site_url());
1463
+ //$xml->addChild('description', 'WooCommerce Product Feed PRO - This product feed is created with the free Advanced Product Feed PRO for WooCommerce plugin from AdTribes.io. For all your support questions check out our FAQ on https://www.adtribes.io or e-mail to: support@adtribes.io ');
1464
  $xml->asXML($file);
1465
  }
1466
  } else {
1495
 
1496
  // For Google Product review template
1497
  if (($feed_config['name'] == "Google Product Review") AND (empty($xml->channel))) {
1498
+
1499
+ if(!is_bool($xml)){
1500
+ $product = $xml->addChild('reviews');
1501
 
1502
+ foreach ($products as $key => $value){
1503
+
1504
+ $expl = "||";
1505
 
1506
+ if(array_key_exists('reviews', $value)) {
1507
+ $review_data = explode("||", $value['reviews']);
1508
+ foreach($review_data as $rk => $rv){
 
1509
 
1510
+ $review_comp = explode(":::", $rv);
1511
+ $nr_reviews = count($review_comp);
1512
 
1513
+ if($nr_reviews > 1){
1514
+ $productz = $xml->reviews->addChild('review');
1515
 
1516
+ foreach($review_comp as $rck => $rcv){
1517
+ $nodes = explode("##", $rcv);
1518
+ $nodes = str_replace("::", "", $nodes);
1519
 
1520
+ if($nodes[0] == "REVIEW_RATINGS"){
1521
+ // Do nothing
1522
+ } elseif($nodes[0] == "REVIEW_URL"){
1523
+ $rev_url = $productz->addChild(strtolower($nodes[0]), htmlspecialchars($nodes[1]));
1524
+ $rev_url->addAttribute('type', 'singleton');
1525
+ } elseif(($nodes[0] == "REVIEWER_NAME") OR ($nodes[0] == "REVIEWER_ID")){
1526
+ if(isset($productz->reviewer)){
1527
+ if($nodes[0] == "REVIEWER_NAME"){
1528
+ $name = $nodes[1];
1529
+ if(empty($name)){
1530
+ $reviewer->addChild('name','Anonymous');
1531
+ $reviewer->name->addAttribute('is_anonymous', 'true');
1532
+ } else {
1533
+ $reviewer->addChild('name',$name);
1534
+ }
1535
  } else {
1536
+ if(is_numeric($nodes[1])){
1537
+ $reviewer->addChild('reviewer_id',$nodes[1]);
1538
+ }
1539
  }
1540
  } else {
1541
+ $reviewer = $productz->addChild('reviewer');
1542
+ if($nodes[0] == "REVIEWER_NAME"){
1543
+ $name = $nodes[1];
1544
+ if(empty($name)){
1545
+ $reviewer->addChild('name','Anonymous');
1546
+ $reviewer->name->addAttribute('is_anonymous', 'true');
1547
+ } else {
1548
+ $reviewer->addChild('name',$name);
1549
+ }
1550
  } else {
1551
+ if(is_numeric($nodes[1])){
1552
+ $reviewer->addChild('reviewer_id',$nodes[1]);
1553
+ }
1554
  }
 
 
1555
  }
1556
+ } else {
1557
+ if(isset($nodes[1])){
1558
+ $content = html_entity_decode($nodes[1]);
1559
+ $content = htmlspecialchars($content);
1560
+ $rev = $productz->addChild(strtolower($nodes[0]), $content);
1561
+ }
1562
  }
1563
  }
 
1564
 
1565
+ foreach($review_comp as $rck => $rcv){
1566
+ $nodes = explode("##", $rcv);
1567
+ $nodes = str_replace("::", "", $nodes);
1568
 
1569
+ if($nodes[0] == "REVIEW_RATINGS"){
1570
+ $rev = $productz->addChild('ratings');
1571
+ $over = $productz->ratings->addChild('overall', $nodes[1]);
1572
+ $over->addAttribute('min', '1');
1573
+ $over->addAttribute('max', '5');
1574
+ }
1575
  }
 
 
1576
 
1577
+ $yo = $productz->addChild('products');
1578
+ $po = $yo->addChild('product');
1579
 
1580
+ $identifiers = array("gtin","mpn","sku","brand");
1581
 
1582
+ // Start determining order of product_ids in the Google review feed
1583
+ $proper_order = array("product_name","gtin","mpn","sku","brand","product_url","review_url","reviews");
1584
+ $order_sorted = array();
1585
+ foreach ($proper_order as &$order_value){
1586
+ if(isset($value[$order_value])){
1587
+ $order_sorted[$order_value] = $value[$order_value];
1588
+ }
1589
  }
1590
+ // End
1591
+
1592
+ foreach($order_sorted as $k => $v) {
1593
+ if(($k != "product_name") AND ($k != "product_url")){
1594
+ if(!in_array($k, $identifiers)){
1595
+ if(($k != "reviews") AND ($k != "review_url")){
1596
+ if($k != "product_url"){
1597
+ $v = str_replace("&", "and", $v);
1598
+ }
1599
+ $poa = $po->addChild($k,htmlspecialchars($v));
1600
+ }
1601
+ } else {
1602
+ if(isset($po->product_ids)){
1603
+ if ($k == "gtin"){
1604
+ $poig = $poi->addChild('gtins');
1605
+ $poig->$k = $v;
1606
+ } elseif ($k == "mpn"){
1607
+ $poim = $poi->addChild('mpns');
1608
+ $poim->$k = $v;
1609
+ } elseif ($k == "sku"){
1610
+ $poix = $poi->addChild('skus');
1611
+ $poix->$k = $v;
1612
+ } elseif($k == "brand"){
1613
+ $poib = $poi->addChild('brands');
1614
+ $poib->$k = $v;
1615
+ } else {
1616
+ // Do nothing
1617
+ }
1618
+ } else {
1619
+ $poi = $po->addChild('product_ids');
1620
+ if ($k == "gtin"){
1621
+ $poig = $poi->addChild('gtins');
1622
+ $poig->$k = $v;
1623
+ } elseif ($k == "mpn"){
1624
+ $poim = $poi->addChild('mpns');
1625
+ $poim->$k = $v;
1626
+ } elseif ($k == "sku"){
1627
+ $poix = $poi->addChild('skus');
1628
+ $poix->$k = $v;
1629
+ } elseif($k == "brand"){
1630
+ $poib = $poi->addChild('brands');
1631
+ $poib->$k = $v;
1632
+ } else {
1633
+ // Do nothing
1634
+ }
1635
  }
1636
+ }
1637
+ }
1638
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1639
 
1640
+ // foreach for product name and product url as order seems to mather to Google
1641
+ foreach($value as $k => $v) {
1642
+ if(($k == "product_name") OR ($k == "product_url")){
1643
+ if(!in_array($k, $identifiers)){
1644
+ if(($k != "reviews") AND ($k != "review_url")){
1645
+ if($k != "product_url"){
1646
+ $v = str_replace("&", "and", $v);
1647
+ }
1648
+ $poa = $po->addChild($k,htmlspecialchars($v));
1649
+ }
1650
+ } else {
1651
+ if(isset($po->product_ids)){
1652
+ if ($k == "gtin"){
1653
+ $poig = $poi->addChild('gtins');
1654
+ $poig->$k = $v;
1655
+ } elseif ($k == "mpn"){
1656
+ $poim = $poi->addChild('mpns');
1657
+ $poim->$k = $v;
1658
+ } elseif($k == "sku"){
1659
+ $poix = $poi->addChild('skus');
1660
+ $poix->$k = $v;
1661
+ } elseif($k == "brand"){
1662
+ $poib = $poi->addChild('brands');
1663
+ $poib->$k = $v;
1664
+ } else {
1665
+ // Do nothing
1666
+ }
1667
+ } else {
1668
+ $poi = $po->addChild('product_ids');
1669
+ if ($k == "gtin"){
1670
+ $poig = $poi->addChild('gtins');
1671
+ $poig->$k = $v;
1672
+ } elseif ($k == "mpn"){
1673
+ $poim = $poi->addChild('mpns');
1674
+ $poim->$k = $v;
1675
+ } elseif ($k == "sku"){
1676
+ $poix = $poi->addChild('skus');
1677
+ $poix->$k = $v;
1678
+ } elseif($k == "brand"){
1679
+ $poib = $poi->addChild('brands');
1680
+ $poib->$k = $v;
1681
+ } else {
1682
+ // Do nothing
1683
+ }
1684
  }
1685
+ }
1686
+ }
1687
+ }
1688
+ }
1689
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1690
  }
1691
  }
1692
  }
1693
  }
1694
 
1695
  foreach ($products as $key => $value){
 
1696
  if ((is_array ( $value )) and (!empty( $value ))) {
1697
  if ($feed_config['name'] == "Yandex") {
1698
  $product = $xml->shop->offers->addChild('offer');
1716
 
1717
  } else {
1718
  if(count($value) > 0){
1719
+ if(is_object($xml)){
1720
+ $product = $xml->addChild('product');
1721
+ }
1722
  }
1723
  }
1724
 
1828
  $product->addChild("$k");
1829
  $product->$k = $v;
1830
  } else {
1831
+ if (($feed_config['fields'] != 'standard') AND ($feed_config['fields'] != "customfeed")){
1832
  $k = $this->get_alternative_key ($channel_attributes, $k);
1833
  }
1834
  if(!empty($k)){
 
1835
  /**
1836
  * Some Zbozi and Heureka attributes need some extra XML nodes
1837
  */
1866
  $productp = $product->addChild($p,$v);
1867
  $productp->addAttribute('name', $pieces[1]);
1868
  } elseif ($feed_config['name'] == "Google Product Review") {
1869
+ } elseif ($feed_config['name'] == "Vivino") {
1870
+ $extra_arr = array('ean','jan','upc','producer','wine-name','appellation','vintage','country','color','image','description','alcohol','producer-address','importer-address','varietal','ageing','closure','winemaker','production-size','residual-sugar','acidity','ph','contains-milk-allergens','contains-egg-allergens','non-alcoholic');
1871
+ $unit_arr = array ('production-size','residual-sugar','acidity');
1872
 
1873
+ if(in_array($k, $extra_arr)){
1874
+ if(!isset($product->extras)){
1875
+ $productp = $product->addChild('extras');
1876
+ }
1877
+
1878
+ // Add units to it
1879
+ if(in_array($k, $unit_arr)){
1880
+ $productk = $productp->addChild($k,$v);
1881
+ if($k == "acidity"){
1882
+ $productk->addAttribute('unit', 'g/l');
1883
+ }
1884
+ if($k == "production-size"){
1885
+ $productk->addAttribute('unit', 'bottles');
1886
+ }
1887
+ if($k == "residual-sugar"){
1888
+ $productk->addAttribute('unit', 'g/l');
1889
+ }
1890
+ } else {
1891
+ $productp->$k = $v;
1892
+ }
1893
+ } else {
1894
+ $product->addChild("$k");
1895
+ $product->$k = $v;
1896
+ }
1897
  } elseif ($feed_config['name'] == "Fruugo.nl") {
1898
  $desc_arr = array('Language','Title','Description');
1899
  $price_arr = array('Currency','NormalPriceWithoutVAT','NormalPriceWithVAT','VATRate');
1925
  }
1926
 
1927
  if(is_object($xml)){
1928
+ //$xml = html_entity_decode($xml->asXML());
1929
  $xml->asXML($file);
1930
  }
1931
  unset($product);
1977
  $channel_attributes = get_option('channel_attributes');
1978
  }
1979
  }
1980
+
1981
  // Append or write to file
1982
  $fp = fopen($file, 'a+');
1983
 
1994
  $pieces = str_replace("'", "", $pieces);
1995
 
1996
  foreach ($pieces as $k_inner => $v){
1997
+ if (($feed_config['fields'] != 'standard') AND ($feed_config['fields'] != "customfeed")){
1998
  $v = $this->get_alternative_key ($channel_attributes, $v);
1999
  }
2000
 
2059
  fwrite($fp, $tab_line);
2060
  }
2061
  } else {
2062
+ $pieces = array_map('trim', $pieces);
2063
  $tofile = fputcsv($fp, $pieces, $csv_delimiter, '"');
2064
  }
2065
 
2173
  $xml_piece = "";
2174
 
2175
  // Get taxonomies
2176
+ $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");
2177
  $taxonomies = get_taxonomies();
2178
  $diff_taxonomies = array_diff($taxonomies, $no_taxonomies);
2179
 
2221
  }
2222
  }
2223
 
2224
+ // Get WooCommerce categories
2225
+ $product_categories = get_terms( 'product_cat', 'hide_empty=0' );
2226
+ $prod_cats = array();
2227
+ if ( ! empty( $product_categories ) && ! is_wp_error( $product_categories ) ) {
2228
+ foreach ( $product_categories as $category ) {
2229
+ $prod_cats[$category->slug] = $category->name;
2230
+ }
2231
+ }
2232
+
2233
+ // Get Fiters on categories
2234
+ $prod_cats_slugs = array();
2235
+ if(isset($project_config['rules'])){
2236
+ foreach ($project_config['rules'] as $rule){
2237
+ if(($rule['attribute'] == "categories") AND ($rule['condition'] == "=")){
2238
+ $slug = array_search($rule['criteria'], $prod_cats);
2239
+ array_push($prod_cats_slugs, $slug);
2240
+ }
2241
+ }
2242
+ }
2243
+
2244
+ $product_cat = "";
2245
+ if(count($prod_cats_slugs) > 0){
2246
+ foreach ( $prod_cats_slugs as $cat_slug ){
2247
+ $product_cat .= $cat_slug .",";
2248
+ }
2249
+ }
2250
+
2251
  // Construct WP query
2252
  $wp_query = array(
2253
  'posts_per_page' => $offset_step_size,
2255
  'post_type' => $post_type,
2256
  'post_status' => 'publish',
2257
  'fields' => 'ids',
2258
+ 'no_found_rows' => true,
2259
+ // 'product_cat' => $product_cat
2260
+ );
2261
+
2262
  $prods = new WP_Query($wp_query);
2263
  $shipping_zones = $this->woosea_get_shipping_zones();
2264
 
2295
  if(!in_array($product_data['id'], $allowed_product_orders)){ continue; }
2296
  }
2297
  }
 
2298
  $product_data['title'] = $product->get_title();
2299
+ $product_data['title'] = $this->woosea_utf8_for_xml( $product_data['title'] );
2300
  $product_data['mother_title'] = $product->get_title();
2301
  $product_data['mother_title'] = $this->woosea_utf8_for_xml( $product_data['mother_title'] );
2302
  $product_data['title_hyphen'] = $product_data['title'];
2456
  // Check if there are mother categories
2457
  if(!empty($product_cat)){
2458
  $category_path = $this->woosea_get_term_parents( $product_cat->term_id, 'product_cat', $link = false, $project_taxonomy = $project_config['taxonomy'], $nicename = false, $visited = array() );
 
 
2459
 
2460
+ if(!is_object($category_path)){
2461
+ $category_path_skroutz = preg_replace('/&gt;/', '>', $category_path);
2462
  $product_data['category_path'] = $category_path;
2463
  $product_data['category_path_skroutz'] = $category_path_skroutz;
2464
  $product_data['category_path_skroutz'] = str_replace("Home >","",$product_data['category_path_skroutz']);
2497
  }
2498
  }
2499
 
2500
+ // Get the RankMath primary category
2501
+ if ($this->woosea_is_plugin_active('seo-by-rank-math/rank-math.php')){
2502
+ $item_id = $product_data['id'];
2503
+ if($product_data['item_group_id'] > 0){
2504
+ $item_id = $product_data['item_group_id'];
2505
+ }
2506
+ $primary_cat_id = get_post_meta( $item_id, 'rank_math_primary_product_cat', true );
2507
+ if ( $primary_cat_id ) {
2508
+ $product_cat = get_term( $primary_cat_id, 'product_cat' );
2509
+ if(!empty($product_cat->name)){
2510
+ $product_data['one_category'] = $product_cat->name;
2511
+ }
2512
+ }
2513
+ }
2514
+
2515
  $product_data['category_path_short'] = str_replace("Home &gt;","",$product_data['category_path']);
2516
  $product_data['category_path_short'] = str_replace("&gt;",">",$product_data['category_path_short']);
2517
  $product_data['category_link'] = $catlink;
2547
  $product_data['raw_description'] = substr($product_data['raw_description'], 0, 5000);
2548
  $product_data['raw_short_description'] = substr($product_data['raw_short_description'], 0, 5000);
2549
 
2550
+ // Parent variable description
2551
+ $product_data['mother_description'] = $product_data['description'];
2552
+ $product_data['mother_short_description'] = $product_data['short_description'];
2553
+
2554
  /**
2555
  * Check of we need to add Google Analytics UTM parameters
2556
  */
2561
  }
2562
 
2563
  $product_data['link'] = get_permalink( $product_data['id'])."$utm_part";
2564
+ $product_data['link_no_tracking'] = get_permalink( $product_data['id']);
2565
  $variable_link = htmlspecialchars(get_permalink( $product_data['id']));
2566
  $vlink_piece = explode("?", $variable_link);
2567
  $qutm_part = ltrim($utm_part, "&amp;");
2569
  $qutm_part = ltrim($qutm_part, "?");
2570
  if($qutm_part){
2571
  $product_data['variable_link'] = $vlink_piece[0]."?".$qutm_part;
2572
+ $product_data['link_no_tracking'] = $vlink_piece[0];
2573
  } else {
2574
  $product_data['variable_link'] = $vlink_piece[0];
2575
+ $product_data['link_no_tracking'] = $vlink_piece[0];
2576
  }
2577
 
2578
  $product_data['condition'] = ucfirst( get_post_meta( $product_data['id'], '_woosea_condition', true ) );
2579
+ $product_data['purchase_note'] = get_post_meta( $product_data['id'], '_purchase_note' );
2580
+
2581
  if(empty($product_data['condition']) || $product_data['condition'] == "Array"){
2582
  $product_data['condition'] = "New";
2583
  }
2584
+
2585
+ // get_stock only works as of WC 5 and higher?
2586
  $product_data['availability'] = $this->get_stock( $this->childID );
2587
 
2588
  /**
2590
  * availability will always return out of stock, even when the stock quantity > 0
2591
  * Therefor, we need to check the stock_status and overwrite te availability value
2592
  */
2593
+ if(!is_bool($product)){
2594
+ $stock_status = $product->get_stock_status();
2595
+ } else {
2596
+ $stock_status = "instock";
2597
+ }
2598
+ $product_data['stock_status'] = $stock_status;
2599
+
2600
  if ($stock_status == "outofstock"){
2601
  $product_data['availability'] = "out of stock";
2602
+ if (($project_config['taxonomy'] == "google_shopping") AND ($project_config['fields'] == "google_shopping")) {
2603
+ $product_data['availability'] = "out_of_stock";
2604
+ }
2605
  } elseif ($stock_status == "onbackorder") {
2606
  $product_data['availability'] = "on backorder";
2607
+ if (($project_config['taxonomy'] == "google_shopping") AND ($project_config['fields'] == "google_shopping")) {
2608
+ $product_data['availability'] = "backorder";
2609
+ }
2610
  } else {
2611
  $product_data['availability'] = "in stock";
2612
+ if (($project_config['taxonomy'] == "google_shopping") AND ($project_config['fields'] == "google_shopping")) {
2613
+ $product_data['availability'] = "in_stock";
2614
+ }
2615
  }
2616
 
2617
  $product_data['author'] = get_the_author();
2618
  $product_data['quantity'] = $this->clean_quantity( $this->childID, "_stock" );
2619
+ $product_data['visibility'] = $product->get_catalog_visibility();
2620
  $product_data['menu_order'] = get_post_field( 'menu_order', $product_data['id'] );
2621
  $product_data['currency'] = get_woocommerce_currency();
2622
  if(isset($project_config['WCML'])){
2633
  $product_data['image_all'] = $product_data['image'];
2634
  $product_data['all_images'] = $product_data['image'];
2635
  $product_data['all_gallery_images'] = "";
2636
+ $product_data['product_type'] = $product->get_type();
2637
+
2638
+ // Get the number of active variations that are on stock for variable products
2639
+ if(($product_data['item_group_id'] > 0) AND ($product_data['product_type'] == "variation")){
2640
+ $parent_product = wc_get_product( $product_data['item_group_id'] );
2641
+
2642
+ if(is_object($parent_product)){
2643
+ $current_products = $parent_product->get_children();
2644
+ $product_data['nr_variations'] = count( $current_products );
2645
+ $vcnt = 0;
2646
+
2647
+ foreach ($current_products as $ckey => $cvalue){
2648
+ $stock_value = get_post_meta( $cvalue, "_stock_status", true );
2649
+ if($stock_value == "instock"){
2650
+ $vcnt++;
2651
+
2652
+ }
2653
+ }
2654
+ $product_data['nr_variations_stock'] = $vcnt;
2655
+ } else {
2656
+ $product_data['nr_variations'] = 9999;
2657
+ $product_data['nr_variations_stock'] = 9999;
2658
+ }
2659
+ } else {
2660
+ $product_data['nr_variations'] = 9999;
2661
+ $product_data['nr_variations_stock'] = 9999;
2662
+ }
2663
+
2664
+ // For variable products I need to get the product gallery images of the simple mother product
2665
  if($product_data['item_group_id'] > 0){
2666
  $parent_product = wc_get_product( $product_data['item_group_id'] );
2667
+
2668
  if(is_object($parent_product)){
2669
  $gallery_ids = $parent_product->get_gallery_image_ids();
2670
  $product_data['image_all'] = wp_get_attachment_url($parent_product->get_image_id());
2690
  $product_data['all_images'] = ltrim($product_data['all_images'],',');
2691
  $product_data['all_images_kogan'] = preg_replace( '/,/', '|', $product_data['all_images'] );
2692
  $product_data['all_gallery_images'] = ltrim($product_data['all_gallery_images'],',');
 
2693
 
2694
  $product_data['content_type'] = "product";
2695
  if($product_data['product_type'] == "variation"){
2705
 
2706
  $product_data['shipping'] = 0;
2707
  $tax_rates = WC_Tax::get_base_tax_rates( $product->get_tax_class() );
2708
+ $all_standard_taxes = WC_Tax::get_rates_for_tax_class( '' );
2709
+
2710
  $shipping_class_id = $product->get_shipping_class_id();
2711
  $shipping_class= $product->get_shipping_class();
2712
 
2716
  }
2717
 
2718
  $product_data['shipping_label'] = $product->get_shipping_class();
2719
+ $term = get_term_by( 'slug', $product->get_shipping_class(), 'product_shipping_class' );
2720
+ if(is_object($term)){
2721
+ $product_data['shipping_label_name'] = $term->name;
2722
+ }
2723
 
2724
  // Get product prices
2725
  $product_data['price'] = wc_get_price_including_tax($product, array('price'=> $product->get_price()));
2729
  $product_data['regular_price'] = wc_get_price_including_tax($product, array('price'=> $product->get_regular_price()));
2730
  $product_data['regular_price'] = wc_format_decimal($product_data['regular_price'],2);
2731
 
2732
+ // Untouched raw system pricing - DO NOT CHANGE THESE
2733
+ $float_system_net_price = floatval(wc_get_price_excluding_tax( $product ));
2734
+ $product_data['system_net_price'] = round($float_system_net_price, 2);
2735
+ $product_data['system_net_price'] = wc_format_decimal($product_data['system_net_price'],2);
2736
+
2737
+ // System regular price
2738
+ $float_system_regular_price = floatval($product->get_regular_price());
2739
+ $product_data['system_regular_price'] = round($float_system_regular_price,2);
2740
+ $product_data['system_regular_price'] = wc_format_decimal($product_data['system_regular_price'],2);
2741
+
2742
+ // System sale price
2743
+ $float_system_sale_price = floatval($product->get_sale_price());
2744
+ if($float_system_sale_price > 0){
2745
+ $product_data['system_sale_price'] = round($float_system_sale_price,2);
2746
+ $product_data['system_sale_price'] = wc_format_decimal($product_data['system_sale_price'],2);
2747
+ $sale_price = $product_data['system_sale_price'];
2748
+ }
2749
 
2750
+ $code_from_config = $this->woosea_country_to_code($project_config['countries']);
2751
 
2752
+ $nr_standard_rates = count($all_standard_taxes);
2753
+ if(!empty($all_standard_taxes) AND ($nr_standard_rates > 1)){
2754
+ foreach ($all_standard_taxes as $rate){
2755
+ $rate_arr = get_object_vars($rate);
2756
+ if($rate_arr['tax_rate_country'] == $code_from_config){
2757
+ $tax_rates[1]['rate'] = $rate_arr['tax_rate'];
2758
+ }
2759
+ }
2760
+ } else {
2761
+ if(!empty($tax_rates)){
2762
+ foreach ($tax_rates as $tk => $tv){
2763
+ if($tv['rate'] > 0){
2764
+ $tax_rates[1]['rate'] = $tv['rate'];
2765
+ } else {
2766
+ $tax_rates[1]['rate'] = 0;
2767
+ }
2768
  }
2769
+ } else {
2770
+ $tax_rates[1]['rate'] = 0;
2771
+ }
2772
+ }
2773
+
2774
+ if(empty($tax_rates[1]['rate'])){
2775
+ if(!empty($all_standard_taxes) AND ($nr_standard_rates > 1)){
2776
+ foreach ($all_standard_taxes as $rate){
2777
+ $rate_arr = get_object_vars($rate);
2778
+ if($rate_arr['tax_rate_country'] == ""){
2779
+ $tax_rates[1]['rate'] = $rate_arr['tax_rate'];
2780
+ }
2781
+ }
2782
  }
 
 
2783
  }
2784
 
2785
  $fullrate = 100+$tax_rates[1]['rate'];
2791
  if($product->get_type() == "bundle"){
2792
  if ($this->woosea_is_plugin_active('woocommerce-product-bundles/woocommerce-product-bundles.php')){
2793
  $product_data['price'] = get_post_meta($product_data['id'], '_price', true);
2794
+ $product_data['sale_price'] = get_post_meta($product_data['id'], '_sale_price', true);
2795
  if(is_numeric($tax_rates[1]['rate'])){
2796
  $product_data['price_forced'] = round(get_post_meta($product_data['id'], '_price', true) * (100+$tax_rates[1]['rate'])/100,2);
2797
  $product_data['regular_price'] = round(get_post_meta($product_data['id'], '_regular_price', true) * (100+$tax_rates[1]['rate'])/100,2);
2832
 
2833
  // Make sure the product ID is not NULL either
2834
  global $woocommerce_wpml;
2835
+ if(!is_null($project_config['WCML'])){
2836
+ //$product_data['non_geo_wcml_price'] = $woocommerce_wpml->multi_currency->prices->get_product_price_in_currency( $product_data['id'], $project_config['WCML'] );
2837
+ $product_data['non_geo_wcml_price'] = wc_format_decimal(get_post_meta( $product_data['id'], '_regular_price', true),2);
2838
+ $product_data['non_geo_wcml_price'] = wc_format_localized_price($product_data['non_geo_wcml_price']);
2839
+ $product_data['non_geo_wcml_price_net_price'] = $product_data['non_geo_wcml_price']/((100+$tax_rates[1]['rate'])/100);
2840
+
2841
+ $non_geo_sale = get_post_meta( $product_data['id'], '_sale_price', true );
2842
+ if(!empty($non_geo_sale)){
2843
+ $product_data['non_geo_wcml_sale_price'] = wc_format_decimal(get_post_meta( $product_data['id'], '_sale_price', true),2);
2844
+ $product_data['non_geo_wcml_sale_price'] = wc_format_localized_price($product_data['non_geo_wcml_sale_price']);
2845
+ $product_data['non_geo_wcml_sale_price_net_price'] = $product_data['non_geo_wcml_sale_price']/((100-$tax_rates[1]['rate'])/100);
2846
+ }
2847
+ }
2848
 
2849
  // When WCML manual prices have been entered
2850
  if(!is_null($product_data['id'])){
2858
  $product_data['regular_price'] = $custom_prices['_regular_price'];
2859
  }
2860
 
2861
+ if(isset($custom_prices['_sale_price'])){
2862
+ if($custom_prices['_sale_price'] > 0){
2863
+ $product_data['sale_price'] = $custom_prices['_sale_price'];
2864
+ } else {
2865
+ // Unset these values as WCML prices have been filled in manually
2866
+ unset($product_data['sale_price']);
2867
+ unset($product_data['system_regular_price']);
2868
+ unset($product_data['system_price']);
2869
+ unset($product_data['system_sale_price']);
2870
+ }
2871
+ }
2872
  }
2873
  }
2874
 
2882
  }
2883
  if($product->get_regular_price()){
2884
  $product_data['regular_price_forced'] = round(wc_get_price_excluding_tax($product, array('price'=> $product->get_regular_price())) * (100+$tax_rates[1]['rate'])/100,2);
2885
+ $product_data['net_regular_price'] = round(wc_get_price_excluding_tax($product, array('price'=> $product->get_regular_price())),2);
2886
+ //$product_data['net_regular_price'] = ($product->get_regular_price()/$fullrate)*100;
2887
+ //$product_data['net_regular_price'] = round($product_data['net_regular_price'],2);
2888
  }
2889
  if($product->get_sale_price()){
2890
  $product_data['sale_price_forced'] = round(wc_get_price_excluding_tax($product, array('price'=> $product->get_sale_price())) * (100+$tax_rates[1]['rate'])/100,2);
2891
+ $product_data['net_sale_price'] = round(wc_get_price_excluding_tax($product, array('price'=> $product->get_sale_price())),2);
2892
+
 
2893
  // We do not want to have 0 sale price values in the feed
2894
  if($product_data['net_sale_price'] == 0){
2895
  $product_data['net_sale_price'] = "";
2896
  }
2897
  }
2898
+ $float_net_price = floatval(wc_get_price_excluding_tax( $product ));
2899
+ $product_data['net_price'] = round($float_net_price, 2);
2900
+ $product_data['net_price'] = wc_format_decimal($product_data['net_price'],2);
2901
+
2902
  $price = wc_get_price_including_tax($product,array('price'=> $product->get_price()));
2903
  if($product_data['sale_price'] > 0){
2904
  $price = $product_data['sale_price'];
2908
  if ($this->woosea_is_plugin_active('woo-discount-rules/woo-discount-rules.php')){
2909
  $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);
2910
  if($discount !== false){
2911
+ // round discounted price on 2 decimals
2912
+ $discount = round($discount,2);
2913
+
2914
  $product_data['sale_price'] = $discount;
2915
+ $product_data['price'] = $discount;
2916
  $price_incl_tax = get_option( 'woocommerce_prices_include_tax' );
2917
  if($price_incl_tax == "yes"){
2918
  $product_data['price_forced'] = $product_data['price']*($fullrate/100);
3021
  }
3022
  }
3023
 
3024
+ // Is the Mix and Match plugin active
3025
+ if ($this->woosea_is_plugin_active('woocommerce-mix-and-match-products/woocommerce-mix-and-match-products.php')){
3026
+ if($product->is_type('mix-and-match')){
3027
+ if($product_data['price'] == "0.00"){
3028
+ $product_data['price'] = "";
3029
+ $product_data['regular_price'] = "";
3030
+ }
3031
+
3032
+ // Get minimum prices
3033
+ $product_data['mm_min_price'] = wc_format_localized_price($product->get_mnm_price());
3034
+ $product_data['mm_min_regular_price'] = wc_format_localized_price($product->get_mnm_regular_price());
3035
+
3036
+ // Get maximum prices
3037
+ $product_data['mm_max_price'] = wc_format_localized_price($product->get_mnm_price('max'));
3038
+ $product_data['mm_max_regular_price'] = wc_format_localized_price($product->get_mnm_regular_price('max'));
3039
+ }
3040
+ }
3041
+
3042
  // Localize the price attributes
3043
  $decimal_separator = wc_get_price_decimal_separator();
3044
  $product_data['price'] = wc_format_localized_price($product_data['price']);
3046
  $product_data['sale_price'] = wc_format_localized_price($product_data['sale_price']);
3047
  if($product->get_price()){
3048
  $product_data['price_forced'] = wc_format_localized_price($product_data['price_forced']);
3049
+ //$product_data['price_forced'] = (float)$product_data['price_forced'];
3050
+ //$product_data['price_forced_rounded'] = round($product_data['price_forced'],0);
3051
  }
3052
  if($product->get_regular_price()){
3053
  $product_data['regular_price_forced'] = wc_format_localized_price($product_data['regular_price_forced']);
3054
+ //$product_data['regular_price_forced'] = (float)$product_data['regular_price_forced'];
3055
+ //$product_data['regular_price_forced_rounded'] = round($product_data['regular_price_forced'],0);
3056
  }
3057
  if($product->get_sale_price()){
3058
  $product_data['sale_price_forced'] = wc_format_localized_price($product_data['sale_price_forced']);
3059
+ //$product_data['sale_price_forced_rounded'] = round($product_data['sale_price_forced'],0);
3060
+
3061
  }
3062
  $product_data['net_price'] = wc_format_localized_price($product_data['net_price']);
3063
 
3071
  $product_data['net_sale_price'] = wc_format_localized_price($product_data['net_sale_price']);
3072
  }
3073
 
3074
+ if(!empty($product_data['system_price'])){
3075
+ $product_data['system_price'] = wc_format_localized_price($product_data['system_price']);
3076
+ }
3077
+
3078
+ if(!empty($product_data['system_net_price'])){
3079
+ $product_data['system_net_price'] = wc_format_localized_price($product_data['system_net_price']);
3080
+ }
3081
+
3082
+ if(!empty($product_data['system_regular_price'])){
3083
+ $product_data['system_regular_price'] = wc_format_localized_price($product_data['system_regular_price']);
3084
+ }
3085
+
3086
+ if(!empty($product_data['system_sale_price'])){
3087
+ $product_data['system_sale_price'] = wc_format_localized_price($product_data['system_sale_price']);
3088
+ }
3089
 
3090
  // Add rounded price options
3091
+ $decimal_separator = wc_get_price_decimal_separator();
3092
+ $float_price = floatval($product_data['price']);
3093
+ $float_regular_price = floatval($product_data['regular_price']);
3094
+ $float_sale_price = floatval($product_data['sale_price']);
3095
+
3096
+ if($decimal_separator == ","){
3097
+ $product_data['rounded_price'] = str_replace(',', '.', $product_data['price']);
3098
+ $product_data['rounded_price'] = round(number_format($product_data['rounded_price'], 2, '.', ''));
3099
+ $product_data['rounded_regular_price'] = str_replace(',', '.', $product_data['regular_price']);
3100
+ $product_data['rounded_regular_price'] = round(number_format($product_data['rounded_regular_price'], 2, '.', ''));
3101
+
3102
+ if($product_data['sale_price'] > 0){
3103
+ $product_data['rounded_sale_price'] = str_replace(',', '.', $product_data['sale_price']);
3104
+ $product_data['rounded_sale_price'] = round(number_format($product_data['rounded_sale_price'], 2, '.', ''));
3105
+ }
3106
+ } else {
3107
+ $product_data['rounded_price'] = round($float_price,0);
3108
+ $product_data['rounded_regular_price'] = (string) round($float_regular_price,0);
3109
+ $product_data['rounded_sale_price'] = round($float_sale_price,0);
3110
+ }
3111
 
3112
  // Calculate discount percentage
3113
+ if(isset($product_data['rounded_sale_price'])){
3114
+ if($product_data['rounded_regular_price'] > 0){
3115
+ $disc = round(($product_data['rounded_sale_price'] * 100) / $product_data['rounded_regular_price'], 2);
3116
+ $product_data['discount_percentage'] = 100-$disc;
3117
+ //$product_data['discount_percentage'] = round(100-(($product_data['sale_price']/$product_data['regular_price'])*100),2);
3118
+ }
3119
  }
3120
 
3121
  foreach($project_config['attributes'] as $attr_key => $attr_arr){
3122
  if(is_array($attr_arr)){
3123
  if($attr_arr['attribute'] == "g:shipping"){
3124
  if($product_data['price'] > 0){
3125
+ $product_data['shipping'] = $this->woosea_get_shipping_cost($class_cost_id, $project_config, $product_data['price'], $tax_rates, $fullrate, $shipping_zones, $product_data['id'], $product_data['item_group_id']);
3126
  $shipping_str = $product_data['shipping'];
3127
  }
3128
  }
3129
  }
3130
  }
3131
 
3132
+ if ((array_key_exists('shipping', $project_config['attributes'])) OR (array_key_exists('lowest_shipping_costs', $project_config['attributes'])) OR (array_key_exists('shipping_price', $project_config['attributes'])) OR ($project_config['fields'] == "trovaprezzi") OR ($project_config['fields'] == "customfeed")){
3133
+ $product_data['shipping'] = $this->woosea_get_shipping_cost($class_cost_id, $project_config, $product_data['price'], $tax_rates, $fullrate, $shipping_zones, $product_data['id'], $product_data['item_group_id']);
3134
  $shipping_str = $product_data['shipping'];
3135
  }
3136
 
3138
  if(!empty($shipping_str)){
3139
  $product_data['shipping_price'] = 0;
3140
  }
3141
+ $lowest_shipping_price = array();
3142
+ $shipping_arr = $product_data['shipping'];
3143
 
3144
  if(is_array($shipping_arr)){
3145
  foreach($shipping_arr as $akey => $arr){
3147
  $pieces_ship = explode (" ", $arr['price']);
3148
  if(isset($pieces_ship['1'])){
3149
  $product_data['shipping_price'] = $pieces_ship['1'];
3150
+ $lowest_shipping_price[] = $pieces_ship['1'];
3151
  }
3152
  }
3153
 
3162
  }
3163
  }
3164
 
3165
+ // Get the lowest shipping costs
3166
+ if(!empty($lowest_shipping_price)){
3167
+ $decimal_separator = wc_get_price_decimal_separator();
3168
+ if($decimal_separator == ","){
3169
+ $numeric_lowest_shipping_price = array();
3170
+ foreach ($lowest_shipping_price as &$value) {
3171
+ $number = str_replace(',', '.', $value);
3172
+ if (is_numeric($number)) {
3173
+ $value = number_format($number, 2, '.', '');
3174
+ $numeric_lowest_shipping_price[] = $value;
3175
+ }
3176
+ }
3177
+ $lowest_shipping_price = $numeric_lowest_shipping_price;
3178
+ unset($value);
3179
+ }
3180
+ $product_data['lowest_shipping_costs'] = min($lowest_shipping_price);
3181
+
3182
+ if($decimal_separator == ","){
3183
+ $product_data['lowest_shipping_costs'] = str_replace('.', ',', $product_data['lowest_shipping_costs']);
3184
+ }
3185
+ }
3186
+
3187
  // Google Dynamic Remarketing feeds require the English price notation
3188
  if ($project_config['name'] == "Google Remarketing - DRM"){
3189
  $thousand_separator = wc_get_price_thousand_separator();
3249
 
3250
  foreach($diff_taxonomies as $taxo){
3251
  $term_value = get_the_terms($product_data['id'], $taxo);
3252
+ $product_data["$taxo"] = "";
3253
 
3254
  if(is_array($term_value)){
3255
  // Do not add variation values to the feed when they are out of stock
3259
  $variations = $product_skroutz->get_available_variations();
3260
  $variations_id = wp_list_pluck( $variations, 'variation_id' );
3261
  $skroutz_att_array = array();
3262
+
3263
  foreach($variations_id as $var_id){
3264
  $stock_value = get_post_meta( $var_id, "_stock_status", true );
3265
  if($stock_value == "instock"){
3273
  $product_data[$taxo] = rtrim($product_data[$taxo],',');
3274
  }
3275
  }
3276
+
3277
  foreach($skroutz_att_array as $skrtz_value){
3278
  $product_data[$taxo] .= ",". $skrtz_value;
3279
  }
3280
  $product_data[$taxo] = ltrim($product_data[$taxo],',');
3281
  $product_data[$taxo] = rtrim($product_data[$taxo],',');
3282
+
3283
  } else {
3284
  // Simple Skroutz product
3285
  foreach($term_value as $term){
3322
  /**
3323
  * Get Custom Attributes for Single, Bundled and Composite products
3324
  */
3325
+ if (($product->is_type('simple')) OR ($product->is_type('woosb')) OR ($product->is_type('mix-and-match')) OR ($product->is_type('external')) OR ($product->is_type('bundle')) OR ($product->is_type('composite')) OR ($product_data['product_type'] == "variable") OR ($product_data['product_type'] == "auction") OR ($product->is_type('subscription'))){
3326
  $custom_attributes = $this->get_custom_attributes( $product_data['id'] );
3327
 
3328
+ if(is_array($custom_attributes)){
 
 
 
 
 
3329
 
 
 
 
 
3330
 
3331
+ if(!in_array("woosea optimized title", $custom_attributes)){
3332
+ $woosea_opt = array (
3333
+ "_woosea_optimized_title" => "woosea optimized title",
3334
+ );
3335
+ $custom_attributes = array_merge($custom_attributes, $woosea_opt);
 
 
3336
  }
3337
+
3338
+ if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
3339
+ $custom_attributes['_aioseop_title'] = "All in one seo pack title";
3340
+ $custom_attributes['_aioseop_description'] = "All in one seo pack description";
3341
+ }
3342
+
3343
+ if ( class_exists( 'Yoast_WooCommerce_SEO' ) ) {
3344
+ if(array_key_exists("yoast_gtin8", $custom_attributes)){
3345
+ $product_data["yoast_gtin8"] = $custom_attributes["yoast_gtin8"];
3346
+ }
3347
+ if(array_key_exists("yoast_gtin12", $custom_attributes)){
3348
+ $product_data["yoast_gtin12"] = $custom_attributes["yoast_gtin12"];
3349
+ }
3350
+ if(array_key_exists("yoast_gtin13", $custom_attributes)){
3351
+ $product_data["yoast_gtin13"] = $custom_attributes["yoast_gtin13"];
3352
+ }
3353
+ if(array_key_exists("yoast_gtin14", $custom_attributes)){
3354
+ $product_data["yoast_gtin14"] = $custom_attributes["yoast_gtin14"];
3355
+ }
3356
+ if(array_key_exists("yoast_isbn", $custom_attributes)){
3357
+ $product_data["yoast_isbn"] = $custom_attributes["yoast_isbn"];
3358
+ }
3359
+ if(array_key_exists("yoast_mpn", $custom_attributes)){
3360
+ $product_data["yoast_mpn"] = $custom_attributes["yoast_mpn"];
3361
+ }
3362
+ }
3363
+
3364
+ foreach($custom_attributes as $custom_kk => $custom_vv){
3365
+ $custom_value = get_post_meta( $product_data['id'], $custom_kk, true );
3366
+ $new_key ="custom_attributes_" . $custom_kk;
3367
+
3368
+ // This is a ACF image field (PLEASE NOTE: the ACF field needs to contain image or bild in the name)
3369
+ if(preg_match("/image|bild/i", $custom_kk)) {
3370
+ if (class_exists('ACF') AND ($custom_value > 0)) {
3371
+ //$image = wp_get_attachment_image_src($custom_value, "large");
3372
+ if(isset($image[0])){
3373
+ $custom_value = $image[0];
3374
+ }
3375
+ }
3376
+ }
3377
+
3378
+ // Just to make sure the title is never empty
3379
+ if(($custom_kk == "_aioseop_title") && ($custom_value == "")){
3380
+ $custom_value = $product_data['title'];
3381
+ }
3382
 
3383
+ // Just to make sure the description is never empty
3384
+ if(($custom_kk == "_aioseop_description") && ($custom_value == "")){
3385
+ $custom_value = $product_data['description'];
3386
+ }
3387
 
3388
+ // Just to make sure product names are never empty
3389
+ if(($custom_kk == "_woosea_optimized_title") && ($custom_value == "")){
3390
+ $custom_value = $product_data['title'];
3391
+ }
3392
 
3393
+ // Just to make sure the condition field is never empty
3394
+ if(($custom_kk == "_woosea_condition") && ($custom_value == "")){
3395
+ $custom_value = $product_data['condition'];
3396
+ }
3397
 
3398
+ // Need to clean up the strange price Rightpress is returning
3399
+ if ($this->woosea_is_plugin_active('wc-dynamic-pricing-and-discounts/wc-dynamic-pricing-and-discounts.php')){
3400
+ if($custom_kk == "rp_wcdpd_price_cache"){
3401
+ if((isset($project_config['AELIA'])) AND (!empty($GLOBALS['woocommerce-aelia-currencyswitcher'])) AND (get_option ('add_aelia_support') == "yes")){
3402
+ $product_data['price'] = do_shortcode('[aelia_cs_product_price product_id="'.$product_data['id'].'" formatted="0" currency="'.$project_config['AELIA'].'"]');
3403
+ $product_data['sale_price'] = apply_filters('wc_aelia_cs_convert', $custom_value['sale_price']['p'], $from_currency, $project_config['AELIA']);
3404
+ } else {
3405
+ if(array_key_exists("price", $custom_value)){
3406
+ $product_data['price'] = $custom_value['price']['p'];
3407
+ }
3408
 
3409
+ if(array_key_exists("sale_price", $custom_value)){
3410
+ $product_data['sale_price'] = $custom_value['sale_price']['p'];
3411
+ }
3412
+ }
3413
  }
3414
  }
3415
+ $product_data[$new_key] = $custom_value;
3416
+
3417
  }
3418
+ }
 
3419
 
3420
  /**
3421
  * We need to check if this product has individual custom product attributes
3425
  $data = $wpdb->get_results($sql);
3426
  if (count($data)) {
3427
  foreach ($data as $key => $value) {
3428
+ $value_display = str_replace("_", " ",$value->name);
3429
  if (preg_match("/_product_attributes/i",$value->name)){
3430
  $product_attr = unserialize($value->type);
3431
  if(!empty($product_attr)){
3443
 
3444
  /**
3445
  * Get Product Attributes for Single products
3446
+ * These are the attributes users create themselves in WooCommerce
3447
  */
3448
+ if (($product->is_type('simple')) OR ($product->is_type('external')) OR ($product->is_type('woosb')) 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')))){
3449
  $single_attributes = $product->get_attributes();
 
3450
  foreach ($single_attributes as $attribute){
3451
+ $attr_name = strtolower($attribute->get_name());
3452
+ $attr_value = $product->get_attribute($attr_name);
3453
+ $product_data[$attr_name] = $attr_value;
3454
  }
3455
  }
3456
 
3463
  }
3464
  }
3465
 
 
 
 
3466
  /**
3467
  * Versioned products need a seperate approach
3468
  * Get data for these products based on the mother products item group id
3473
  $product_variations = new WC_Product_Variation( $product_data['id'] );
3474
  $variations = $product_variations->get_variation_attributes();
3475
 
3476
+ // For Skroutz and Bestprice apparal products we can only append colours to the product name
3477
  // When a product has both a size and color attribute we assume its an apparal product
3478
+ if(($project_config['fields'] == "skroutz") OR ($project_config['fields'] == "bestprice")){
3479
  $size_found = "no";
3480
  $color_found = "no";
3481
 
3509
  if(isset($sz_attribute)){
3510
  $skroutz_size = get_post_meta( $product_data['id'], "attribute_".$sz_attribute, true );
3511
  }
3512
+
3513
  if((!empty($skroutz_color)) AND (!empty($skroutz_size))){
3514
 
3515
  foreach($variations as $kvar => $vvar){
3551
  }
3552
  }
3553
 
 
 
3554
  if((isset($project_config['lowest_price_variations'])) OR (isset($project_config['default_variations']))){
 
3555
  // Determine the default variation product
3556
  if( ($product_data['item_group_id'] > 0) AND (is_object(wc_get_product( $product_data['item_group_id']))) AND (($product_data['product_type'] == "variation") OR ($product_data['product_type'] == "subscription_variation"))){
3557
+ $mother_product = new WC_Product_Variable($product_data['item_group_id']);
3558
+ //$mother_product = wc_get_product($product_data['item_group_id']);
3559
+ $def_attributes = $mother_product->get_default_attributes();
3560
 
3561
  if(isset($project_config['lowest_price_variations'])){
3562
+
3563
  // Determine lowest priced variation
3564
  $variation_min_price = $mother_product->get_variation_price('min');
3565
  $variation_min_price = wc_format_decimal($variation_min_price,2);
3566
  $variation_min_price = wc_format_localized_price($variation_min_price);
3567
+ $var_price = get_post_meta($product_data['id'], '_price', true);
3568
+ $var_price = wc_format_decimal($var_price,2);
3569
+ $var_price = wc_format_localized_price($var_price);
3570
+ $variation_prices = $mother_product->get_variation_prices();
3571
+ $variation_prices_price = array_values($variation_prices['price']);
3572
+ if(!empty($variation_prices_price)){
3573
+ $lowest_price = min($variation_prices_price);
3574
+ } else {
3575
+ $lowest_price = 0;
3576
+ }
3577
 
3578
+ if(($var_price == $lowest_price) OR ($var_price == $variation_min_price) OR ($product_data['system_regular_price'] == $variation_min_price) OR ($product_data['system_net_price'] == $variation_min_price)){
3579
  $variation_pass = "true";
3580
  } else {
3581
  $variation_pass = "false";
3713
  /**
3714
  * Although this is a product variation we also need to grap the Dynamic attributes belonging to the simple mother prodict
3715
  */
3716
+ $stock_value = get_post_meta( $product_data['id'], "_stock_status", true );
3717
+ //if($stock_value == "instock"){
3718
  foreach($diff_taxonomies as $taxo){
3719
  $term_value = get_the_terms($product_data['item_group_id'], $taxo);
3720
  unset($product_data[$taxo]);
3721
  if(is_array($term_value)){
3722
  foreach($term_value as $term){
3723
  if(empty($product_data[$taxo])){
3724
+ $product_data[$taxo] = $term->name;
3725
  } else {
3726
+ $product_data[$taxo] .= " ".$term->name;
3727
  }
3728
  }
3729
  }
3730
+ }
3731
 
3732
  /**
3733
  * Add product tags to the product data array
3747
 
3748
  // Add attribute values to the variation product names to make them unique
3749
  $product_data['title_hyphen'] = $product_data['title']." - ";
3750
+ $product_data['mother_title_hyphen'] = $product_data['mother_title']." - ";
3751
 
3752
  foreach($variations as $kk => $vv){
3753
  $custom_key = $kk;
3781
  /**
3782
  * Get Custom Attributes for this variable product
3783
  */
 
3784
  $custom_attributes = $this->get_custom_attributes( $product_data['id'] );
3785
 
3786
  if(!in_array("woosea optimized title", $custom_attributes)){
3794
  $custom_attributes['_aioseop_title'] = "All in one seo pack title";
3795
  $custom_attributes['_aioseop_description'] = "All in one seo pack description";
3796
  }
3797
+
3798
+ if ( class_exists( 'Yoast_WooCommerce_SEO' ) ) {
3799
+ if(array_key_exists("yoast_gtin8", $custom_attributes)){
3800
+ $product_data["yoast_gtin8"] = $custom_attributes["yoast_gtin8"];
3801
+ }
3802
+ if(array_key_exists("yoast_gtin12", $custom_attributes)){
3803
+ $product_data["yoast_gtin12"] = $custom_attributes["yoast_gtin12"];
3804
+ }
3805
+ if(array_key_exists("yoast_gtin13", $custom_attributes)){
3806
+ $product_data["yoast_gtin13"] = $custom_attributes["yoast_gtin13"];
3807
+ }
3808
+ if(array_key_exists("yoast_gtin14", $custom_attributes)){
3809
+ $product_data["yoast_gtin14"] = $custom_attributes["yoast_gtin14"];
3810
+ }
3811
+ if(array_key_exists("yoast_isbn", $custom_attributes)){
3812
+ $product_data["yoast_isbn"] = $custom_attributes["yoast_isbn"];
3813
+ }
3814
+ if(array_key_exists("yoast_mpn", $custom_attributes)){
3815
+ $product_data["yoast_mpn"] = $custom_attributes["yoast_mpn"];
3816
+ }
3817
+ }
3818
+
3819
  foreach($custom_attributes as $custom_kk => $custom_vv){
3820
  $custom_value = get_post_meta( $product_data['id'], $custom_kk, true );
3821
 
3847
  $new_key = str_replace("var","product",$new_key);
3848
  if(!empty( $custom_value )){
3849
  $product_data[$new_key] = $custom_value;
3850
+ }
3851
  }
3852
  }
3853
 
3862
  $value_display = str_replace("_", " ",$value->name);
3863
  if (preg_match("/_product_attributes/i",$value->name)){
3864
  $product_attr = unserialize($value->type);
3865
+ if((!empty($product_attr)) AND (is_array($product_attr))){
3866
  foreach ($product_attr as $key => $arr_value) {
3867
  $new_key ="custom_attributes_" . $key;
3868
  $product_data[$new_key] = $arr_value['value'];
3877
  */
3878
  $custom_attributes_mother = $this->get_custom_attributes( $product_data['item_group_id'] );
3879
 
3880
+ if ( class_exists( 'Yoast_WooCommerce_SEO' ) ) {
3881
+ if(array_key_exists("yoast_gtin8", $custom_attributes_mother)){
3882
+ $product_data["yoast_gtin8"] = $custom_attributes_mother["yoast_gtin8"];
3883
+ }
3884
+ if(array_key_exists("yoast_gtin12", $custom_attributes_mother)){
3885
+ $product_data["yoast_gtin12"] = $custom_attributes_mother["yoast_gtin12"];
3886
+ }
3887
+ if(array_key_exists("yoast_gtin13", $custom_attributes_mother)){
3888
+ $product_data["yoast_gtin13"] = $custom_attributes_mother["yoast_gtin13"];
3889
+ }
3890
+ if(array_key_exists("yoast_gtin14", $custom_attributes_mother)){
3891
+ $product_data["yoast_gtin14"] = $custom_attributes_mother["yoast_gtin14"];
3892
+ }
3893
+ if(array_key_exists("yoast_isbn", $custom_attributes_mother)){
3894
+ $product_data["yoast_isbn"] = $custom_attributes_mother["yoast_isbn"];
3895
+ }
3896
+ if(array_key_exists("yoast_mpn", $custom_attributes_mother)){
3897
+ $product_data["yoast_mpn"] = $custom_attributes_mother["yoast_mpn"];
3898
+ }
3899
+ }
3900
+
3901
  foreach($custom_attributes_mother as $custom_kk_m => $custom_value_m){
3902
 
3903
  if(!array_key_exists($custom_kk_m, $product_data)){
3937
  * we will add CDATA brackets to the title and description attributes
3938
  */
3939
  $product_data['title_lc'] = ucfirst(strtolower($product_data['title']));
3940
+ $product_data['title_lcw'] = ucwords(strtolower($product_data['title']));
3941
+
3942
+ // Add CDATA to title and descriptions
3943
+ //$add_woosea_cdata = get_option ('add_woosea_cdata');
3944
+ //if($add_woosea_cdata == "yes"){
3945
+ // $product_data['title'] = $this->woosea_append_cdata ( $product_data['title'] );
3946
+ // $product_data['description'] = $this->woosea_append_cdata ( $product_data['description'] );
3947
+ // $product_data['short_description'] = $this->woosea_append_cdata ( $product_data['short_description'] );
3948
+ //}
3949
 
3950
  /**
3951
  * Get product reviews for Google Product Review Feeds
3952
  */
3953
  $product_data['reviews'] = $this->woosea_get_reviews( $product_data, $product );
3954
 
3955
+
3956
+ /**
3957
+ * Filter out reviews that do not have text
3958
+ */
3959
+ if(!empty($product_data['reviews'])){
3960
+ foreach($product_data['reviews'] as $review_id => $review_details){
3961
+ if(empty($review_details['content'])){
3962
+ unset($product_data['reviews'][$review_id]);
3963
+ }
3964
+ }
3965
+ }
3966
+
3967
+ /**
3968
+ * Filter out reviews that do not have a rating
3969
+ */
3970
+ if(!empty($product_data['reviews'])){
3971
+ foreach($product_data['reviews'] as $review_id => $review_details){
3972
+ if(empty($review_details['review_ratings'])){
3973
+ unset($product_data['reviews'][$review_id]);
3974
+ }
3975
+ }
3976
+ }
3977
+
3978
+ /**
3979
+ * Filter out reviews that have a link in the review text / content as that is now allowed by Google
3980
+ */
3981
+ if(!empty($product_data['reviews'])){
3982
+ foreach($product_data['reviews'] as $review_id => $review_details){
3983
+ $pos = strpos($review_details['content'], 'www');
3984
+ if($pos !== false){
3985
+ unset($product_data['reviews'][$review_id]);
3986
+ }
3987
+
3988
+ $pos = strpos($review_details['content'], 'http');
3989
+ if($pos !== false){
3990
+ unset($product_data['reviews'][$review_id]);
3991
+ }
3992
+ }
3993
+ }
3994
+
3995
  /**
3996
  * Check if individual products need to be excluded
3997
  */
4036
  $product_data = $this->woocommerce_sea_filters( $project_config['rules'], $product_data );
4037
  }
4038
  }
4039
+
4040
+ if(isset($product_data['title_lcw'])){
4041
+ $product_data['title_lcw'] = ucwords($product_data['title_lcw']);
4042
+ }
4043
 
4044
  // Check if the sale price is effective
4045
  if(isset($product_data['sale_price_start_date'])){
4061
  // For these channels parent products are allowed
4062
  $allowed_channel_parents = array(
4063
  "skroutz",
4064
+ "bestprice",
4065
  "google_dsa",
4066
  "google_product_review",
4067
  );
4068
 
4069
+ if(array_key_exists('fields', $project_config)){
4070
+ if (!in_array($project_config['fields'], $allowed_channel_parents)){
4071
+ if(($product->is_type('variable')) AND ($product_data['item_group_id'] == 0)){
4072
+ $product_data = array();
4073
+ $product_data = null;
4074
+ }
4075
+ }
4076
+ }
4077
 
4078
  /**
4079
  * Remove variation products that are not THE default variation product
4086
  /**
4087
  * And item_group_id is not allowed for simple products, prevent users from adding this to the feedd
4088
  */
4089
+ if (($product->is_type('simple')) OR ($product->is_type('external')) OR ($product->is_type('woosb')) 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')))){
4090
  unset($product_data['item_group_id']);
4091
  }
4092
 
4100
  }
4101
  }
4102
 
4103
+ /**
4104
+ * Do final check on Skroutz out of stock sizes
4105
+ * When a size is not on stock remove it
4106
+ */
4107
+ if($project_config['fields'] == "skroutz"){
4108
+
4109
+ if(isset($product_data['id'])){
4110
+
4111
+ foreach($project_config['attributes'] as $ky => $vy){
4112
+ if(isset($vy['attribute'])){
4113
+ if($vy['attribute'] == "size"){
4114
+ $size_found = "yes";
4115
+ $sz_attribute = $vy['mapfrom'];
4116
+ }
4117
+ if($vy['attribute'] == "color"){
4118
+ $color_found = "yes";
4119
+ $clr_attribute = $vy['mapfrom'];
4120
+ }
4121
+ }
4122
+ }
4123
+
4124
+ $stock_value = get_post_meta( $product_data['id'], "_stock_status", true );
4125
+ $sz_attr_value = get_post_meta( $product_data['id'], $sz_attribute, true );
4126
+
4127
+ if(!empty($clr_attribute)){
4128
+ $clr_attr_value = get_post_meta( $product_data['id'], "attribute_".$clr_attribute, true );
4129
+ } else {
4130
+ $clr_attr_value = "";
4131
+ }
4132
+
4133
+ // HIER MOET EEN CHECK IN OP product_type
4134
+ if(isset($product_data['item_group_id']) AND ($product_data['product_type'] == "variation")){
4135
+
4136
+ if($product_data['item_group_id'] > 0){
4137
+ $product_skroutz = wc_get_product($product_data['item_group_id']);
4138
+ $variations = $product_skroutz->get_available_variations();
4139
+ $variations_id = wp_list_pluck( $variations, 'variation_id' );
4140
+
4141
+ foreach($variations_id as $var_id){
4142
+ $clr_variation = get_post_meta( $var_id, "attribute_".$clr_attribute, true );
4143
+ $size_variation = get_post_meta( $var_id, "attribute_".$sz_attribute, true );
4144
+ $stock_variation = get_post_meta( $var_id, "_stock_status", true );
4145
+
4146
+ if($clr_variation == $clr_attr_value){
4147
+ if($stock_variation == "outofstock"){
4148
+ // Remove this size as it is not on stock
4149
+ if(array_key_exists($sz_attribute, $product_data)){
4150
+ $product_data[$sz_attribute] = str_replace(ucfirst($size_variation),"",$product_data[$sz_attribute]);
4151
+ $product_data[$sz_attribute] = str_replace(", , ",",",$product_data[$sz_attribute]);
4152
+ $product_data[$sz_attribute] = rtrim($product_data[$sz_attribute], " ");
4153
+ $product_data[$sz_attribute] = trim($product_data[$sz_attribute], ",");
4154
+ }
4155
+ } else {
4156
+ // Add comma's in the size field and put availability on stock as at least one variation is on stock
4157
+ $size_variation_new = $size_variation.",";
4158
+ $product_data[$sz_attribute] = str_replace($size_variation,$size_variation_new,$product_data[$sz_attribute]);
4159
+ $product_data[$sz_attribute] = trim($product_data[$sz_attribute], ",");
4160
+ $product_data['availability'] = "in stock";
4161
+ }
4162
+ }
4163
+ }
4164
+ } else {
4165
+ // This is a parent variable product
4166
+ $product_skroutz = wc_get_product($product_data['id']);
4167
+ $variations = $product_skroutz->get_available_variations();
4168
+ $variations_id = wp_list_pluck( $variations, 'variation_id' );
4169
+
4170
+ foreach($variations_id as $var_id){
4171
+ //$clr_variation = get_post_meta( $var_id, "attribute_".$clr_attribute, true );
4172
+ $size_variation = get_post_meta( $var_id, "attribute_".$sz_attribute, true );
4173
+ $stock_variation = get_post_meta( $var_id, "_stock_status", true );
4174
+ if($stock_variation == "outofstock"){
4175
+ // Remove this size as it is not on stock
4176
+ if(array_key_exists($sz_attribute, $product_data)){
4177
+ $product_data[$sz_attribute] = str_replace(ucfirst($size_variation),"",$product_data[$sz_attribute]);
4178
+ $product_data[$sz_attribute] = str_replace(", , ",",",$product_data[$sz_attribute]);
4179
+ $product_data[$sz_attribute] = rtrim($product_data[$sz_attribute], " ");
4180
+ $product_data[$sz_attribute] = rtrim($product_data[$sz_attribute], ",");
4181
+
4182
+ }
4183
+ }
4184
+ }
4185
+ }
4186
+ }
4187
+ }
4188
+ }
4189
+
4190
  /**
4191
  * When product has passed the filter rules it can continue with the rest
4192
  */
4220
  }
4221
  } else {
4222
  if((strlen($attr_value['mapfrom'])) AND (array_key_exists($attr_value['mapfrom'], $product_data))){
4223
+ if(($attr_value['attribute'] == "URL") OR ($attr_value['attribute'] == "g:link") OR ($attr_value['attribute'] == "g:link_template") OR ($attr_value['attribute'] == "g:image_link") OR ($attr_value['attribute'] == "link") OR ($attr_value['attribute'] == "Final URL") OR ($attr_value['attribute'] == "SKU")){
4224
  $attr_line = "'".$attr_value['prefix']."".$product_data[$attr_value['mapfrom']]."".$attr_value['suffix']."'";
4225
  } else {
4226
  $attr_line = "'".$attr_value['prefix']. "".$product_data[$attr_value['mapfrom']]."" .$attr_value['suffix']."'";
4292
  }
4293
  } else {
4294
  if(strlen($product_data[$attr_value['mapfrom']])){
4295
+ if(($attr_value['attribute'] == "URL") OR ($attr_value['attribute'] == "g:link") OR ($attr_value['attribute'] == "g:link_template") OR ($attr_value['attribute'] == "g:image_link") OR ($attr_value['attribute'] == "link") OR ($attr_value['attribute'] == "Final URL") OR ($attr_value['attribute'] == "SKU")){
4296
  if(($product_data['product_type'] == "variation") AND (preg_match("/aelia_cs_currency/", $attr_value['suffix']))){
4297
  $attr_value['suffix'] = str_replace("?","&",$attr_value['suffix']);
4298
  $attr_line .= ",'".$attr_value['prefix']."".$product_data[$attr_value['mapfrom']]."".$attr_value['suffix']."'";
4476
  $shipping_str .= ":WOOSEA_POSTAL_CODE##$v";
4477
  } elseif ($k == "price"){
4478
  $shipping_str .= ":WOOSEA_PRICE##$attr_value[prefix] $v $attr_value[suffix]";
4479
+ //$shipping_str .= ":WOOSEA_PRICE##$v";
4480
  } else {
4481
  // UNKNOWN, DO NOT ADD
4482
  }
4513
  }
4514
  } else {
4515
  if(strlen($product_data[$attr_value['mapfrom']])){
4516
+ if(($attr_value['attribute'] == "URL") OR ($attr_value['attribute'] == "g:link") OR ($attr_value['attribute'] == "link") OR ($attr_value['attribute'] == "g:link_template")){
4517
  if(($product_data['product_type'] == "variation") AND (preg_match("/aelia_cs_currency/", $attr_value['suffix']))){
4518
  $attr_value['suffix'] = str_replace("?","&",$attr_value['suffix']);
4519
  $xml_product[$attr_value['attribute']] = "$attr_value[prefix]". $product_data[$attr_value['mapfrom']] ."$attr_value[suffix]";
4783
  }
4784
  // New policy of Google, only when the value is yes add it to the feed
4785
  // 28 October 2019
4786
+ if(array_key_exists('calculated', $project_config['attributes'])){
4787
  $xml_product['g:identifier_exists'] = $identifier_exists;
4788
+ }
4789
  }
4790
  return $xml_product;
4791
  }
5043
  return $product_data;
5044
  }
5045
 
5046
+ /**
5047
+ * Execute project rules
5048
+ */
5049
  private function woocommerce_sea_rules( $project_rules2, $product_data ){
5050
  $aantal_prods = count($product_data);
5051
+ if($aantal_prods > 0){
5052
 
5053
+ foreach ($project_rules2 as $pr_key => $pr_array){
5054
 
5055
+ foreach ($product_data as $pd_key => $pd_value){
5056
 
5057
+ // Check is there is a rule on specific attributes
5058
+ if($pd_key == $pr_array['attribute']){
5059
+ // This is because for data manipulation the than attribute is empty
5060
+ if(!array_key_exists('than_attribute', $pr_array)){
5061
+ $pr_array['than_attribute'] = $pd_key;
5062
+ }
 
5063
 
5064
  // Check if a rule has been set for Google categories
5065
  if (!empty($product_data['categories']) AND ($pr_array['than_attribute'] == "google_category") AND ($product_data[$pr_array['attribute']] == $pr_array['criteria'])){
5066
+
5067
+ $pr_array['than_attribute'] = "categories";
5068
  $category_id = explode("-", $pr_array['newvalue']);
5069
  $pr_array['newvalue'] = $category_id[0];
5070
+ $product_data['categories'] = $pr_array['newvalue'];
5071
+ }
5072
 
5073
+ // Make sure that rules on numerics are on true numerics
5074
+ if (!is_array($pd_value) AND (!preg_match('/[A-Za-z]/', $pd_value))){
5075
+ $pd_value = strtr($pd_value, ',', '.');
5076
+ }
5077
 
5078
 
5079
+ // Make sure the price or sale price is numeric
5080
+ if(($pr_array['attribute'] == "sale_price") OR ($pr_array['attribute'] == "price")){
5081
+ settype($pd_value, "double");
5082
+ }
5083
 
5084
+ if (((is_numeric($pd_value)) AND ($pr_array['than_attribute'] != "shipping"))){
5085
 
5086
+ // Rules for numeric values
5087
+ switch ($pr_array['condition']) {
5088
+ case($pr_array['condition'] = "contains"):
5089
+ if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
5090
+ $product_data[$pr_array['than_attribute']] = str_replace($pr_array['criteria'], $pr_array['newvalue'], $pd_value);
5091
+ }
5092
+ break;
5093
+ case($pr_array['condition'] = "containsnot"):
5094
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
5095
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5096
+ }
5097
+ break;
5098
+ case($pr_array['condition'] = "="):
5099
+ if (($pd_value == $pr_array['criteria'])){
5100
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5101
+ }
5102
+ break;
5103
+ case($pr_array['condition'] = "!="):
5104
+ if (($pd_value != $pr_array['criteria'])){
5105
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5106
+ }
5107
+ break;
5108
+ case($pr_array['condition'] = ">"):
5109
+ if (($pd_value > $pr_array['criteria'])){
5110
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5111
+ }
5112
+ break;
5113
+ case($pr_array['condition'] = ">="):
5114
+ if (($pd_value >= $pr_array['criteria'])){
5115
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5116
+ }
5117
+ break;
5118
+ case($pr_array['condition'] = "<"):
5119
+ if (($pd_value < $pr_array['criteria'])){
5120
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5121
+ }
5122
+ break;
5123
+ case($pr_array['condition'] = "=<"):
5124
+ if (($pd_value <= $pr_array['criteria'])){
5125
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5126
+ }
5127
+ break;
5128
+ case($pr_array['condition'] = "empty"):
5129
+ if(empty($product_data[$pr_array['attribute']])){
5130
+ if ((strlen($pd_value) < 1)){
5131
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5132
+ } else {
5133
+ $product_data[$pr_array['attribute']] = $product_data[$pr_array['than_attribute']];
5134
+ }
5135
+ }
5136
+ break;
5137
+ case($pr_array['condition'] = "multiply"):
5138
+ $pr_array['criteria'] = strtr($pr_array['criteria'], ',', '.');
5139
+ $convert_back = "false";
5140
+ $pos = strpos($pd_value, ',');
5141
+ if($pos !== false){
5142
+ $convert_back = "true";
5143
+ }
5144
+ $pd_value = strtr($pd_value, ',', '.');
5145
+ $newvalue = $pd_value*$pr_array['criteria'];
5146
+ $newvalue = round($newvalue, 2);
5147
+ if($convert_back == "true"){
5148
+ $newvalue = strtr($newvalue, '.',',');
5149
+ }
5150
+ $product_data[$pr_array['attribute']] = $newvalue;
5151
+ break;
5152
+ case($pr_array['condition'] = "divide"):
5153
+ $newvalue = ($pd_value / $pr_array['criteria']);
5154
+ $newvalue = round($newvalue, 2);
5155
+ $newvalue = strtr($newvalue, '.',',');
5156
+ $product_data[$pr_array['attribute']] = $newvalue;
5157
+ break;
5158
+ case($pr_array['condition'] = "plus"):
5159
+ $newvalue = ($pd_value + $pr_array['criteria']);
5160
+ $product_data[$pr_array['attribute']] = $newvalue;
5161
+ break;
5162
+ case($pr_array['condition'] = "minus"):
5163
+ $newvalue = ($pd_value - $pr_array['criteria']);
5164
+ $product_data[$pr_array['attribute']] = $newvalue;
5165
+ break;
5166
+ case($pr_array['condition'] = "findreplace"):
5167
+ if (strpos($pd_value, $pr_array['criteria']) !== false){
5168
  // Make sure that a new value has been set
5169
+ if(!empty($pr_array['newvalue'])){
5170
+ // Find and replace only work on same attribute field, otherwise create a contains rule
5171
  if($pr_array['attribute'] == $pr_array['than_attribute']){
5172
  $newvalue = str_replace($pr_array['criteria'],$pr_array['newvalue'], $pd_value);
5173
  $product_data[$pr_array['than_attribute']] = ucfirst($newvalue);
5174
  }
5175
+ }
5176
+ }
5177
+ break;
5178
+ default:
5179
+ break;
5180
+ }
5181
+ } elseif (is_array($pd_value)) {
5182
+
5183
+ // For now only shipping details are in an array
5184
+ foreach ($pd_value as $k => $v){
5185
+ if(is_array($v)){
5186
+ foreach ($v as $kk => $vv){
5187
+ // Only shipping detail rule can be on price for now
5188
+ if($kk == "price"){
5189
+ switch ($pr_array['condition']) {
5190
+ case($pr_array['condition'] = "contains"):
5191
+ if ((preg_match('/'.$pr_array['criteria'].'/', $vv))){
5192
+ $pd_value[$k]['price'] = str_replace($pr_array['criteria'], $pr_array['newvalue'], $vv);
5193
+ $product_data[$pr_array['than_attribute']] = $pd_value;
5194
+ }
5195
+ break;
5196
+ case($pr_array['condition'] = "containsnot"):
5197
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $vv))){
5198
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
5199
+ $product_data[$pr_array['than_attribute']] = $pd_value;
5200
+ }
5201
+ break;
5202
+ case($pr_array['condition'] = "="):
5203
+ if (($vv == $pr_array['criteria'])){
5204
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
5205
+ $product_data[$pr_array['than_attribute']] = $pd_value;
5206
+ }
5207
+ break;
5208
+ case($pr_array['condition'] = "!="):
5209
+ if (($vv != $pr_array['criteria'])){
5210
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
5211
+ $product_data[$pr_array['than_attribute']] = $pd_value;
5212
+ }
5213
+ break;
5214
+ case($pr_array['condition'] = ">"):
5215
+ if (($vv > $pr_array['criteria'])){
5216
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
5217
+ $product_data[$pr_array['than_attribute']] = $pd_value;
5218
+ }
5219
+ break;
5220
+ case($pr_array['condition'] = ">="):
5221
+ if (($vv >= $pr_array['criteria'])){
5222
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
5223
+ $product_data[$pr_array['than_attribute']] = $pd_value;
5224
+ }
5225
+ break;
5226
+ case($pr_array['condition'] = "<"):
5227
+ if (($vv < $pr_array['criteria'])){
5228
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
5229
+ $product_data[$pr_array['than_attribute']] = $pd_value;
5230
+ }
5231
+ break;
5232
+ case($pr_array['condition'] = "=<"):
5233
+ if (($vv <= $pr_array['criteria'])){
5234
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
5235
+ $product_data[$pr_array['than_attribute']] = $pd_value;
5236
+ }
5237
+ break;
5238
+ case($pr_array['condition'] = "empty"):
5239
+ if ((strlen($vv) < 1)){
5240
+ $pd_value[$k]['price'] = $pr_array['newvalue'];
5241
+ $product_data[$pr_array['than_attribute']] = $pd_value;
5242
+ }
5243
+ break;
5244
+ case($pr_array['condition'] = "multiply"):
5245
+ // Only shipping array
5246
+ if(is_array($pd_value)){
5247
+ $pr_array['criteria'] = strtr($pr_array['criteria'], ',', '.');
5248
+ foreach ($pd_value as $ship_a_key => $shipping_arr){
5249
+ foreach($shipping_arr as $ship_key => $ship_value){
5250
+ if($ship_key == "price"){
5251
+ $ship_pieces = explode(" ", $ship_value);
5252
+ $pd_value = strtr($ship_pieces[1], ',', '.');
5253
+ $newvalue = $pd_value*$pr_array['criteria'];
5254
+ $newvalue = round($newvalue, 2);
5255
+ $newvalue = strtr($newvalue, '.',',');
5256
+ $newvalue = $ship_pieces[0]." ".$newvalue;
5257
+ $product_data[$pr_array['than_attribute']][$ship_a_key]['price'] = $newvalue;
5258
+ }
5259
+ }
5260
+ }
5261
+ }
5262
+ break;
5263
+ default:
5264
+ break;
5265
+ }
5266
+ }
5267
+ }
5268
+ } else {
5269
+ // Rules on product tags
5270
+ foreach ($pd_value as $k => $v){
5271
+
5272
+ // Rules for string values
5273
+ if (!array_key_exists('cs', $pr_array)){
5274
+ $v = strtolower($v);
5275
+ $pr_array['criteria'] = strtolower($pr_array['criteria']);
5276
+ }
5277
+
5278
+ switch ($pr_array['condition']) {
5279
+ case($pr_array['condition'] = "contains"):
5280
+ if ((preg_match('/'.$pr_array['criteria'].'/', $v))){
5281
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5282
+ }
5283
+ break;
5284
+ case($pr_array['condition'] = "containsnot"):
5285
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $v))){
5286
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5287
+ }
5288
+ break;
5289
+ case($pr_array['condition'] = "="):
5290
+ if (($v == $pr_array['criteria'])){
5291
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5292
+ }
5293
+ break;
5294
+ case($pr_array['condition'] = "!="):
5295
+ if (($v != $pr_array['criteria'])){
5296
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5297
+ }
5298
+ break;
5299
+ case($pr_array['condition'] = ">"):
5300
+ if (($v > $pr_array['criteria'])){
5301
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5302
+ }
5303
+ break;
5304
+ case($pr_array['condition'] = ">="):
5305
+ if (($v >= $pr_array['criteria'])){
5306
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5307
+ }
5308
+ break;
5309
+ case($pr_array['condition'] = "<"):
5310
+ if (($v < $pr_array['criteria'])){
5311
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5312
+ }
5313
+ break;
5314
+ case($pr_array['condition'] = "=<"):
5315
+ if (($v <= $pr_array['criteria'])){
5316
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5317
+ }
5318
+ break;
5319
+ case($pr_array['condition'] = "empty"):
5320
+ if ((strlen($v) < 1)){
5321
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5322
+ }
5323
+ break;
5324
+ case($pr_array['condition'] = "multiply"):
5325
+ // Only shipping array
5326
+ if(is_array($v)){
5327
+ $pr_array['criteria'] = strtr($pr_array['criteria'], ',', '.');
5328
+ foreach ($v as $ship_a_key => $shipping_arr){
5329
+ foreach($shipping_arr as $ship_key => $ship_value){
5330
+ if($ship_key == "price"){
5331
+ $ship_pieces = explode(" ", $ship_value);
5332
+ $pd_value = strtr($ship_pieces[1], ',', '.');
5333
+ $newvalue = $pd_value*$pr_array['criteria'];
5334
+ $newvalue = round($newvalue, 2);
5335
+ $newvalue = strtr($newvalue, '.',',');
5336
+ $newvalue = $ship_pieces[0]." ".$newvalue;
5337
+ $product_data[$pr_array['than_attribute']][$ship_a_key]['price'] = $newvalue;
5338
+ }
5339
+ }
5340
+ }
5341
+ }
5342
+ break;
5343
+ default:
5344
+ break;
5345
+ }
5346
+ }
5347
+ }
5348
+ }
5349
+ } else {
5350
+ // Rules for string values
5351
+ if (!array_key_exists('cs', $pr_array)){
5352
+ if($pr_array['attribute'] != "image"){
5353
+ $pd_value = strtolower($pd_value);
5354
+ $pr_array['criteria'] = strtolower($pr_array['criteria']);
5355
+ }
5356
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5357
 
5358
+ switch ($pr_array['condition']) {
5359
+ case($pr_array['condition'] = "contains"):
5360
+ if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
5361
+ // Specifically for shipping price rules
5362
+ if(!empty($product_data[$pr_array['than_attribute']])){
5363
+ if(is_array($product_data[$pr_array['than_attribute']])){
5364
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
5365
+ for ($x = 0; $x <= $arr_size; $x++) {
5366
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
5367
+ }
5368
+ } else {
5369
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5370
+ }
5371
+ } else {
5372
+ // This attribute value is empty for this product
5373
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5374
+ }
5375
+ }
5376
+ break;
5377
+ case($pr_array['condition'] = "containsnot"):
5378
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value))){
5379
+ // Specifically for shipping price rules
5380
+ if(is_array($product_data[$pr_array['than_attribute']])){
5381
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
5382
+ for ($x = 0; $x <= $arr_size; $x++) {
5383
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
5384
+ }
5385
+ } else {
5386
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5387
+ }
5388
+ }
5389
+ break;
5390
+ case($pr_array['condition'] = "="):
5391
+ if (($pr_array['criteria'] == "$pd_value")){
5392
+ // Specifically for shipping price rules
5393
+ if(is_array($product_data[$pr_array['than_attribute']])){
5394
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
5395
+ for ($x = 0; $x <= $arr_size; $x++) {
5396
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
5397
+ }
5398
+ } else {
5399
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5400
+ }
5401
+ }
5402
+ $ship = $product_data['shipping'];
5403
+ break;
5404
+ case($pr_array['condition'] = "!="):
5405
+ if (($pr_array['criteria'] != "$pd_value")){
5406
+ // Specifically for shipping price rules
5407
+ if(is_array($product_data[$pr_array['than_attribute']])){
5408
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
5409
+ for ($x = 0; $x <= $arr_size; $x++) {
5410
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
5411
+ }
5412
+ } else {
5413
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5414
+ }
5415
+ }
5416
+ break;
5417
+ case($pr_array['condition'] = ">"):
5418
+ // Use a lexical order on relational string operators
5419
+ if (($pd_value > $pr_array['criteria'])){
5420
+ // Specifically for shipping price rules
5421
+ if(is_array($product_data[$pr_array['than_attribute']])){
5422
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
5423
+ for ($x = 0; $x <= $arr_size; $x++) {
5424
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
5425
+ }
5426
+ } else {
5427
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5428
+ }
5429
+ }
5430
+ break;
5431
+ case($pr_array['condition'] = ">="):
5432
+ // Use a lexical order on relational string operators
5433
+ if (($pd_value >= $pr_array['criteria'])){
5434
+ // Specifically for shipping price rules
5435
+ if(is_array($product_data[$pr_array['than_attribute']])){
5436
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
5437
+ for ($x = 0; $x <= $arr_size; $x++) {
5438
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
5439
+ }
5440
+ } else {
5441
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5442
+ }
5443
+ }
5444
+ break;
5445
+ case($pr_array['condition'] = "<"):
5446
+ // Use a lexical order on relational string operators
5447
+ if (($pd_value < $pr_array['criteria'])){
5448
+ // Specifically for shipping price rules
5449
+ if(isset($product_data[$pr_array['than_attribute']]) AND (is_array($product_data[$pr_array['than_attribute']]))){
5450
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
5451
+ for ($x = 0; $x <= $arr_size; $x++) {
5452
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
5453
+ }
5454
+ } else {
5455
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5456
+ }
5457
+ }
5458
+ break;
5459
+ case($pr_array['condition'] = "=<"):
5460
+ // Use a lexical order on relational string operators
5461
+ if (($pd_value <= $pr_array['criteria'])){
5462
+ // Specifically for shipping price rules
5463
+ if(is_array($product_data[$pr_array['than_attribute']])){
5464
+ $arr_size = (count($product_data[$pr_array['than_attribute']])-1);
5465
+ for ($x = 0; $x <= $arr_size; $x++) {
5466
+ $product_data[$pr_array['than_attribute']][$x]['price'] = $pr_array['newvalue'];
5467
+ }
5468
+ } else {
5469
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5470
+ }
5471
+ }
5472
+ break;
5473
+
5474
+ case($pr_array['condition'] = "empty"):
5475
+ if(empty($product_data[$pr_array['attribute']])){
5476
+ if(empty($product_data[$pr_array['than_attribute']])){
5477
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5478
+ } else {
5479
+ $product_data[$pr_array['attribute']] = $product_data[$pr_array['than_attribute']];
5480
+ }
5481
+ }
5482
+ break;
5483
+ case($pr_array['condition'] = "replace"):
5484
+ $product_data[$pr_array['than_attribute']] = str_replace($pr_array['criteria'], $pr_array['newvalue'], $product_data[$pr_array['than_attribute']]);
5485
+ break;
5486
  case($pr_array['condition'] = "findreplace"):
5487
  if (strpos($pd_value, $pr_array['criteria']) !== false){
5488
+ // Make sure that a new value has been set
5489
+ if(!empty($pr_array['newvalue'])){
5490
+ // Find and replace only work on same attribute field, otherwise create a contains rule
5491
  if($pr_array['attribute'] == $pr_array['than_attribute']){
5492
+ $newvalue = str_replace($pr_array['criteria'],$pr_array['newvalue'], $pd_value);
5493
+ //$product_data[$pr_array['than_attribute']] = ucfirst($newvalue);
5494
+ $product_data[$pr_array['than_attribute']] = $newvalue;
5495
+ }
5496
+ }
5497
+ }
5498
  break;
5499
+ default:
5500
+ break;
5501
+ }
5502
+ }
5503
+ } else {
5504
+ // When a rule has been set on an attribute that is not in product_data
5505
+ // Add the newvalue to product_data
5506
+ if (!array_key_exists($pr_array['attribute'], $product_data)){
5507
  if(!empty($pr_array['newvalue'])){
5508
+ if ($pr_array['condition'] == "empty") {
5509
+ $product_data[$pr_array['than_attribute']] = $pr_array['newvalue'];
5510
+ }
5511
  } else {
5512
+ if(!empty($pr_array['than_attribute'])){
5513
+ if(array_key_exists($pr_array['than_attribute'], $product_data)){
5514
+ $product_data[$pr_array['attribute']] = $product_data[$pr_array['than_attribute']];
5515
+ }
5516
  }
5517
+ }
5518
+ }
5519
+ }
5520
+ }
5521
+ }
5522
+ }
5523
+ return $product_data;
5524
+ }
5525
 
5526
  /**
5527
  * Function to exclude products based on individual product exclusions
5544
  }
5545
  }
5546
 
5547
+
5548
+ /**
5549
+ * Execute project filters (include / exclude)
5550
+ */
5551
  private function woocommerce_sea_filters( $project_rules, $product_data ){
5552
+ $allowed = 1;
5553
 
5554
+ // Check if product was already excluded from the feed
5555
+ $product_excluded = ucfirst( get_post_meta( $product_data['id'], '_woosea_exclude_product', true ) );
5556
 
5557
+ if( $product_excluded == "Yes"){
5558
+ $allowed = 0;
5559
+ }
5560
 
5561
+ foreach ($project_rules as $pr_key => $pr_array){
5562
 
5563
+ if($pr_array['attribute'] == "categories"){
5564
+ $pr_array['attribute'] = "raw_categories";
5565
  }
5566
 
5567
+ if(!array_key_exists($pr_array['attribute'], $product_data)) {
5568
+ $product_data[$pr_array['attribute']] = ""; // Sets an empty postmeta value in place of a missing one.
5569
+ }
 
 
5570
 
5571
+ foreach ($product_data as $pd_key => $pd_value){
5572
+ // Check is there is a rule on specific attributes
5573
+ if(in_array($pd_key, $pr_array, TRUE)){
5574
+ if($pd_key == "price" || $pd_key == "regular_price"){
5575
+ //$pd_value = @number_format($pd_value,2);
5576
+ $pd_value = wc_format_decimal($pd_value);
5577
+ }
5578
 
5579
+ if (is_numeric($pd_value)){
5580
+ $old_value = $pd_value;
5581
+ if($pd_key == "price" || $pd_key == "regular_price"){
5582
+ $pd_value = @number_format($pd_value,2);
5583
+ }
5584
 
5585
+ // Rules for numeric values
5586
+ switch ($pr_array['condition']) {
5587
+ case($pr_array['condition'] = "contains"):
5588
+ if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5589
+ $allowed = 0;
5590
+ } elseif ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5591
+ $allowed = 0;
5592
+ }
5593
+ break;
5594
+ case($pr_array['condition'] = "containsnot"):
5595
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5596
+ $allowed = 0;
5597
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5598
+ $allowed = 0;
5599
+ }
5600
+ break;
 
 
 
 
 
 
 
 
 
 
 
5601
  case($pr_array['condition'] = "="):
5602
+ if (($old_value == $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5603
+ $allowed = 0;
5604
+ } elseif (($old_value != $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5605
+ $allowed = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5606
  }
5607
+ break;
5608
+ case($pr_array['condition'] = "!="):
5609
+ if (($old_value == $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5610
+ if($allowed <> 0){
5611
+ $allowed = 1;
5612
+ }
5613
+ } elseif (($old_value == $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5614
+ $allowed = 0;
5615
+ }
5616
+ break;
5617
+ case($pr_array['condition'] = ">"):
5618
+ if (($old_value > $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5619
+ $allowed = 0;
5620
+ } elseif (($old_value <= $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5621
+ $allowed = 0;
5622
+ }
5623
+ break;
5624
+ case($pr_array['condition'] = ">="):
5625
+ if (($old_value >= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5626
+ $allowed = 0;
5627
+ } elseif (($old_value < $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5628
+ $allowed = 0;
5629
+ }
5630
+ break;
5631
+ case($pr_array['condition'] = "<"):
5632
+ if (($old_value < $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5633
+ $allowed = 0;
5634
+ } elseif (($old_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5635
+ $allowed = 0;
5636
+ }
5637
+ break;
5638
+ case($pr_array['condition'] = "=<"):
5639
+ if (($old_value <= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
5640
+ $allowed = 0;
5641
+ } elseif (($old_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
5642
+ $allowed = 0;
5643
+ }
5644
+ break;
5645
+ case($pr_array['condition'] = "empty"):
5646
+ if ((strlen($pd_value) < 1) && ($pr_array['than'] == "exclude")){
5647
+ $allowed = 0;
5648
+ } elseif ((strlen($pd_value > 0)) && ($pr_array['than'] == "include_only")){
5649
+ $allowed = 0;
5650
+ }
5651
  break;
5652
+ case($pr_array['condition'] = "notempty"):
5653
+ if ((strlen($pd_value) > 1) && ($pr_array['than'] == "exclude")){
5654
+ $allowed = 0;
5655
+ } elseif ((strlen($pd_value < 0)) && ($pr_array['than'] == "include_only")){
5656
+ $allowed = 0;
5657
+ }
5658
  break;
5659
+ default:
5660
+ break;
5661
+ }
5662
+ } elseif (is_array($pd_value)){
5663
+ // Tis can either be a shipping or product_tag array
5664
+ if(($pr_array['attribute'] == "product_tag") OR ($pr_array['attribute'] == "purchase_note")){
5665
+ $in_tag_array = "not";
5666
+
5667
+ foreach($pd_value as $pt_key => $pt_value){
5668
+ // Rules for string values
5669
+ if (!array_key_exists('cs', $pr_array)){
5670
+ $pt_value = strtolower($pt_value);
5671
+ $pr_array['criteria'] = strtolower($pr_array['criteria']);
5672
+ }
5673
+
5674
+ if(preg_match('/'.$pr_array['criteria'].'/', $pt_value)){
5675
+ $in_tag_array = "yes";
5676
+ }
5677
+ }
5678
+
5679
+ if($in_tag_array == "yes"){
5680
+ //if(in_array($pr_array['criteria'], $pd_value, TRUE)) {
5681
+ $v = $pr_array['criteria'];
5682
+ switch ($pr_array['condition']) {
5683
+ case($pr_array['condition'] = "contains"):
5684
+ if ((preg_match('/'.$pr_array['criteria'].'/', $v))){
5685
+ if($pr_array['than'] == "include_only"){
5686
+ if($allowed <> 0){
5687
+ $allowed = 1;
5688
+ }
5689
+ } else {
5690
+ $allowed = 0;
5691
+ }
5692
+ } else {
5693
+ $allowed = 0;
5694
+ }
5695
+ break;
5696
+ case($pr_array['condition'] = "containsnot"):
5697
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $v))){
5698
+ if($pr_array['than'] == "include_only"){
5699
+ if($allowed <> 0){
5700
+ $allowed = 1;
5701
+ }
5702
+ } else {
5703
+ $allowed = 0;
5704
+ }
5705
+ } else {
5706
+ $allowed = 0;
5707
+ }
5708
+ break;
5709
+ case($pr_array['condition'] = "="):
5710
+ if (($v == $pr_array['criteria'])){
5711
+ if($pr_array['than'] == "include_only"){
5712
+ if($allowed <> 0){
5713
+ $allowed = 1;
5714
+ }
5715
+ } else {
5716
+ $allowed = 0;
5717
+ }
5718
+ } else {
5719
+ $allowed = 0;
5720
+ }
5721
+ break;
5722
+ case($pr_array['condition'] = "!="):
5723
+ if (($v != $pr_array['criteria'])){
5724
+ if($pr_array['than'] == "include_only"){
5725
+ if($allowed <> 0){
5726
+ $allowed = 1;
5727
+ }
5728
+ } else {
5729
+ $allowed = 0;
5730
+ }
5731
+ }
5732
+ break;
5733
+ case($pr_array['condition'] = ">"):
5734
+ if (($v > $pr_array['criteria'])){
5735
+ if($pr_array['than'] == "include_only"){
5736
+ if($allowed <> 0){
5737
+ $allowed = 1;
5738
+ }
5739
+ } else {
5740
+ $allowed = 0;
5741
+ }
5742
+ }
5743
+ break;
5744
+ case($pr_array['condition'] = ">="):
5745
+ if (($v >= $pr_array['criteria'])){
5746
+ if($pr_array['than'] == "include_only"){
5747
+ if($allowed <> 0){
5748
+ $allowed = 1;
5749
+ }
5750
+ } else {
5751
+ $allowed = 0;
5752
+ }
5753
+ }
5754
+ break;
5755
+ case($pr_array['condition'] = "<"):
5756
+ if (($v < $pr_array['criteria'])){
5757
+ if($pr_array['than'] == "include_only"){
5758
+ if($allowed <> 0){
5759
+ $allowed = 1;
5760
+ }
5761
+ } else {
5762
+ $allowed = 0;
5763
+ }
5764
+ }
5765
+ break;
5766
+ case($pr_array['condition'] = "=<"):
5767
+ if (($v <= $pr_array['criteria'])){
5768
+ if($pr_array['than'] == "include_only"){
5769
+ if($allowed <> 0){
5770
+ $allowed = 1;
5771
+ }
5772
+ } else {
5773
+ $allowed = 0;
5774
+ }
5775
+ }
5776
+ break;
5777
+ case($pr_array['condition'] = "empty"):
5778
+ if (strlen($v) < 1){
5779
+ if($pr_array['than'] == "include_only"){
5780
+ if($allowed <> 0){
5781
+ $allowed = 1;
5782
+ }
5783
+ } else {
5784
+ if(!empty($pt_value)){
5785
+ $allowed = 1;
5786
+ } else {
5787
+ $allowed = 0;
5788
+ }
5789
+ }
5790
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5791
  break;
5792
+ case($pr_array['condition'] = "notempty"):
5793
+ if (strlen($v) > 1){
5794
+ if($pr_array['than'] == "include_only"){
5795
+ if($allowed <> 0){
5796
+ $allowed = 1;
5797
+ }
5798
+ } else {
5799
+ if(!empty($pt_value)){
5800
+ $allowed = 1;
5801
+ } else {
5802
+ $allowed = 0;
5803
+ }
5804
+ }
5805
+ }
5806
  break;
5807
+ default:
5808
+ break;
5809
+ }
5810
+ } else {
5811
+ switch ($pr_array['condition']) {
5812
+ case($pr_array['condition'] = "contains"):
5813
+ if($pr_array['than'] == "include_only"){
5814
+ $allowed = 0;
5815
+ } else {
5816
+ if($allowed <> 0){
5817
+ $allowed = 1;
5818
+ }
5819
+ }
5820
+ break;
5821
+ case($pr_array['condition'] = "containsnot"):
5822
+ if($pr_array['than'] == "include_only"){
5823
+ if($allowed <> 0){
5824
+ $allowed = 1;
5825
+ }
5826
+ } else {
5827
+ $allowed = 0;
5828
+ }
5829
+ break;
5830
+ case($pr_array['condition'] = "="):
5831
+ if($pr_array['than'] == "include_only"){
5832
+ $allowed = 0;
5833
+ } else {
5834
+ if($allowed <> 0){
5835
+ $allowed = 1;
5836
+ }
5837
+ }
5838
+ break;
5839
+ case($pr_array['condition'] = "!="):
5840
+ if($pr_array['than'] == "include_only"){
5841
+ if($allowed <> 0){
5842
+ $allowed = 1;
5843
+ }
5844
+ } else {
5845
+ $allowed = 0;
5846
+ }
5847
+ break;
5848
+ case($pr_array['condition'] = ">"):
5849
+ if($pr_array['than'] == "include_only"){
5850
+ $allowed = 0;
5851
+ } else {
5852
+ $allowed = 0;
5853
+ }
5854
+ break;
5855
+ case($pr_array['condition'] = ">="):
5856
+ if($pr_array['than'] == "include_only"){
5857
+ $allowed = 0;
5858
+ } else {
5859
+ $allowed = 0;
5860
+ }
5861
+ break;
5862
+ case($pr_array['condition'] = "<"):
5863
+ if($pr_array['than'] == "include_only"){
5864
+ $allowed = 0;
5865
+ } else {
5866
+ $allowed = 0;
5867
+ }
5868
+ break;
5869
+ case($pr_array['condition'] = "=<"):
5870
+ if($pr_array['than'] == "include_only"){
5871
+ $allowed = 0;
5872
+ } else {
5873
+ $allowed = 0;
5874
+ }
5875
+ break;
5876
+ case($pr_array['condition'] = "empty"):
5877
+ if($pr_array['than'] == "include_only"){
5878
+ if($allowed <> 0){
5879
+ $allowed = 1;
5880
+ }
5881
+ } else {
5882
+ $allowed = 0;
5883
+ }
5884
  break;
5885
+ case($pr_array['condition'] = "notempty"):
5886
+ if($pr_array['than'] == "include_only"){
5887
+ if($allowed <> 0){
5888
+ $allowed = 0;
5889
+ }
5890
+ } else {
5891
+ $allowed = 1;
5892
+ }
5893
  break;
5894
+ default:
5895
+ break;
5896
+ }
5897
+ }
5898
+ } else {
5899
+ // For now only shipping details are in an array
5900
+ foreach ($pd_value as $k => $v){
5901
+ foreach ($v as $kk => $vv){
5902
+ // Only shipping detail rule can be on price for now
5903
+ if($kk == "price"){
5904
+ switch ($pr_array['condition']) {
5905
+ case($pr_array['condition'] = "contains"):
5906
+ if ((preg_match('/'.$pr_array['criteria'].'/', $vv))){
5907
+ $allowed = 0;
5908
+ }
5909
+ break;
5910
+ case($pr_array['condition'] = "containsnot"):
5911
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $vv))){
5912
+ $allowed = 0;
5913
+ }
5914
+ break;
5915
+ case($pr_array['condition'] = "="):
5916
+ if (($vv == $pr_array['criteria'])){
5917
+ $allowed = 0;
5918
+ }
5919
+ break;
5920
+ case($pr_array['condition'] = "!="):
5921
+ if (($vv != $pr_array['criteria'])){
5922
+ $allowed = 0;
5923
+ }
5924
+ break;
5925
+ case($pr_array['condition'] = ">"):
5926
+ if (($vv > $pr_array['criteria'])){
5927
+ $allowed = 0;
5928
+ }
5929
+ break;
5930
+ case($pr_array['condition'] = ">="):
5931
+ if (($vv >= $pr_array['criteria'])){
5932
+ $allowed = 0;
5933
+ }
5934
+ break;
5935
+ case($pr_array['condition'] = "<"):
5936
+ if (($vv < $pr_array['criteria'])){
5937
+ $allowed = 0;
5938
+ }
5939
+ break;
5940
+ case($pr_array['condition'] = "=<"):
5941
+ if (($vv <= $pr_array['criteria'])){
5942
+ $allowed = 0;
5943
+ }
5944
+ break;
5945
+ case($pr_array['condition'] = "empty"):
5946
+ if (strlen($vv) < 1){
5947
+ $allowed = 0;
5948
+ }
5949
  break;
5950
+ case($pr_array['condition'] = "notempty"):
5951
+ if (strlen($vv) > 1){
5952
+ $allowed = 0;
5953
+ }
5954
  break;
5955
+ default:
5956
+ break;
5957
+ }
5958
+ }
5959
+ }
5960
+ }
5961
+ }
5962
+ } else {
5963
+ // Filters for string values
5964
+ // If case-sensitve is off than lowercase both the criteria and attribute value
5965
+ if (array_key_exists('cs', $pr_array)){
5966
+ if ($pr_array['cs'] != "on"){
5967
+ $pd_value = strtolower($pd_value);
5968
+ $pr_array['criteria'] = strtolower($pr_array['criteria']);
5969
+ }
5970
+ }
5971
+ $pos = strpos($pd_value, '&amp;');
5972
+ $pos_slash = strpos($pr_array['criteria'], '\\');
5973
+ if($pos !== false){
5974
+ $pd_value = str_replace("&amp;","&",$pd_value);
5975
+ }
5976
+ if($pos_slash !== false){
5977
+ $pr_array['criteria'] = str_replace("\\","",$pr_array['criteria']);
5978
+ }
5979
 
5980
+ switch ($pr_array['condition']) {
5981
+ case($pr_array['condition'] = "contains"):
5982
+ if ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5983
+ $allowed = 0;
5984
+ } elseif ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5985
+ $allowed = 0;
5986
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5987
+ if($allowed <> 0){
5988
+ $allowed = 1;
5989
+ }
5990
+ }
5991
+ break;
5992
+ case($pr_array['condition'] = "containsnot"):
5993
+ if ((!preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
5994
+ $allowed = 0;
5995
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
5996
+ $allowed = 0;
5997
+ }
5998
+ break;
5999
  case($pr_array['condition'] = "="):
6000
+ if (($pr_array['criteria'] == "$pd_value") AND ($pr_array['than'] == "exclude")){
6001
  $allowed = 0;
6002
  } elseif (($pr_array['criteria'] != "$pd_value") && ($pr_array['than'] == "include_only")){
6003
  $found = strpos($pd_value,$pr_array['criteria']);
6004
+ if ($found !== false) {
6005
+ //for category mapping check if its an array
6006
+ if($pr_array['attribute'] == "raw_categories"){
6007
+ $raw_cats_arr = explode("||",$pd_value);
6008
+ if(is_array($raw_cats_arr)){
6009
+ if(in_array($pr_array['criteria'],$raw_cats_arr, TRUE)){
6010
+ if($allowed <> 0){
6011
+ $allowed = 1;
6012
+ }
6013
+ } else {
6014
+ $allowed = 0;
6015
+ }
6016
+ }
6017
+ } else {
6018
+ if($allowed <> 0){
6019
+ $allowed = 1;
6020
+ }
6021
+ }
6022
+ } else {
6023
+ $allowed = 0;
6024
+ }
6025
+ } elseif (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "include_only")){
 
 
 
 
 
 
 
 
 
 
 
6026
  if($allowed <> 0){
6027
+ $allowed = 1;
6028
+ }
6029
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "exclude")){
6030
+ // $allowed = 0;
6031
+ } elseif ((preg_match('/'.$pr_array['criteria'].'/', $pd_value)) && ($pr_array['than'] == "include_only")){
6032
+ $allowed = 1;
6033
+ } else {
6034
+ // $allowed = 1; // Change made on February 24th 2021
6035
+ }
6036
+ break;
6037
+ case($pr_array['condition'] = "!="):
6038
+ if (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "exclude")){
6039
+ if($allowed <> 0){
6040
+ $allowed = 1;
6041
+ }
6042
+ } elseif (($pr_array['criteria'] == "$pd_value") && ($pr_array['than'] == "include_only")){
6043
+ $allowed = 0;
6044
+ } elseif (($pr_array['criteria'] != "$pd_value") && ($pr_array['than'] == "exclude")){
6045
+ $allowed = 0;
6046
+ }
6047
+ break;
6048
+ case($pr_array['condition'] = ">"):
6049
+ // Use a lexical order on relational string operators
6050
+ if (($pd_value > $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
6051
+ $allowed = 0;
6052
+ } elseif (($pd_value < $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
6053
+ $allowed = 0;
6054
+ }
6055
+ break;
6056
+ case($pr_array['condition'] = ">="):
6057
+ // Use a lexical order on relational string operators
6058
+ if (($pd_value >= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
6059
+ $allowed = 0;
6060
+ } elseif (($pd_value < $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
6061
+ $allowed = 0;
6062
+ }
6063
+ break;
6064
+ case($pr_array['condition'] = "<"):
6065
+ // Use a lexical order on relational string operators
6066
+ if (($pd_value < $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
6067
+ $allowed = 0;
6068
+ } elseif (($pd_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
6069
+ $allowed = 0;
6070
+ }
6071
+ break;
6072
+ case($pr_array['condition'] = "=<"):
6073
+ // Use a lexical order on relational string operators
6074
+ if (($pd_value <= $pr_array['criteria']) && ($pr_array['than'] == "exclude")){
6075
+ $allowed = 0;
6076
+ } elseif (($pd_value > $pr_array['criteria']) && ($pr_array['than'] == "include_only")){
6077
+ $allowed = 0;
6078
+ }
6079
+ break;
6080
+ case($pr_array['condition'] = "empty"):
6081
  if ((strlen($pd_value) < 1) && ($pr_array['than'] == "exclude")){
6082
+ $allowed = 0;
6083
+ } elseif ((strlen($pd_value) > 0) && ($pr_array['than'] == "exclude")){
6084
+ if($allowed <> 0){
6085
+ $allowed = 1;
6086
+ }
6087
+ } elseif ((strlen($pd_value) > 0) && ($pr_array['than'] == "include_only")){
6088
+ $allowed = 0;
6089
+ }
 
 
6090
  break;
6091
+ case($pr_array['condition'] = "notempty"):
6092
+ if ((strlen($pd_value) > 0) && ($pr_array['than'] == "exclude")){
6093
+ $allowed = 0;
6094
+ } elseif ((strlen($pd_value) < 1) && ($pr_array['than'] == "exclude")){
6095
+ if($allowed <> 0){
6096
+ $allowed = 1;
6097
+ }
6098
+ } elseif ((strlen($pd_value) < 1) && ($pr_array['than'] == "include_only")){
6099
+ $allowed = 0;
6100
+ }
6101
+ break;
6102
+ default:
6103
+ break;
6104
+ }
6105
+ }
6106
+ }
6107
+ }
6108
+ }
6109
 
6110
+ if ($allowed < 1){
6111
+ $product_data = array();
6112
+ $product_data = null;
6113
+ } else {
6114
+ return $product_data;
6115
+ }
6116
+ }
6117
  }
css/woosea_admin.css CHANGED
@@ -5,7 +5,7 @@
5
  margin-right: 24px;
6
  padding: 8px 12px;
7
  position: absolute;
8
- z-index: 1000;
9
  }
10
  .typeahead {
11
  background-color: #FFFFFF;
@@ -260,13 +260,16 @@ input:checked + .woo-product-feed-pro-slider:before {
260
  .woo-product-feed-pro-form-style-2 .input-field-midsmall:focus,
261
  .woo-product-feed-pro-form-style-2 .input-field-small:focus,
262
  .woo-product-feed-pro-form-style-2 .input-field-medium:focus,
 
263
  .woo-product-feed-pro-form-style-2 .textarea-field:focus,
 
264
  .woo-product-feed-pro-form-style-2 .select-field:focus{
265
  border: 1px solid #0C0;
266
  }
267
  .woo-product-feed-pro-form-style-2 .textarea-field{
268
  height:100px;
269
  width: 55%;
 
270
  }
271
  .woo-product-feed-pro-form-style-2 input[type=submit],
272
  .woo-product-feed-pro-form-style-2 input[type=button]{
5
  margin-right: 24px;
6
  padding: 8px 12px;
7
  position: absolute;
8
+ /* z-index: 1000;*/
9
  }
10
  .typeahead {
11
  background-color: #FFFFFF;
260
  .woo-product-feed-pro-form-style-2 .input-field-midsmall:focus,
261
  .woo-product-feed-pro-form-style-2 .input-field-small:focus,
262
  .woo-product-feed-pro-form-style-2 .input-field-medium:focus,
263
+ /*
264
  .woo-product-feed-pro-form-style-2 .textarea-field:focus,
265
+ */
266
  .woo-product-feed-pro-form-style-2 .select-field:focus{
267
  border: 1px solid #0C0;
268
  }
269
  .woo-product-feed-pro-form-style-2 .textarea-field{
270
  height:100px;
271
  width: 55%;
272
+ word-break: break-all;
273
  }
274
  .woo-product-feed-pro-form-style-2 input[type=submit],
275
  .woo-product-feed-pro-form-style-2 input[type=button]{
js/woosea_add_cart.js CHANGED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function($) {
2
+ //localStorage.removeItem("attributes");
3
+ $( "select" ).change(function() {
4
+
5
+ //localStorage.removeItem("attributes");
6
+ var productId = $('input[name=product_id]').val();
7
+ var selectedName = $(this).attr("name");
8
+ var selectedValue = $(this).find('option:selected').text();
9
+ var storedAttributes = JSON.parse(localStorage.getItem("attributes"));
10
+
11
+ // Already saved a selection in local storage
12
+ if(storedAttributes){
13
+ // Only add new selections to the local storage
14
+ var len_value = selectedValue.length;
15
+ if(len_value > 0){
16
+ storedAttributes[selectedName] = selectedValue;
17
+ localStorage.setItem("attributes", JSON.stringify(storedAttributes));
18
+ }
19
+ } else {
20
+ var json_attributes = new Object();
21
+ json_attributes.productId = productId;
22
+ json_attributes[selectedName] = selectedValue;
23
+ localStorage.setItem("attributes", JSON.stringify(json_attributes));
24
+ }
25
+
26
+ var storedAttributes = JSON.parse(localStorage.getItem("attributes"));
27
+
28
+ // Now AJAX call to save in options
29
+ var inputdata = {
30
+ 'action': 'woosea_storedattributes_details',
31
+ 'data_to_pass': productId,
32
+ 'storedAttributes': storedAttributes,
33
+ }
34
+
35
+ $.post(frontEndAjax.ajaxurl, inputdata, function( response ) {
36
+ }, 'json' );
37
+
38
+ console.log(storedAttributes);
39
+ });
40
+
41
+ // For shop pages
42
+ $(".add_to_cart_button").click(function(){
43
+ var productId = $(this).attr('data-product_id');
44
+
45
+ console.log(productId);
46
+
47
+ // Ajax frontend
48
+ var inputdata = {
49
+ 'action': 'woosea_addtocart_details',
50
+ 'data_to_pass': productId,
51
+ }
52
+
53
+ $.post(frontEndAjax.ajaxurl, inputdata, function( response ) {
54
+ fbq("track", "AddToCart", {
55
+ content_ids: "['" + response.product_id + "']",
56
+ content_name: response.product_name,
57
+ content_category: response.product_cats,
58
+ content_type: "product",
59
+ value: response.product_price,
60
+ currency: response.product_currency,
61
+ });
62
+ }, 'json' );
63
+ });
64
+
65
+ // For product pages
66
+ $(".single_add_to_cart_button").click(function(){
67
+ var productId = $('input[name=product_id]').val();
68
+
69
+ if(!productId){
70
+ productId = $(this).attr('value');
71
+ }
72
+
73
+ console.log(productId);
74
+
75
+ // Ajax frontend
76
+ var inputdata = {
77
+ 'action': 'woosea_addtocart_details',
78
+ 'data_to_pass': productId,
79
+ }
80
+
81
+ $.post(frontEndAjax.ajaxurl, inputdata, function( response ) {
82
+
83
+ fbq("track", "AddToCart", {
84
+ content_ids: "['" + response.product_id + "']",
85
+ content_name: response.product_name,
86
+ content_category: response.product_cats,
87
+ content_type: "product",
88
+ value: response.product_price,
89
+ currency: response.product_currency,
90
+ });
91
+ }, 'json' );
92
+ });
93
+ });
js/woosea_autocomplete.js CHANGED
@@ -5695,8 +5695,10 @@ jQuery(document).ready(function($) {
5695
  jQuery(".js-autosuggest").on('click',function(){
5696
  var className = $(this).attr("class").split(' ')[3];
5697
  var rowCount = className.split("_")[1]
5698
-
5699
- jQuery( ".autocomplete_" + rowCount ).typeahead({
 
 
5700
  input: '.js-autosuggest',
5701
  source: google_taxonomy,
5702
  hint: true,
@@ -5708,7 +5710,6 @@ jQuery(document).ready(function($) {
5708
  });
5709
  jQuery( ".autocomplete_" + rowCount ).focus();
5710
 
5711
-
5712
  jQuery(this).on('change', function(){ // on change of state
5713
 
5714
  var minimum = 1;
@@ -5741,7 +5742,6 @@ jQuery(document).ready(function($) {
5741
  }
5742
  } else {
5743
  var map_to_category = "";
5744
-
5745
  jQuery.ajax({
5746
  method: "POST",
5747
  url: ajaxurl,
5695
  jQuery(".js-autosuggest").on('click',function(){
5696
  var className = $(this).attr("class").split(' ')[3];
5697
  var rowCount = className.split("_")[1]
5698
+
5699
+ //$('#the-basics-11603 .autocomplete_11603').typeahead({
5700
+ jQuery("." + className).typeahead({
5701
+ //jQuery(".autocomplete_" + rowCount ).typeahead({
5702
  input: '.js-autosuggest',
5703
  source: google_taxonomy,
5704
  hint: true,
5710
  });
5711
  jQuery( ".autocomplete_" + rowCount ).focus();
5712
 
 
5713
  jQuery(this).on('change', function(){ // on change of state
5714
 
5715
  var minimum = 1;
5742
  }
5743
  } else {
5744
  var map_to_category = "";
 
5745
  jQuery.ajax({
5746
  method: "POST",
5747
  url: ajaxurl,
js/woosea_key.js CHANGED
@@ -1,5 +1,4 @@
1
  jQuery(document).ready(function($) {
2
-
3
  jQuery("#deactivate_license").on('click', function(){
4
  //jQuery("#deactivate_license").click(function(){
5
  $('.notice').replaceWith("<div class='notice notice-info is-dismissible'><p>Your license has been deactivated.</p></div>");
@@ -27,7 +26,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',
1
  jQuery(document).ready(function($) {
 
2
  jQuery("#deactivate_license").on('click', function(){
3
  //jQuery("#deactivate_license").click(function(){
4
  $('.notice').replaceWith("<div class='notice notice-info is-dismissible'><p>Your license has been deactivated.</p></div>");
26
  var license_key = $('#license-key').val();
27
 
28
  jQuery.ajax({
29
+ url: 'https://www.adtribes.io/check/license.php?key=' + license_key + '&email=' + license_email + '&domain=' + root_domain + '&version=10.8.5',
30
  jsonp: 'callback',
31
  dataType: 'jsonp',
32
  type: 'GET',
js/woosea_manage.js CHANGED
@@ -1,5 +1,6 @@
1
  jQuery(function($) {
2
- //jQuery(document).ready(function($) {
 
3
  var project_hash = null;
4
  var project_status = null;
5
  var get_value = null;
@@ -256,6 +257,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){
@@ -276,6 +297,26 @@ jQuery(function($) {
276
  }
277
  })
278
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
279
  // Check if user would like to add a Facebook Pixel to their website
280
  $('#woosea_content_ids').on('change', function(){ // on change of state
281
  var content_ids = $('#woosea_content_ids').val();
@@ -290,13 +331,19 @@ jQuery(function($) {
290
 
291
  // Check if user would like to add a Facebook Pixel to their website
292
  $('#add_facebook_pixel').on('change', function(){ // on change of state
 
 
293
  if(this.checked){
294
 
295
  // Checkbox is on
296
  jQuery.ajax({
297
  method: "POST",
298
  url: ajaxurl,
299
- data: { 'action': 'woosea_add_facebook_pixel_setting', 'status': "on" }
 
 
 
 
300
  })
301
  .done(function( data ) {
302
  $('#facebook_pixel').after('<tr id="facebook_pixel_id"><td colspan="2"><span>Insert Facebook pixel ID:</span>&nbsp;<input type="text" class="input-field-medium" id="fb_pixel_id" name="fb_pixel_id">&nbsp;<input type="button" id="save_facebook_pixel_id" value="Save"></td></tr>');
@@ -309,7 +356,11 @@ jQuery(function($) {
309
  jQuery.ajax({
310
  method: "POST",
311
  url: ajaxurl,
312
- data: { 'action': 'woosea_add_facebook_pixel_setting', 'status': "off" }
 
 
 
 
313
  })
314
  .done(function( data ) {
315
  $('#facebook_pixel_id').remove();
@@ -320,6 +371,49 @@ jQuery(function($) {
320
  }
321
  })
322
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
323
  // Check if user would like to change the batch size
324
  $('#add_batch').on('change', function(){ // on change of state
325
  if(this.checked){
@@ -381,13 +475,19 @@ jQuery(function($) {
381
 
382
  // Check if user would like to enable Dynamic Remarketing
383
  $('#add_remarketing').on('change', function(){ // on change of state
384
- if(this.checked){
 
 
385
 
386
  // Checkbox is on
387
  jQuery.ajax({
388
  method: "POST",
389
  url: ajaxurl,
390
- data: { 'action': 'woosea_add_remarketing', 'status': "on" }
 
 
 
 
391
  })
392
  .done(function( data ) {
393
  $('#remarketing').after('<tr id="adwords_conversion_id"><td colspan="2"><span>Insert your Dynamic Remarketing Conversion tracking ID:</span>&nbsp;<input type="text" class="input-field-medium" id="adwords_conv_id" name="adwords_conv_id">&nbsp;<input type="submit" id="save_conversion_id" value="Save"></td></tr>');
@@ -400,7 +500,11 @@ jQuery(function($) {
400
  jQuery.ajax({
401
  method: "POST",
402
  url: ajaxurl,
403
- data: { 'action': 'woosea_add_remarketing', 'status': "off" }
 
 
 
 
404
  })
405
  .done(function( data ) {
406
  $('#adwords_conversion_id').remove();
@@ -414,7 +518,7 @@ jQuery(function($) {
414
  // Save Google Dynamic Remarketing pixel ID
415
  jQuery("#save_conversion_id").on('click',function(){
416
  var adwords_conversion_id = $('#adwords_conv_id').val();
417
- var re = /^[0-9]*$/;
418
 
419
  var woosea_valid_conversion_id=re.test(adwords_conversion_id);
420
  // Check for allowed characters
@@ -456,7 +560,30 @@ jQuery(function($) {
456
  url: ajaxurl,
457
  data: { 'action': 'woosea_save_facebook_pixel_id', 'facebook_pixel_id': facebook_pixel_id }
458
  })
459
- //$("#fb_pixel_id").val("ready");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
460
  }
461
  })
462
 
1
  jQuery(function($) {
2
+
3
+ //jQuery(document).ready(function($) {
4
  var project_hash = null;
5
  var project_status = null;
6
  var get_value = null;
257
  }
258
  })
259
 
260
+ // Check if user would like the plugin to remove the free shipping class
261
+ $('#remove_free_shipping').on('change', function(){ // on change of state
262
+ if(this.checked){
263
+
264
+ // Checkbox is on
265
+ jQuery.ajax({
266
+ method: "POST",
267
+ url: ajaxurl,
268
+ data: { 'action': 'woosea_remove_free_shipping', 'status': "on" }
269
+ })
270
+ } else {
271
+ // Checkbox is off
272
+ jQuery.ajax({
273
+ method: "POST",
274
+ url: ajaxurl,
275
+ data: { 'action': 'woosea_remove_free_shipping', 'status': "off" }
276
+ })
277
+ }
278
+ })
279
+
280
  // Check if user would like to enable debug logging
281
  $('#add_woosea_logging').on('change', function(){ // on change of state
282
  if(this.checked){
297
  }
298
  })
299
 
300
+ // Check if user would like to enable addition of CDATA
301
+ $('#add_woosea_cdata').on('change', function(){ // on change of state
302
+ if(this.checked){
303
+
304
+ // Checkbox is on
305
+ jQuery.ajax({
306
+ method: "POST",
307
+ url: ajaxurl,
308
+ data: { 'action': 'woosea_add_woosea_cdata', 'status': "on" }
309
+ })
310
+ } else {
311
+ // Checkbox is off
312
+ jQuery.ajax({
313
+ method: "POST",
314
+ url: ajaxurl,
315
+ data: { 'action': 'woosea_add_woosea_cdata', 'status': "off" }
316
+ })
317
+ }
318
+ })
319
+
320
  // Check if user would like to add a Facebook Pixel to their website
321
  $('#woosea_content_ids').on('change', function(){ // on change of state
322
  var content_ids = $('#woosea_content_ids').val();
331
 
332
  // Check if user would like to add a Facebook Pixel to their website
333
  $('#add_facebook_pixel').on('change', function(){ // on change of state
334
+ var nonce = $('#add_facebook_pixel').val();
335
+
336
  if(this.checked){
337
 
338
  // Checkbox is on
339
  jQuery.ajax({
340
  method: "POST",
341
  url: ajaxurl,
342
+ data: {
343
+ 'action': 'woosea_add_facebook_pixel_setting',
344
+ 'security': nonce,
345
+ 'status': "on"
346
+ }
347
  })
348
  .done(function( data ) {
349
  $('#facebook_pixel').after('<tr id="facebook_pixel_id"><td colspan="2"><span>Insert Facebook pixel ID:</span>&nbsp;<input type="text" class="input-field-medium" id="fb_pixel_id" name="fb_pixel_id">&nbsp;<input type="button" id="save_facebook_pixel_id" value="Save"></td></tr>');
356
  jQuery.ajax({
357
  method: "POST",
358
  url: ajaxurl,
359
+ data: {
360
+ 'action': 'woosea_add_facebook_pixel_setting',
361
+ 'security': nonce,
362
+ 'status': "off"
363
+ }
364
  })
365
  .done(function( data ) {
366
  $('#facebook_pixel_id').remove();
371
  }
372
  })
373
 
374
+ // Check if user would like to enable the Facebook Conversion API
375
+ $('#add_facebook_capi').on('change', function(){ // on change of state
376
+ var nonce = $('#add_facebook_capi').val();
377
+
378
+ if(this.checked){
379
+
380
+ // Checkbox is on
381
+ jQuery.ajax({
382
+ method: "POST",
383
+ url: ajaxurl,
384
+ data: {
385
+ 'action': 'woosea_add_facebook_capi_setting',
386
+ 'security': nonce,
387
+ 'status': "on"
388
+ }
389
+ })
390
+ .done(function( data ) {
391
+ $('#facebook_capi').after('<tr id="facebook_capi_token"><td colspan="2"><span>Insert your Facebook Conversion API token:</span><br/><br/><input type="textarea" class="textarea-field" id="fb_capi_token" name="fb_capi_token"><br/><br/><input type="button" id="save_facebook_capi_token" value="Save"></td></tr>');
392
+ })
393
+ .fail(function( data ) {
394
+ console.log('Failed AJAX Call :( /// Return Data: ' + data);
395
+ });
396
+ } else {
397
+ // Checkbox is off
398
+ jQuery.ajax({
399
+ method: "POST",
400
+ url: ajaxurl,
401
+ data: {
402
+ 'action': 'woosea_add_facebook_capi_setting',
403
+ 'security': nonce,
404
+ 'status': "off"
405
+ }
406
+ })
407
+ .done(function( data ) {
408
+ $('#facebook_capi_token').remove();
409
+ })
410
+ .fail(function( data ) {
411
+ console.log('Failed AJAX Call :( /// Return Data: ' + data);
412
+ });
413
+ }
414
+ })
415
+
416
+
417
  // Check if user would like to change the batch size
418
  $('#add_batch').on('change', function(){ // on change of state
419
  if(this.checked){
475
 
476
  // Check if user would like to enable Dynamic Remarketing
477
  $('#add_remarketing').on('change', function(){ // on change of state
478
+ var nonce = $('#add_remarketing').val();
479
+
480
+ if(this.checked){
481
 
482
  // Checkbox is on
483
  jQuery.ajax({
484
  method: "POST",
485
  url: ajaxurl,
486
+ data: {
487
+ 'action': 'woosea_add_remarketing',
488
+ 'security': nonce,
489
+ 'status': "on"
490
+ }
491
  })
492
  .done(function( data ) {
493
  $('#remarketing').after('<tr id="adwords_conversion_id"><td colspan="2"><span>Insert your Dynamic Remarketing Conversion tracking ID:</span>&nbsp;<input type="text" class="input-field-medium" id="adwords_conv_id" name="adwords_conv_id">&nbsp;<input type="submit" id="save_conversion_id" value="Save"></td></tr>');
500
  jQuery.ajax({
501
  method: "POST",
502
  url: ajaxurl,
503
+ data: {
504
+ 'action': 'woosea_add_remarketing',
505
+ 'security': nonce,
506
+ 'status': "off"
507
+ }
508
  })
509
  .done(function( data ) {
510
  $('#adwords_conversion_id').remove();
518
  // Save Google Dynamic Remarketing pixel ID
519
  jQuery("#save_conversion_id").on('click',function(){
520
  var adwords_conversion_id = $('#adwords_conv_id').val();
521
+ var re = /^[0-9,-]*$/;
522
 
523
  var woosea_valid_conversion_id=re.test(adwords_conversion_id);
524
  // Check for allowed characters
560
  url: ajaxurl,
561
  data: { 'action': 'woosea_save_facebook_pixel_id', 'facebook_pixel_id': facebook_pixel_id }
562
  })
563
+ }
564
+ })
565
+
566
+ // Save Facebook Conversion API token
567
+ jQuery("#save_facebook_capi_token").on('click',function(){
568
+ var facebook_capi_token = $('#fb_capi_token').val();
569
+ var re = /^[0-9A-Za-z]*$/;
570
+ var woosea_valid_facebook_capi_token=re.test(facebook_capi_token);
571
+
572
+ // Check for allowed characters
573
+ if (!woosea_valid_facebook_capi_token){
574
+ $('.notice').replaceWith("<div class='notice notice-error woosea-notice-conversion is-dismissible'><p>Sorry, this is not a valid Facebook Conversion API Token.</p></div>");
575
+ // Disable submit button too
576
+ $('#save_facebook_capi_token').attr('disabled',true);
577
+ } else {
578
+ $('.woosea-notice-conversion').remove();
579
+ $('#save_facebook_capi_token').attr('disabled',false);
580
+
581
+ // Now we need to save the Facebook Conversion API Token
582
+ jQuery.ajax({
583
+ method: "POST",
584
+ url: ajaxurl,
585
+ data: { 'action': 'woosea_save_facebook_capi_token', 'facebook_capi_token': facebook_capi_token }
586
+ })
587
  }
588
  })
589
 
js/woosea_rules.js CHANGED
@@ -70,9 +70,9 @@ jQuery(document).ready(function($) {
70
  data = JSON.parse( data );
71
 
72
  if(TrueRowCount == 0){
73
- $( '#woosea-ajax-table' ).find('tbody:first').append('<tr><td><input type="hidden" name="rules[' + data.rowCount + '][rowCount]" value="' + data.rowCount + '"><input type="checkbox" name="record" class="checkbox-field"></td><td><i>Filter:</i></td><td><select name="rules[' + data.rowCount + '][attribute]" id="rules_' + data.rowCount + '">' + data.dropdown + '</select></td><td><select name="rules[' + data.rowCount + '][condition]" class="select-field"><option value="contains">contains</option><option value="containsnot">does not contain</option><option value="=">is equal to</option><option value="!=">is not equal to</option><option value=">">is greater than</option><option value=">=">is greater or equal to</option><option value="<">is less than</option><option value="=<">is less or equal to</option><option value="empty">is empty</option></select></td><td><input type="text" name="rules[' + rowCount + '][criteria]" class="input-field-large" id="criteria_' + data.rowCount + '"></td><td><input type="checkbox" name="rules[' + rowCount + '][cs]" class="checkbox-field" alt="Case sensitive"></td><td><select name="rules[' + rowCount + '][than]" class="select-field"><optgroup label="Action">Action:<option value="exclude"> Exclude</option><option value="include_only">Include only</option></optgroup></select></td><td>&nbsp;</td></tr>');
74
  } else {
75
- $('<tr><td><input type="hidden" name="rules[' + data.rowCount + '][rowCount]" value="' + data.rowCount + '"><input type="checkbox" name="record" class="checkbox-field"></td><td><i>Filter:</i></td><td><select name="rules[' + data.rowCount + '][attribute]" id="rules_' + data.rowCount + '">' + data.dropdown + '</select></td><td><select name="rules[' + data.rowCount + '][condition]" class="select-field"><option value="contains">contains</option><option value="containsnot">does not contain</option><option value="=">is equal to</option><option value="!=">is not equal to</option><option value=">">is greater than</option><option value=">=">is greater or equal to</option><option value="<">is less than</option><option value="=<">is less or equal to</option><option value="empty">is empty</option></select></td><td><input type="text" name="rules[' + rowCount + '][criteria]" class="input-field-large" id="criteria_' + data.rowCount + '"></td><td><input type="checkbox" name="rules[' + rowCount + '][cs]" class="checkbox-field" alt="Case sensitive"></td><td><select name="rules[' + rowCount + '][than]" class="select-field"><optgroup label="Action">Action:<option value="exclude"> Exclude</option><option value="include_only">Include only</option></optgroup></select></td><td>&nbsp;</td></tr>').insertBefore( ".rules-buttons");
76
  }
77
 
78
  // Check if user selected a data manipulation condition
70
  data = JSON.parse( data );
71
 
72
  if(TrueRowCount == 0){
73
+ $( '#woosea-ajax-table' ).find('tbody:first').append('<tr><td><input type="hidden" name="rules[' + data.rowCount + '][rowCount]" value="' + data.rowCount + '"><input type="checkbox" name="record" class="checkbox-field"></td><td><i>Filter:</i></td><td><select name="rules[' + data.rowCount + '][attribute]" id="rules_' + data.rowCount + '">' + data.dropdown + '</select></td><td><select name="rules[' + data.rowCount + '][condition]" class="select-field"><option value="contains">contains</option><option value="containsnot">does not contain</option><option value="=">is equal to</option><option value="!=">is not equal to</option><option value=">">is greater than</option><option value=">=">is greater or equal to</option><option value="<">is less than</option><option value="=<">is less or equal to</option><option value="empty">is empty</option><option value="notempty">is not empty</option></select></td><td><input type="text" name="rules[' + rowCount + '][criteria]" class="input-field-large" id="criteria_' + data.rowCount + '"></td><td><input type="checkbox" name="rules[' + rowCount + '][cs]" class="checkbox-field" alt="Case sensitive"></td><td><select name="rules[' + rowCount + '][than]" class="select-field"><optgroup label="Action">Action:<option value="exclude"> Exclude</option><option value="include_only">Include only</option></optgroup></select></td><td>&nbsp;</td></tr>');
74
  } else {
75
+ $('<tr><td><input type="hidden" name="rules[' + data.rowCount + '][rowCount]" value="' + data.rowCount + '"><input type="checkbox" name="record" class="checkbox-field"></td><td><i>Filter:</i></td><td><select name="rules[' + data.rowCount + '][attribute]" id="rules_' + data.rowCount + '">' + data.dropdown + '</select></td><td><select name="rules[' + data.rowCount + '][condition]" class="select-field"><option value="contains">contains</option><option value="containsnot">does not contain</option><option value="=">is equal to</option><option value="!=">is not equal to</option><option value=">">is greater than</option><option value=">=">is greater or equal to</option><option value="<">is less than</option><option value="=<">is less or equal to</option><option value="empty">is empty</option><option value="notempty">is not empty</option></select></td><td><input type="text" name="rules[' + rowCount + '][criteria]" class="input-field-large" id="criteria_' + data.rowCount + '"></td><td><input type="checkbox" name="rules[' + rowCount + '][cs]" class="checkbox-field" alt="Case sensitive"></td><td><select name="rules[' + rowCount + '][than]" class="select-field"><optgroup label="Action">Action:<option value="exclude"> Exclude</option><option value="include_only">Include only</option></optgroup></select></td><td>&nbsp;</td></tr>').insertBefore( ".rules-buttons");
76
  }
77
 
78
  // Check if user selected a data manipulation condition
pages/admin/woosea-generate-feed-step-0.php CHANGED
@@ -34,9 +34,11 @@ if (!in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', g
34
  $locale = apply_filters( 'woocommerce_countries_base_country', $default['country'] );
35
  }
36
 
37
- if($license_information['notice'] == "true"){
38
- $notifications_box['message_type'] = $license_information['message_type'];
39
- $notifications_box['message'] = $license_information['message'];
 
 
40
  }
41
 
42
  if ($versions['PHP'] < 5.6){
@@ -395,7 +397,7 @@ if (array_key_exists('project_hash', $_GET)){
395
  </td>
396
  </tr>
397
  <tr id="product_variations">
398
- <td><span><?php _e('Include all product variations','woo-product-feed-pro' );?>:</span></td>
399
  <td>
400
  <label class="woo-product-feed-pro-switch">
401
  <?php
@@ -410,7 +412,7 @@ if (array_key_exists('project_hash', $_GET)){
410
  </td>
411
  </tr>
412
  <tr id="default_variation">
413
- <td><span><?php _e( 'Only include default product variation','woo-product-feed-pro' );?>:</span></td>
414
  <td>
415
  <label class="woo-product-feed-pro-switch">
416
  <?php
@@ -425,7 +427,7 @@ if (array_key_exists('project_hash', $_GET)){
425
  </td>
426
  </tr>
427
  <tr id="lowest_price_variation">
428
- <td><span><?php _e( 'Only include lowest priced product variation(s)','woo-product-feed-pro' );?>:</span></td>
429
  <td>
430
  <label class="woo-product-feed-pro-switch">
431
  <?php
34
  $locale = apply_filters( 'woocommerce_countries_base_country', $default['country'] );
35
  }
36
 
37
+ if (!empty($license_information)){
38
+ if($license_information['notice'] == "true"){
39
+ $notifications_box['message_type'] = $license_information['message_type'];
40
+ $notifications_box['message'] = $license_information['message'];
41
+ }
42
  }
43
 
44
  if ($versions['PHP'] < 5.6){
397
  </td>
398
  </tr>
399
  <tr id="product_variations">
400
+ <td><span><?php _e('Include product variations','woo-product-feed-pro' );?>:</span></td>
401
  <td>
402
  <label class="woo-product-feed-pro-switch">
403
  <?php
412
  </td>
413
  </tr>
414
  <tr id="default_variation">
415
+ <td><span><?php _e( 'And only include default product variation','woo-product-feed-pro' );?>:</span></td>
416
  <td>
417
  <label class="woo-product-feed-pro-switch">
418
  <?php
427
  </td>
428
  </tr>
429
  <tr id="lowest_price_variation">
430
+ <td><span><?php _e( 'And only include lowest priced product variation(s)','woo-product-feed-pro' );?>:</span></td>
431
  <td>
432
  <label class="woo-product-feed-pro-switch">
433
  <?php
pages/admin/woosea-generate-feed-step-1.php CHANGED
@@ -101,7 +101,7 @@ function woosea_hierarchical_term_tree($category, $prev_mapped){
101
 
102
  $r .= "<tr class=\"catmapping\">";
103
  $r .= "<td><input type=\"hidden\" name=\"mappings[$x][rowCount]\" value=\"$x\"><input type=\"hidden\" name=\"mappings[$x][categoryId]\" value=\"$woo_category_id\"><input type=\"hidden\" name=\"mappings[$x][criteria]\" class=\"input-field-large\" id=\"$woo_category_id\" value=\"$woo_category\">$woo_category ($sub_category->count)</td>";
104
- $r .= "<td><input type=\"search\" name=\"mappings[$x][map_to_category]\" class=\"$mapped_active_class js-typeahead js-autosuggest autocomplete_$x\" value=\"$mapped_category\"></td>";
105
  if(($yo == $nr_categories) AND ($nr_subcats == 0)){
106
  $r .= "<td><span class=\"copy_category_$x\" style=\"display: inline-block;\" title=\"Copy this category to all others\"></span></td>";
107
  } else {
@@ -115,7 +115,7 @@ function woosea_hierarchical_term_tree($category, $prev_mapped){
115
  } else {
116
  $r .= "<tr class=\"catmapping\">";
117
  $r .= "<td><input type=\"hidden\" name=\"mappings[$x][rowCount]\" value=\"$x\"><input type=\"hidden\" name=\"mappings[$x][categoryId]\" value=\"$woo_category_id\"><input type=\"hidden\" name=\"mappings[$x][criteria]\" class=\"input-field-large\" id=\"$woo_category_id\" value=\"$woo_category\">-- $woo_category ($sub_category->count)</td>";
118
- $r .= "<td><input type=\"search\" name=\"mappings[$x][map_to_category]\" class=\"$mapped_active_class js-typeahead js-autosuggest autocomplete_$x mother_$sub_category->parent\" value=\"$mapped_category\"></td>";
119
  $r .= "<td><span class=\"copy_category_$x\" style=\"display: inline-block;\" title=\"Copy this category to all others\"></span></td>";
120
  $r .= "</tr>";
121
  }
@@ -227,7 +227,7 @@ function woosea_hierarchical_term_tree($category, $prev_mapped){
227
 
228
  <table class="woo-product-feed-pro-table">
229
  <tr>
230
- <td><strong><?php _e( 'We\’ve got you covered!','woo-product-feed-pro' );?></strong></td>
231
  </tr>
232
  <tr>
233
  <td>
101
 
102
  $r .= "<tr class=\"catmapping\">";
103
  $r .= "<td><input type=\"hidden\" name=\"mappings[$x][rowCount]\" value=\"$x\"><input type=\"hidden\" name=\"mappings[$x][categoryId]\" value=\"$woo_category_id\"><input type=\"hidden\" name=\"mappings[$x][criteria]\" class=\"input-field-large\" id=\"$woo_category_id\" value=\"$woo_category\">$woo_category ($sub_category->count)</td>";
104
+ $r .= "<td><div id=\"the-basics-$x\"><input type=\"search\" name=\"mappings[$x][map_to_category]\" class=\"$mapped_active_class js-typeahead js-autosuggest autocomplete_$x\" value=\"$mapped_category\"></div></td>";
105
  if(($yo == $nr_categories) AND ($nr_subcats == 0)){
106
  $r .= "<td><span class=\"copy_category_$x\" style=\"display: inline-block;\" title=\"Copy this category to all others\"></span></td>";
107
  } else {
115
  } else {
116
  $r .= "<tr class=\"catmapping\">";
117
  $r .= "<td><input type=\"hidden\" name=\"mappings[$x][rowCount]\" value=\"$x\"><input type=\"hidden\" name=\"mappings[$x][categoryId]\" value=\"$woo_category_id\"><input type=\"hidden\" name=\"mappings[$x][criteria]\" class=\"input-field-large\" id=\"$woo_category_id\" value=\"$woo_category\">-- $woo_category ($sub_category->count)</td>";
118
+ $r .= "<td><div id=\"the-basics-$x\"><input type=\"search\" name=\"mappings[$x][map_to_category]\" class=\"$mapped_active_class js-typeahead js-autosuggest autocomplete_$x mother_$sub_category->parent\" value=\"$mapped_category\"></div></td>";
119
  $r .= "<td><span class=\"copy_category_$x\" style=\"display: inline-block;\" title=\"Copy this category to all others\"></span></td>";
120
  $r .= "</tr>";
121
  }
227
 
228
  <table class="woo-product-feed-pro-table">
229
  <tr>
230
+ <td><strong><?php _e( 'We have got you covered!','woo-product-feed-pro' );?></strong></td>
231
  </tr>
232
  <tr>
233
  <td>
pages/admin/woosea-generate-feed-step-4.php CHANGED
@@ -77,7 +77,7 @@ if (array_key_exists('project_hash', $_GET)){
77
  $criteria = "";
78
  }
79
  ?>
80
- <tr class="rowCount">
81
  <td><input type="hidden" name="rules[<?php print "$rule_key";?>][rowCount]" value="<?php print "$rule_key";?>"><input type="checkbox" name="record" class="checkbox-field"></td>
82
  <td><i><?php _e( 'Filter','woo-product-feed-pro' );?></i></td>
83
  <td>
@@ -150,12 +150,18 @@ if (array_key_exists('project_hash', $_GET)){
150
  } else {
151
  print "<option value=\"empty\">is empty</option>";
152
  }
 
 
 
 
 
 
153
  ?>
154
  </select>
155
  </td>
156
  <td>
157
  <div style="display: block;">
158
- <input type="text" id="rulevalue" name="rules[<?php print "$rule_key";?>][criteria]" class="input-field-large" value="<?php print "$criteria";?>">
159
  </div>
160
  </td>
161
  <td>
@@ -283,6 +289,12 @@ if (array_key_exists('project_hash', $_GET)){
283
  print "<option value=\"empty\">is empty</option>";
284
  }
285
 
 
 
 
 
 
 
286
  // Data manipulators
287
  if (isset($project['rules2'][$rule2_key]['condition']) AND ($project['rules2'][$rule2_key]['condition'] == "multiply")){
288
  print "<option value=\"multiply\" selected>multiply</option>";
@@ -314,7 +326,7 @@ if (array_key_exists('project_hash', $_GET)){
314
  </td>
315
  <td>
316
  <div style="display: block;">
317
- <input type="text" id="rulevalue" name="rules2[<?php print "$rule2_key";?>][criteria]" class="input-field-large" value="<?php print "$criteria";?>">
318
  </div>
319
  </td>
320
  <?php
77
  $criteria = "";
78
  }
79
  ?>
80
+ <tr class="rowCount">
81
  <td><input type="hidden" name="rules[<?php print "$rule_key";?>][rowCount]" value="<?php print "$rule_key";?>"><input type="checkbox" name="record" class="checkbox-field"></td>
82
  <td><i><?php _e( 'Filter','woo-product-feed-pro' );?></i></td>
83
  <td>
150
  } else {
151
  print "<option value=\"empty\">is empty</option>";
152
  }
153
+
154
+ if (isset($project['rules'][$rule_key]['condition']) AND ($project['rules'][$rule_key]['condition'] == "notempty")){
155
+ print "<option value=\"notempty\" selected>is not empty</option>";
156
+ } else {
157
+ print "<option value=\"notempty\">is not empty</option>";
158
+ }
159
  ?>
160
  </select>
161
  </td>
162
  <td>
163
  <div style="display: block;">
164
+ <input type="text" id="rulevalue" name="rules[<?php print "$rule_key";?>][criteria]" class="input-field-large" value='<?php print $criteria;?>'>
165
  </div>
166
  </td>
167
  <td>
289
  print "<option value=\"empty\">is empty</option>";
290
  }
291
 
292
+ if (isset($project['rules2'][$rule2_key]['condition']) AND ($project['rules2'][$rule2_key]['condition'] == "notempty")){
293
+ print "<option value=\"notempty\" selected>is not empty</option>";
294
+ } else {
295
+ print "<option value=\"notempty\">is not empty</option>";
296
+ }
297
+
298
  // Data manipulators
299
  if (isset($project['rules2'][$rule2_key]['condition']) AND ($project['rules2'][$rule2_key]['condition'] == "multiply")){
300
  print "<option value=\"multiply\" selected>multiply</option>";
326
  </td>
327
  <td>
328
  <div style="display: block;">
329
+ <input type="text" id="rulevalue" name="rules2[<?php print "$rule2_key";?>][criteria]" class="input-field-large" value='<?php print $criteria;?>'>
330
  </div>
331
  </td>
332
  <?php
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">
@@ -96,7 +97,15 @@ if (!wp_next_scheduled( 'woosea_cron_hook' ) ) {
96
  foreach($cron_projects as $key => $value){
97
  $cron_projects[$key]['active'] = "true";
98
  }
99
- update_option('cron_projects', $cron_projects,'no');
 
 
 
 
 
 
 
 
100
  } else {
101
  // Set default notification to show
102
  $getelite_notice = get_option('woosea_getelite_notification');
@@ -124,6 +133,23 @@ 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">
97
  foreach($cron_projects as $key => $value){
98
  $cron_projects[$key]['active'] = "true";
99
  }
100
+ update_option('cron_projects', $cron_projects,'no');
101
+ } elseif (array_key_exists('force-clean', $_GET)){
102
+ // Forcefully remove all feed and plugin configurations
103
+ delete_option( 'cron_projects' );
104
+ delete_option( 'channel_statics' );
105
+ delete_option( 'woosea_getelite_notification' );
106
+ delete_option( 'woosea_license_notification_closed' );
107
+ wp_clear_scheduled_hook( 'woosea_cron_hook' );
108
+ wp_clear_scheduled_hook( 'woosea_check_license' );
109
  } else {
110
  // Set default notification to show
111
  $getelite_notice = get_option('woosea_getelite_notification');
133
  <?php
134
  }
135
  }
136
+
137
+
138
+ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
139
+ ?>
140
+ <div class="notice notice-error is-dismissible">
141
+ <p>
142
+ <strong><?php _e( 'WARNING: Your WP-Cron is disabled', 'woo-product-feed-pro' );?></strong><br/></br/>
143
+ 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>.
144
+ </p>
145
+ </div>
146
+ <?php
147
+ }
148
+
149
+ // Double check if the woosea_cron_hook is there, when it is not create a new one
150
+ if (!wp_next_scheduled( 'woosea_cron_hook' ) ) {
151
+ wp_schedule_event ( time(), 'hourly', 'woosea_cron_hook');
152
+ }
153
  ?>
154
 
155
  <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
@@ -73,6 +73,10 @@ add_filter('admin_footer_text', 'my_footer_text');
73
  //we check if the page is visited by click on the tabs or on the menu button.
74
  //then we get the active tab.
75
  $active_tab = "woosea_manage_settings";
 
 
 
 
76
  $header_text = __( 'Plugin settings', 'woo-product-feed-pro' );
77
  if(isset($_GET["tab"])) {
78
  if($_GET["tab"] == "woosea_manage_settings"){
@@ -101,6 +105,20 @@ if(isset($_GET["tab"])) {
101
  ?>
102
  </span>
103
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
  <!-- wordpress provides the styling for tabs. -->
106
  <h2 class="nav-tab-wrapper">
@@ -161,7 +179,7 @@ if(isset($_GET["tab"])) {
161
  </tr>
162
  <tr class="<?php print"$elite_disable";?>" id="identifier_option">
163
  <td>
164
- <span><?php _e( 'Add GTIN, MPN, UPC, EAN, Product condition, Optimised title, Installment, Unit measure and Brand attributes to your store:', 'woo-product-feed-pro' );?> (<a href="https://adtribes.io/add-gtin-mpn-upc-ean-product-condition-optimised-title-and-brand-attributes/?utm_source=<?php print "$host";?>&utm_medium=manage-settings&utm_content=adding fields" target="_blank"><?php _e( 'Read more about this', 'woo-product-feed-pro' );?>)</a></span>
165
  </td>
166
  <td>
167
  <label class="woo-product-feed-pro-switch">
@@ -179,7 +197,7 @@ if(isset($_GET["tab"])) {
179
  </tr>
180
  <tr class="<?php print"$elite_disable";?>" id="manipulation_option">
181
  <td>
182
- <span><?php _e( 'Enable Product data manipulation feature:', 'woo-product-feed-pro' );?> (<a href="https://adtribes.io/feature-product-data-manipulation/?utm_source=<?php print "$host";?>&utm_medium=manage-settings&utm_content=wpml support" target="_blank"><?php _e( 'Read more about this', 'woo-product-feed-pro' );?>)</a></span>
183
  </td>
184
  <td>
185
  <label class="woo-product-feed-pro-switch">
@@ -238,7 +256,7 @@ if(isset($_GET["tab"])) {
238
  ?>
239
  <tr>
240
  <td>
241
- <span><?php _e( 'Use mother main image for variations', 'woo-product-feed-pro');?></span>
242
  </td>
243
  <td>
244
  <label class="woo-product-feed-pro-switch">
@@ -256,7 +274,7 @@ if(isset($_GET["tab"])) {
256
  </tr>
257
  <tr>
258
  <td>
259
- <span><?php _e( 'Add shipping costs for all countries to feed (Google Shopping / Facebook only)', 'woo-product-feed-pro');?></span>
260
  </td>
261
  <td>
262
  <label class="woo-product-feed-pro-switch">
@@ -292,7 +310,25 @@ if(isset($_GET["tab"])) {
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>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
296
  </td>
297
  <td>
298
  <label class="woo-product-feed-pro-switch">
@@ -326,6 +362,24 @@ if(isset($_GET["tab"])) {
326
  </label>
327
  </td>
328
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
329
 
330
  <tr id="facebook_pixel">
331
  <td>
@@ -336,9 +390,9 @@ if(isset($_GET["tab"])) {
336
  <?php
337
  $add_facebook_pixel = get_option ('add_facebook_pixel');
338
  if($add_facebook_pixel == "yes"){
339
- print "<input type=\"checkbox\" id=\"add_facebook_pixel\" name=\"add_facebook_pixel\" class=\"checkbox-field\" checked>";
340
  } else {
341
- print "<input type=\"checkbox\" id=\"add_facebook_pixel\" name=\"add_facebook_pixel\" class=\"checkbox-field\">";
342
  }
343
  ?>
344
  <div class="woo-product-feed-pro-slider round"></div>
@@ -373,20 +427,48 @@ if(isset($_GET["tab"])) {
373
  </select>
374
  </td>
375
  </tr>
376
-
377
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
378
  <tr id="remarketing">
379
  <td>
380
  <span><?php _e( 'Add Google Dynamic Remarketing Pixel:', 'woo-product-feed-pro');?></span>
381
  </td>
382
  <td>
383
  <label class="woo-product-feed-pro-switch">
384
- <?php
385
  $add_remarketing = get_option ('add_remarketing');
386
  if($add_remarketing == "yes"){
387
- print "<input type=\"checkbox\" id=\"add_remarketing\" name=\"add_remarketing\" class=\"checkbox-field\" checked>";
388
  } else {
389
- print "<input type=\"checkbox\" id=\"add_remarketing\" name=\"add_remarketing\" class=\"checkbox-field\">";
390
  }
391
  ?>
392
  <div class="woo-product-feed-pro-slider round"></div>
@@ -423,7 +505,7 @@ if(isset($_GET["tab"])) {
423
  if($add_batch == "yes"){
424
  $woosea_batch_size = get_option('woosea_batch_size');
425
 
426
- print "<tr id=\"woosea_batch_size\"><td colspan=\"2\"><span>Insert batch size:</span>&nbsp;<input type=\"text\" class=\"input-field-medium\" id=\"batch_size\" name=\"batch_size\" value=\"$woosea_batch_size\">&nbsp;<input type=\"submit\" id=\"save_batch_size\" value=\"Save\"></td></tr>";
427
  }
428
  ?>
429
  </form>
@@ -440,70 +522,89 @@ 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
451
- $fp = @fopen($test_file, 'w');
452
- @fwrite($fp, 'Cats chase mice');
453
- @fclose($fp);
454
- if(is_file($test_file)){
455
- $directory_perm = "True";
456
- }
457
-
458
- // XML subcategory
459
- $fp = @fopen($test_file_xml, 'w');
460
- @fwrite($fp, 'Cats chase mice');
461
- @fclose($fp);
462
- if(is_file($test_file_xml)){
463
- $directory_perm_xml = "True";
464
- } else {
465
- $directory_perm_xml = "False";
466
- }
467
-
468
- // CSV subcategory
469
- $fp = @fopen($test_file_csv, 'w');
470
- @fwrite($fp, 'Cats chase mice');
471
- @fclose($fp);
472
- if(is_file($test_file_csv)){
473
- $directory_perm_csv = "True";
474
- } else {
475
- $directory_perm_csv = "False";
476
- }
477
-
478
- // TXT subcategory
479
- $fp = @fopen($test_file_txt, 'w');
480
- @fwrite($fp, 'Cats chase mice');
481
- @fclose($fp);
482
- if(is_file($test_file_txt)){
483
- $directory_perm_txt = "True";
484
- } else {
485
- $directory_perm_txt = "False";
486
- }
487
-
488
- // TSV subcategory
489
- $fp = @fopen($test_file_tsv, 'w');
490
- @fwrite($fp, 'Cats chase mice');
491
- @fclose($fp);
492
- if(is_file($test_file_tsv)){
493
- $directory_perm_tsv = "True";
494
- } else {
495
- $directory_perm_tsv = "False";
496
- }
497
-
498
- // Logs subcategory
499
- $fp = @fopen($test_file_logs, 'w');
500
- @fwrite($fp, 'Cats chase mice');
501
- @fclose($fp);
502
- if(is_file($test_file_logs)){
503
- $directory_perm_logs = "True";
504
- } else {
505
- $directory_perm_logs = "False";
506
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
  } else {
508
  $directory_perm = "False";
509
  }
@@ -515,10 +616,14 @@ 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>";
521
- print "<tr><td>PHP-version sufficient</td><td>$php_validation ($versions[PHP])</td></tr>";
522
  print "<tr><td>Product feed directory writable</td><td>$directory_perm</td></tr>";
523
  print "<tr><td>Product feed XML directory writable</td><td>$directory_perm_xml</td></tr>";
524
  print "<tr><td>Product feed CSV directory writable</td><td>$directory_perm_csv</td></tr>";
73
  //we check if the page is visited by click on the tabs or on the menu button.
74
  //then we get the active tab.
75
  $active_tab = "woosea_manage_settings";
76
+
77
+ // create nonce
78
+ $nonce = wp_create_nonce( 'woosea_ajax_nonce' );
79
+
80
  $header_text = __( 'Plugin settings', 'woo-product-feed-pro' );
81
  if(isset($_GET["tab"])) {
82
  if($_GET["tab"] == "woosea_manage_settings"){
105
  ?>
106
  </span>
107
  </div>
108
+
109
+ <?php
110
+ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
111
+ ?>
112
+ <div class="notice notice-error is-dismissible">
113
+ <p>
114
+ <strong><?php _e( 'WARNING: Your WP-Cron is disabled', 'woo-product-feed-pro' );?></strong><br/></br/>
115
+ 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>.
116
+ </p>
117
+ </div>
118
+ <?php
119
+ }
120
+ ?>
121
+
122
 
123
  <!-- wordpress provides the styling for tabs. -->
124
  <h2 class="nav-tab-wrapper">
179
  </tr>
180
  <tr class="<?php print"$elite_disable";?>" id="identifier_option">
181
  <td>
182
+ <span><?php _e( 'Add GTIN, MPN, UPC, EAN, Product condition, Optimised title, Installment, Unit measure, Brand and many more attributes to your store:', 'woo-product-feed-pro' );?> (<a href="https://adtribes.io/add-gtin-mpn-upc-ean-product-condition-optimised-title-and-brand-attributes/?utm_source=<?php print "$host";?>&utm_medium=manage-settings&utm_content=adding fields" target="_blank"><?php _e( 'Read more about this', 'woo-product-feed-pro' );?>)</a></span>
183
  </td>
184
  <td>
185
  <label class="woo-product-feed-pro-switch">
197
  </tr>
198
  <tr class="<?php print"$elite_disable";?>" id="manipulation_option">
199
  <td>
200
+ <span><?php _e( 'Enable the Product Data Manipulation feature:', 'woo-product-feed-pro' );?> (<a href="https://adtribes.io/feature-product-data-manipulation/?utm_source=<?php print "$host";?>&utm_medium=manage-settings&utm_content=wpml support" target="_blank"><?php _e( 'Read more about this', 'woo-product-feed-pro' );?>)</a></span>
201
  </td>
202
  <td>
203
  <label class="woo-product-feed-pro-switch">
256
  ?>
257
  <tr>
258
  <td>
259
+ <span><?php _e( 'Use parent variable product image for variations', 'woo-product-feed-pro');?></span>
260
  </td>
261
  <td>
262
  <label class="woo-product-feed-pro-switch">
274
  </tr>
275
  <tr>
276
  <td>
277
+ <span><?php _e( 'Add shipping costs for all countries to your feed (Google Shopping / Facebook only)', 'woo-product-feed-pro');?></span>
278
  </td>
279
  <td>
280
  <label class="woo-product-feed-pro-switch">
310
  </tr>
311
  <tr>
312
  <td>
313
+ <span><?php _e( 'Remove the free shipping zone from your feed (Google Shopping / Facebook only)', 'woo-product-feed-pro');?></span>
314
+ </td>
315
+ <td>
316
+ <label class="woo-product-feed-pro-switch">
317
+ <?php
318
+ $remove_free_shipping = get_option ('remove_free_shipping');
319
+ if($remove_free_shipping == "yes"){
320
+ print "<input type=\"checkbox\" id=\"remove_free_shipping\" name=\"remove_free_shipping\" class=\"checkbox-field\" checked>";
321
+ } else {
322
+ print "<input type=\"checkbox\" id=\"remove_free_shipping\" name=\"remove_free_shipping\" class=\"checkbox-field\">";
323
+ }
324
+ ?>
325
+ <div class="woo-product-feed-pro-slider round"></div>
326
+ </label>
327
+ </td>
328
+ </tr>
329
+ <tr>
330
+ <td>
331
+ <span><?php _e( 'Remove the local pickup shipping zone from your feed (Google Shopping / Facebook only)', 'woo-product-feed-pro');?></span>
332
  </td>
333
  <td>
334
  <label class="woo-product-feed-pro-switch">
362
  </label>
363
  </td>
364
  </tr>
365
+ <tr>
366
+ <td>
367
+ <span><?php _e( 'Add CDATA to title, description and short description:', 'woo-product-feed-pro');?></span>
368
+ </td>
369
+ <td>
370
+ <label class="woo-product-feed-pro-switch">
371
+ <?php
372
+ $add_woosea_cdata = get_option ('add_woosea_cdata');
373
+ if($add_woosea_cdata == "yes"){
374
+ print "<input type=\"checkbox\" id=\"add_woosea_cdata\" name=\"add_woosea_cdata\" class=\"checkbox-field\" checked>";
375
+ } else {
376
+ print "<input type=\"checkbox\" id=\"add_woosea_cdata\" name=\"add_woosea_cdata\" class=\"checkbox-field\">";
377
+ }
378
+ ?>
379
+ <div class="woo-product-feed-pro-slider round"></div>
380
+ </label>
381
+ </td>
382
+ </tr>
383
 
384
  <tr id="facebook_pixel">
385
  <td>
390
  <?php
391
  $add_facebook_pixel = get_option ('add_facebook_pixel');
392
  if($add_facebook_pixel == "yes"){
393
+ print "<input type=\"checkbox\" id=\"add_facebook_pixel\" name=\"add_facebook_pixel\" class=\"checkbox-field\" value=\"$nonce\" checked>";
394
  } else {
395
+ print "<input type=\"checkbox\" id=\"add_facebook_pixel\" name=\"add_facebook_pixel\" class=\"checkbox-field\" value=\"$nonce\">";
396
  }
397
  ?>
398
  <div class="woo-product-feed-pro-slider round"></div>
427
  </select>
428
  </td>
429
  </tr>
430
+ <?php
431
+ if($elite_disable == "enabled"){
432
+ ?>
433
+ <tr class="<?php print"$elite_disable";?>" id="facebook_capi">
434
+ <td>
435
+ <span><?php _e( 'Enable Facebook Conversion API:', 'woo-product-feed-pro');?> (<a href="https://adtribes.io/facebook-conversion-api/" target="_blank"><?php _e( 'Read more about this', 'woo-product-feed-pro' );?>)</a></span>
436
+ </td>
437
+ <td>
438
+ <label class="woo-product-feed-pro-switch">
439
+ <?php
440
+ $add_facebook_capi = get_option ('add_facebook_capi');
441
+ if($add_facebook_capi == "yes"){
442
+ print "<input type=\"checkbox\" id=\"add_facebook_capi\" name=\"add_facebook_capi\" class=\"checkbox-field\" value=\"$nonce\" checked>";
443
+ } else {
444
+ print "<input type=\"checkbox\" id=\"add_facebook_capi\" name=\"add_facebook_capi\" class=\"checkbox-field\" value=\"$nonce\">";
445
+ }
446
+ ?>
447
+ <div class="woo-product-feed-pro-slider round"></div>
448
+ </label>
449
+ </td>
450
+ </tr>
451
+ <?php
452
+ if($add_facebook_capi == "yes"){
453
+ $facebook_capi_token = get_option('woosea_facebook_capi_token');
454
+ print "<tr id=\"facebook_capi_token\"><td colspan=\"2\"><span>Insert your Facebook Conversion API token:</span><br/><br/><input type=\"textarea\" class=\"textarea-field\" id=\"fb_capi_token\" name=\"fb_capi_token\" value=\"$facebook_capi_token\"><br/><br/><input type=\"button\" id=\"save_facebook_capi_token\" value=\"Save\"></td></tr>";
455
+ }
456
+ ?>
457
+ <?php
458
+ }
459
+ ?>
460
  <tr id="remarketing">
461
  <td>
462
  <span><?php _e( 'Add Google Dynamic Remarketing Pixel:', 'woo-product-feed-pro');?></span>
463
  </td>
464
  <td>
465
  <label class="woo-product-feed-pro-switch">
466
+ <?php
467
  $add_remarketing = get_option ('add_remarketing');
468
  if($add_remarketing == "yes"){
469
+ print "<input type=\"checkbox\" id=\"add_remarketing\" name=\"add_remarketing\" class=\"checkbox-field\" value=\"$nonce\" checked>";
470
  } else {
471
+ print "<input type=\"checkbox\" id=\"add_remarketing\" name=\"add_remarketing\" class=\"checkbox-field\" value=\"$nonce\">";
472
  }
473
  ?>
474
  <div class="woo-product-feed-pro-slider round"></div>
505
  if($add_batch == "yes"){
506
  $woosea_batch_size = get_option('woosea_batch_size');
507
 
508
+ print "<tr id=\"woosea_batch_size\"><td colspan=\"2\"><span>Insert batch size:</span>&nbsp;<input type=\"text\" class=\"input-field-medium\" id=\"batch_size\" name=\"batch_size\" value=\"$woosea_batch_size\">&nbsp;<input type=\"button\" id=\"save_batch_size\" value=\"Save\"></td></tr>";
509
  }
510
  ?>
511
  </form>
522
  $external_path_tsv = $external_base . "/woo-product-feed-pro/";
523
  $external_path_logs = $external_base . "/woo-product-feed-pro/";
524
  $test_file = $external_path . "/tesfile.txt";
525
+ $test_file_xml = $external_path . "xml/tesfile.txt";
526
+ $test_file_csv = $external_path . "csv/tesfile.txt";
527
+ $test_file_txt = $external_path . "txt/tesfile.txt";
528
+ $test_file_tsv = $external_path . "tsv/tesfile.txt";
529
+ $test_file_logs = $external_path . "logs/tesfile.txt";
530
 
531
  if (is_writable($external_path)) {
532
+ // Normal root category
533
+ $fp = @fopen($test_file, 'w');
534
+ @fwrite($fp, 'Cats chase mice');
535
+ @fclose($fp);
536
+ if(is_file($test_file)){
537
+ $directory_perm = "True";
538
+ }
539
+
540
+ // XML subcategory
541
+ $fp = @fopen($test_file_xml, 'w');
542
+ if(!is_bool($fp)){
543
+ @fwrite($fp, 'Cats chase mice');
544
+ @fclose($fp);
545
+ if(is_file($test_file_xml)){
546
+ $directory_perm_xml = "True";
547
+ } else {
548
+ $directory_perm_xml = "False";
549
+ }
550
+ } else {
551
+ $directory_perm_xml = "Unknown";
552
+ }
553
+
554
+ // CSV subcategory
555
+ $fp = @fopen($test_file_csv, 'w');
556
+ if(!is_bool($fp)){
557
+ @fwrite($fp, 'Cats chase mice');
558
+ @fclose($fp);
559
+ if(is_file($test_file_csv)){
560
+ $directory_perm_csv = "True";
561
+ } else {
562
+ $directory_perm_csv = "False";
563
+ }
564
+ } else {
565
+ $directory_perm_csv = "Unknown";
566
+ }
567
+
568
+ // TXT subcategory
569
+ $fp = @fopen($test_file_txt, 'w');
570
+ if(!is_bool($fp)){
571
+ @fwrite($fp, 'Cats chase mice');
572
+ @fclose($fp);
573
+ if(is_file($test_file_txt)){
574
+ $directory_perm_txt = "True";
575
+ } else {
576
+ $directory_perm_txt = "False";
577
+ }
578
+ } else {
579
+ $directory_perm_txt = "Unknown";
580
+ }
581
+ // TSV subcategory
582
+ $fp = @fopen($test_file_tsv, 'w');
583
+ if(!is_bool($fp)){
584
+ @fwrite($fp, 'Cats chase mice');
585
+ @fclose($fp);
586
+ if(is_file($test_file_tsv)){
587
+ $directory_perm_tsv = "True";
588
+ } else {
589
+ $directory_perm_tsv = "False";
590
+ }
591
+ } else {
592
+ $directory_perm_tsv = "Uknown";
593
+ }
594
+
595
+ // Logs subcategory
596
+ $fp = @fopen($test_file_logs, 'w');
597
+ if(!is_bool($fp)){
598
+ @fwrite($fp, 'Cats chase mice');
599
+ @fclose($fp);
600
+ if(is_file($test_file_logs)){
601
+ $directory_perm_logs = "True";
602
+ } else {
603
+ $directory_perm_logs = "False";
604
+ }
605
+ } else {
606
+ $directory_perm_logs = "Unknown";
607
+ }
608
  } else {
609
  $directory_perm = "False";
610
  }
616
  $cron_enabled = "True";
617
  }
618
 
619
+ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
620
+ $cron_enabled = "<strong>False</strong>";
621
+ }
622
+
623
  print "<table class=\"woo-product-feed-pro-table\">";
624
  print "<tr><td><strong>System check</strong></td><td><strong>Status</strong></td></tr>";
625
  print "<tr><td>WP-Cron enabled</td><td>$cron_enabled</td></tr>";
626
+ print "<tr><td>PHP-version</td><td>$php_validation ($versions[PHP])</td></tr>";
627
  print "<tr><td>Product feed directory writable</td><td>$directory_perm</td></tr>";
628
  print "<tr><td>Product feed XML directory writable</td><td>$directory_perm_xml</td></tr>";
629
  print "<tr><td>Product feed CSV directory writable</td><td>$directory_perm_csv</td></tr>";
readme.txt CHANGED
@@ -2,17 +2,17 @@
2
  Contributors: jorisverwater,supportadtribes,evavangelooven
3
  License: GPLv3
4
  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.
16
 
17
  = Our mission =
18
  Offer free and advanced, intuitive, tooling and plugins for website owners and marketers to easily set-up and manage their online marketing campaigns.
@@ -61,21 +61,27 @@ This plugin enables you to add and configure Google Analytics UTM tracking-codes
61
  = Shipping class support =
62
  This plugin enables you to set the shipping zone (and shipping class) so the right shipping cost end up in your product feed. Our plugin uses all shipping zone settings you have configured in WooCommerce (flat rates, classes and free shipping). Our support also supports US and Australian postal codes and regions.
63
 
 
 
 
64
  = WooCommerce Shipping Table Rate (Bolder Elements) support =
65
  Our plugin supports the WooCommerce Shipping Table Rate plugin created by Bolder Elements.
66
 
67
  = Product variations / Variables =
68
  This plugin supports product variables so all your variations make it to product feeds as individual products too.
69
 
70
- = Facebook Pixel (Elite version) =
71
  This plugin adds the Facebook pixel code on your websites and makes sure it matches the content of your Facebook catalogue product feed
72
  Our plugin add's the following Facebook pixel events:
73
  * on your product pages, both for simple, variable and variations pages
74
  * on your category pages (ViewCategory event)
75
  * on your search result pages (Search event)
76
  * on your cart page (AddToCart event)
77
- * on the add to cart button (AddToCart event)
78
- * on the thank you page (PurChase event)
 
 
 
79
 
80
  = Google Dynamic Remarketing Pixel =
81
  This plugin adds the Google Dynamic Remarketing pixel code on your website.
@@ -112,6 +118,8 @@ Our plugin supports Polylang
112
  * XML, CSV, TSV and TXT formats;
113
  * Supports WPML (version 4.1 and higher)
114
  * Supports WCML, WooCommerce Multilingual
 
 
115
  * Intuitive interface;
116
  * Supports product variations / variables;
117
  * Scheduled product feed refreshes: daily, twice-daily or every hour;
@@ -125,6 +133,7 @@ Our plugin supports Polylang
125
  * Google Analytics support: add Google Analytics UTM parameters to your product feed and individual products.
126
  * Supports the official Facebook for WooCommerce plugin (SKU_ID parameter)
127
  * Supports Yoasts primary category feature
 
128
  * Supports the official "WooCommerce Brands" plugin
129
  * Supports Yith brand attributes
130
  * Supports the official "WooCommerce Product Bundles" plugin
@@ -134,19 +143,20 @@ Our plugin supports Polylang
134
  * Supports WooCommerce Dynamic Pricing & Discounts from RightPress
135
  * Supports the Discount Rules for WooCommerce plugin from FlyCart
136
  * Supports WC Fields Factory
 
137
  * Supports Table Rate Shipping for WooCommerce from Bolder Elements
138
  * Supports usage of the All In One SEO pack title and description attributes
 
139
 
140
  Some of the above mentioned feature can only be used by users who upgraded to the Elite version of our plugin
141
 
142
  === Elite paid features ===
143
- * WPML support
144
  * Aelia currency switcher support
145
  * Polylang support
146
  * Addition of the extra fields on your product edit pages
147
  * Data manipulation feature
148
  * WooCommerce structured data bug fix
149
- * Facebook pixel
150
 
151
  === Channels ===
152
  * Custom feeds
@@ -158,9 +168,11 @@ Some of the above mentioned feature can only be used by users who upgraded to th
158
  * Google Local Products
159
  * Google Local Products Inventory
160
  * Google Shopping Actions
161
- * Facebook Dynamic Ads / remarketing
162
  * Bing Shopping
 
163
  * Pinterest
 
164
  * <a href="https://businesshelp.snapchat.com/en-US/a/product-catalog-specs" target="_blank">Snapchat</a>
165
  * <a href="https://yandex.com/support/market-tech-requirements/index.html" target="_blank">Yandex</a>
166
  * ShopMania
@@ -175,6 +187,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
@@ -229,6 +242,7 @@ Some of the above mentioned feature can only be used by users who upgraded to th
229
  * <a href="https://www.guenstiger.de" target="_blank" rel="nofollow">Guenstiger.de</a>
230
  * Hood.de
231
  * Ladenzeile.de
 
232
  * Livingo.de
233
  * Medizinfuchs.de
234
  * <a href="https://www.moebel.de" target="_blank">Moebel.de</a>
@@ -249,13 +263,13 @@ Some of the above mentioned feature can only be used by users who upgraded to th
249
  == Installation ==
250
 
251
  === From within Wordpress ===
252
- 1. Visit Plugins > Add New’;
253
- 1. Search for Product Feed PRO for WooCommerce’;
254
- 1. Activate Product Feed PRO for WooCommerce from your plugins page.
255
 
256
  === Manually ===
257
  1. Upload the woo-product-feed-pro folder to your /wp-content/plugins/ directory;
258
- 1. Activate Product Feed PRO for WooCommerce from your plugins page.
259
 
260
  == Frequently Asked Questions ==
261
 
@@ -322,6 +336,461 @@ 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 +3457,462 @@ 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
 
2
  Contributors: jorisverwater,supportadtribes,evavangelooven
3
  License: GPLv3
4
  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 pixel, Facebook Conversion API, Facebook CAPI,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.8
8
+ Stable tag: 10.8.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. Next to creating product feeds this plugin also add's the Facebook pixel, Facebook Conversion API (CAPI) and Google Dynamic Remarketing pixel to your website and makes sure they are aligned with your feeds.
16
 
17
  = Our mission =
18
  Offer free and advanced, intuitive, tooling and plugins for website owners and marketers to easily set-up and manage their online marketing campaigns.
61
  = Shipping class support =
62
  This plugin enables you to set the shipping zone (and shipping class) so the right shipping cost end up in your product feed. Our plugin uses all shipping zone settings you have configured in WooCommerce (flat rates, classes and free shipping). Our support also supports US and Australian postal codes and regions.
63
 
64
+ = WooCommerce Shipping Table Rate (official WooCommerce) support =
65
+ Our plugin supports the official shipping table rate plugin of WooCommerce
66
+
67
  = WooCommerce Shipping Table Rate (Bolder Elements) support =
68
  Our plugin supports the WooCommerce Shipping Table Rate plugin created by Bolder Elements.
69
 
70
  = Product variations / Variables =
71
  This plugin supports product variables so all your variations make it to product feeds as individual products too.
72
 
73
+ = Facebook Pixel =
74
  This plugin adds the Facebook pixel code on your websites and makes sure it matches the content of your Facebook catalogue product feed
75
  Our plugin add's the following Facebook pixel events:
76
  * on your product pages, both for simple, variable and variations pages
77
  * on your category pages (ViewCategory event)
78
  * on your search result pages (Search event)
79
  * on your cart page (AddToCart event)
80
+ * on the checkout page (initiateCheckout event)
81
+ * on the order thank you page (PurChase event)
82
+
83
+ = Facebook Conversion API (CAPI) =
84
+ This plugin connects to the Facebook Conversion API so all your website conversions are being tracked properly
85
 
86
  = Google Dynamic Remarketing Pixel =
87
  This plugin adds the Google Dynamic Remarketing pixel code on your website.
118
  * XML, CSV, TSV and TXT formats;
119
  * Supports WPML (version 4.1 and higher)
120
  * Supports WCML, WooCommerce Multilingual
121
+ * Supports Aelia Currency Switcher
122
+ * Supports Polylang
123
  * Intuitive interface;
124
  * Supports product variations / variables;
125
  * Scheduled product feed refreshes: daily, twice-daily or every hour;
133
  * Google Analytics support: add Google Analytics UTM parameters to your product feed and individual products.
134
  * Supports the official Facebook for WooCommerce plugin (SKU_ID parameter)
135
  * Supports Yoasts primary category feature
136
+ * Supports Rankmaths primary category feature
137
  * Supports the official "WooCommerce Brands" plugin
138
  * Supports Yith brand attributes
139
  * Supports the official "WooCommerce Product Bundles" plugin
143
  * Supports WooCommerce Dynamic Pricing & Discounts from RightPress
144
  * Supports the Discount Rules for WooCommerce plugin from FlyCart
145
  * Supports WC Fields Factory
146
+ * Supports Table Rate Shipping for WooCommerce from WooCommerce
147
  * Supports Table Rate Shipping for WooCommerce from Bolder Elements
148
  * Supports usage of the All In One SEO pack title and description attributes
149
+ * Supports the WPC Product Bundles for WooCommerce plugin
150
 
151
  Some of the above mentioned feature can only be used by users who upgraded to the Elite version of our plugin
152
 
153
  === Elite paid features ===
154
+ * WPML / WCML support
155
  * Aelia currency switcher support
156
  * Polylang support
157
  * Addition of the extra fields on your product edit pages
158
  * Data manipulation feature
159
  * WooCommerce structured data bug fix
 
160
 
161
  === Channels ===
162
  * Custom feeds
168
  * Google Local Products
169
  * Google Local Products Inventory
170
  * Google Shopping Actions
171
+ * Facebook Dynamic Ad's / remarketing
172
  * Bing Shopping
173
+ * Bing Shopping Promotions
174
  * Pinterest
175
+ * <a href="https://help.vivino.com/s/article/How-do-I-create-my-product-feed-XML?language=en_US" target="_blank">Vivino</a>
176
  * <a href="https://businesshelp.snapchat.com/en-US/a/product-catalog-specs" target="_blank">Snapchat</a>
177
  * <a href="https://yandex.com/support/market-tech-requirements/index.html" target="_blank">Yandex</a>
178
  * ShopMania
187
  * <a href="https://www.beslist.nl" target="_blank" rel="nofollow">Beslist.nl</a>
188
  * <a href="https://www.beslist.be" target="_blank" rel="nofollow">Beslist.be</a>
189
  * <a href="https://www.fashionchick.nl" target="_blank">Fashionchick.nl</a>
190
+ * <a href="https://www.boetiek.nl" target="_blank">Boetiek.nl</a>
191
  * Bol.com
192
  * Stylight
193
  * Incurvy
242
  * <a href="https://www.guenstiger.de" target="_blank" rel="nofollow">Guenstiger.de</a>
243
  * Hood.de
244
  * Ladenzeile.de
245
+ * <a href="https://connect.idealo.de/import/en/csv/#_attributes_documentation" target="_blank">Idealo.de</a>
246
  * Livingo.de
247
  * Medizinfuchs.de
248
  * <a href="https://www.moebel.de" target="_blank">Moebel.de</a>
263
  == Installation ==
264
 
265
  === From within Wordpress ===
266
+ 1. Visit Plugins > Add New;
267
+ 1. Search for Product Feed PRO for WooCommerce;
268
+ 1. Activate Product Feed PRO for WooCommerce from your plugins page.
269
 
270
  === Manually ===
271
  1. Upload the woo-product-feed-pro folder to your /wp-content/plugins/ directory;
272
+ 1. Activate Product Feed PRO for WooCommerce from your plugins page.
273
 
274
  == Frequently Asked Questions ==
275
 
336
 
337
  === Changelog ===
338
 
339
+ = 10.8.5 (2021-11-07) =
340
+ * Fixed the JSON-lD for the brand details
341
+
342
+ = 10.8.4 (2021-11-02) =
343
+ * Fixed an issue with Skroutz feeds where product sizes that are out of stock are now removed from the size field
344
+
345
+ = 10.8.3 (2021-11-01) =
346
+ * Solved a PHP notice upon activation of plugin
347
+
348
+ = 10.8.2 (2021-10-30) =
349
+ * Solved a PHP notice upon activation of plugin
350
+
351
+ = 10.8.1 (2021-10-26) =
352
+ * Added the "is not empty" operator for filters and rules
353
+
354
+ = 10.8.0 (2021-10-25) =
355
+ * When the product variable is not an object the retrieval of the stock status broke processing of the feed. Build in a check to prevent this from happening.
356
+
357
+ = 10.7.9 (2021-10-24) =
358
+ * Tested for compatibility with WooCommerce 5.8
359
+
360
+ = 10.7.8 (2021-10-18) =
361
+ * Reviews that have no rating or have deeplinks in the review text are now being removed fromn review feeds automatically as they are not allowed by Google
362
+
363
+ = 10.7.7 (2021-10-17) =
364
+ * Added the Region Id attribute for Google Shopping feeds
365
+
366
+ = 10.7.5 (2021-10-14) =
367
+ * Added the Miinto.fr template
368
+
369
+ = 10.7.4 (2021-10-13) =
370
+ * Fixed a division by zero error
371
+
372
+ = 10.7.3 (2021-10-12) =
373
+ * Fixed filters on purchase note array's
374
+
375
+ = 10.7.2 (2021-10-12) =
376
+ * Added support for the WPC Product Bundles for WooCommerce plugin
377
+
378
+ = 10.7.1 (2021-10-11) =
379
+ * Added purchase note attribute
380
+
381
+ = 10.7.0 (2021-10-05) =
382
+ * Made changes to the code to calculate the number of product variations that are on stock as it did not work for some users
383
+
384
+ = 10.6.9 (2021-10-01) =
385
+ * Solved some PHP 8 compatibility issues that caused feeds to get stuck processing
386
+
387
+ = 10.6.8 (2021-09-30) =
388
+ * Solved a Call to undefined method WC_Product_Simple::get_available_variations error
389
+
390
+ = 10.6.7 (2021-09-29) =
391
+ * Made a change to the code so it uses less memory when processing a feed
392
+
393
+ = 10.6.6 (2021-09-28) =
394
+ * Solved an issue where the plugin got stuck when variable products get deleted in WooCommerce during processing of the feed
395
+
396
+ = 10.6.5 (2021-09-22) =
397
+ * Build in an extra check to see if the cron events are active to update feeds. When not this cron event is being created.
398
+
399
+ = 10.6.4 (2021-09-14) =
400
+ * Added capacity attribute to the Google Shopping template
401
+
402
+ = 10.6.3 (2021-09-13) =
403
+ * Added display ads attributes to the Google Shopping template
404
+
405
+ = 10.6.2 (2021-09-13) =
406
+ * Fixed an issue where simple products with variations (which in theory is not possible) caused the feed processing to get stuck
407
+
408
+ = 10.6.1 (2021-09-09) =
409
+ * Solved an undefined array issue when creating a new feed
410
+
411
+ = 10.6.0 (2021-09-09) =
412
+ * Solved an issue with wrong sale prices when WCML was enabled and manual prices were entered
413
+
414
+ = 10.5.9 (2021-09-08) =
415
+ * Somehow simple products got an item_group_id for some users causing a critical error. Added a check on this to fix the error.
416
+
417
+ = 10.5.8 (2021-09-07) =
418
+ * Added a feature to be able to remove products from feeds when only few variations are in stock
419
+
420
+ = 10.5.7 (2021-09-07) =
421
+ * Fixed an issue where Rankmath plugin is installed but no primary category has been set. This resulted in a PHP notice in the logs. This has been solved now.
422
+
423
+ = 10.5.6 (2021-09-03) =
424
+ * Fixed an undefined variable issue for the facebook pixel id
425
+
426
+ = 10.5.5 (2021-09-01) =
427
+ * Fixed a Google Remarketing Pixel issue on the cart page
428
+
429
+ = 10.5.4 (2021-09-01) =
430
+ * Fixed a shipping cost issue where shipping classes that had no shipping costs set where empty
431
+ * Fixed a Google Remarketing pixel, added apostrophe on the AW-XXXXXX parameter
432
+
433
+ = 10.5.3 (2021-08-29) =
434
+ * Solved a bug: when the XML variable was not an object is returned a fatal error. Issue is solved now.
435
+
436
+ = 10.5.2 (2021-08-25) =
437
+ * Tested for compatibility with WooCommerce 5.6
438
+
439
+ = 10.5.1 (2021-08-18) =
440
+ * Fixed an issue where the visibility attribute did not return anything
441
+
442
+ = 10.5.0 (2021-08-11) =
443
+ * Added the Vivino template to the plugin
444
+
445
+ = 10.4.9 (2021-08-10) =
446
+ * Added support for Prisjakt (Sweden, Norway, Finland) feeds. The Google Shopping feed requirements are being used for it as of this release.
447
+
448
+ = 10.4.8 (2021-08-10) =
449
+ * Added support for the Yoast SEO WooCommerce unique identifiers GTIN's, ISBN, MPN so they can be used for feeds.
450
+
451
+ = 10.4.7 (2021-07-28) =
452
+ * Checked for compatibility with WP 5.8
453
+
454
+ = 10.4.6 (2021-07-22) =
455
+ * Facebook is not yet using the new availability values yet so reverting it back for Facebook only
456
+
457
+ = 10.4.5 (2021-07-21) =
458
+ * Google changed its availability requirements (underscores in the availability values), we have adjusted the plugin on this.
459
+
460
+ = 10.4.4 (2021-07-15) =
461
+ * Fixed a product review feed bug where review names with a : in it broke the feed.
462
+
463
+ = 10.4.3 (2021-07-12) =
464
+ * Added the non tax price attribute for WCML
465
+
466
+ = 10.4.2 (2021-07-09) =
467
+ * Fixed a shipping issue where table rates where put on 0 when pickup was available too.
468
+
469
+ = 10.4.1 (2021-07-08) =
470
+ * Implemented Google's new Dynamic Remarketing event pixelcode and added the Purchase and Add To Cart events for it
471
+
472
+ = 10.4.0 (2021-07-03) =
473
+ * Fixed a PHP notice on a foreach loop when a non-array was used for it
474
+
475
+ = 10.3.9 (2021-07-02) =
476
+ * A PHP warning was thrown when a review feed was created while there were no reviews in WooCommerce
477
+
478
+ = 10.3.8 (2021-07-02) =
479
+ * Fixed a bug: When a find and replace rule was created it converted strings to lowercases, this has been fixed.
480
+
481
+ = 10.3.7 (2021-07-01) =
482
+ * Added Facebook Auto / Vehicle fields to the Facebook templating
483
+
484
+ = 10.3.6 (2021-06-30) =
485
+ * Added eventID's to the Facebook pixel and Facebook Conversion API in order to prevent duplicate events being measured
486
+
487
+ = 10.3.5 (2021-06-29) =
488
+ * Fixed a bug: using a rounding price attribute did not work properly when in WooCommerce currency options the decimal or thousand separator was left blank, it always rounded down. This has been fixed.
489
+
490
+ = 10.3.4 (2021-06-28) =
491
+ * Added the quantity_to_sell_on_facebook field to the Facebook template
492
+
493
+ = 10.3.3 (2021-06-25) =
494
+ * Added a 'Link without parameters' attribute (which holds no attribute or UTM parameters in the URL)
495
+
496
+ = 10.3.2 (2021-06-18) =
497
+ * Added some product data attributes to the Google Shopping template: capacity, count, disclosure date, feature description, flavor, format, product line, product page url, release date, scent, size system, size type, suggested retail price, theme and video link
498
+
499
+ = 10.3.1 (2021-06-16) =
500
+ * Removed Okazii.ro from the list of supported channels
501
+
502
+ = 10.3.0 (2021-06-16) =
503
+ * Cleaning-up some debug code for the Facebook CAPI implementation
504
+
505
+ = 10.2.9 (2021-06-15) =
506
+ * Added support for the Facebook Conversion API (CAPI) - still in beta!
507
+ * Stripped whitespaces from values in CSV feeds
508
+
509
+ = 10.2.8 (2021-06-14) =
510
+ * Checked for compatibility with WooCommerce 5.4
511
+
512
+ = 10.2.7 (2021-06-13) =
513
+ * Added Adwords grouping, Adwords labels and Adwords redirect fields to the Bing Shopping template
514
+
515
+ = 10.2.6 (2021-06-11) =
516
+ * Added an array check on custom attributes
517
+
518
+ = 10.2.5 (2021-06-09) =
519
+ * When discount plugins are being used prices will be rounded on 2 decimals
520
+
521
+ = 10.2.4 (2021-06-09) =
522
+ * Fixed a CDATA issue
523
+
524
+ = 10.2.3 (2021-06-08) =
525
+ * Added seller name to Google & Bing shopping templates
526
+
527
+ = 10.2.2 (2021-06-04) =
528
+ * Removed an useless nonce
529
+
530
+ = 10.2.1 (2021-06-04) =
531
+ * Added XSS vulnerability checks on both the Google Remarketing pixel and Facebook pixel feature.
532
+
533
+ = 10.2.0 (2021-06-02) =
534
+ * Removed a CSS z-index as it conflicted with Jetpack
535
+
536
+ = 10.1.9 (2021-06-01) =
537
+ * Fixed a PHP notice that showed when users created an empty rule
538
+
539
+ = 10.1.8 (2021-05-31) =
540
+ * When the identifier exists field mapping is removed from the field mapping also remove it from the feed
541
+ * Some minor textual changes in the feed configuration forms
542
+
543
+ = 10.1.7 (2021-05-27) =
544
+ * Fixed a bug: The Facebook pixel addToCart, initiateCheckout and Purchase event does not accept comma's in prices. Fixed.
545
+
546
+ = 10.1.6 (2021-05-27) =
547
+ * Fixed a bug: The Facebook pixel viewContent event does not accept comma's in prices. Fixed.
548
+
549
+ = 10.1.5 (2021-05-24) =
550
+ * Fixed a bug: exclude filters on regular prices did not work
551
+
552
+ = 10.1.4 (2021-05-24) =
553
+ * Adding CDATA feature so CDATA can be added to the title, description and short description fields
554
+
555
+ = 10.1.3 (2021-05-24) =
556
+ * Fixed an issue with taxes being added in the system sale prices
557
+
558
+ = 10.1.2 (2021-05-14) =
559
+ * Added the product type field mapping as default mapping for Google Shopping feeds
560
+
561
+ = 10.1.1 (2021-05-12) =
562
+ * Added support for Mix and Match minimum and maximum prices
563
+ * Removed the item_group_id for Mix and Match products
564
+
565
+ = 10.1.0 (2021-05-12) =
566
+ * Tested for compatibility with WooCommerce 5.3
567
+ * Changed UI when saving new plugin batch size so it shows the correct batch number immediatly
568
+
569
+ = 10.0.9 (2021-05-04) =
570
+ * Added extra fields for Google's local storefront shopping feeds
571
+
572
+ = 10.0.8 (2021-04-28) =
573
+ * Fixed an issue with the image field for custom feeds, it was added as image_link. This has been fixed now.
574
+
575
+ = 10.0.7 (2021-04-27) =
576
+ * Added support for ACF image fields (make sure to use image or bild in your field name)
577
+
578
+ = 10.0.6 (2021-04-27) =
579
+ * Added support for the WooCommerce Shipping & Tax plugin
580
+
581
+ = 10.0.5 (2021-04-21) =
582
+ * Added the "pickup today / merchant hosted local storefront" fields for Google Shopping
583
+
584
+ = 10.0.4 (2021-04-19) =
585
+ * Fixed an issue where shipping costs where missing from feeds
586
+ * Lowest shipping costs did not return the lowest price when prices where not numeric. This has been fixed now.
587
+
588
+ = 10.0.3 (2021-04-19) =
589
+ * When variations are out of stock we remove them from the parent product for Skroutz feeds
590
+
591
+ = 10.0.2 (2021-04-18) =
592
+ * Fixed a bug: rules that where set on attributes that were empty accidently added values to the product data. This has been fixed now.
593
+
594
+ = 10.0.1 (2021-04-16) =
595
+ * Fixed a bug: the multiple standard tax rates are now also taken into account for shipping costs
596
+
597
+ = 10.0.0 (2021-04-15) =
598
+ * Fixed a bug: when multiple standard tax rates for multiple countries where configured the plugin did not pick the correct tax rate when a feed was configured for a country other then the base country. This has been fixed now.
599
+
600
+ = 9.9.9 (2021-04-12) =
601
+ * Added a "force clean-up" feature that in one go removes all feed configurations and scheduled jobs
602
+
603
+ = 9.9.8 (2021-04-12) =
604
+ * Added support for non numeric characters in the AW Dynamic tracking ID
605
+
606
+ = 9.9.7 (2021-04-11) =
607
+ * Fixed helptexts and notifications
608
+
609
+ = 9.9.6 (2021-04-08) =
610
+ * Added support for the Rankmath primary category
611
+
612
+ = 9.9.5 (2021-04-08) =
613
+ * Fixed an issue with the product_url field for Google review feeds. The & charcater was shown as AND. Issue fixed now.
614
+
615
+ = 9.9.4 (2021-03-30) =
616
+ * Added lowest shipping costs attribute
617
+
618
+ = 9.9.3 (2021-03-29) =
619
+ * Removed currency from shipping costs of Heureka feeds
620
+
621
+ = 9.9.2 (2021-03-27) =
622
+ * Fixed an issue for the shipping table rate plugin, when multiple where configured only one price made it to the feed. Issue is fixed.
623
+
624
+ = 9.9.1 (2021-03-25) =
625
+ * Added support for the official WooCommerce Table Rate plugin (by WooCommerce)
626
+
627
+ = 9.9.0 (2021-03-24) =
628
+ * Added product type field mapping to the Facebook template
629
+ * Change the default field mapping for title to "product name parent product" so grouping on variable products works better in Facebook
630
+
631
+ = 9.8.9 (2021-03-22) =
632
+ * Fixed a Table Rate shipping issue that overwrote shipping costs for Flat Rates.
633
+
634
+ = 9.8.8 (2021-03-22) =
635
+ * Fixed an UI issue with filters and rules, apostrofs were not showing. Issue is fixed now.
636
+
637
+ = 9.8.7 (2021-03-22) =
638
+ * Bundle and composite products should not get an item group ID in the feed, removed it from the feed.
639
+
640
+ = 9.8.6 (2021-03-19) =
641
+ * Fixed an issue where shipping tax was not added for WooCommerce table rate shipping costs
642
+
643
+ = 9.8.5 (2021-03-18) =
644
+ * Affiliate / external product types got an item_group_id of 0 in the feed whereas it should be empty. Issue is fixed now.
645
+
646
+ = 9.8.4 (2021-03-18) =
647
+ * Added the Idealo.de Germany template, including their Direktkauf fields
648
+
649
+ = 9.8.3 (2021-03-15) =
650
+ * Solved a rounding issue for sale prices including VAT
651
+
652
+ = 9.8.2 (2021-03-15) =
653
+ * Fixed a Facebook Purchase event where only the value of the last product was added to the Facebook pixel instead of the value of all products bought
654
+
655
+ = 9.8.1 (2021-03-13) =
656
+ * The plugin systems check showed a critical error for users that are on PHP 8. Issue is fixed now.
657
+
658
+ = 9.8.0 (2021-03-11) =
659
+ * Only reviews that are approved make it to the review feeds, disapproved reviews are removed
660
+
661
+ = 9.7.9 (2021-03-10) =
662
+ * Checked for compatibility with WordPress 5.7
663
+ * Checked for compatibility with WooCommerce 5.1
664
+
665
+ = 9.7.8 (2021-03-10) =
666
+ * Added a boolean check on the review feed creation
667
+
668
+ = 9.7.7 (2021-03-09) =
669
+ * Removed the woosea_add_cart.js from the source as it was an empty file
670
+
671
+ = 9.7.6 (2021-03-08) =
672
+ * Fixed an issue with the Facebook Purchase event that did not track the order value correct
673
+
674
+ = 9.7.5 (2021-03-07) =
675
+ * Another recode of the lowest price variation feature
676
+
677
+ = 9.7.4 (2021-03-05) =
678
+ * Added Bing Shopping Promotions template
679
+
680
+ = 9.7.3 (2021-03-04) =
681
+ * Added a new attribute "Stock Status WooCommerce"
682
+ * Fixed another quote issue with the Facebook pixel
683
+
684
+ = 9.7.2 (2021-03-03) =
685
+ * Fixed an issue with the Facebook pixel. Product names that had an apostrophe in them were not measured.
686
+
687
+ = 9.7.1 (2021-03-03) =
688
+ * Added another fix to take into account prices excluding VAT for filtering out all but the minimum priced variation
689
+
690
+ = 9.7.0 (2021-03-03) =
691
+ * Fixed a bug where lowest priced variations where not making it to feeds
692
+
693
+ = 9.6.9 (2021-02-28) =
694
+ * Added product name parent hyphen attribute
695
+
696
+ = 9.6.8 (2021-02-25) =
697
+ * Added Google category taxonomy mapping for Snapchat feeds
698
+
699
+ = 9.6.7 (2021-02-25) =
700
+ * When suffixes and prefixes are used for the Heureka URL fields spaces are removed
701
+
702
+ = 9.6.6 (2021-02-24) =
703
+ * Added support for PHP 8.0
704
+
705
+ = 9.6.5 (2021-02-24) =
706
+ * Do not add Skroutz variable products to the feed when they do not have item_group_id's
707
+
708
+ = 9.6.4 (2021-02-24) =
709
+ * Fixed an issue with rules and filters
710
+ * When a rule was set on an image link, no longer lowercase the image link
711
+
712
+ = 9.6.3 (2021-02-23) =
713
+ * Fixed a bug, the Facebook pixel is now also measuing revenue for multiple items in Cart, InititiateCheckout and Purchase events
714
+ * Reverted back some changes in filters and rules
715
+
716
+ = 9.6.2 (2021-02-22) =
717
+ * For Skroutz feed removing sizes from feeds when they are out-of-stock
718
+
719
+ = 9.6.1 (2021-02-19) =
720
+ * Added attribute that will allow you to uppercase every first character of a string in product names
721
+
722
+ = 9.6.0 (2021-02-19) =
723
+ * Changed g:itemid to g:id for the Google Local Product Feeds
724
+
725
+ = 9.5.9 (2021-02-19) =
726
+ * Added a fail-safe when users do not select a marketing channel which let to PHP notices in logs
727
+
728
+ = 9.5.8 (2021-02-18) =
729
+ * Added shipping class name attribute
730
+
731
+ = 9.5.7 (2021-02-17) =
732
+ * Dynamic attribute values are now also added to parent variable products for Skroutz feeds
733
+
734
+ = 9.5.6 (2021-02-17) =
735
+ * Changed attribute name primary category to Yoast primary category as it caused lots of confussion
736
+
737
+ = 9.5.5 (2021-02-11) =
738
+ * Fixed a PHP notice that showed when creating a new rule
739
+ * Tested for compatibility with WooCommerce 5.0
740
+
741
+ = 9.5.4 (2021-02-09) =
742
+ * When free shipping zones are removed do not remove the other shipping zones
743
+
744
+ = 9.5.3 (2021-02-08) =
745
+ * Added a feature to remove free shipping zones from Google and Facebook feeds
746
+
747
+ = 9.5.2 (2021-02-08) =
748
+ * Fixed a minor issue in exclude rules for WooCommerce category names
749
+
750
+ = 9.5.1 (2021-02-02) =
751
+ * Dynamic attributes without values that are used for product details should be skipped which not always happened. This is fixed now.
752
+
753
+ = 9.5.0 (2021-02-01) =
754
+ * Discount rules created with the FlyCart plugin did not make it to Skroutz feeds. This has been solved now
755
+
756
+ = 9.4.9 (2021-01-31) =
757
+ * Added a seperate sale price attribute for bundled products
758
+ * Reviews for parent variable products are removed, the reviews are attached to its variations
759
+
760
+ = 9.4.8 (2021-01-30) =
761
+ * Fixed an issue with the ecomm_prodid on the cart page
762
+
763
+ = 9.4.7 (2021-01-29) =
764
+ * Solved an issue that shipping costs to the first product in a custom feed where empty
765
+
766
+ = 9.4.6 (2021-01-28) =
767
+ * Added a new attribute: product description parent product
768
+
769
+ = 9.4.5 (2021-01-28) =
770
+ * Added a Google Shopping field to their template: g:ship_from_country
771
+ * Stripping & characters from review names as it breaks the review feeds
772
+
773
+ = 9.4.4 (2021-01-27) =
774
+ * 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.
775
+
776
+ = 9.4.3 (2021-01-27) =
777
+ * Fixed an issue with an undefined ecomm_price variable on product variable pages
778
+
779
+ = 9.4.2 (2021-01-26) =
780
+ * Added the Dutch Boetiek.nl template
781
+
782
+ = 9.4.1 (2021-01-19) =
783
+ * Fixed a bug: exclude filters on empty product tags were broken. This is fixed now.
784
+
785
+ = 9.4.0 (2021-01-14) =
786
+ * Added a WP-cron check and notifications
787
+
788
+ = 9.3.9 (2021-01-14) =
789
+ * Bestprice.gr apparel products are now grouped by color
790
+
791
+ = 9.3.8 (2021-01-13) =
792
+ * Tested for compatibility with WooCommerce 4.9
793
+
794
  = 9.3.7 (2021-01-12) =
795
  * Added the Bestprice.gr template
796
 
3457
 
3458
  == Upgrade Notice ==
3459
 
3460
+ = 10.8.5 =
3461
+ Fixed the JSON-lD for the brand details
3462
+
3463
+ = 10.8.4 =
3464
+ Fixed an issue with Skroutz feeds where product sizes that are out of stock are now removed from the size field
3465
+
3466
+ = 10.8.3 =
3467
+ Solved a PHP notice upon activation of plugin
3468
+
3469
+ = 10.8.2 =
3470
+ Solved a PHP notice upon activation of plugin
3471
+
3472
+ = 10.8.1 =
3473
+ Added the "is not empty" operator for filters and rules
3474
+
3475
+ = 10.8.0 =
3476
+ When the product variable is not an object the retrieval of the stock status broke processing of the feed. Build in a check to prevent this from happening.
3477
+
3478
+ = 10.7.9 =
3479
+ Tested for compatibility with WooCommerce 5.8
3480
+
3481
+ = 10.7.8 =
3482
+ Reviews that have no rating or have deeplinks in the review text are now being removed fromn review feeds automatically as they are not allowed by Google
3483
+
3484
+ = 10.7.7 =
3485
+ Added the Region Id attribute for Google Shopping feeds
3486
+
3487
+ = 10.7.5 =
3488
+ Added the Miinto.fr template
3489
+
3490
+ = 10.7.4 =
3491
+ Fixed a division by zero error
3492
+
3493
+ = 10.7.3 =
3494
+ Fixed filters on purchase note array's
3495
+
3496
+ = 10.7.2 =
3497
+ Added support for the WPC Product Bundles for WooCommerce plugin
3498
+
3499
+ = 10.7.1 =
3500
+ Added purchase note attribute
3501
+
3502
+ = 10.7.0 =
3503
+ Made changes to the code to calculate the number of product variations that are on stock as it did not work for some users
3504
+
3505
+ = 10.6.9 =
3506
+ Solved some PHP 8 compatibility issues that caused feeds to get stuck processing
3507
+
3508
+ = 10.6.8 =
3509
+ Solved a Call to undefined method WC_Product_Simple::get_available_variations error
3510
+
3511
+ = 10.6.7 =
3512
+ Made a change to the code so it uses less memory when processing a feed
3513
+
3514
+ = 10.6.6 =
3515
+ Solved an issue where the plugin got stuck when variable products get deleted in WooCommerce during processing of the feed
3516
+
3517
+ = 10.6.5 =
3518
+ Build in an extra check to see if the cron events are active to update feeds. When not this cron event is being created.
3519
+
3520
+ = 10.6.4 =
3521
+ Added capacity attribute to the Google Shopping template
3522
+
3523
+ = 10.6.3 =
3524
+ Added display ads attributes to the Google Shopping template
3525
+
3526
+ = 10.6.2 =
3527
+ Fixed an issue where simple products with variations (which in theory is not possible) caused the feed processing to get stuck
3528
+
3529
+ = 10.6.1 =
3530
+ Solved an undefined array issue when creating a new feed
3531
+
3532
+ = 10.6.0 =
3533
+ Solved an issue with wrong sale prices when WCML was enabled and manual prices were entered
3534
+
3535
+ = 10.5.9 =
3536
+ Somehow simple products got an item_group_id for some users causing a critical error. Added a check on this to fix the error.
3537
+
3538
+ = 10.5.8 =
3539
+ Added a feature to be able to remove products from feeds when only few variations are in stock
3540
+
3541
+ = 10.5.7 =
3542
+ Fixed an issue where Rankmath plugin is installed but no primary category has been set. This resulted in a PHP notice in the logs. This has been solved now.
3543
+
3544
+ = 10.5.6 =
3545
+ Fixed an undefined variable issue for the facebook pixel id
3546
+
3547
+ = 10.5.5 =
3548
+ Fixed a Google Remarketing Pixel issue on the cart page
3549
+
3550
+ = 10.5.4 =
3551
+ Fixed a shipping cost issue where shipping classes that had no shipping costs set where empty
3552
+ Fixed a Google Remarketing pixel, added apostrophe on the AW-XXXXXX parameter
3553
+
3554
+ = 10.5.3 =
3555
+ Solved a bug: when the XML variable was not an object is returned a fatal error. Issue is solved now.
3556
+
3557
+ = 10.5.2 =
3558
+ Tested for compatibility with WooCommerce 5.6
3559
+
3560
+ = 10.5.1 =
3561
+ Fixed an issue where the visibility attribute did not return anything
3562
+
3563
+ = 10.5.0 =
3564
+ Added the Vivino template to the plugin
3565
+
3566
+ = 10.4.9 =
3567
+ Added support for Prisjakt (Sweden, Norway, Finland) feeds. The Google Shopping feed requirements are being used for it as of this release.
3568
+
3569
+ = 10.4.8 =
3570
+ Added support for the Yoast SEO WooCommerce unique identifiers GTIN's, ISBN, MPN so they can be used for feeds.
3571
+
3572
+ = 10.4.7 =
3573
+ Checked for compatibility with WP 5.8
3574
+
3575
+ = 10.4.6 =
3576
+ Reverting back the availability changes for Facebook only
3577
+
3578
+ = 10.4.5 =
3579
+ Google changed its availability requirements (underscores in the availability values), we have adjusted the plugin on this.
3580
+
3581
+ = 10.4.4 =
3582
+ Fixed a product review feed bug where review names with a : in it broke the feed.
3583
+
3584
+ = 10.4.3 =
3585
+ Added the non tax price attribute for WCML
3586
+
3587
+ = 10.4.2 =
3588
+ Fixed a shipping issue where table rates where put on 0 when pickup was available too.
3589
+
3590
+ = 10.4.1 =
3591
+ Implemented Google's new Dynamic Remarketing event pixelcode and added the Purchase and Add To Cart events for it
3592
+
3593
+ = 10.4.0 =
3594
+ Fixed a PHP notice on a foreach loop when a non-array was used for it
3595
+
3596
+ = 10.3.9 =
3597
+ A PHP warning was thrown when a review feed was created while there were no reviews in WooCommerce
3598
+
3599
+ = 10.3.8 =
3600
+ Fixed a bug: When a find and replace rule was created it converted strings to lowercases, this has been fixed.
3601
+
3602
+ = 10.3.7 =
3603
+ Added Facebook Auto / Vehicle fields to the Facebook templating
3604
+
3605
+ = 10.3.6 =
3606
+ Added eventID's to the Facebook pixel and Facebook Conversion API in order to prevent duplicate events being measured
3607
+
3608
+ = 10.3.5 =
3609
+ Fixed a bug: using a rounding price attribute did not work properly when in WooCommerce currency options the decimal or thousand separator was left blank, it always rounded down. This has been fixed.
3610
+
3611
+ = 10.3.4 =
3612
+ Added the quantity_to_sell_on_facebook field to the Facebook template
3613
+
3614
+ = 10.3.3 =
3615
+ Added a 'Link without parameters' attribute (which holds no attribute or UTM parameters in the URL)
3616
+
3617
+ = 10.3.2 =
3618
+ Added some product data attributes to the Google Shopping template: capacity, count, disclosure date, feature description, flavor, format, product line, product pag
3619
+ e url, release date, scent, size system, size type, suggested retail price, theme and video link
3620
+
3621
+ = 10.3.1 =
3622
+ Removed Okazii.ro from the list of supported channels
3623
+
3624
+ = 10.3.0 =
3625
+ Cleaning-up some debug code for the Facebook CAPI implementation
3626
+
3627
+ = 10.2.9 =
3628
+ Added support for the Facebook Conversion API (CAPI) - still in beta!
3629
+ Stripped whitespaces from values in CSV feeds
3630
+
3631
+ = 10.2.8 =
3632
+ Checked for compatibility with WooCommerce 5.4
3633
+
3634
+ = 10.2.7 =
3635
+ Added Adwords grouping, Adwords labels and Adwords redirect fields to the Bing Shopping template
3636
+
3637
+ = 10.2.6 =
3638
+ Added an array check on custom attributes
3639
+
3640
+ = 10.2.5 =
3641
+ When discount plugins are being used prices will be rounded on 2 decimals
3642
+
3643
+ = 10.2.4 =
3644
+ Fixed a CDATA issue
3645
+
3646
+ = 10.2.3 =
3647
+ Added seller name to Google & Bing shopping templates
3648
+
3649
+ = 10.2.2 =
3650
+ Removed an useless nonce
3651
+
3652
+ = 10.2.1 =
3653
+ Added XSS vulnerability checks on both the Google Remarketing pixel and Facebook pixel feature.
3654
+
3655
+ = 10.2.0 =
3656
+ Removed a CSS z-index as it conflicted with Jetpack
3657
+
3658
+ = 10.1.9 =
3659
+ Fixed a PHP notice that showed when users created an empty rule
3660
+
3661
+ = 10.1.8 =
3662
+ When the identifier exists field mapping is removed from the field mapping also remove it from the feed
3663
+ Some minor textual changes in the feed configuration forms
3664
+
3665
+ = 10.1.7 =
3666
+ Fixed a bug: The Facebook pixel addToCart, initiateCheckout and Purchase event does not accept comma's in prices. Fixed.
3667
+
3668
+ = 10.1.6 =
3669
+ Fixed a bug: The Facebook pixel viewContent event does not accept comma's in prices. Fixed.
3670
+
3671
+ = 10.1.5 =
3672
+ Fixed a bug: exclude filters on regular prices did not work
3673
+
3674
+ = 10.1.4 =
3675
+ Adding CDATA feature so CDATA can be added to the title, description and short description fields
3676
+
3677
+ = 10.1.3 =
3678
+ Fixed an issue with taxes being added in the system sale prices
3679
+
3680
+ = 10.1.2 =
3681
+ Added the product type field mapping as default mapping for Google Shopping feeds
3682
+
3683
+ = 10.1.1 =
3684
+ Added support for Mix and Match minimum and maximum prices
3685
+ Removed the item_group_id for Mix and Match products
3686
+
3687
+ = 10.1.0 =
3688
+ Tested for compatibility with WooCommerce 5.3
3689
+ Changed UI when saving new plugin batch size so it shows the correct batch number immediatly
3690
+
3691
+ = 10.0.9 =
3692
+ Added extra fields for Google's local storefront shopping feeds
3693
+
3694
+ = 10.0.8 =
3695
+ Fixed an issue with the image field for custom feeds, it was added as image_link. This has been fixed now.
3696
+
3697
+ = 10.0.7 =
3698
+ Added support for ACF image fields (make sure to use image or bild in your field name)
3699
+
3700
+ = 10.0.6 =
3701
+ Added support for the WooCommerce Shipping & Tax plugin
3702
+
3703
+ = 10.0.5 =
3704
+ Added the "pickup today / merchant hosted local storefront" fields for Google Shopping
3705
+
3706
+ = 10.0.4 =
3707
+ Fixed an issue where shipping costs where missing from feeds
3708
+ Lowest shipping costs did not return the lowest price when prices where not numeric. This has been fixed now.
3709
+
3710
+ = 10.0.3 =
3711
+ When variations are out of stock we remove them from the parent product for Skroutz feeds
3712
+
3713
+ = 10.0.2 =
3714
+ Fixed a bug: rules that where set on attributes that were empty accidently added values to the product data. This has been fixed now.
3715
+
3716
+ = 10.0.1 =
3717
+ Fixed a bug: the multiple standard tax rates are now also taken into account for shipping costs
3718
+
3719
+ = 10.0.0 =
3720
+ Fixed a bug: when multiple standard tax rates for multiple countries where configured the plugin did not pick the correct tax rate when a feed was configured for a country other then the base country. This has been fixed now.
3721
+
3722
+ = 9.9.9 =
3723
+ Added a "force clean-up" feature that in one go removes all feed configurations and scheduled jobs
3724
+
3725
+ = 9.9.8 =
3726
+ Added support for non numeric characters in the AW Dynamic tracking ID
3727
+
3728
+ = 9.9.7 =
3729
+ Fixed helptexts and notifications
3730
+
3731
+ = 9.9.6 =
3732
+ Added support for the Rankmath primary category
3733
+
3734
+ = 9.9.5 =
3735
+ Fixed an issue with the product_url field for Google review feeds. The & charcater was shown as AND. Issue fixed now.
3736
+
3737
+ = 9.9.4 =
3738
+ Added lowest shipping costs attribute
3739
+
3740
+ = 9.9.3 =
3741
+ Removed currency from shipping costs of Heureka feeds
3742
+
3743
+ = 9.9.2 =
3744
+ Fixed an issue for the shipping table rate plugin, when multiple where configured only one price made it to the feed. Issue is fixed.
3745
+
3746
+ = 9.9.1 =
3747
+ Added support for the official WooCommerce Table Rate plugin (by WooCommerce)
3748
+
3749
+ = 9.9.0 =
3750
+ Added product type field mapping to the Facebook template
3751
+ Change the default field mapping for title to "product name parent product" so grouping on variable products works better in Facebook
3752
+
3753
+ = 9.8.9 =
3754
+ Fixed a Table Rate shipping issue that overwrote shipping costs for Flat Rates.
3755
+
3756
+ = 9.8.8 =
3757
+ Fixed an UI issue with filters and rules, apostrofs were not showing. Issue is fixed now.
3758
+
3759
+ = 9.8.7 =
3760
+ Bundle and composite products should not get an item group ID in the feed, removed it from the feed.
3761
+
3762
+ = 9.8.6 =
3763
+ Fixed an issue where shipping tax was not added for WooCommerce table rate shipping costs
3764
+
3765
+ = 9.8.5 =
3766
+ Affiliate / external product types got an item_group_id of 0 in the feed whereas it should be empty. Issue is fixed now.
3767
+
3768
+ = 9.8.4 =
3769
+ Added the Idealo.de Germany template, including their Direktkauf fields
3770
+
3771
+ = 9.8.3 =
3772
+ Solved a rounding issue for sale prices including VAT
3773
+
3774
+ = 9.8.2 =
3775
+ Fixed a Facebook Purchase event where only the value of the last product was added to the Facebook pixel instead of the value of all products bought
3776
+
3777
+ = 9.8.1 =
3778
+ The plugin systems check showed a critical error for users that are on PHP 8. Issue is fixed now.
3779
+
3780
+ = 9.8.0 =
3781
+ Only reviews that are approved make it to the review feeds, disapproved reviews are removed
3782
+
3783
+ = 9.7.9 =
3784
+ Checked for compatibility with WordPress 5.7
3785
+ Checked for compatibility with WooCommerce 5.1.0
3786
+
3787
+ = 9.7.8 =
3788
+ Added a boolean check on the review feed creation
3789
+
3790
+ = 9.7.7 =
3791
+ Removed the woosea_add_cart.js from the source as it was an empty file
3792
+
3793
+ = 9.7.6 =
3794
+ Fixed an issue with the Facebook Purchase event that did not track the order value correct
3795
+
3796
+ = 9.7.5 =
3797
+ Another recode of the lowest price variation feature
3798
+
3799
+ = 9.7.4 =
3800
+ Added Bing Shopping Promotions template
3801
+
3802
+ = 9.7.3 =
3803
+ Added a new attribute "Stock Status WooCommerce"
3804
+ Fixed another quote issue with the Facebook pixel
3805
+
3806
+ = 9.7.2 =
3807
+ Fixed an issue with the Facebook pixel. Product names that had an apostrophe in them were not measured.
3808
+
3809
+ = 9.7.1 =
3810
+ Added another fix to take into account prices excluding VAT for filtering out all but the minimum priced variation
3811
+
3812
+ = 9.7.0 =
3813
+ Fixed a bug where lowest priced variations where not making it to feeds
3814
+
3815
+ = 9.6.9 =
3816
+ Added product name parent hyphen attribute
3817
+
3818
+ = 9.6.8 =
3819
+ Added Google category taxonomy mapping for Snapchat feeds
3820
+
3821
+ = 9.6.7 =
3822
+ When suffixes and prefixes are used for the Heureka URL fields spaces are removed
3823
+
3824
+ = 9.6.6 =
3825
+ Added support for PHP 8.0
3826
+
3827
+ = 9.6.5 =
3828
+ Do not add Skroutz variable products to the feed when they do not have item_group_id's
3829
+
3830
+ = 9.6.4 =
3831
+ Fixed an issue with rules and filters
3832
+ When a rule was set on an image link, no longer lowercase the image link
3833
+
3834
+ = 9.6.3 =
3835
+ Fixed a bug, the Facebook pixel is now also measuing revenue for multiple items in Cart, InititiateCheckout and Purchase events
3836
+ Reverted back some changes in filters and rules
3837
+
3838
+ = 9.6.2 =
3839
+ For Skroutz feed removing sizes from feeds when they are out-of-stock
3840
+
3841
+ = 9.6.1 =
3842
+ Added attribute that will allow you to uppercase every first character of a string in product names
3843
+
3844
+ = 9.6.0 =
3845
+ Changed g:itemid to g:id for the Google Local Product Feeds
3846
+
3847
+ = 9.5.9 =
3848
+ * Added a fail-safe when users do not select a marketing channel which let to PHP notices in logs
3849
+
3850
+ = 9.5.8 =
3851
+ Added shipping class name attribute
3852
+
3853
+ = 9.5.7 =
3854
+ Dynamic attribute values are now also added to parent variable products for Skroutz feeds
3855
+
3856
+ = 9.5.6 =
3857
+ Changed attribute name primary category to Yoast primary category as it caused lots of confussion
3858
+
3859
+ = 9.5.5 =
3860
+ Fixed a PHP notice that showed when creating a new rule
3861
+ Tested for compatibility with WooCommerce 5.0
3862
+
3863
+ = 9.5.4 =
3864
+ When free shipping zones are removed do not remove the other shipping zones
3865
+
3866
+ = 9.5.3 =
3867
+ Added a feature to remove free shipping zones from Google and Facebook feeds
3868
+
3869
+ = 9.5.2 =
3870
+ Fixed a minor issue in exclude rules for WooCommerce category names
3871
+
3872
+ = 9.5.1 =
3873
+ Dynamic attributes without values that are used for product details should be skipped which not always happened. This is fixed now.
3874
+
3875
+ = 9.5.0 =
3876
+ Discount rules created with the FlyCart plugin did not make it to Skroutz feeds. This has been solved now
3877
+
3878
+ = 9.4.9 =
3879
+ Added a seperate sale price attribute for bundled products
3880
+ Reviews for parent variable products are removed, the reviews are attached to its variations
3881
+
3882
+ = 9.4.8 =
3883
+ Fixed an issue with the ecomm_prodid on the cart page
3884
+
3885
+ = 9.4.7 =
3886
+ Solved an issue that shipping costs to the first product in a custom feed where empty
3887
+
3888
+ = 9.4.6 =
3889
+ Added a new attribute: product description parent product
3890
+
3891
+ = 9.4.5 =
3892
+ Added a Google Shopping field to their template: g:ship_from_country
3893
+ Stripping & characters from review names as it breaks the review feeds
3894
+
3895
+ = 9.4.4 =
3896
+ 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.
3897
+
3898
+ = 9.4.3 =
3899
+ Fixed an issue with an undefined ecomm_price variable on product variable pages
3900
+
3901
+ = 9.4.2 =
3902
+ Added the Dutch Boetiek.nl template
3903
+
3904
+ = 9.4.1 =
3905
+ Fixed a bug: exclude filters on empty product tags were broken. This is fixed now.
3906
+
3907
+ = 9.4.0 =
3908
+ Added a WP-cron check and notifications
3909
+
3910
+ = 9.3.9 =
3911
+ Bestprice.gr apparel products are now grouped by color
3912
+
3913
+ = 9.3.8 =
3914
+ Tested for compatibility with WooCommerce 4.9
3915
+
3916
  = 9.3.7 =
3917
  Added the Bestprice.gr template
3918
 
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
@@ -11,13 +11,13 @@
11
  * License: GPL3
12
  * License URI: https://www.gnu.org/licenses/gpl-3.0.html
13
  * Requires at least: 4.5
14
- * Tested up to: 5.6
15
  *
16
  * Text Domain: woo-product-feed-pro
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
 
@@ -101,7 +101,8 @@ function woosea_scripts($hook) {
101
  wp_enqueue_script('jquery-ui-datepicker');
102
 
103
  // Only register and enqueue JS scripts from within the plugin itself
104
- if (preg_match("/product-feed-pro/i",$hook)){
 
105
  // JS files for ChartJS
106
  wp_register_script( 'woosea_chart-bundle-js', plugin_dir_url( __FILE__ ) . 'js/Chart.bundle.js', WOOCOMMERCESEA_PLUGIN_VERSION, true );
107
  wp_enqueue_script( 'woosea_chart-bundle-js' );
@@ -115,7 +116,7 @@ function woosea_scripts($hook) {
115
  wp_enqueue_script( 'typeahead-js' );
116
 
117
  // JS for adding input field validation
118
- wp_register_script( 'woosea_validation-js', plugin_dir_url( __FILE__ ) . 'js/woosea_validation.js?BLAAT=999', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
119
  wp_enqueue_script( 'woosea_validation-js' );
120
 
121
  // JS for autocomplete
@@ -123,7 +124,7 @@ function woosea_scripts($hook) {
123
  wp_enqueue_script( 'woosea_autocomplete-js' );
124
 
125
  // JS for adding table rows to the rules page
126
- wp_register_script( 'woosea_rules-js', plugin_dir_url( __FILE__ ) . 'js/woosea_rules.js?BLAAT=1', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
127
  wp_enqueue_script( 'woosea_rules-js' );
128
 
129
  // JS for adding table rows to the field mappings page
@@ -138,13 +139,27 @@ function woosea_scripts($hook) {
138
  wp_register_script( 'woosea_key-js', plugin_dir_url( __FILE__ ) . 'js/woosea_key.js', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
139
  wp_enqueue_script( 'woosea_key-js' );
140
 
 
 
 
141
  }
142
  // JS for manage projects page
143
- wp_register_script( 'woosea_manage-js', plugin_dir_url( __FILE__ ) . 'js/woosea_manage.js', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
144
  wp_enqueue_script( 'woosea_manage-js' );
145
  }
146
  add_action( 'admin_enqueue_scripts' , 'woosea_scripts' );
147
 
 
 
 
 
 
 
 
 
 
 
 
148
  /**
149
  * Get product variation ID based on dropdown selects product page
150
  */
@@ -279,7 +294,7 @@ add_filter('plugin_action_links', 'woosea_plugin_action_links', 10, 2);
279
  /**
280
  * Get category path for Facebook pixel
281
  */
282
- function woosea_get_term_parents( $id, $taxonomy, $link = false, $project_taxonomy, $nicename = false, $visited = array() ) {
283
  // Only add Home to the beginning of the chain when we start buildin the chain
284
  if(empty($visited)){
285
  $chain = 'Home';
@@ -302,7 +317,7 @@ function woosea_get_term_parents( $id, $taxonomy, $link = false, $project_taxono
302
 
303
  if ($parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited, TRUE )){
304
  $visited[] = $parent->parent;
305
- $chain .= woosea_get_term_parents( $parent->parent, $taxonomy, $link, $separator, $nicename, $visited );
306
  }
307
 
308
  if ($link){
@@ -314,7 +329,6 @@ function woosea_get_term_parents( $id, $taxonomy, $link = false, $project_taxono
314
  return $chain;
315
  }
316
 
317
-
318
  /**
319
  * Add Facebook pixel
320
  */
@@ -324,17 +338,40 @@ function woosea_add_facebook_pixel( $product = null ){
324
  }
325
  $fb_pagetype = WooSEA_Google_Remarketing::woosea_google_remarketing_pagetype();
326
  $add_facebook_pixel = get_option ('add_facebook_pixel');
 
 
 
327
  $currency = get_woocommerce_currency();
328
-
329
  if($add_facebook_pixel == "yes"){
330
  $facebook_pixel_id = get_option("woosea_facebook_pixel_id");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
 
332
- if($facebook_pixel_id > 0){
333
  if ($fb_pagetype == "product"){
334
  if ( '' !== $product->get_price()) {
335
 
336
  $fb_prodid = get_the_id();
337
  $product_name = $product->get_name();
 
 
 
338
  $cats = "";
339
  $all_cats = get_the_terms( $fb_prodid, 'product_cat' );
340
  if(!empty($all_cats)){
@@ -345,9 +382,10 @@ function woosea_add_facebook_pixel( $product = null ){
345
  // strip last comma
346
  $cats = rtrim($cats, ",");
347
  $cats = str_replace("&amp;","&", $cats);
 
 
348
 
349
  if(!empty($fb_prodid)){
350
-
351
  if(!$product) {
352
  return -1;
353
  }
@@ -384,7 +422,17 @@ function woosea_add_facebook_pixel( $product = null ){
384
  $fb_price = $fb_lowprice;
385
  }
386
  }
387
- $viewContent = "fbq(\"track\",\"ViewContent\",{content_category:\"$cats\", content_name:\"$product_name\", content_type:\"product\", content_ids:[\"$fb_prodid\"], value:\"$fb_price\", currency:\"$currency\"});";
 
 
 
 
 
 
 
 
 
 
388
  } else {
389
  // This is a parent variable product
390
  // Since these are not allowed in the feed, at the variations product ID's
@@ -415,12 +463,32 @@ function woosea_add_facebook_pixel( $product = null ){
415
  $fb_highprice = wc_format_localized_price( $highest );
416
  $fb_price = $fb_lowprice;
417
  }
418
- $viewContent = "fbq(\"track\",\"ViewContent\",{content_category:\"$cats\", content_name:\"$product_name\", content_type:\"product_group\", content_ids:[$content], value:\"$fb_price\", currency:\"$currency\"});";
 
 
 
 
 
 
 
 
 
 
419
  }
420
  } else {
421
  // This is a simple product page
422
- $fb_price = wc_format_localized_price( $product->get_price() );
423
- $viewContent = "fbq(\"track\",\"ViewContent\",{content_category:\"$cats\", content_name:\"$product_name\", content_type:\"product\", content_ids:[\"$fb_prodid\"], value:\"$fb_price\", currency:\"$currency\"});";
 
 
 
 
 
 
 
 
 
 
424
  }
425
  }
426
  }
@@ -433,8 +501,8 @@ function woosea_add_facebook_pixel( $product = null ){
433
  $order = wc_get_order( $order_id );
434
  $order_items = $order->get_items();
435
  $currency = get_woocommerce_currency();
436
- $order_real = 0;
437
  $contents = "";
 
438
 
439
  if ( !is_wp_error( $order_items )) {
440
  foreach( $order_items as $item_id => $order_item) {
@@ -443,26 +511,33 @@ function woosea_add_facebook_pixel( $product = null ){
443
  if($variation_id > 0){
444
  $prod_id = $variation_id;
445
  }
446
-
447
  $prod_quantity = $order_item->get_quantity();
448
- $order_real = wc_format_localized_price( $order_item->get_total() );
449
-
450
- // $order_subtotal = number_format(($order_item->get_subtotal()),2, '.', '');
451
- // $order_subtotal_tax= number_format(($order_item->get_subtotal_tax()),2, '.', '');
452
- // $order_real = number_format(($order_subtotal+$order_subtotal_tax+$order_real),2,',','');
453
  $contents .= "{'id': '$prod_id', 'quantity': $prod_quantity},";
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
461
  $currency = get_woocommerce_currency();
462
  $cart_items = WC()->cart->get_cart();
 
 
463
  $cart_real = 0;
464
  $contents = "";
465
 
 
 
 
466
  $checkoutpage = wc_get_checkout_url();
467
  $current_url = get_permalink(get_the_ID());
468
 
@@ -470,6 +545,8 @@ function woosea_add_facebook_pixel( $product = null ){
470
  if( !is_wp_error( $cart_items )) {
471
  foreach( $cart_items as $cart_id => $cart_item) {
472
  $prod_id = $cart_item['product_id'];
 
 
473
  if($cart_item['variation_id'] > 0){
474
  $prod_id = $cart_item['variation_id'];
475
  }
@@ -477,20 +554,31 @@ 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
  }
@@ -523,8 +611,14 @@ function woosea_add_facebook_pixel( $product = null ){
523
  }
524
  $fb_prodid = rtrim($fb_prodid, ",");
525
  $category_name = $term->name;
526
- $category_path = woosea_get_term_parents( $term->term_id, 'product_cat', $link = false, $project_taxonomy = false, $nicename = false, $visited = array() );
527
- $viewContent = "fbq(\"track\",\"ViewCategory\",{content_category:\"$category_path\", content_name:\"$category_name\", content_type:\"product\", content_ids:\"[$fb_prodid]\"});";
 
 
 
 
 
 
528
  } elseif ($fb_pagetype == "searchresults"){
529
  $term = get_queried_object();
530
  $search_string = sanitize_text_field($_GET['s']);
@@ -553,9 +647,15 @@ function woosea_add_facebook_pixel( $product = null ){
553
  }
554
  }
555
  $fb_prodid = rtrim($fb_prodid, ",");
556
- $viewContent = "fbq(\"trackCustom\",\"Search\",{search_string:\"$search_string\", content_type:\"product\", content_ids:\"[\"$fb_prodid\"]\"});";
 
 
 
 
 
557
  } else {
558
  // This is another page than a product page
 
559
  $viewContent = "";
560
  }
561
  ?>
@@ -574,7 +674,8 @@ function woosea_add_facebook_pixel( $product = null ){
574
  t.src=v;s=b.getElementsByTagName(e)[0];
575
  s.parentNode.insertBefore(t,s)}(window, document,'script',
576
  'https://connect.facebook.net/en_US/fbevents.js');
577
- fbq("init", "<?php print"$facebook_pixel_id";?>");
 
578
  fbq("track", "PageView");
579
  <?php
580
  if(strlen($viewContent) > 2){
@@ -583,10 +684,42 @@ function woosea_add_facebook_pixel( $product = null ){
583
  ?>
584
  </script>
585
  <noscript>
586
- <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=<?php print"$facebook_pixel_id";?>&ev=PageView&noscript=1"/>
587
  </noscript>
588
  <!-- End Facebook Pixel Code -->
589
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
590
  }
591
  }
592
  }
@@ -601,11 +734,26 @@ function woosea_add_remarketing_tags( $product = null ){
601
  }
602
  $ecomm_pagetype = WooSEA_Google_Remarketing::woosea_google_remarketing_pagetype();
603
  $add_remarketing = get_option ('add_remarketing');
604
-
605
  if($add_remarketing == "yes"){
606
  $adwords_conversion_id = get_option("woosea_adwords_conversion_id");
 
 
 
 
607
 
608
  if($adwords_conversion_id > 0){
 
 
 
 
 
 
 
 
 
 
 
609
  if ($ecomm_pagetype == "product"){
610
  if ( '' !== $product->get_price()) {
611
  $ecomm_prodid = get_the_id();
@@ -622,7 +770,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 +807,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 {
@@ -667,58 +817,83 @@ function woosea_add_remarketing_tags( $product = null ){
667
  }
668
  }
669
  ?>
670
- <script type="text/javascript">
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 = {
685
- ecomm_prodid: '<?php print "$ecomm_prodid";?>',
686
- ecomm_pagetype: '<?php print "$ecomm_pagetype";?>',
687
- };
688
- </script>
689
- <?php
690
- } else {
691
- // This is another page than a product page
692
- ?>
693
- <script type="text/javascript">
694
- var google_tag_params = {
695
- ecomm_pagetype: '<?php print "$ecomm_pagetype";?>',
696
- };
697
- </script>
698
- <?php
699
- }
700
- ?>
701
- <!-- Google-code – remarketing tag added by AdTribes.io -->
702
- <!--------------------------------------------------
703
- You need to make sure that the ecomm_prodid parameter, which we fill with your
704
- WooCommerce product Id matches the g:id field for your Google Merchant Center feed.
705
- --------------------------------------------------->
706
- <script type="text/javascript">
707
- /* <![CDATA[ */
708
- var google_conversion_id = <?php print "$adwords_conversion_id";?>;
709
- var google_custom_params = window.google_tag_params;
710
- var google_remarketing_only = true;
711
- /* ]]> */
712
- </script>
713
- <script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js">
714
- </script>
715
- <noscript>
716
- <div style="display:inline;">
717
- <img height="1" width="1" style="border-style:none;" alt="" src="//googleads.g.doubleclick.net/pagead/viewthroughconversion/<?php print "$adwords_conversion_id";?>/?guid=ON&amp;script=0"/>
718
- </div>
719
- </noscript>
720
- <!-- End Google Remarketing Pixel Code -->
721
- <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
722
  }
723
  }
724
  }
@@ -804,6 +979,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
  */
@@ -928,11 +1104,19 @@ function woosea_categories_dropdown() {
928
  }
929
  add_action( 'wp_ajax_woosea_categories_dropdown', 'woosea_categories_dropdown' );
930
 
 
 
 
 
 
 
 
931
  /**
932
  * Save Google Dynamic Remarketing Conversion Tracking ID
933
  */
934
  function woosea_save_adwords_conversion_id() {
935
  $adwords_conversion_id = sanitize_text_field($_POST['adwords_conversion_id']);
 
936
  update_option("woosea_adwords_conversion_id", $adwords_conversion_id);
937
  }
938
  add_action( 'wp_ajax_woosea_save_adwords_conversion_id', 'woosea_save_adwords_conversion_id' );
@@ -951,10 +1135,21 @@ add_action( 'wp_ajax_woosea_save_batch_size', 'woosea_save_batch_size' );
951
  */
952
  function woosea_save_facebook_pixel_id() {
953
  $facebook_pixel_id = sanitize_text_field($_POST['facebook_pixel_id']);
 
954
  update_option("woosea_facebook_pixel_id", $facebook_pixel_id);
955
  }
956
  add_action( 'wp_ajax_woosea_save_facebook_pixel_id', 'woosea_save_facebook_pixel_id' );
957
 
 
 
 
 
 
 
 
 
 
 
958
  /**
959
  * Mass map categories to the correct Google Shopping category taxonomy
960
  */
@@ -1519,7 +1714,7 @@ function woosea_product_fix_structured_data( $product = null ) {
1519
  $brand = get_post_meta( $variation_id, '_woosea_brand', true );
1520
  if ( $brand ) {
1521
  $markup['brand'] = array (
1522
- '@type' => 'Thing',
1523
  'name' => $brand,
1524
  );
1525
  }
@@ -1622,7 +1817,7 @@ function woosea_product_fix_structured_data( $product = null ) {
1622
 
1623
  if ( $brand ) {
1624
  $markup['brand'] = array (
1625
- '@type' => 'Thing',
1626
  'name' => $brand,
1627
  );
1628
  }
@@ -2285,6 +2480,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
@@ -2301,20 +2511,59 @@ function woosea_add_woosea_logging (){
2301
  add_action( 'wp_ajax_woosea_add_woosea_logging', 'woosea_add_woosea_logging' );
2302
 
2303
  /**
2304
- * This function enables the setting to add
2305
- * the Faceook pixel
2306
  */
2307
- function woosea_add_facebook_pixel_setting (){
2308
  $status = sanitize_text_field($_POST['status']);
2309
 
2310
  if ($status == "off"){
2311
- update_option( 'add_facebook_pixel', 'no', 'yes');
2312
  } else {
2313
- update_option( 'add_facebook_pixel', 'yes', 'yes');
2314
  }
2315
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2316
  add_action( 'wp_ajax_woosea_add_facebook_pixel_setting', 'woosea_add_facebook_pixel_setting' );
2317
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2318
  /**
2319
  * This function saves the value that needs to be used in the Facebook pixel content_ids parameter
2320
  */
@@ -2334,13 +2583,18 @@ add_action( 'wp_ajax_woosea_facebook_content_ids', 'woosea_facebook_content_ids'
2334
  * Google's Dynamic Remarketing
2335
  */
2336
  function woosea_add_remarketing (){
2337
- $status = sanitize_text_field($_POST['status']);
2338
-
2339
- if ($status == "off"){
2340
- update_option( 'add_remarketing', 'no', 'yes');
2341
- } else {
2342
- update_option( 'add_remarketing', 'yes', 'yes');
2343
- }
 
 
 
 
 
2344
  }
2345
  add_action( 'wp_ajax_woosea_add_remarketing', 'woosea_add_remarketing' );
2346
 
@@ -2351,10 +2605,14 @@ add_action( 'wp_ajax_woosea_add_remarketing', 'woosea_add_remarketing' );
2351
  function woosea_add_batch (){
2352
  $status = sanitize_text_field($_POST['status']);
2353
 
2354
- if ($status == "off"){
2355
- update_option( 'add_batch', 'no', 'yes');
2356
- } else {
2357
- update_option( 'add_batch', 'yes', 'yes');
 
 
 
 
2358
  }
2359
  }
2360
  add_action( 'wp_ajax_woosea_add_batch', 'woosea_add_batch' );
@@ -4618,13 +4876,16 @@ function woosea_blog_widgets() {
4618
 
4619
  add_meta_box('woosea_rss_dashboard_widget', __('Latest Product Feed Pro Tutorials', 'rc_mdm'), 'woosea_my_rss_box','dashboard','side','high');
4620
  }
4621
- add_action('wp_dashboard_setup', 'woosea_blog_widgets');
4622
 
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 +4894,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: 10.8.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
11
  * License: GPL3
12
  * License URI: https://www.gnu.org/licenses/gpl-3.0.html
13
  * Requires at least: 4.5
14
+ * Tested up to: 5.8
15
  *
16
  * Text Domain: woo-product-feed-pro
17
  * Domain Path: /languages
18
  *
19
  * WC requires at least: 4.4
20
+ * WC tested up to: 5.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
  * Plugin versionnumber, please do not override.
49
  * Define some constants
50
  */
51
+ define( 'WOOCOMMERCESEA_PLUGIN_VERSION', '10.8.5' );
52
  define( 'WOOCOMMERCESEA_PLUGIN_NAME', 'woocommerce-product-feed-pro' );
53
  define( 'WOOCOMMERCESEA_PLUGIN_NAME_SHORT', 'woo-product-feed-pro' );
54
 
101
  wp_enqueue_script('jquery-ui-datepicker');
102
 
103
  // Only register and enqueue JS scripts from within the plugin itself
104
+ if (preg_match("/product-feed-pro/i",$hook)){
105
+
106
  // JS files for ChartJS
107
  wp_register_script( 'woosea_chart-bundle-js', plugin_dir_url( __FILE__ ) . 'js/Chart.bundle.js', WOOCOMMERCESEA_PLUGIN_VERSION, true );
108
  wp_enqueue_script( 'woosea_chart-bundle-js' );
116
  wp_enqueue_script( 'typeahead-js' );
117
 
118
  // JS for adding input field validation
119
+ wp_register_script( 'woosea_validation-js', plugin_dir_url( __FILE__ ) . 'js/woosea_validation.js', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
120
  wp_enqueue_script( 'woosea_validation-js' );
121
 
122
  // JS for autocomplete
124
  wp_enqueue_script( 'woosea_autocomplete-js' );
125
 
126
  // JS for adding table rows to the rules page
127
+ wp_register_script( 'woosea_rules-js', plugin_dir_url( __FILE__ ) . 'js/woosea_rules.js', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
128
  wp_enqueue_script( 'woosea_rules-js' );
129
 
130
  // JS for adding table rows to the field mappings page
139
  wp_register_script( 'woosea_key-js', plugin_dir_url( __FILE__ ) . 'js/woosea_key.js', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
140
  wp_enqueue_script( 'woosea_key-js' );
141
 
142
+ // JS for managing addToCart event
143
+ // wp_register_script( 'woosea_addcart-js', plugin_dir_url( __FILE__ ) . 'js/woosea_add_cart.js', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
144
+ // wp_enqueue_script( 'woosea_addcart-js' );
145
  }
146
  // JS for manage projects page
147
+ wp_register_script( 'woosea_manage-js', plugin_dir_url( __FILE__ ) . 'js/woosea_manage.js?yo=12', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
148
  wp_enqueue_script( 'woosea_manage-js' );
149
  }
150
  add_action( 'admin_enqueue_scripts' , 'woosea_scripts' );
151
 
152
+ /**
153
+ * Enqueue front end scripts
154
+ */
155
+ function woosea_fe_scripts($hook) {
156
+ // JS for managing addToCart event
157
+ wp_enqueue_script( 'ajax-script', get_template_directory_uri() . 'js/my-ajax-script.js', array('jquery') );
158
+ wp_register_script( 'woosea_addcart-js', plugin_dir_url( __FILE__ ) . 'js/woosea_add_cart.js', '',WOOCOMMERCESEA_PLUGIN_VERSION, true );
159
+ wp_enqueue_script( 'woosea_addcart-js' );
160
+ }
161
+ //add_action('wp_enqueue_scripts', 'woosea_fe_scripts');
162
+
163
  /**
164
  * Get product variation ID based on dropdown selects product page
165
  */
294
  /**
295
  * Get category path for Facebook pixel
296
  */
297
+ function woosea_get_term_parents( $id, $taxonomy, $project_taxonomy, $link = false, $nicename = false, $visited = array() ) {
298
  // Only add Home to the beginning of the chain when we start buildin the chain
299
  if(empty($visited)){
300
  $chain = 'Home';
317
 
318
  if ($parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited, TRUE )){
319
  $visited[] = $parent->parent;
320
+ $chain .= woosea_get_term_parents( $parent->parent, $taxonomy, $separator, $link = false, $nicename, $visited );
321
  }
322
 
323
  if ($link){
329
  return $chain;
330
  }
331
 
 
332
  /**
333
  * Add Facebook pixel
334
  */
338
  }
339
  $fb_pagetype = WooSEA_Google_Remarketing::woosea_google_remarketing_pagetype();
340
  $add_facebook_pixel = get_option ('add_facebook_pixel');
341
+ $add_facebook_capi = get_option ('add_facebook_capi');
342
+ $viewContent = "";
343
+ $event_id = uniqid (rand (),true);
344
  $currency = get_woocommerce_currency();
345
+
346
  if($add_facebook_pixel == "yes"){
347
  $facebook_pixel_id = get_option("woosea_facebook_pixel_id");
348
+ $facebook_capi_token = get_option("woosea_facebook_capi_token");
349
+
350
+ // Add vulnerability check
351
+ if(!is_numeric($facebook_pixel_id)){
352
+ unset($facebook_pixel_id);
353
+ }
354
+
355
+ if(isset($facebook_pixel_id) AND ($facebook_pixel_id > 0)){
356
+ // Set Facebook conversion API data
357
+ define('FACEBOOK_APP_ACCESS_TOKEN', $facebook_capi_token);
358
+ define('FACEBOOK_PIXEL_OFFLINE_EVENT_SET_ID', $facebook_pixel_id);
359
+ $fb_capi_data["match_keys"] = array();
360
+ $fb_capi_data["event_time"] = time();
361
+ $fb_capi_data["event_id"] = $event_id;
362
+ $fb_capi_data["user_data"]["client_ip_address"] = WC_Geolocation::get_ip_address();
363
+ $fb_capi_data["user_data"]["client_user_agent"] = $_SERVER['HTTP_USER_AGENT'];
364
+ $fb_capi_data["action_source"] = "website";
365
+ $fb_capi_data["event_source_url"] = home_url($_SERVER['REQUEST_URI']);
366
 
 
367
  if ($fb_pagetype == "product"){
368
  if ( '' !== $product->get_price()) {
369
 
370
  $fb_prodid = get_the_id();
371
  $product_name = $product->get_name();
372
+ $product_name = str_replace("\"","",$product_name);
373
+ $product_name = str_replace("'","",$product_name);
374
+
375
  $cats = "";
376
  $all_cats = get_the_terms( $fb_prodid, 'product_cat' );
377
  if(!empty($all_cats)){
382
  // strip last comma
383
  $cats = rtrim($cats, ",");
384
  $cats = str_replace("&amp;","&", $cats);
385
+ $cats = str_replace("\"","",$cats);
386
+ $cats = str_replace("'","",$cats);
387
 
388
  if(!empty($fb_prodid)){
 
389
  if(!$product) {
390
  return -1;
391
  }
422
  $fb_price = $fb_lowprice;
423
  }
424
  }
425
+ $fb_price = floatval(str_replace(',', '.', str_replace(',', '.', $fb_price)));
426
+ $viewContent = "fbq(\"track\",\"ViewContent\",{content_category:\"$cats\", content_name:\"$product_name\", content_type:\"product\", content_ids:[\"$fb_prodid\"], value:\"$fb_price\", currency:\"$currency\"},{eventID:\"$event_id\"});";
427
+
428
+ // Facebook CAPI data
429
+ $fb_capi_data["event_name"] = "ViewContent";
430
+ $fb_capi_data["custom_data"]["content_ids"] = $fb_prodid;
431
+ $fb_capi_data["custom_data"]["content_name"] = $product_name;
432
+ $fb_capi_data["custom_data"]["content_category"] = $cats;
433
+ $fb_capi_data["custom_data"]["currency"] = $currency;
434
+ $fb_capi_data["custom_data"]["value"] = $fb_price;
435
+ $fb_capi_data["custom_data"]["content_type"] = "product";
436
  } else {
437
  // This is a parent variable product
438
  // Since these are not allowed in the feed, at the variations product ID's
463
  $fb_highprice = wc_format_localized_price( $highest );
464
  $fb_price = $fb_lowprice;
465
  }
466
+ $fb_price = floatval(str_replace(',', '.', str_replace(',', '.', $fb_price)));
467
+ $viewContent = "fbq(\"track\",\"ViewContent\",{content_category:\"$cats\", content_name:\"$product_name\", content_type:\"product_group\", content_ids:[$content], value:\"$fb_price\", currency:\"$currency\"},{eventID:\"$event_id\"});";
468
+
469
+ // Facebook CAPI data
470
+ $fb_capi_data["event_name"] = "ViewContent";
471
+ $fb_capi_data["custom_data"]["content_ids"] = $fb_prodid;
472
+ $fb_capi_data["custom_data"]["content_name"] = $product_name;
473
+ $fb_capi_data["custom_data"]["content_category"] = $cats;
474
+ $fb_capi_data["custom_data"]["currency"] = $currency;
475
+ $fb_capi_data["custom_data"]["value"] = $fb_price;
476
+ $fb_capi_data["custom_data"]["content_type"] = "product_group";
477
  }
478
  } else {
479
  // This is a simple product page
480
+ $fb_price = wc_format_localized_price( $product->get_price() );
481
+ $fb_price = floatval(str_replace(',', '.', str_replace(',', '.', $fb_price)));
482
+ $viewContent = "fbq(\"track\",\"ViewContent\",{content_category:\"$cats\", content_name:\"$product_name\", content_type:\"product\", content_ids:[\"$fb_prodid\"], value:\"$fb_price\", currency:\"$currency\"},{eventID:\"$event_id\"});";
483
+
484
+ // Facebook CAPI data
485
+ $fb_capi_data["event_name"] = "ViewContent";
486
+ $fb_capi_data["custom_data"]["content_ids"] = $fb_prodid;
487
+ $fb_capi_data["custom_data"]["content_name"] = $product_name;
488
+ $fb_capi_data["custom_data"]["content_category"] = $cats;
489
+ $fb_capi_data["custom_data"]["currency"] = $currency;
490
+ $fb_capi_data["custom_data"]["value"] = $fb_price;
491
+ $fb_capi_data["custom_data"]["content_type"] = "product";
492
  }
493
  }
494
  }
501
  $order = wc_get_order( $order_id );
502
  $order_items = $order->get_items();
503
  $currency = get_woocommerce_currency();
 
504
  $contents = "";
505
+ $order_real = wc_format_localized_price($order->get_total());
506
 
507
  if ( !is_wp_error( $order_items )) {
508
  foreach( $order_items as $item_id => $order_item) {
511
  if($variation_id > 0){
512
  $prod_id = $variation_id;
513
  }
 
514
  $prod_quantity = $order_item->get_quantity();
 
 
 
 
 
515
  $contents .= "{'id': '$prod_id', 'quantity': $prod_quantity},";
516
  }
517
  }
518
  $contents = rtrim($contents, ",");
519
+ $order_real = floatval(str_replace(',', '.', str_replace(',', '.', $order_real)));
520
+ $viewContent = "fbq('track','Purchase',{currency:'$currency', value:'$order_real', content_type:'product', contents:[$contents]},{eventID:\"$event_id\"});";
521
+
522
+ // Facebook CAPI data
523
+ $fb_capi_data["event_name"] = "Purchase";
524
+ $fb_capi_data["custom_data"]["content_ids"] = $prod_id;
525
+ $fb_capi_data["custom_data"]["currency"] = $currency;
526
+ $fb_capi_data["custom_data"]["value"] = $order_real;
527
+ $fb_capi_data["custom_data"]["content_type"] = "product";
528
  }
529
  } else {
530
  // This is on the cart page itself
531
  $currency = get_woocommerce_currency();
532
  $cart_items = WC()->cart->get_cart();
533
+ $cart_quantity = count($cart_items);
534
+
535
  $cart_real = 0;
536
  $contents = "";
537
 
538
+ $cart_total_amount = wc_format_localized_price(WC()->cart->get_cart_contents_total());
539
+ $cart_total_amount = floatval(str_replace(',', '.', str_replace(',', '.', $cart_total_amount)));
540
+
541
  $checkoutpage = wc_get_checkout_url();
542
  $current_url = get_permalink(get_the_ID());
543
 
545
  if( !is_wp_error( $cart_items )) {
546
  foreach( $cart_items as $cart_id => $cart_item) {
547
  $prod_id = $cart_item['product_id'];
548
+ $product = $cart_item['data'];
549
+ $product_name = $product->get_name();
550
  if($cart_item['variation_id'] > 0){
551
  $prod_id = $cart_item['variation_id'];
552
  }
554
  //$contents .= "$prod_id,";
555
 
556
  $cart_real = wc_format_localized_price( $cart_item['line_total'] );
 
 
 
 
 
557
  }
558
  $contents = rtrim($contents, ",");
559
 
560
  // User is on the billing pages
561
  if($checkoutpage == $current_url){
562
+ $viewContent = "fbq(\"track\",\"InitiateCheckout\",{currency:\"$currency\", value:\"$cart_total_amount\", content_type:\"product\", content_ids:[$contents]},{eventID:\"$event_id\"});";
563
+
564
+ // Facebook CAPI data
565
+ $fb_capi_data["event_name"] = "InitiateCheckout";
566
+ $fb_capi_data["custom_data"]["content_ids"] = $contents;
567
+ $fb_capi_data["custom_data"]["content_name"] = $product_name;
568
+ $fb_capi_data["custom_data"]["currency"] = $currency;
569
+ $fb_capi_data["custom_data"]["value"] = $cart_total_amount;
570
+ $fb_capi_data["custom_data"]["content_type"] = "product";
571
  } else {
572
  // User is on the basket page
573
+ $viewContent = "fbq(\"track\",\"AddToCart\",{currency:\"$currency\", value:\"$cart_total_amount\", content_type:\"product\", content_ids:[$contents]},{eventID:\"$event_id\"});";
574
+
575
+ // Facebook CAPI data
576
+ $fb_capi_data["event_name"] = "AddToCart";
577
+ $fb_capi_data["custom_data"]["content_ids"] = $contents;
578
+ $fb_capi_data["custom_data"]["content_name"] = $product_name;
579
+ $fb_capi_data["custom_data"]["currency"] = $currency;
580
+ $fb_capi_data["custom_data"]["value"] = $cart_total_amount;
581
+ $fb_capi_data["custom_data"]["content_type"] = "product";
582
  }
583
  }
584
  }
611
  }
612
  $fb_prodid = rtrim($fb_prodid, ",");
613
  $category_name = $term->name;
614
+ $category_path = woosea_get_term_parents( $term->term_id, 'product_cat', $project_taxonomy = false, $link = false, $nicename = false, $visited = array() );
615
+ $viewContent = "fbq(\"track\",\"ViewCategory\",{content_category:'$category_path', content_name:'$category_name', content_type:\"product\", content_ids:\"[$fb_prodid]\"},{eventID:\"$event_id\"});";
616
+
617
+ // Facebook CAPI data
618
+ $fb_capi_data["event_name"] = "ViewCategory";
619
+ $fb_capi_data["custom_data"]["content_ids"] = $ids;
620
+ $fb_capi_data["custom_data"]["content_type"] = "product";
621
+
622
  } elseif ($fb_pagetype == "searchresults"){
623
  $term = get_queried_object();
624
  $search_string = sanitize_text_field($_GET['s']);
647
  }
648
  }
649
  $fb_prodid = rtrim($fb_prodid, ",");
650
+ $viewContent = "fbq(\"trackCustom\",\"Search\",{search_string:\"$search_string\", content_type:\"product\", content_ids:\"[$fb_prodid]\"},{eventID:\"$event_id\"});";
651
+
652
+ // Facebook CAPI data
653
+ $fb_capi_data["event_name"] = "Search";
654
+ $fb_capi_data["custom_data"]["content_ids"] = $ids;
655
+ $fb_capi_data["custom_data"]["content_type"] = "product";
656
  } else {
657
  // This is another page than a product page
658
+ $fb_capi_data["event_name"] = "ViewContent";
659
  $viewContent = "";
660
  }
661
  ?>
674
  t.src=v;s=b.getElementsByTagName(e)[0];
675
  s.parentNode.insertBefore(t,s)}(window, document,'script',
676
  'https://connect.facebook.net/en_US/fbevents.js');
677
+
678
+ fbq("init", "<?php echo htmlentities($facebook_pixel_id, ENT_QUOTES, 'UTF-8');?>");
679
  fbq("track", "PageView");
680
  <?php
681
  if(strlen($viewContent) > 2){
684
  ?>
685
  </script>
686
  <noscript>
687
+ <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=<?php echo htmlentities($facebook_pixel_id, ENT_QUOTES, 'UTF-8');;?>&ev=PageView&noscript=1&eid=<?php print"$event_id";?>"/>
688
  </noscript>
689
  <!-- End Facebook Pixel Code -->
690
  <?php
691
+
692
+ // POST data to Facebook Conversion API
693
+ if(($add_facebook_capi == "yes") AND (!empty($facebook_capi_token))){
694
+ // Turn Data to JSON
695
+ $data_json = json_encode(array($fb_capi_data));
696
+
697
+ // Fill available fields
698
+ $fields = array();
699
+ $fields['access_token'] = FACEBOOK_APP_ACCESS_TOKEN;
700
+ $fields['upload_tag'] = $fb_capi_data["event_name"] . '-' . time(); // You should set a tag here (feel free to adjust)
701
+ $fields['data'] = $data_json;
702
+ $url = 'https://graph.facebook.com/v11.0/' . FACEBOOK_PIXEL_OFFLINE_EVENT_SET_ID . '/events';
703
+ $curl = curl_init($url);
704
+
705
+ curl_setopt_array($curl, array(
706
+ // Replace with your offline_event_set_id
707
+ CURLOPT_URL => 'https://graph.facebook.com/v11.0/' . FACEBOOK_PIXEL_OFFLINE_EVENT_SET_ID . '/events',
708
+ CURLOPT_RETURNTRANSFER => true,
709
+ CURLOPT_ENCODING => "",
710
+ CURLOPT_MAXREDIRS => 10,
711
+ CURLOPT_TIMEOUT => 30,
712
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
713
+ CURLOPT_CUSTOMREQUEST => "POST",
714
+ CURLOPT_POSTFIELDS => http_build_query($fields),
715
+ CURLOPT_HTTPHEADER => array(
716
+ "cache-control: no-cache",
717
+ //"content-type: multipart/form-data",
718
+ "Accept: application/json" ),
719
+ ));
720
+ $response = curl_exec($curl);
721
+ curl_close($curl);
722
+ }
723
  }
724
  }
725
  }
734
  }
735
  $ecomm_pagetype = WooSEA_Google_Remarketing::woosea_google_remarketing_pagetype();
736
  $add_remarketing = get_option ('add_remarketing');
737
+
738
  if($add_remarketing == "yes"){
739
  $adwords_conversion_id = get_option("woosea_adwords_conversion_id");
740
+ // Add vulnerability check, unset when no proper comversion ID was inserted
741
+ if(!is_numeric($adwords_conversion_id)){
742
+ unset($adwords_conversion_id);
743
+ }
744
 
745
  if($adwords_conversion_id > 0){
746
+ ?>
747
+ <!-- Global site tag (gtag.js) - Google Ads: <?php echo htmlentities($adwords_conversion_id, ENT_QUOTES, 'UTF-8');?> - Added by the Product Feed Pro plugin from AdTribes.io -->
748
+ <script async src="https://www.googletagmanager.com/gtag/js?id=AW-<?php echo htmlentities($adwords_conversion_id, ENT_QUOTES, 'UTF-8');?>"></script>
749
+ <script>
750
+ window.dataLayer = window.dataLayer || [];
751
+ function gtag(){dataLayer.push(arguments);}
752
+ gtag('js', new Date());
753
+
754
+ gtag('config', '<?php echo 'AW-'.htmlentities($adwords_conversion_id, ENT_QUOTES, 'UTF-8');?>');
755
+ </script>
756
+ <?php
757
  if ($ecomm_pagetype == "product"){
758
  if ( '' !== $product->get_price()) {
759
  $ecomm_prodid = get_the_id();
770
  // In that case we need to put in the AggregateOffer structured data
771
  $variation_id = woosea_find_matching_product_variation( $product, $_GET );
772
  $nr_get = count($_GET);
773
+
774
  if($nr_get > 0){
775
  $variable_product = wc_get_product($variation_id);
776
 
807
  $ecomm_price = wc_format_decimal( $lowest, wc_get_price_decimals());
808
  } else {
809
  $ecomm_lowprice = wc_format_decimal( $lowest, wc_get_price_decimals() );
810
+ $ecomm_highprice = wc_format_decimal( $highest, wc_get_price_decimals() );
811
+ $ecomm_price = $ecomm_lowprice;
812
+
813
  }
814
  }
815
  } else {
817
  }
818
  }
819
  ?>
820
+ <script>
821
+ gtag('event', 'view_item', {
822
+ 'send_to' : '<?php echo 'AW-'.htmlentities($adwords_conversion_id, ENT_QUOTES, 'UTF-8');?>',
823
+ 'value' : <?php print "$ecomm_price";?>,
824
+ 'items' : [{
825
+ 'id': <?php print "$ecomm_prodid";?>,
826
+ 'google_business_vertical': 'retail'
827
+ }]
828
+ });
829
  </script>
 
830
  <?php
831
  }
832
  } elseif ($ecomm_pagetype == "cart"){
833
+ // This is on the order thank you page
834
+ if( isset( $_GET['key'] ) && is_wc_endpoint_url( 'order-received' ) ) {
835
+ $order_string = sanitize_text_field($_GET['key']);
836
+ if(!empty($order_string)){
837
+ $order_id = wc_get_order_id_by_order_key( $order_string );
838
+ $order = wc_get_order( $order_id );
839
+ $order_items = $order->get_items();
840
+ $currency = get_woocommerce_currency();
841
+ $contents = "";
842
+ $order_real = wc_format_localized_price($order->get_total());
843
+
844
+ if ( !is_wp_error( $order_items )) {
845
+ foreach( $order_items as $item_id => $order_item) {
846
+ $prod_id = $order_item->get_product_id();
847
+ $variation_id = $order_item->get_variation_id();
848
+ if($variation_id > 0){
849
+ $prod_id = $variation_id;
850
+ }
851
+ $prod_quantity = $order_item->get_quantity();
852
+ }
853
+ }
854
+ $order_real = floatval(str_replace(',', '.', str_replace(',', '.', $order_real)));
855
+ ?>
856
+ <script>
857
+ gtag('event', 'purchase', {
858
+ 'send_to' : '<?php echo 'AW-'.htmlentities($adwords_conversion_id, ENT_QUOTES, 'UTF-8');?>',
859
+ 'value' : <?php print "$order_real";?>,
860
+ 'items' : [{
861
+ 'id': <?php print "$prod_id";?>,
862
+ 'google_business_vertical': 'retail'
863
+ }]
864
+ });
865
+ </script>
866
+ <?php
867
+ }
868
+ } else {
869
+ // This is on the cart page, no purchase yet
870
+ // Get the first product from cart and use that product ID
871
+ foreach( WC()->cart->get_cart() as $cart_item ){
872
+ $ecomm_prodid = $cart_item['product_id'];
873
+ break;
874
+ }
875
+
876
+ if($ecomm_prodid > 0){
877
+ $currency = get_woocommerce_currency();
878
+ $cart_items = WC()->cart->get_cart();
879
+ $cart_quantity = count($cart_items);
880
+ $cart_total_amount = wc_format_localized_price(WC()->cart->get_cart_contents_total()+WC()->cart->tax_total);
881
+ $cart_total_amount = floatval(str_replace(',', '.', str_replace(',', '.', $cart_total_amount)));
882
+ ?>
883
+ <script>
884
+ gtag('event', 'add_to_cart', {
885
+ 'send_to' : '<?php echo 'AW-'.htmlentities($adwords_conversion_id, ENT_QUOTES, 'UTF-8');?>',
886
+ 'value' : <?php print "$cart_total_amount";?>,
887
+ 'items' : [{
888
+ 'id': <?php print "$ecomm_prodid";?>,
889
+ 'google_business_vertical': 'retail'
890
+ }]
891
+ });
892
+ </script>
893
+ <?php
894
+ }
895
+ }
896
+ }
897
  }
898
  }
899
  }
979
  }
980
  add_action('admin_notices', 'woosea_request_review');
981
 
982
+
983
  /**
984
  * Create a seperate MySql table for saving conversion information
985
  */
1104
  }
1105
  add_action( 'wp_ajax_woosea_categories_dropdown', 'woosea_categories_dropdown' );
1106
 
1107
+ /**
1108
+ * Sanitize XSS
1109
+ */
1110
+ function woosea_sanitize_xss($value) {
1111
+ return htmlspecialchars(strip_tags($value));
1112
+ }
1113
+
1114
  /**
1115
  * Save Google Dynamic Remarketing Conversion Tracking ID
1116
  */
1117
  function woosea_save_adwords_conversion_id() {
1118
  $adwords_conversion_id = sanitize_text_field($_POST['adwords_conversion_id']);
1119
+ $adwords_conversion_id = woosea_sanitize_xss($adwords_conversion_id);
1120
  update_option("woosea_adwords_conversion_id", $adwords_conversion_id);
1121
  }
1122
  add_action( 'wp_ajax_woosea_save_adwords_conversion_id', 'woosea_save_adwords_conversion_id' );
1135
  */
1136
  function woosea_save_facebook_pixel_id() {
1137
  $facebook_pixel_id = sanitize_text_field($_POST['facebook_pixel_id']);
1138
+ $facebook_pixel_id = woosea_sanitize_xss($facebook_pixel_id);
1139
  update_option("woosea_facebook_pixel_id", $facebook_pixel_id);
1140
  }
1141
  add_action( 'wp_ajax_woosea_save_facebook_pixel_id', 'woosea_save_facebook_pixel_id' );
1142
 
1143
+ /**
1144
+ * Save Facebook Conversion API Token
1145
+ */
1146
+ function woosea_save_facebook_capi_token() {
1147
+ $facebook_capi_token = sanitize_text_field($_POST['facebook_capi_token']);
1148
+ $facebook_capi_token = woosea_sanitize_xss($facebook_capi_token);
1149
+ update_option("woosea_facebook_capi_token", $facebook_capi_token);
1150
+ }
1151
+ add_action( 'wp_ajax_woosea_save_facebook_capi_token', 'woosea_save_facebook_capi_token' );
1152
+
1153
  /**
1154
  * Mass map categories to the correct Google Shopping category taxonomy
1155
  */
1714
  $brand = get_post_meta( $variation_id, '_woosea_brand', true );
1715
  if ( $brand ) {
1716
  $markup['brand'] = array (
1717
+ '@type' => 'Brand',
1718
  'name' => $brand,
1719
  );
1720
  }
1817
 
1818
  if ( $brand ) {
1819
  $markup['brand'] = array (
1820
+ '@type' => 'Brand',
1821
  'name' => $brand,
1822
  );
1823
  }
2480
  }
2481
  add_action( 'wp_ajax_woosea_local_pickup_shipping', 'woosea_local_pickup_shipping' );
2482
 
2483
+ /**
2484
+ * This function enables the setting to remove
2485
+ * free shipping zones
2486
+ */
2487
+ function woosea_remove_free_shipping (){
2488
+ $status = sanitize_text_field($_POST['status']);
2489
+
2490
+ if ($status == "off"){
2491
+ update_option( 'remove_free_shipping', 'no', 'yes');
2492
+ } else {
2493
+ update_option( 'remove_free_shipping', 'yes', 'yes');
2494
+ }
2495
+ }
2496
+ add_action( 'wp_ajax_woosea_remove_free_shipping', 'woosea_remove_free_shipping' );
2497
+
2498
  /**
2499
  * This function enables the setting to use
2500
  * logging
2511
  add_action( 'wp_ajax_woosea_add_woosea_logging', 'woosea_add_woosea_logging' );
2512
 
2513
  /**
2514
+ * This function enables the setting to add CDATA to title and descriptions
 
2515
  */
2516
+ function woosea_add_woosea_cdata (){
2517
  $status = sanitize_text_field($_POST['status']);
2518
 
2519
  if ($status == "off"){
2520
+ update_option( 'add_woosea_cdata', 'no', 'yes');
2521
  } else {
2522
+ update_option( 'add_woosea_cdata', 'yes', 'yes');
2523
  }
2524
  }
2525
+ add_action( 'wp_ajax_woosea_add_woosea_cdata', 'woosea_add_woosea_cdata' );
2526
+
2527
+ /**
2528
+ * This function enables the setting to add
2529
+ * the Faceook pixel
2530
+ */
2531
+ function woosea_add_facebook_pixel_setting (){
2532
+ check_ajax_referer('woosea_ajax_nonce', 'security');
2533
+ $status = sanitize_text_field($_POST['status']);
2534
+
2535
+ // Only admin users are allowed to make changes that impact the front-end
2536
+ $user = wp_get_current_user();
2537
+ if ( in_array( 'administrator', (array) $user->roles ) ) {
2538
+ if ($status == "off"){
2539
+ update_option( 'add_facebook_pixel', 'no', 'yes');
2540
+ } else {
2541
+ update_option( 'add_facebook_pixel', 'yes', 'yes');
2542
+ }
2543
+ }
2544
+ }
2545
  add_action( 'wp_ajax_woosea_add_facebook_pixel_setting', 'woosea_add_facebook_pixel_setting' );
2546
 
2547
+ /**
2548
+ * This function enables the setting to enable
2549
+ * the Faceook Conversion API (CAPI)
2550
+ */
2551
+ function woosea_add_facebook_capi_setting (){
2552
+ check_ajax_referer('woosea_ajax_nonce', 'security');
2553
+ $status = sanitize_text_field($_POST['status']);
2554
+
2555
+ // Only admin users are allowed to make changes that impact the front-end
2556
+ $user = wp_get_current_user();
2557
+ if ( in_array( 'administrator', (array) $user->roles ) ) {
2558
+ if ($status == "off"){
2559
+ update_option( 'add_facebook_capi', 'no', 'yes');
2560
+ } else {
2561
+ update_option( 'add_facebook_capi', 'yes', 'yes');
2562
+ }
2563
+ }
2564
+ }
2565
+ add_action( 'wp_ajax_woosea_add_facebook_capi_setting', 'woosea_add_facebook_capi_setting' );
2566
+
2567
  /**
2568
  * This function saves the value that needs to be used in the Facebook pixel content_ids parameter
2569
  */
2583
  * Google's Dynamic Remarketing
2584
  */
2585
  function woosea_add_remarketing (){
2586
+ check_ajax_referer('woosea_ajax_nonce', 'security');
2587
+ $status = sanitize_text_field($_POST['status']);
2588
+
2589
+ // Only admin users are allowed to make changes that impact the front-end
2590
+ $user = wp_get_current_user();
2591
+ if ( in_array( 'administrator', (array) $user->roles ) ) {
2592
+ if ($status == "off"){
2593
+ update_option( 'add_remarketing', 'no', 'yes');
2594
+ } else {
2595
+ update_option( 'add_remarketing', 'yes', 'yes');
2596
+ }
2597
+ }
2598
  }
2599
  add_action( 'wp_ajax_woosea_add_remarketing', 'woosea_add_remarketing' );
2600
 
2605
  function woosea_add_batch (){
2606
  $status = sanitize_text_field($_POST['status']);
2607
 
2608
+ // Only admin users are allowed to make changes that impact the performance
2609
+ $user = wp_get_current_user();
2610
+ if ( in_array( 'administrator', (array) $user->roles ) ) {
2611
+ if ($status == "off"){
2612
+ update_option( 'add_batch', 'no', 'yes');
2613
+ } else {
2614
+ update_option( 'add_batch', 'yes', 'yes');
2615
+ }
2616
  }
2617
  }
2618
  add_action( 'wp_ajax_woosea_add_batch', 'woosea_add_batch' );
4876
 
4877
  add_meta_box('woosea_rss_dashboard_widget', __('Latest Product Feed Pro Tutorials', 'rc_mdm'), 'woosea_my_rss_box','dashboard','side','high');
4878
  }
4879
+ //add_action('wp_dashboard_setup', 'woosea_blog_widgets');
4880
 
4881
  /**
4882
  * Creates the RSS metabox
4883
  */
4884
+ function woosea_feed_interval( $seconds ) {
4885
+ return 172800; // Cache the feed for 2 days
4886
+ }
4887
+
4888
  function woosea_my_rss_box() {
 
4889
  // Get RSS Feed(s)
4890
  include_once(ABSPATH . WPINC . '/feed.php');
4891
  $domain = $_SERVER['HTTP_HOST'];
4894
  $my_feeds = array(
4895
  'https://www.adtribes.io/feed/'
4896
  );
4897
+
4898
+ add_filter( 'wp_feed_cache_transient_lifetime' , 'woosea_feed_interval' );
4899
 
4900
  // Loop through Feeds
4901
  foreach ( $my_feeds as $feed) :