Version Description
12.02.2022
- Tweak: Avoid loading the entire admin UX in case an admin is not viewing the plugin admin page itself
- Fix: Fixed a side case where the plugin would output wrong html in case the pro version demo is enabled
Download this release
Release Info
Developer | alekv |
Plugin | Pixel Manager for WooCommerce – Track Google Analytics, Google Ads, Facebook and more |
Version | 1.14.1 |
Comparing to | |
See all releases |
Code changes from version 1.16.6 to 1.14.1
- classes/admin/class-admin.php +270 -100
- classes/admin/class-ask-for-rating.php +2 -2
- classes/admin/class-debug-info.php +17 -19
- classes/admin/class-documentation.php +38 -38
- classes/admin/class-environment-check.php +169 -284
- classes/admin/class-notifications.php +2 -2
- classes/class-default-options.php +14 -50
- classes/pixels/class-cookie-consent-management.php +2 -2
- classes/pixels/class-pixel-manager.php +282 -264
- classes/pixels/class-pixel.php +55 -2
- classes/pixels/class-script-manager.php +0 -284
- classes/pixels/class-shortcodes.php +45 -104
- classes/pixels/facebook/class-facebook-pixel-manager-microdata.php +2 -2
- classes/pixels/facebook/class-facebook-pixel-manager.php +76 -2
- classes/pixels/google/class-google-ads.php +53 -48
- classes/pixels/google/class-google-analytics-4.php +2 -3
- classes/pixels/google/class-google-analytics-refund.php +2 -37
- classes/pixels/google/class-google-analytics.php +48 -0
- classes/pixels/google/class-google-pixel-manager.php +145 -19
- classes/pixels/google/class-google.php +520 -284
- classes/pixels/google/trait-google.php +168 -377
- classes/pixels/trait-product.php +63 -80
- classes/pixels/trait-shop.php +231 -282
- css/admin.css +2 -2
- js/admin/ask-for-rating.js +0 -37
- js/admin/environment-check.js +0 -84
- js/admin/freemius-keep-deactivate-button-enabled.js +0 -22
- js/admin/helpers.js +0 -12
- js/admin/main-freemius.js +0 -1
- js/admin/main.js +0 -8
- js/admin/script-blocker-warning.js +0 -13
- js/admin/tabs.js +0 -172
- js/admin/wpm-admin-freemius.p1.min.js +1 -1
- js/admin/wpm-admin-freemius.p1.min.js.map +1 -1
- js/admin/wpm-admin.p1.min.js +1 -1
- js/admin/wpm-admin.p1.min.js.map +1 -1
- js/public/wpm-public.p1.min.js +1 -1
- js/public/wpm-public.p1.min.js.map +1 -1
- languages/woocommerce-google-adwords-conversion-tracking-tag.pot +228 -191
- readme.txt +34 -143
- vendor/composer/autoload_psr4.php +0 -1
- vendor/composer/autoload_static.php +0 -5
- vendor/composer/installed.json +6 -38
- vendor/composer/installed.php +5 -14
- vendor/freemius/wordpress-sdk/assets/img/plugin-icon.png +0 -0
- vendor/freemius/wordpress-sdk/assets/img/theme-icon.png +0 -0
- vendor/freemius/wordpress-sdk/assets/img/woocommerce-google-adwords-conversion-tracking-tag.png +0 -0
- vendor/freemius/wordpress-sdk/includes/class-freemius.php +2 -25
- vendor/freemius/wordpress-sdk/includes/managers/class-fs-admin-notice-manager.php +2 -7
- vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/ArgumentNotExistException.php +1 -5
- vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/EmptyArgumentException.php +1 -5
- vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/Exception.php +1 -5
- vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/InvalidArgumentException.php +1 -5
- vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/OAuthException.php +1 -5
- vendor/freemius/wordpress-sdk/includes/sdk/FreemiusBase.php +0 -4
- vendor/freemius/wordpress-sdk/includes/sdk/FreemiusWordPress.php +1 -4
- vendor/freemius/wordpress-sdk/require.php +1 -5
- vendor/freemius/wordpress-sdk/start.php +1 -1
- vendor/freemius/wordpress-sdk/templates/account/partials/addon.php +1 -6
- vendor/freemius/wordpress-sdk/templates/ajax-loader.php +1 -6
- vendor/freemius/wordpress-sdk/templates/debug.php +2 -8
- vendor/freemius/wordpress-sdk/templates/firewall-issues-js.php +6 -10
- vendor/freemius/wordpress-sdk/templates/partials/network-activation.php +1 -6
- vendor/freemius/wordpress-sdk/templates/sticky-admin-notice-js.php +2 -4
- vendor/giggsey/libphonenumber-for-php/METADATA-VERSION.txt +1 -1
- vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/229.php +5 -1
- vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/238.php +3 -0
- vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/248.php +0 -2
- vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/32.php +0 -1
- vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/354.php +0 -1
- vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/502.php +0 -1
- vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/507.php +0 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_AG.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_AI.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_AS.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_BB.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_BJ.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_BM.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_BS.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_CA.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_CL.php +4 -4
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_CV.php +2 -3
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_DM.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_DO.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_GA.php +6 -6
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_GD.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_GU.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_IS.php +3 -3
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_JM.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_KN.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_KR.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_KW.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_KY.php +3 -3
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_LC.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_LI.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_MP.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_MS.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_PA.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_PR.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_SC.php +3 -3
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_SG.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_SL.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_SX.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_TC.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_TT.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_US.php +3 -3
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_VC.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_VG.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_VI.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_BE.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_MS.php +3 -3
- vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_PT.php +1 -1
- vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_SC.php +3 -3
- vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_SE.php +4 -1
- vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_US.php +2 -2
- vendor/giggsey/libphonenumber-for-php/src/geocoding/data/en/13.php +1 -0
- vendor/giggsey/libphonenumber-for-php/src/geocoding/data/en/238.php +3 -3
- vendor/giggsey/libphonenumber-for-php/src/geocoding/data/en/56.php +0 -1
- vendor/giggsey/libphonenumber-for-php/src/geocoding/data/en/61.php +5 -5
- vendor/giggsey/libphonenumber-for-php/src/geocoding/data/es/56.php +0 -1
- vendor/giggsey/libphonenumber-for-php/src/geocoding/data/pt/238.php +3 -3
- wgact.php +33 -13
classes/admin/class-admin.php
CHANGED
@@ -1,10 +1,13 @@
|
|
1 |
<?php
|
2 |
|
3 |
// TODO move script for copying debug info into a proper .js enqueued file, or switch tabs to JavaScript switching and always save all settings at the same time
|
|
|
4 |
namespace WCPM\Classes\Admin;
|
5 |
|
6 |
-
use
|
|
|
7 |
use WCPM\Classes\Pixels\Trait_Shop ;
|
|
|
8 |
|
9 |
if ( !defined( 'ABSPATH' ) ) {
|
10 |
exit;
|
@@ -13,6 +16,7 @@ if ( !defined( 'ABSPATH' ) ) {
|
|
13 |
|
14 |
class Admin
|
15 |
{
|
|
|
16 |
use Trait_Shop ;
|
17 |
public $ip ;
|
18 |
protected $text_domain ;
|
@@ -21,13 +25,11 @@ class Admin
|
|
21 |
protected $documentation ;
|
22 |
private $consent_mode_regions ;
|
23 |
private $validations ;
|
24 |
-
private $google ;
|
25 |
public function __construct( $options )
|
26 |
{
|
27 |
$this->options = $options;
|
28 |
$this->plugin_hook = 'woocommerce_page_wpm';
|
29 |
$this->documentation = new Documentation();
|
30 |
-
$this->google = new Google( $this->options );
|
31 |
add_action( 'admin_enqueue_scripts', [ $this, 'wpm_admin_scripts' ] );
|
32 |
// add the admin options page
|
33 |
add_action( 'admin_menu', [ $this, 'wpm_plugin_admin_add_page' ], 99 );
|
@@ -46,7 +48,7 @@ class Admin
|
|
46 |
|
47 |
protected function if_is_wpm_admin_page()
|
48 |
{
|
49 |
-
$_get = filter_input_array( INPUT_GET,
|
50 |
|
51 |
if ( !empty($_get['page']) && 'wpm' === $_get['page'] ) {
|
52 |
return true;
|
@@ -75,7 +77,7 @@ class Admin
|
|
75 |
|
76 |
public function my_after_purchase_js( $js_function )
|
77 |
{
|
78 |
-
return "function ( response ) {\n\n let\n isTrial = (null != response.purchase.trial_ends),\n isSubscription = (null != response.purchase.initial_amount),\n total = isTrial ? 0 : (isSubscription ? response.purchase.initial_amount : response.purchase.gross).toString(),\n productName = 'WooCommerce Pixel Manager',\n // storeUrl = 'https://sweetcode.com',\n storeName = 'SweetCode';\n \n window.dataLayer = window.dataLayer || [];\n\n function gtag() {\n dataLayer.push(arguments);\n }\n \n gtag('js', new Date()); \n \n gtag('config', 'UA-39746956-10', {'anonymize_ip':
|
79 |
}
|
80 |
|
81 |
public function my_checkout_enrich( $html )
|
@@ -203,7 +205,7 @@ class Admin
|
|
203 |
// add the field for the conversion label
|
204 |
add_settings_field(
|
205 |
'wpm_plugin_conversion_label',
|
206 |
-
esc_html__( 'Google Ads
|
207 |
[ $this, 'wpm_option_html_google_ads_conversion_label' ],
|
208 |
'wpm_plugin_options_page',
|
209 |
$section_ids['settings_name']
|
@@ -234,7 +236,7 @@ class Admin
|
|
234 |
public function add_section_main_subsection_facebook( $section_ids )
|
235 |
{
|
236 |
$sub_section_ids = [
|
237 |
-
'title' => esc_html__( '
|
238 |
'slug' => 'facebook',
|
239 |
];
|
240 |
add_settings_field(
|
@@ -249,7 +251,7 @@ class Admin
|
|
249 |
// add the field for the conversion label
|
250 |
add_settings_field(
|
251 |
'wpm_plugin_facebook_pixel_id',
|
252 |
-
esc_html__( '
|
253 |
[ $this, 'wpm_option_html_facebook_pixel_id' ],
|
254 |
'wpm_plugin_options_page',
|
255 |
$section_ids['settings_name']
|
@@ -388,16 +390,6 @@ class Admin
|
|
388 |
'wpm_plugin_options_page',
|
389 |
$section_ids['settings_name']
|
390 |
);
|
391 |
-
if ( wpm_fs()->is__premium_only() || $this->options['general']['pro_version_demo'] ) {
|
392 |
-
// add checkbox for disabling tracking for user roles
|
393 |
-
add_settings_field(
|
394 |
-
'wpm_setting_disable_tracking_for_user_roles',
|
395 |
-
esc_html__( 'Disable Tracking for User Roles', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
396 |
-
[ $this, 'wpm_setting_html_disable_tracking_for_user_roles' ],
|
397 |
-
'wpm_plugin_options_page',
|
398 |
-
$section_ids['settings_name']
|
399 |
-
);
|
400 |
-
}
|
401 |
}
|
402 |
|
403 |
public function add_section_advanced_subsection_google( $section_ids )
|
@@ -415,6 +407,16 @@ class Admin
|
|
415 |
'wpm_plugin_options_page',
|
416 |
$section_ids['settings_name']
|
417 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
418 |
// add the field for the aw_merchant_id
|
419 |
add_settings_field(
|
420 |
'wpm_plugin_aw_merchant_id',
|
@@ -532,7 +534,7 @@ class Admin
|
|
532 |
'wpm_plugin_options_page',
|
533 |
$section_ids['settings_name']
|
534 |
);
|
535 |
-
if ( ( new Environment_Check(
|
536 |
// add fields for the Borlabs Cookie support
|
537 |
add_settings_field(
|
538 |
'wpm_setting_borlabs_support',
|
@@ -542,7 +544,7 @@ class Admin
|
|
542 |
$section_ids['settings_name']
|
543 |
);
|
544 |
}
|
545 |
-
if ( ( new Environment_Check(
|
546 |
// add fields for the Cookiebot support
|
547 |
add_settings_field(
|
548 |
'wpm_setting_cookiebot_support',
|
@@ -552,7 +554,17 @@ class Admin
|
|
552 |
$section_ids['settings_name']
|
553 |
);
|
554 |
}
|
555 |
-
if ( ( new Environment_Check(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
556 |
// add fields for the Complianz GDPR support
|
557 |
add_settings_field(
|
558 |
'wpm_setting_complianz_support',
|
@@ -562,7 +574,7 @@ class Admin
|
|
562 |
$section_ids['settings_name']
|
563 |
);
|
564 |
}
|
565 |
-
if ( ( new Environment_Check(
|
566 |
// add fields for the Cookie Notice by hu-manity.co support
|
567 |
add_settings_field(
|
568 |
'wpm_setting_cookie_notice_support',
|
@@ -572,7 +584,7 @@ class Admin
|
|
572 |
$section_ids['settings_name']
|
573 |
);
|
574 |
}
|
575 |
-
if ( ( new Environment_Check(
|
576 |
// add fields for the Cookie Script support
|
577 |
add_settings_field(
|
578 |
'wpm_setting_cookie_script_support',
|
@@ -582,7 +594,7 @@ class Admin
|
|
582 |
$section_ids['settings_name']
|
583 |
);
|
584 |
}
|
585 |
-
if ( ( new Environment_Check(
|
586 |
// add fields for the GDPR Cookie Compliance support
|
587 |
add_settings_field(
|
588 |
'wpm_setting_moove_gdpr_support',
|
@@ -592,7 +604,7 @@ class Admin
|
|
592 |
$section_ids['settings_name']
|
593 |
);
|
594 |
}
|
595 |
-
if ( ( new Environment_Check(
|
596 |
// add fields for the GDPR Cookie Consent support
|
597 |
add_settings_field(
|
598 |
'wpm_setting_cookie_law_info_support',
|
@@ -607,7 +619,7 @@ class Admin
|
|
607 |
public function add_section_advanced_subsection_facebook( $section_ids )
|
608 |
{
|
609 |
$sub_section_ids = [
|
610 |
-
'title' => '
|
611 |
'slug' => 'facebook',
|
612 |
];
|
613 |
add_settings_field(
|
@@ -622,7 +634,7 @@ class Admin
|
|
622 |
// add field for the Facebook CAPI token
|
623 |
add_settings_field(
|
624 |
'wpm_setting_facebook_capi_token',
|
625 |
-
esc_html__( '
|
626 |
[ $this, 'wpm_setting_html_facebook_capi_token' ],
|
627 |
'wpm_plugin_options_page',
|
628 |
$section_ids['settings_name']
|
@@ -630,7 +642,7 @@ class Admin
|
|
630 |
// add field for the Facebook CAPI user transparency process anonymous hits
|
631 |
add_settings_field(
|
632 |
'wpm_setting_facebook_capi_user_transparency_process_anonymous_hits',
|
633 |
-
esc_html__( '
|
634 |
[ $this, 'wpm_setting_facebook_capi_user_transparency_process_anonymous_hits' ],
|
635 |
'wpm_plugin_options_page',
|
636 |
$section_ids['settings_name']
|
@@ -638,7 +650,7 @@ class Admin
|
|
638 |
// add field for the Facebook CAPI user transparency send additional client identifiers
|
639 |
add_settings_field(
|
640 |
'wpm_setting_facebook_capi_user_transparency_send_additional_client_identifiers',
|
641 |
-
esc_html__( '
|
642 |
[ $this, 'wpm_setting_facebook_capi_user_transparency_send_additional_client_identifiers' ],
|
643 |
'wpm_plugin_options_page',
|
644 |
$section_ids['settings_name']
|
@@ -646,7 +658,7 @@ class Admin
|
|
646 |
// add fields for Facebook microdata
|
647 |
add_settings_field(
|
648 |
'wpm_setting_facebook_microdata_active',
|
649 |
-
esc_html__( '
|
650 |
[ $this, 'wpm_setting_html_facebook_microdata' ],
|
651 |
'wpm_plugin_options_page',
|
652 |
$section_ids['settings_name']
|
@@ -668,6 +680,39 @@ class Admin
|
|
668 |
[ $this, 'wpm_plugin_section_add_cart_data_description' ],
|
669 |
'wpm_plugin_options_page'
|
670 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
671 |
// add checkbox for dynamic remarketing
|
672 |
add_settings_field(
|
673 |
'wpm_plugin_option_gads_dynamic_remarketing',
|
@@ -785,7 +830,7 @@ class Admin
|
|
785 |
|
786 |
<script>
|
787 |
if (typeof wpm_hide_script_blocker_warning === "function") {
|
788 |
-
wpm_hide_script_blocker_warning()
|
789 |
}
|
790 |
</script>
|
791 |
|
@@ -922,7 +967,7 @@ class Admin
|
|
922 |
style="display:block; margin-bottom: 10px; width: 100%;resize: none;color:dimgrey;"
|
923 |
cols="100%" rows="30"
|
924 |
readonly><?php
|
925 |
-
esc_html_e( ( new Debug_Info(
|
926 |
?>
|
927 |
</textarea>
|
928 |
<button id="debug-info-button"
|
@@ -1103,7 +1148,7 @@ class Admin
|
|
1103 |
$this->get_status_icon_new( $this->options['google']['ads']['conversion_label'], $this->options['google']['ads']['conversion_id'] );
|
1104 |
$this->get_documentation_html_by_key( 'google_ads_conversion_label' );
|
1105 |
echo '<br><br>' ;
|
1106 |
-
esc_html_e( 'The
|
1107 |
echo ' <i>Xt19CO3axGAX0vg6X3gM</i>' ;
|
1108 |
|
1109 |
if ( $this->options['google']['ads']['conversion_label'] && !$this->options['google']['ads']['conversion_id'] ) {
|
@@ -1149,7 +1194,7 @@ class Admin
|
|
1149 |
$this->get_status_icon_new( $this->options['facebook']['pixel_id'] );
|
1150 |
$this->get_documentation_html_by_key( 'facebook_pixel_id' );
|
1151 |
echo '<br><br>' ;
|
1152 |
-
esc_html_e( 'The
|
1153 |
echo ' <i>765432112345678</i>' ;
|
1154 |
}
|
1155 |
|
@@ -1335,7 +1380,7 @@ class Admin
|
|
1335 |
<a class="documentation-icon" href="<?php
|
1336 |
echo esc_url( $path ) ;
|
1337 |
?>" target="_blank">
|
1338 |
-
<span style="vertical-align: top; margin-top:
|
1339 |
class="tooltiptext">
|
1340 |
<?php
|
1341 |
esc_html_e( 'open the documentation', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
@@ -1345,6 +1390,42 @@ class Admin
|
|
1345 |
<?php
|
1346 |
}
|
1347 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1348 |
public function wpm_setting_html_google_consent_mode_active()
|
1349 |
{
|
1350 |
// adding the hidden input is a hack to make WordPress save the option with the value zero,
|
@@ -1395,7 +1476,7 @@ class Admin
|
|
1395 |
<option value="<?php
|
1396 |
esc_html_e( $region_code );
|
1397 |
?>" <?php
|
1398 |
-
esc_html_e( ( in_array( $region_code, $this->options['google']['consent_mode']['regions']
|
1399 |
?>><?php
|
1400 |
esc_html_e( $region_name );
|
1401 |
?></option>
|
@@ -1405,9 +1486,9 @@ class Admin
|
|
1405 |
|
1406 |
</select>
|
1407 |
<script>
|
1408 |
-
jQuery(
|
1409 |
// theme: "classic"
|
1410 |
-
})
|
1411 |
</script>
|
1412 |
<?php
|
1413 |
$this->get_documentation_html_by_key( 'google_consent_regions' );
|
@@ -1553,7 +1634,7 @@ class Admin
|
|
1553 |
?>
|
1554 |
</label>
|
1555 |
<?php
|
1556 |
-
$this->get_status_icon_new( $this->options['google']['user_id'], $this->options['google']['analytics']['universal']['property_id'] || $this->options['google']['analytics']['ga4']['measurement_id'] || $this->
|
1557 |
$this->html_pro_feature();
|
1558 |
// echo $this->get_documentation_html('/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-consent-mode#/consent-mgmt/google-consent-mode');
|
1559 |
?>
|
@@ -1590,13 +1671,13 @@ class Admin
|
|
1590 |
?>
|
1591 |
</label>
|
1592 |
<?php
|
1593 |
-
$this->get_status_icon_new( $this->options['google']['ads']['enhanced_conversions'], $this->
|
1594 |
$this->html_pro_feature();
|
1595 |
$this->get_documentation_html_by_key( 'google_ads_enhanced_conversions' );
|
1596 |
?>
|
1597 |
<?php
|
1598 |
|
1599 |
-
if ( !$this->
|
1600 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1601 |
esc_html_e( 'You need to activate Google Ads', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1602 |
echo '</p><br>' ;
|
@@ -1620,7 +1701,7 @@ class Admin
|
|
1620 |
?>
|
1621 |
/>
|
1622 |
<?php
|
1623 |
-
$this->get_status_icon_new( $this->options['google']['ads']['phone_conversion_number']
|
1624 |
$this->get_documentation_html_by_key( 'google_ads_phone_conversion_number' );
|
1625 |
$this->html_pro_feature();
|
1626 |
echo '<br><br>' ;
|
@@ -1643,7 +1724,7 @@ class Admin
|
|
1643 |
?>
|
1644 |
/>
|
1645 |
<?php
|
1646 |
-
$this->get_status_icon_new( $this->options['google']['ads']['phone_conversion_label']
|
1647 |
$this->get_documentation_html_by_key( 'google_ads_phone_conversion_label' );
|
1648 |
$this->html_pro_feature();
|
1649 |
echo '<br><br>' ;
|
@@ -1664,6 +1745,40 @@ class Admin
|
|
1664 |
$this->html_pro_feature();
|
1665 |
}
|
1666 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1667 |
public function wpm_setting_html_complianz_support()
|
1668 |
{
|
1669 |
esc_html_e( 'Complianz GDPR detected. Automatic support is:', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
@@ -1750,7 +1865,7 @@ class Admin
|
|
1750 |
|
1751 |
if ( !$this->options['facebook']['pixel_id'] ) {
|
1752 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1753 |
-
esc_html_e( 'You need to activate the
|
1754 |
echo '</p><br>' ;
|
1755 |
}
|
1756 |
|
@@ -1780,7 +1895,7 @@ class Admin
|
|
1780 |
?>
|
1781 |
/>
|
1782 |
<?php
|
1783 |
-
esc_html_e( 'Send CAPI hits for anonymous visitors who likely have blocked the
|
1784 |
?>
|
1785 |
</label>
|
1786 |
<?php
|
@@ -1790,7 +1905,7 @@ class Admin
|
|
1790 |
|
1791 |
if ( $this->options['facebook']['capi']['user_transparency']['process_anonymous_hits'] && !$this->options['facebook']['pixel_id'] ) {
|
1792 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1793 |
-
esc_html_e( 'You need to activate the
|
1794 |
echo '</p><br>' ;
|
1795 |
}
|
1796 |
|
@@ -1826,7 +1941,7 @@ class Admin
|
|
1826 |
|
1827 |
if ( $this->options['facebook']['capi']['user_transparency']['send_additional_client_identifiers'] && !$this->options['facebook']['pixel_id'] ) {
|
1828 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1829 |
-
esc_html_e( 'You need to activate the
|
1830 |
echo '</p><br>' ;
|
1831 |
}
|
1832 |
|
@@ -1851,7 +1966,7 @@ class Admin
|
|
1851 |
?>
|
1852 |
/>
|
1853 |
<?php
|
1854 |
-
esc_html_e( 'Enable
|
1855 |
?>
|
1856 |
</label>
|
1857 |
<?php
|
@@ -1861,12 +1976,44 @@ class Admin
|
|
1861 |
|
1862 |
if ( $this->options['facebook']['microdata'] && !$this->options['facebook']['pixel_id'] ) {
|
1863 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1864 |
-
esc_html_e( 'You need to activate the
|
1865 |
echo '</p><br>' ;
|
1866 |
}
|
1867 |
|
1868 |
}
|
1869 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1870 |
public function wpm_setting_html_order_duplication_prevention()
|
1871 |
{
|
1872 |
// adding the hidden input is a hack to make WordPress save the option with the value zero,
|
@@ -1916,49 +2063,10 @@ class Admin
|
|
1916 |
?>
|
1917 |
</label>
|
1918 |
<?php
|
1919 |
-
$this->get_status_icon_new( $this->options['general']['maximum_compatibility_mode']
|
1920 |
$this->get_documentation_html_by_key( 'maximum_compatibility_mode' );
|
1921 |
}
|
1922 |
|
1923 |
-
public function wpm_setting_html_disable_tracking_for_user_roles()
|
1924 |
-
{
|
1925 |
-
// https://semantic-ui.com/modules/dropdown.html#multiple-selection
|
1926 |
-
// https://developer.woocommerce.com/2017/08/08/selectwoo-an-accessible-replacement-for-select2/
|
1927 |
-
// https://github.com/woocommerce/selectWoo
|
1928 |
-
?>
|
1929 |
-
<select id="wpm_setting_disable_tracking_for_user_roles" multiple="multiple"
|
1930 |
-
name="wgact_plugin_options[shop][disable_tracking_for][]"
|
1931 |
-
style="width:350px; padding-left: 10px" data-placeholder="Choose roles…" aria-label="Roles"
|
1932 |
-
class="wc-enhanced-select"
|
1933 |
-
<?php
|
1934 |
-
esc_html_e( $this->disable_if_demo() );
|
1935 |
-
?>
|
1936 |
-
>
|
1937 |
-
<?php
|
1938 |
-
foreach ( get_editable_roles() as $role => $details ) {
|
1939 |
-
?>
|
1940 |
-
<option value="<?php
|
1941 |
-
esc_html_e( $role );
|
1942 |
-
?>" <?php
|
1943 |
-
esc_html_e( ( in_array( $role, $this->options['shop']['disable_tracking_for'], true ) ? 'selected' : '' ) );
|
1944 |
-
?>><?php
|
1945 |
-
esc_html_e( $details['name'] );
|
1946 |
-
?></option>
|
1947 |
-
<?php
|
1948 |
-
}
|
1949 |
-
?>
|
1950 |
-
|
1951 |
-
</select>
|
1952 |
-
<script>
|
1953 |
-
jQuery("#wpm_setting_disable_tracking_for_user_roles").select2({
|
1954 |
-
// theme: "classic"
|
1955 |
-
})
|
1956 |
-
</script>
|
1957 |
-
<?php
|
1958 |
-
// $this->get_documentation_html_by_key('google_consent_regions');
|
1959 |
-
$this->html_pro_feature();
|
1960 |
-
}
|
1961 |
-
|
1962 |
private function get_order_duplication_prevention_text()
|
1963 |
{
|
1964 |
esc_html_e( 'Basic order duplication prevention is ', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
@@ -2191,6 +2299,67 @@ class Admin
|
|
2191 |
esc_html_e( 'ID of your Google Merchant Center account. It looks like this: 12345678', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
2192 |
}
|
2193 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2194 |
public function wpm_plugin_option_product_identifier()
|
2195 |
{
|
2196 |
?>
|
@@ -2442,7 +2611,7 @@ class Admin
|
|
2442 |
|
2443 |
if ( !$this->validations->is_facebook_pixel_id( $input['facebook']['pixel_id'] ) ) {
|
2444 |
$input['facebook']['pixel_id'] = ( isset( $this->options['facebook']['pixel_id'] ) ? $this->options['facebook']['pixel_id'] : '' );
|
2445 |
-
add_settings_error( 'wgact_plugin_options', 'invalid-facebook-pixel-id', esc_html__( 'You have entered an invalid
|
2446 |
}
|
2447 |
|
2448 |
}
|
@@ -2451,7 +2620,7 @@ class Admin
|
|
2451 |
|
2452 |
if ( !$this->validations->is_facebook_capi_token( $input['facebook']['capi']['token'] ) ) {
|
2453 |
$input['facebook']['capi']['token'] = ( isset( $this->options['facebook']['capi']['token'] ) ? $this->options['facebook']['capi']['token'] : '' );
|
2454 |
-
add_settings_error( 'wgact_plugin_options', 'invalid-facebook-pixel-id', esc_html__( 'You have entered an invalid
|
2455 |
}
|
2456 |
|
2457 |
}
|
@@ -2509,12 +2678,16 @@ class Admin
|
|
2509 |
}
|
2510 |
|
2511 |
}
|
2512 |
-
|
2513 |
-
|
2514 |
-
|
2515 |
-
|
2516 |
-
|
2517 |
-
|
|
|
|
|
|
|
|
|
2518 |
}
|
2519 |
|
2520 |
// Recursively go through the array and merge (overwrite old values with new ones
|
@@ -2554,9 +2727,6 @@ class Admin
|
|
2554 |
// but should be preserved
|
2555 |
$non_form_keys = [
|
2556 |
'db_version' => $this->options['db_version'],
|
2557 |
-
'shop' => [
|
2558 |
-
'disable_tracking_for' => [],
|
2559 |
-
],
|
2560 |
];
|
2561 |
// in case the form field input is missing
|
2562 |
// if (!array_key_exists('google_business_vertical', $input['google']['ads'])) {
|
1 |
<?php
|
2 |
|
3 |
// TODO move script for copying debug info into a proper .js enqueued file, or switch tabs to JavaScript switching and always save all settings at the same time
|
4 |
+
// TODO debug info list of active payment gateways
|
5 |
namespace WCPM\Classes\Admin;
|
6 |
|
7 |
+
use WC_Geolocation ;
|
8 |
+
use WCPM\Classes\Pixels\Google\Trait_Google ;
|
9 |
use WCPM\Classes\Pixels\Trait_Shop ;
|
10 |
+
use WP_Screen ;
|
11 |
|
12 |
if ( !defined( 'ABSPATH' ) ) {
|
13 |
exit;
|
16 |
|
17 |
class Admin
|
18 |
{
|
19 |
+
use Trait_Google ;
|
20 |
use Trait_Shop ;
|
21 |
public $ip ;
|
22 |
protected $text_domain ;
|
25 |
protected $documentation ;
|
26 |
private $consent_mode_regions ;
|
27 |
private $validations ;
|
|
|
28 |
public function __construct( $options )
|
29 |
{
|
30 |
$this->options = $options;
|
31 |
$this->plugin_hook = 'woocommerce_page_wpm';
|
32 |
$this->documentation = new Documentation();
|
|
|
33 |
add_action( 'admin_enqueue_scripts', [ $this, 'wpm_admin_scripts' ] );
|
34 |
// add the admin options page
|
35 |
add_action( 'admin_menu', [ $this, 'wpm_plugin_admin_add_page' ], 99 );
|
48 |
|
49 |
protected function if_is_wpm_admin_page()
|
50 |
{
|
51 |
+
$_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_STRING );
|
52 |
|
53 |
if ( !empty($_get['page']) && 'wpm' === $_get['page'] ) {
|
54 |
return true;
|
77 |
|
78 |
public function my_after_purchase_js( $js_function )
|
79 |
{
|
80 |
+
return "function ( response ) {\n\n let\n isTrial = (null != response.purchase.trial_ends),\n isSubscription = (null != response.purchase.initial_amount),\n total = isTrial ? 0 : (isSubscription ? response.purchase.initial_amount : response.purchase.gross).toString(),\n productName = 'WooCommerce Pixel Manager',\n // storeUrl = 'https://sweetcode.com',\n storeName = 'SweetCode';\n \n window.dataLayer = window.dataLayer || [];\n\n function gtag() {\n dataLayer.push(arguments);\n }\n \n gtag('js', new Date()); \n \n gtag('config', 'UA-39746956-10', {'anonymize_ip':'true'});\n gtag('config', 'G-LWRCPMQS9T');\n gtag('config', 'AW-406204436');\n \n gtag('event', 'purchase', {\n 'send_to':['UA-39746956-10', 'G-LWRCPMQS9T'],\n 'transaction_id':response.purchase.id.toString(),\n 'currency':'USD',\n 'discount':0,\n 'items':[{\n 'id':response.purchase.plan_id.toString(),\n 'quantity':1,\n 'price':total,\n 'name':productName,\n 'category': 'Plugin',\n }],\n 'affiliation': storeName,\n 'value':response.purchase.initial_amount.toString()\n });\n \n gtag('event', 'conversion', {\n 'send_to': 'AW-406204436/XrUYCK3J8YoCEJTg2MEB',\n 'value': response.purchase.initial_amount.toString(),\n 'currency': 'USD',\n 'transaction_id': response.purchase.id.toString()\n });\n \n !function(f,b,e,v,n,t,s)\n {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n n.queue=[];t=b.createElement(e);t.async=!0;\n t.src=v;s=b.getElementsByTagName(e)[0];\n s.parentNode.insertBefore(t,s)}(window, document,'script',\n 'https://connect.facebook.net/en_US/fbevents.js');\n fbq('init', '257839909406661');\n fbq('track', 'PageView');\n \n fbq('track', 'Purchase', {\n currency: 'USD',\n value: total\n });\n }";
|
81 |
}
|
82 |
|
83 |
public function my_checkout_enrich( $html )
|
205 |
// add the field for the conversion label
|
206 |
add_settings_field(
|
207 |
'wpm_plugin_conversion_label',
|
208 |
+
esc_html__( 'Google Ads Conversion Label', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
209 |
[ $this, 'wpm_option_html_google_ads_conversion_label' ],
|
210 |
'wpm_plugin_options_page',
|
211 |
$section_ids['settings_name']
|
236 |
public function add_section_main_subsection_facebook( $section_ids )
|
237 |
{
|
238 |
$sub_section_ids = [
|
239 |
+
'title' => esc_html__( 'Facebook', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
240 |
'slug' => 'facebook',
|
241 |
];
|
242 |
add_settings_field(
|
251 |
// add the field for the conversion label
|
252 |
add_settings_field(
|
253 |
'wpm_plugin_facebook_pixel_id',
|
254 |
+
esc_html__( 'Facebook pixel ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
255 |
[ $this, 'wpm_option_html_facebook_pixel_id' ],
|
256 |
'wpm_plugin_options_page',
|
257 |
$section_ids['settings_name']
|
390 |
'wpm_plugin_options_page',
|
391 |
$section_ids['settings_name']
|
392 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
393 |
}
|
394 |
|
395 |
public function add_section_advanced_subsection_google( $section_ids )
|
407 |
'wpm_plugin_options_page',
|
408 |
$section_ids['settings_name']
|
409 |
);
|
410 |
+
if ( $this->options['google']['gtag']['deactivation'] ) {
|
411 |
+
// add fields for the gtag insertion
|
412 |
+
add_settings_field(
|
413 |
+
'wpm_plugin_option_gtag_deactivation',
|
414 |
+
esc_html__( 'gtag Deactivation', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
415 |
+
[ $this, 'wpm_setting_html_google_gtag_deactivation' ],
|
416 |
+
'wpm_plugin_options_page',
|
417 |
+
$section_ids['settings_name']
|
418 |
+
);
|
419 |
+
}
|
420 |
// add the field for the aw_merchant_id
|
421 |
add_settings_field(
|
422 |
'wpm_plugin_aw_merchant_id',
|
534 |
'wpm_plugin_options_page',
|
535 |
$section_ids['settings_name']
|
536 |
);
|
537 |
+
if ( ( new Environment_Check() )->is_borlabs_cookie_active() ) {
|
538 |
// add fields for the Borlabs Cookie support
|
539 |
add_settings_field(
|
540 |
'wpm_setting_borlabs_support',
|
544 |
$section_ids['settings_name']
|
545 |
);
|
546 |
}
|
547 |
+
if ( ( new Environment_Check() )->is_cookiebot_active() ) {
|
548 |
// add fields for the Cookiebot support
|
549 |
add_settings_field(
|
550 |
'wpm_setting_cookiebot_support',
|
554 |
$section_ids['settings_name']
|
555 |
);
|
556 |
}
|
557 |
+
if ( !( new Environment_Check() )->is_some_cmp_active() ) {
|
558 |
+
// add fields for the Cookiebot support
|
559 |
+
add_settings_field(
|
560 |
+
'wpm_setting_cookiebot_active',
|
561 |
+
esc_html__( 'Cookiebot support', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
562 |
+
[ $this, 'wpm_setting_html_cookiebot_manual_setting' ],
|
563 |
+
'wpm_plugin_options_page',
|
564 |
+
$section_ids['settings_name']
|
565 |
+
);
|
566 |
+
}
|
567 |
+
if ( ( new Environment_Check() )->is_complianz_active() ) {
|
568 |
// add fields for the Complianz GDPR support
|
569 |
add_settings_field(
|
570 |
'wpm_setting_complianz_support',
|
574 |
$section_ids['settings_name']
|
575 |
);
|
576 |
}
|
577 |
+
if ( ( new Environment_Check() )->is_cookie_notice_active() ) {
|
578 |
// add fields for the Cookie Notice by hu-manity.co support
|
579 |
add_settings_field(
|
580 |
'wpm_setting_cookie_notice_support',
|
584 |
$section_ids['settings_name']
|
585 |
);
|
586 |
}
|
587 |
+
if ( ( new Environment_Check() )->is_cookie_script_active() ) {
|
588 |
// add fields for the Cookie Script support
|
589 |
add_settings_field(
|
590 |
'wpm_setting_cookie_script_support',
|
594 |
$section_ids['settings_name']
|
595 |
);
|
596 |
}
|
597 |
+
if ( ( new Environment_Check() )->is_moove_gdpr_active() ) {
|
598 |
// add fields for the GDPR Cookie Compliance support
|
599 |
add_settings_field(
|
600 |
'wpm_setting_moove_gdpr_support',
|
604 |
$section_ids['settings_name']
|
605 |
);
|
606 |
}
|
607 |
+
if ( ( new Environment_Check() )->is_cookie_law_info_active() ) {
|
608 |
// add fields for the GDPR Cookie Consent support
|
609 |
add_settings_field(
|
610 |
'wpm_setting_cookie_law_info_support',
|
619 |
public function add_section_advanced_subsection_facebook( $section_ids )
|
620 |
{
|
621 |
$sub_section_ids = [
|
622 |
+
'title' => 'Facebook',
|
623 |
'slug' => 'facebook',
|
624 |
];
|
625 |
add_settings_field(
|
634 |
// add field for the Facebook CAPI token
|
635 |
add_settings_field(
|
636 |
'wpm_setting_facebook_capi_token',
|
637 |
+
esc_html__( 'Facebook CAPI: token', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
638 |
[ $this, 'wpm_setting_html_facebook_capi_token' ],
|
639 |
'wpm_plugin_options_page',
|
640 |
$section_ids['settings_name']
|
642 |
// add field for the Facebook CAPI user transparency process anonymous hits
|
643 |
add_settings_field(
|
644 |
'wpm_setting_facebook_capi_user_transparency_process_anonymous_hits',
|
645 |
+
esc_html__( 'Facebook CAPI: process anonymous hits', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
646 |
[ $this, 'wpm_setting_facebook_capi_user_transparency_process_anonymous_hits' ],
|
647 |
'wpm_plugin_options_page',
|
648 |
$section_ids['settings_name']
|
650 |
// add field for the Facebook CAPI user transparency send additional client identifiers
|
651 |
add_settings_field(
|
652 |
'wpm_setting_facebook_capi_user_transparency_send_additional_client_identifiers',
|
653 |
+
esc_html__( 'Facebook CAPI: send additional visitor identifiers', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
654 |
[ $this, 'wpm_setting_facebook_capi_user_transparency_send_additional_client_identifiers' ],
|
655 |
'wpm_plugin_options_page',
|
656 |
$section_ids['settings_name']
|
658 |
// add fields for Facebook microdata
|
659 |
add_settings_field(
|
660 |
'wpm_setting_facebook_microdata_active',
|
661 |
+
esc_html__( 'Facebook Microdata Tags for Catalogues', 'woocommerce-google-adwords-conversion-tracking-tag' ),
|
662 |
[ $this, 'wpm_setting_html_facebook_microdata' ],
|
663 |
'wpm_plugin_options_page',
|
664 |
$section_ids['settings_name']
|
680 |
[ $this, 'wpm_plugin_section_add_cart_data_description' ],
|
681 |
'wpm_plugin_options_page'
|
682 |
);
|
683 |
+
// add fields for cart data
|
684 |
+
// add_settings_field(
|
685 |
+
// 'wgact_plugin_add_cart_data',
|
686 |
+
// esc_html__(
|
687 |
+
// 'Activation',
|
688 |
+
// 'woocommerce-google-adwords-conversion-tracking-tag'
|
689 |
+
// ),
|
690 |
+
// [$this, 'wgact_option_html_google_ads_add_cart_data'],
|
691 |
+
// 'wpm_plugin_options_page',
|
692 |
+
// 'wpm_plugin_beta_section'
|
693 |
+
// );
|
694 |
+
// add the field for the aw_feed_country
|
695 |
+
// add_settings_field(
|
696 |
+
// 'wgact_plugin_aw_feed_country',
|
697 |
+
// esc_html__(
|
698 |
+
// 'aw_feed_country',
|
699 |
+
// 'woocommerce-google-adwords-conversion-tracking-tag'
|
700 |
+
// ),
|
701 |
+
// [$this, 'wgact_plugin_setting_aw_feed_country'],
|
702 |
+
// 'wpm_plugin_options_page',
|
703 |
+
// 'wpm_plugin_beta_section'
|
704 |
+
// );
|
705 |
+
// add the field for the aw_feed_language
|
706 |
+
// add_settings_field(
|
707 |
+
// 'wgact_plugin_aw_feed_language',
|
708 |
+
// esc_html__(
|
709 |
+
// 'aw_feed_language',
|
710 |
+
// 'woocommerce-google-adwords-conversion-tracking-tag'
|
711 |
+
// ),
|
712 |
+
// [$this, 'wgact_plugin_setting_aw_feed_language'],
|
713 |
+
// 'wpm_plugin_options_page',
|
714 |
+
// 'wpm_plugin_beta_section'
|
715 |
+
// );
|
716 |
// add checkbox for dynamic remarketing
|
717 |
add_settings_field(
|
718 |
'wpm_plugin_option_gads_dynamic_remarketing',
|
830 |
|
831 |
<script>
|
832 |
if (typeof wpm_hide_script_blocker_warning === "function") {
|
833 |
+
wpm_hide_script_blocker_warning();
|
834 |
}
|
835 |
</script>
|
836 |
|
967 |
style="display:block; margin-bottom: 10px; width: 100%;resize: none;color:dimgrey;"
|
968 |
cols="100%" rows="30"
|
969 |
readonly><?php
|
970 |
+
esc_html_e( ( new Debug_Info() )->get_debug_info() );
|
971 |
?>
|
972 |
</textarea>
|
973 |
<button id="debug-info-button"
|
1148 |
$this->get_status_icon_new( $this->options['google']['ads']['conversion_label'], $this->options['google']['ads']['conversion_id'] );
|
1149 |
$this->get_documentation_html_by_key( 'google_ads_conversion_label' );
|
1150 |
echo '<br><br>' ;
|
1151 |
+
esc_html_e( 'The conversion Label looks similar to this:', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1152 |
echo ' <i>Xt19CO3axGAX0vg6X3gM</i>' ;
|
1153 |
|
1154 |
if ( $this->options['google']['ads']['conversion_label'] && !$this->options['google']['ads']['conversion_id'] ) {
|
1194 |
$this->get_status_icon_new( $this->options['facebook']['pixel_id'] );
|
1195 |
$this->get_documentation_html_by_key( 'facebook_pixel_id' );
|
1196 |
echo '<br><br>' ;
|
1197 |
+
esc_html_e( 'The Facebook pixel ID looks similar to this:', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1198 |
echo ' <i>765432112345678</i>' ;
|
1199 |
}
|
1200 |
|
1380 |
<a class="documentation-icon" href="<?php
|
1381 |
echo esc_url( $path ) ;
|
1382 |
?>" target="_blank">
|
1383 |
+
<span style="vertical-align: top; margin-top: 0px" class="dashicons dashicons-info-outline tooltip"><span
|
1384 |
class="tooltiptext">
|
1385 |
<?php
|
1386 |
esc_html_e( 'open the documentation', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1390 |
<?php
|
1391 |
}
|
1392 |
|
1393 |
+
public function wpm_setting_html_google_gtag_deactivation()
|
1394 |
+
{
|
1395 |
+
// adding the hidden input is a hack to make WordPress save the option with the value zero,
|
1396 |
+
// instead of not saving it and remove that array key entirely
|
1397 |
+
// https://stackoverflow.com/a/1992745/4688612
|
1398 |
+
?>
|
1399 |
+
<label>
|
1400 |
+
<input type='hidden' value='0' name='wgact_plugin_options[google][gtag][deactivation]'>
|
1401 |
+
<input type='checkbox' id='wpm_plugin_option_gtag_deactivation'
|
1402 |
+
name='wgact_plugin_options[google][gtag][deactivation]'
|
1403 |
+
value='1' <?php
|
1404 |
+
checked( $this->options['google']['gtag']['deactivation'] );
|
1405 |
+
?> />
|
1406 |
+
<?php
|
1407 |
+
esc_html_e( 'Disable gtag.js insertion, if another plugin is inserting it already', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1408 |
+
?>
|
1409 |
+
</label>
|
1410 |
+
<?php
|
1411 |
+
$this->get_documentation_html_by_key( 'google_gtag_deactivation' );
|
1412 |
+
?>
|
1413 |
+
<br>
|
1414 |
+
<p>
|
1415 |
+
<span class="dashicons dashicons-info"></span>
|
1416 |
+
<?php
|
1417 |
+
esc_html_e( 'Only do this, if the other plugin does insert the gtag above this pixel. If not, keep the gtag active.', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1418 |
+
?>
|
1419 |
+
</p>
|
1420 |
+
<p>
|
1421 |
+
<span class="dashicons dashicons-info"></span>
|
1422 |
+
<?php
|
1423 |
+
esc_html_e( 'This setting is deprecated. It will be removed in future versions of the plugin. Read more about it in the documentation.', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1424 |
+
?>
|
1425 |
+
</p>
|
1426 |
+
<?php
|
1427 |
+
}
|
1428 |
+
|
1429 |
public function wpm_setting_html_google_consent_mode_active()
|
1430 |
{
|
1431 |
// adding the hidden input is a hack to make WordPress save the option with the value zero,
|
1476 |
<option value="<?php
|
1477 |
esc_html_e( $region_code );
|
1478 |
?>" <?php
|
1479 |
+
esc_html_e( ( in_array( $region_code, $this->options['google']['consent_mode']['regions'] ) ? 'selected' : '' ) );
|
1480 |
?>><?php
|
1481 |
esc_html_e( $region_name );
|
1482 |
?></option>
|
1486 |
|
1487 |
</select>
|
1488 |
<script>
|
1489 |
+
jQuery('#wpm_setting_google_consent_regions').select2({
|
1490 |
// theme: "classic"
|
1491 |
+
});
|
1492 |
</script>
|
1493 |
<?php
|
1494 |
$this->get_documentation_html_by_key( 'google_consent_regions' );
|
1634 |
?>
|
1635 |
</label>
|
1636 |
<?php
|
1637 |
+
$this->get_status_icon_new( $this->options['google']['user_id'], $this->options['google']['analytics']['universal']['property_id'] || $this->options['google']['analytics']['ga4']['measurement_id'] || $this->is_google_ads_active(), true );
|
1638 |
$this->html_pro_feature();
|
1639 |
// echo $this->get_documentation_html('/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-consent-mode#/consent-mgmt/google-consent-mode');
|
1640 |
?>
|
1671 |
?>
|
1672 |
</label>
|
1673 |
<?php
|
1674 |
+
$this->get_status_icon_new( $this->options['google']['ads']['enhanced_conversions'], $this->is_google_ads_active(), false );
|
1675 |
$this->html_pro_feature();
|
1676 |
$this->get_documentation_html_by_key( 'google_ads_enhanced_conversions' );
|
1677 |
?>
|
1678 |
<?php
|
1679 |
|
1680 |
+
if ( !$this->is_google_ads_active() ) {
|
1681 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1682 |
esc_html_e( 'You need to activate Google Ads', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1683 |
echo '</p><br>' ;
|
1701 |
?>
|
1702 |
/>
|
1703 |
<?php
|
1704 |
+
$this->get_status_icon_new( $this->options['google']['ads']['phone_conversion_number'] );
|
1705 |
$this->get_documentation_html_by_key( 'google_ads_phone_conversion_number' );
|
1706 |
$this->html_pro_feature();
|
1707 |
echo '<br><br>' ;
|
1724 |
?>
|
1725 |
/>
|
1726 |
<?php
|
1727 |
+
$this->get_status_icon_new( $this->options['google']['ads']['phone_conversion_label'] );
|
1728 |
$this->get_documentation_html_by_key( 'google_ads_phone_conversion_label' );
|
1729 |
$this->html_pro_feature();
|
1730 |
echo '<br><br>' ;
|
1745 |
$this->html_pro_feature();
|
1746 |
}
|
1747 |
|
1748 |
+
public function wpm_setting_html_cookiebot_manual_setting()
|
1749 |
+
{
|
1750 |
+
// adding the hidden input is a hack to make WordPress save the option with the value zero,
|
1751 |
+
// instead of not saving it and remove that array key entirely
|
1752 |
+
// https://stackoverflow.com/a/1992745/4688612
|
1753 |
+
?>
|
1754 |
+
<label>
|
1755 |
+
<input type='hidden' value='0' name='wgact_plugin_options[shop][cookie_consent_mgmt][cookiebot][active]'>
|
1756 |
+
<input type='checkbox' id='wpm_setting_cookiebot_active'
|
1757 |
+
name='wgact_plugin_options[shop][cookie_consent_mgmt][cookiebot][active]'
|
1758 |
+
value='1'
|
1759 |
+
<?php
|
1760 |
+
checked( $this->options['shop']['cookie_consent_mgmt']['cookiebot']['active'] );
|
1761 |
+
?>
|
1762 |
+
<?php
|
1763 |
+
esc_html_e( $this->disable_if_demo() );
|
1764 |
+
?>
|
1765 |
+
/>
|
1766 |
+
<?php
|
1767 |
+
esc_html_e( 'Enable Cookiebot settings', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1768 |
+
?>
|
1769 |
+
</label>
|
1770 |
+
<?php
|
1771 |
+
$this->get_status_icon_new( $this->options['shop']['cookie_consent_mgmt']['cookiebot']['active'], $this->options['google']['consent_mode']['active'], true );
|
1772 |
+
$this->html_pro_feature();
|
1773 |
+
|
1774 |
+
if ( $this->options['shop']['cookie_consent_mgmt']['cookiebot']['active'] && !$this->options['google']['consent_mode']['active'] ) {
|
1775 |
+
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1776 |
+
esc_html_e( 'You need to activate the Google consent mode', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1777 |
+
echo '</p><br>' ;
|
1778 |
+
}
|
1779 |
+
|
1780 |
+
}
|
1781 |
+
|
1782 |
public function wpm_setting_html_complianz_support()
|
1783 |
{
|
1784 |
esc_html_e( 'Complianz GDPR detected. Automatic support is:', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1865 |
|
1866 |
if ( !$this->options['facebook']['pixel_id'] ) {
|
1867 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1868 |
+
esc_html_e( 'You need to activate the Facebook pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1869 |
echo '</p><br>' ;
|
1870 |
}
|
1871 |
|
1895 |
?>
|
1896 |
/>
|
1897 |
<?php
|
1898 |
+
esc_html_e( 'Send CAPI hits for anonymous visitors who likely have blocked the Facebook pixel.', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1899 |
?>
|
1900 |
</label>
|
1901 |
<?php
|
1905 |
|
1906 |
if ( $this->options['facebook']['capi']['user_transparency']['process_anonymous_hits'] && !$this->options['facebook']['pixel_id'] ) {
|
1907 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1908 |
+
esc_html_e( 'You need to activate the Facebook pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1909 |
echo '</p><br>' ;
|
1910 |
}
|
1911 |
|
1941 |
|
1942 |
if ( $this->options['facebook']['capi']['user_transparency']['send_additional_client_identifiers'] && !$this->options['facebook']['pixel_id'] ) {
|
1943 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1944 |
+
esc_html_e( 'You need to activate the Facebook pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1945 |
echo '</p><br>' ;
|
1946 |
}
|
1947 |
|
1966 |
?>
|
1967 |
/>
|
1968 |
<?php
|
1969 |
+
esc_html_e( 'Enable Facebook product microdata output', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1970 |
?>
|
1971 |
</label>
|
1972 |
<?php
|
1976 |
|
1977 |
if ( $this->options['facebook']['microdata'] && !$this->options['facebook']['pixel_id'] ) {
|
1978 |
echo '<p></p><span class="dashicons dashicons-info"></span>' ;
|
1979 |
+
esc_html_e( 'You need to activate the Facebook pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
1980 |
echo '</p><br>' ;
|
1981 |
}
|
1982 |
|
1983 |
}
|
1984 |
|
1985 |
+
public function wgact_option_html_google_ads_add_cart_data()
|
1986 |
+
{
|
1987 |
+
// adding the hidden input is a hack to make WordPress save the option with the value zero,
|
1988 |
+
// instead of not saving it and remove that array key entirely
|
1989 |
+
// https://stackoverflow.com/a/1992745/4688612
|
1990 |
+
?>
|
1991 |
+
<label>
|
1992 |
+
<input type='hidden' value='0' name='wgact_plugin_options[google][ads][add_cart_data]'>
|
1993 |
+
<input type='checkbox' id='wgact_plugin_option_gads_add_cart_data'
|
1994 |
+
name='wgact_plugin_options[google][ads][add_cart_data]'
|
1995 |
+
value='1' <?php
|
1996 |
+
checked( $this->options['google']['ads']['add_cart_data'] );
|
1997 |
+
?> />
|
1998 |
+
<?php
|
1999 |
+
esc_html_e( 'Add the cart data to the conversion event', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
2000 |
+
?>
|
2001 |
+
</label>
|
2002 |
+
<?php
|
2003 |
+
$this->get_status_icon_new( $this->options['google']['ads']['add_cart_data'], $this->add_to_cart_requirements_fulfilled() );
|
2004 |
+
|
2005 |
+
if ( !$this->add_to_cart_requirements_fulfilled() ) {
|
2006 |
+
?>
|
2007 |
+
<p><span class="dashicons dashicons-info"></span>
|
2008 |
+
<?php
|
2009 |
+
esc_html_e( 'Requires an active Google Ads Conversion ID, an active Conversion Label and an active Google Merchant Center ID (aw_merchant_id)', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
2010 |
+
?>
|
2011 |
+
</p>
|
2012 |
+
<?php
|
2013 |
+
}
|
2014 |
+
|
2015 |
+
}
|
2016 |
+
|
2017 |
public function wpm_setting_html_order_duplication_prevention()
|
2018 |
{
|
2019 |
// adding the hidden input is a hack to make WordPress save the option with the value zero,
|
2063 |
?>
|
2064 |
</label>
|
2065 |
<?php
|
2066 |
+
$this->get_status_icon_new( $this->options['general']['maximum_compatibility_mode'] );
|
2067 |
$this->get_documentation_html_by_key( 'maximum_compatibility_mode' );
|
2068 |
}
|
2069 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2070 |
private function get_order_duplication_prevention_text()
|
2071 |
{
|
2072 |
esc_html_e( 'Basic order duplication prevention is ', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
2299 |
esc_html_e( 'ID of your Google Merchant Center account. It looks like this: 12345678', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
2300 |
}
|
2301 |
|
2302 |
+
public function wgact_plugin_setting_aw_feed_country()
|
2303 |
+
{
|
2304 |
+
?>
|
2305 |
+
<b><?php
|
2306 |
+
esc_html_e( $this->get_visitor_country() );
|
2307 |
+
?></b>
|
2308 |
+
<div style="margin-top:10px">
|
2309 |
+
<?php
|
2310 |
+
esc_html_e( 'Currently the plugin automatically detects the location of the visitor for this setting. In most, if not all, cases this will work fine. Please let us know if you have a use case where you need another output:', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
2311 |
+
?>
|
2312 |
+
<a href="mailto:support@sweetcode.com">support@sweetcode.com</a>
|
2313 |
+
</div>
|
2314 |
+
<?php
|
2315 |
+
}
|
2316 |
+
|
2317 |
+
// dupe in pixel
|
2318 |
+
public function get_visitor_country()
|
2319 |
+
{
|
2320 |
+
|
2321 |
+
if ( $this->isLocalhost() ) {
|
2322 |
+
// error_log('check external ip');
|
2323 |
+
$this->ip = WC_Geolocation::get_external_ip_address();
|
2324 |
+
} else {
|
2325 |
+
// error_log('check regular ip');
|
2326 |
+
$this->ip = WC_Geolocation::get_ip_address();
|
2327 |
+
}
|
2328 |
+
|
2329 |
+
$location = WC_Geolocation::geolocate_ip( $this->ip );
|
2330 |
+
// error_log ('ip: ' . $this->>$ip);
|
2331 |
+
// error_log ('country: ' . $location['country']);
|
2332 |
+
return $location['country'];
|
2333 |
+
}
|
2334 |
+
|
2335 |
+
// dupe in pixel
|
2336 |
+
public function isLocalhost()
|
2337 |
+
{
|
2338 |
+
$_server = filter_input_array( INPUT_SERVER, FILTER_SANITIZE_STRING );
|
2339 |
+
return in_array( $_server['REMOTE_ADDR'], [ '127.0.0.1', '::1' ] );
|
2340 |
+
}
|
2341 |
+
|
2342 |
+
public function wgact_plugin_setting_aw_feed_language()
|
2343 |
+
{
|
2344 |
+
?>
|
2345 |
+
<b><?php
|
2346 |
+
esc_html_e( $this->get_gmc_language() );
|
2347 |
+
?></b>
|
2348 |
+
<div style="margin-top:10px">
|
2349 |
+
<?php
|
2350 |
+
esc_html_e( 'The plugin will use the WordPress default language for this setting. If the shop uses translations, in theory we could also use the visitors locale. But, if that language is not set up in the Google Merchant Center we might run into issues. If you need more options here let us know:', 'woocommerce-google-adwords-conversion-tracking-tag' );
|
2351 |
+
?>
|
2352 |
+
<a href=\"mailto:support@sweetcode.com\">support@sweetcode.com</a>
|
2353 |
+
</div>
|
2354 |
+
<?php
|
2355 |
+
}
|
2356 |
+
|
2357 |
+
// dupe in pixel
|
2358 |
+
public function get_gmc_language()
|
2359 |
+
{
|
2360 |
+
return strtoupper( substr( get_locale(), 0, 2 ) );
|
2361 |
+
}
|
2362 |
+
|
2363 |
public function wpm_plugin_option_product_identifier()
|
2364 |
{
|
2365 |
?>
|
2611 |
|
2612 |
if ( !$this->validations->is_facebook_pixel_id( $input['facebook']['pixel_id'] ) ) {
|
2613 |
$input['facebook']['pixel_id'] = ( isset( $this->options['facebook']['pixel_id'] ) ? $this->options['facebook']['pixel_id'] : '' );
|
2614 |
+
add_settings_error( 'wgact_plugin_options', 'invalid-facebook-pixel-id', esc_html__( 'You have entered an invalid Facebook pixel ID. It only contains 14 to 16 digits.', 'woocommerce-google-adwords-conversion-tracking-tag' ) );
|
2615 |
}
|
2616 |
|
2617 |
}
|
2620 |
|
2621 |
if ( !$this->validations->is_facebook_capi_token( $input['facebook']['capi']['token'] ) ) {
|
2622 |
$input['facebook']['capi']['token'] = ( isset( $this->options['facebook']['capi']['token'] ) ? $this->options['facebook']['capi']['token'] : '' );
|
2623 |
+
add_settings_error( 'wgact_plugin_options', 'invalid-facebook-pixel-id', esc_html__( 'You have entered an invalid Facebook CAPI token.', 'woocommerce-google-adwords-conversion-tracking-tag' ) );
|
2624 |
}
|
2625 |
|
2626 |
}
|
2678 |
}
|
2679 |
|
2680 |
}
|
2681 |
+
// merging with the existing options
|
2682 |
+
// and overwriting old values
|
2683 |
+
// since disabling a checkbox doesn't send a value,
|
2684 |
+
// we need to set one to overwrite the old value
|
2685 |
+
$input = array_replace_recursive( $this->non_form_keys( $input ), $input );
|
2686 |
+
// error_log(print_r($input, true));
|
2687 |
+
// $input = $this->merge_options($this->options, $input);
|
2688 |
+
// error_log('input merged');
|
2689 |
+
// error_log(print_r($input, true));
|
2690 |
+
return $input;
|
2691 |
}
|
2692 |
|
2693 |
// Recursively go through the array and merge (overwrite old values with new ones
|
2727 |
// but should be preserved
|
2728 |
$non_form_keys = [
|
2729 |
'db_version' => $this->options['db_version'],
|
|
|
|
|
|
|
2730 |
];
|
2731 |
// in case the form field input is missing
|
2732 |
// if (!array_key_exists('google_business_vertical', $input['google']['ads'])) {
|
classes/admin/class-ask-for-rating.php
CHANGED
@@ -36,7 +36,7 @@ class Ask_For_Rating {
|
|
36 |
// server side php ajax handler for the admin rating notice
|
37 |
public function ajax_rating_notice_handler() {
|
38 |
|
39 |
-
$_post = filter_input_array(INPUT_POST,
|
40 |
|
41 |
$set = $_post['set'];
|
42 |
|
@@ -151,7 +151,7 @@ class Ask_For_Rating {
|
|
151 |
<?php esc_html_e('I already did', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
152 |
</a>
|
153 |
</div>
|
154 |
-
<div style="white-space:normal; bottom:0; right: 0; margin-bottom:
|
155 |
<a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
|
156 |
target="_blank">
|
157 |
<?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
36 |
// server side php ajax handler for the admin rating notice
|
37 |
public function ajax_rating_notice_handler() {
|
38 |
|
39 |
+
$_post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
|
40 |
|
41 |
$set = $_post['set'];
|
42 |
|
151 |
<?php esc_html_e('I already did', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
152 |
</a>
|
153 |
</div>
|
154 |
+
<div style="white-space:normal; bottom:0; right: 0; margin-bottom: 0px; margin-right: 5px;align-self: flex-end;">
|
155 |
<a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
|
156 |
target="_blank">
|
157 |
<?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
classes/admin/class-debug-info.php
CHANGED
@@ -10,11 +10,9 @@ if (!defined('ABSPATH')) {
|
|
10 |
|
11 |
class Debug_Info {
|
12 |
protected $environment_check;
|
13 |
-
protected $options;
|
14 |
|
15 |
-
public function __construct(
|
16 |
-
$this->
|
17 |
-
$this->environment_check = new Environment_Check($this->options);
|
18 |
}
|
19 |
|
20 |
public function get_debug_info() {
|
@@ -90,7 +88,7 @@ class Debug_Info {
|
|
90 |
|
91 |
// $html .= 'wc_get_page_permalink(\'checkout\'): ' . wc_get_page_permalink('checkout') . PHP_EOL;
|
92 |
|
93 |
-
$html .= PHP_EOL . '## WooCommerce Payment Gateways
|
94 |
$html .= 'Active payment gateways: ' . PHP_EOL;
|
95 |
|
96 |
// $this->get_enabled_payment_gateways();
|
@@ -277,12 +275,12 @@ class Debug_Info {
|
|
277 |
private function get_last_orders( $limit = 100 ) {
|
278 |
// Get most recent order ids in date descending order.
|
279 |
$query = new WC_Order_Query([
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
|
287 |
try {
|
288 |
return $query->get_orders();
|
@@ -371,14 +369,14 @@ class Debug_Info {
|
|
371 |
|
372 |
public function get_earliest_order_with_pixel_fired_tag( $order_ids, $limit ) {
|
373 |
$query = new WC_Order_Query([
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
|
383 |
// error_log(print_r($query->get_orders(), true));
|
384 |
// error_log('min: ' . min($query->get_orders()));
|
10 |
|
11 |
class Debug_Info {
|
12 |
protected $environment_check;
|
|
|
13 |
|
14 |
+
public function __construct() {
|
15 |
+
$this->environment_check = new Environment_Check();
|
|
|
16 |
}
|
17 |
|
18 |
public function get_debug_info() {
|
88 |
|
89 |
// $html .= 'wc_get_page_permalink(\'checkout\'): ' . wc_get_page_permalink('checkout') . PHP_EOL;
|
90 |
|
91 |
+
$html .= PHP_EOL . '## WooCommerce Payment Gateways##' . PHP_EOL . PHP_EOL;
|
92 |
$html .= 'Active payment gateways: ' . PHP_EOL;
|
93 |
|
94 |
// $this->get_enabled_payment_gateways();
|
275 |
private function get_last_orders( $limit = 100 ) {
|
276 |
// Get most recent order ids in date descending order.
|
277 |
$query = new WC_Order_Query([
|
278 |
+
'limit' => $limit,
|
279 |
+
'type' => 'shop_order',
|
280 |
+
'orderby' => 'date',
|
281 |
+
'order' => 'DESC',
|
282 |
+
'return' => 'ids',
|
283 |
+
]);
|
284 |
|
285 |
try {
|
286 |
return $query->get_orders();
|
369 |
|
370 |
public function get_earliest_order_with_pixel_fired_tag( $order_ids, $limit ) {
|
371 |
$query = new WC_Order_Query([
|
372 |
+
'limit' => $limit,
|
373 |
+
// 'orderby' => 'date',
|
374 |
+
// 'order' => 'DESC',
|
375 |
+
'type' => 'shop_order',
|
376 |
+
'return' => 'ids',
|
377 |
+
'post__in' => $order_ids,
|
378 |
+
'meta_key' => '_wpm_conversion_pixel_fired'
|
379 |
+
]);
|
380 |
|
381 |
// error_log(print_r($query->get_orders(), true));
|
382 |
// error_log('min: ' . min($query->get_orders()));
|
classes/admin/class-documentation.php
CHANGED
@@ -10,121 +10,121 @@ class Documentation {
|
|
10 |
protected $documentation_host;
|
11 |
|
12 |
public function __construct() {
|
13 |
-
$this->documentation_host = 'sweetcode.com';
|
14 |
}
|
15 |
|
16 |
public function get_link( $key = 'default' ) {
|
17 |
$documentation_links = [
|
18 |
'default' => [
|
19 |
-
'default' => '/
|
20 |
'wcm' => '/'],
|
21 |
'script_blockers' => [
|
22 |
-
'default' => '/
|
23 |
'wcm' => '/'],
|
24 |
'google_analytics_universal_property' => [
|
25 |
-
'default' => '/
|
26 |
'wcm' => '/'],
|
27 |
'google_analytics_4_id' => [
|
28 |
-
'default' => '/
|
29 |
'wcm' => '/'],
|
30 |
'google_ads_conversion_id' => [
|
31 |
-
'default' => '/
|
32 |
'wcm' => '/'],
|
33 |
'google_ads_conversion_label' => [
|
34 |
-
'default' => '/
|
35 |
'wcm' => '/'],
|
36 |
'google_optimize_container_id' => [
|
37 |
-
'default' => '/
|
38 |
'wcm' => '/'],
|
39 |
'facebook_pixel_id' => [
|
40 |
-
'default' => '/
|
41 |
'wcm' => '/'],
|
42 |
'bing_uet_tag_id' => [
|
43 |
-
'default' => '/
|
44 |
'wcm' => '/'],
|
45 |
'twitter_pixel_id' => [
|
46 |
-
'default' => '/
|
47 |
'wcm' => '/'],
|
48 |
'pinterest_pixel_id' => [
|
49 |
-
'default' => '/
|
50 |
'wcm' => '/'],
|
51 |
'snapchat_pixel_id' => [
|
52 |
-
'default' => '/
|
53 |
'wcm' => '/'],
|
54 |
'tiktok_pixel_id' => [
|
55 |
-
'default' => '/
|
56 |
'wcm' => '/'],
|
57 |
'hotjar_site_id' => [
|
58 |
-
'default' => '/
|
59 |
'wcm' => '/'],
|
60 |
'google_gtag_deactivation' => [
|
61 |
-
'default' => '/docs
|
62 |
'wcm' => '/'],
|
63 |
'google_consent_mode' => [
|
64 |
-
'default' => '/
|
65 |
'wcm' => '/'],
|
66 |
'google_consent_regions' => [
|
67 |
-
'default' => '/
|
68 |
'wcm' => '/'],
|
69 |
'google_analytics_eec' => [
|
70 |
-
'default' => '/
|
71 |
'wcm' => '/'],
|
72 |
'google_analytics_4_api_secret' => [
|
73 |
-
'default' => '/
|
74 |
'wcm' => '/'],
|
75 |
'google_ads_enhanced_conversions' => [
|
76 |
-
'default' => '/
|
77 |
'wcm' => '/'],
|
78 |
'google_ads_phone_conversion_number' => [
|
79 |
-
'default' => '/
|
80 |
'wcm' => '/'],
|
81 |
'google_ads_phone_conversion_label' => [
|
82 |
-
'default' => '/
|
83 |
'wcm' => '/'],
|
84 |
'explicit_consent_mode' => [
|
85 |
-
'default' => '/
|
86 |
'wcm' => '/'],
|
87 |
'facebook_capi_token' => [
|
88 |
-
'default' => '/
|
89 |
'wcm' => '/'],
|
90 |
'facebook_capi_user_transparency_process_anonymous_hits' => [
|
91 |
-
'default' => '/
|
92 |
'wcm' => '/'],
|
93 |
'facebook_capi_user_transparency_send_additional_client_identifiers' => [
|
94 |
-
'default' => '/
|
95 |
'wcm' => '/'],
|
96 |
'facebook_microdata' => [
|
97 |
-
'default' => '/
|
98 |
'wcm' => '/'],
|
99 |
'maximum_compatibility_mode' => [
|
100 |
-
'default' => '/
|
101 |
'wcm' => '/'],
|
102 |
'google_ads_dynamic_remarketing' => [
|
103 |
-
'default' => '/
|
104 |
'wcm' => '/'],
|
105 |
'variations_output' => [
|
106 |
-
'default' => '/
|
107 |
'wcm' => '/'],
|
108 |
'aw_merchant_id' => [
|
109 |
-
'default' => '/
|
110 |
'wcm' => '/'],
|
111 |
'custom_thank_you' => [
|
112 |
-
'default' => '/
|
113 |
'wcm' => '/'],
|
114 |
'the_dismiss_button_doesnt_work_why' => [
|
115 |
-
'default' => '/
|
116 |
'wcm' => '/'],
|
117 |
'wp-rocket-javascript-concatenation' => [
|
118 |
-
'default' => '/
|
119 |
'wcm' => '/'],
|
120 |
'litespeed-cache-inline-javascript-after-dom-ready' => [
|
121 |
-
'default' => '/
|
122 |
'wcm' => '/'],
|
123 |
'payment-gateways' => [
|
124 |
-
'default' => '/
|
125 |
'wcm' => '/'],
|
126 |
'test_order' => [
|
127 |
-
'default' => '/
|
128 |
'wcm' => '/'],
|
129 |
];
|
130 |
|
10 |
protected $documentation_host;
|
11 |
|
12 |
public function __construct() {
|
13 |
+
$this->documentation_host = 'docs.sweetcode.com';
|
14 |
}
|
15 |
|
16 |
public function get_link( $key = 'default' ) {
|
17 |
$documentation_links = [
|
18 |
'default' => [
|
19 |
+
'default' => '/wgact/',
|
20 |
'wcm' => '/'],
|
21 |
'script_blockers' => [
|
22 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=script-blocker-error#/script-blockers',
|
23 |
'wcm' => '/'],
|
24 |
'google_analytics_universal_property' => [
|
25 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-analytics-property-id#/pixels/google-analytics',
|
26 |
'wcm' => '/'],
|
27 |
'google_analytics_4_id' => [
|
28 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-analytics-4-id#/pixels/google-analytics',
|
29 |
'wcm' => '/'],
|
30 |
'google_ads_conversion_id' => [
|
31 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-ads-configure-the-plugin#/pixels/google-ads?id=configure-the-plugin',
|
32 |
'wcm' => '/'],
|
33 |
'google_ads_conversion_label' => [
|
34 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-ads-configure-the_plugin#/pixels/google-ads?id=configure-the-plugin',
|
35 |
'wcm' => '/'],
|
36 |
'google_optimize_container_id' => [
|
37 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-optimize#/pixels/google-optimize',
|
38 |
'wcm' => '/'],
|
39 |
'facebook_pixel_id' => [
|
40 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=facebook-pixel-id#/pixels/facebook',
|
41 |
'wcm' => '/'],
|
42 |
'bing_uet_tag_id' => [
|
43 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=microsoft-advertising-uet-tag-id#/pixels/microsoft-advertising?id=setting-up-the-uet-tag',
|
44 |
'wcm' => '/'],
|
45 |
'twitter_pixel_id' => [
|
46 |
+
'default' => '/wgact/#/twitter',
|
47 |
'wcm' => '/'],
|
48 |
'pinterest_pixel_id' => [
|
49 |
+
'default' => '/wgact/#/pinterest',
|
50 |
'wcm' => '/'],
|
51 |
'snapchat_pixel_id' => [
|
52 |
+
'default' => '/wgact/#/snapchat',
|
53 |
'wcm' => '/'],
|
54 |
'tiktok_pixel_id' => [
|
55 |
+
'default' => '/wgact/#/tiktok',
|
56 |
'wcm' => '/'],
|
57 |
'hotjar_site_id' => [
|
58 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=hotjar-site-id#/pixels/hotjar',
|
59 |
'wcm' => '/'],
|
60 |
'google_gtag_deactivation' => [
|
61 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=gtag-js#/faq?id=google-tag-assistant-reports-multiple-installations-of-global-site-tag-gtagjs-detected-what-shall-i-do',
|
62 |
'wcm' => '/'],
|
63 |
'google_consent_mode' => [
|
64 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-consent-mode#/consent-mgmt/google-consent-mode',
|
65 |
'wcm' => '/'],
|
66 |
'google_consent_regions' => [
|
67 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-consent-mode-regions#/consent-mgmt/google-consent-mode?id=regions',
|
68 |
'wcm' => '/'],
|
69 |
'google_analytics_eec' => [
|
70 |
+
'default' => '/wgact/#/pixels/google-analytics?id=enhanced-e-commerce-funnel-setup',
|
71 |
'wcm' => '/'],
|
72 |
'google_analytics_4_api_secret' => [
|
73 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-analytics-4-api-secret#/pixels/google-analytics?id=ga4-api-secret',
|
74 |
'wcm' => '/'],
|
75 |
'google_ads_enhanced_conversions' => [
|
76 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-ads-enhanced-conversions#/pixels/google-ads?id=enhanced-conversions',
|
77 |
'wcm' => '/'],
|
78 |
'google_ads_phone_conversion_number' => [
|
79 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-ads-phone-conversion-number#/pixels/google-ads?id=phone-conversion-number',
|
80 |
'wcm' => '/'],
|
81 |
'google_ads_phone_conversion_label' => [
|
82 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-ads-phone-conversion-number#/pixels/google-ads?id=phone-conversion-number',
|
83 |
'wcm' => '/'],
|
84 |
'explicit_consent_mode' => [
|
85 |
+
'default' => '/wgact/#/consent-mgmt/overview?id=explicit-consent-mode',
|
86 |
'wcm' => '/'],
|
87 |
'facebook_capi_token' => [
|
88 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=facebook-capi-token#/pixels/facebook?id=facebook-conversion-api-capi',
|
89 |
'wcm' => '/'],
|
90 |
'facebook_capi_user_transparency_process_anonymous_hits' => [
|
91 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=facebook-capi-transparency-settings#/pixels/facebook?id=user-transparency-settings',
|
92 |
'wcm' => '/'],
|
93 |
'facebook_capi_user_transparency_send_additional_client_identifiers' => [
|
94 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=facebook-capi-transparency-settings#/pixels/facebook?id=user-transparency-settings',
|
95 |
'wcm' => '/'],
|
96 |
'facebook_microdata' => [
|
97 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=facebook-microdata#/pixels/facebook?id=microdata-tags-for-catalogues',
|
98 |
'wcm' => '/'],
|
99 |
'maximum_compatibility_mode' => [
|
100 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=maximum-compatibility-mode#/general?id=maximum-compatibility-mode',
|
101 |
'wcm' => '/'],
|
102 |
'google_ads_dynamic_remarketing' => [
|
103 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=dynamic-remarketing#/dynamic-remarketing',
|
104 |
'wcm' => '/'],
|
105 |
'variations_output' => [
|
106 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=dynamic-remarketing#/dynamic-remarketing',
|
107 |
'wcm' => '/'],
|
108 |
'aw_merchant_id' => [
|
109 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=conversion-cart-data#/pixels/google-ads?id=conversion-cart-data',
|
110 |
'wcm' => '/'],
|
111 |
'custom_thank_you' => [
|
112 |
+
'default' => '/wgact/#/troubleshooting?id=wc-custom-thank-you',
|
113 |
'wcm' => '/'],
|
114 |
'the_dismiss_button_doesnt_work_why' => [
|
115 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=wpp-pixel-manager-docs&utm_content=dismiss-button-info#/faq?id=the-dismiss-button-doesnt-work-why',
|
116 |
'wcm' => '/'],
|
117 |
'wp-rocket-javascript-concatenation' => [
|
118 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=wp-rocket-javascript-concatenation-error#/troubleshooting?id=wp-rocket-javascript-concatenation',
|
119 |
'wcm' => '/'],
|
120 |
'litespeed-cache-inline-javascript-after-dom-ready' => [
|
121 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=litespeed-inline-js-dom-ready-error#/troubleshooting?id=litespeed-cache-inline-javascript-after-dom-ready',
|
122 |
'wcm' => '/'],
|
123 |
'payment-gateways' => [
|
124 |
+
'default' => '/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=paypal-standard-warning#/requirements?id=payment-gateways',
|
125 |
'wcm' => '/'],
|
126 |
'test_order' => [
|
127 |
+
'default' => '/wgact/#/test-order',
|
128 |
'wcm' => '/'],
|
129 |
];
|
130 |
|
classes/admin/class-environment-check.php
CHANGED
@@ -7,17 +7,12 @@ if (!defined('ABSPATH')) {
|
|
7 |
}
|
8 |
|
9 |
class Environment_Check {
|
10 |
-
|
11 |
-
public $notifications;
|
12 |
private $documentation;
|
13 |
-
private $order_redirect = null;
|
14 |
-
private $options;
|
15 |
|
16 |
-
public function __construct(
|
17 |
if (is_admin()) {
|
18 |
|
19 |
-
$this->options = $options;
|
20 |
-
|
21 |
$this->notifications = new Notifications();
|
22 |
$this->documentation = new Documentation();
|
23 |
|
@@ -164,33 +159,25 @@ class Environment_Check {
|
|
164 |
|
165 |
public function flush_flying_press_cache() {
|
166 |
try {
|
167 |
-
if (class_exists('\FlyingPress\
|
168 |
-
\FlyingPress\Purge::purge_cached_pages();
|
169 |
-
}
|
170 |
|
171 |
-
//
|
172 |
-
//
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
// // No other 'normal' way is possible.
|
178 |
-
//
|
179 |
-
// if (!is_array(\FlyingPress\Config::$config['js_defer_excludes'])) {
|
180 |
-
// \FlyingPress\Config::$config['js_defer_excludes'] = [];
|
181 |
-
// }
|
182 |
-
//
|
183 |
-
// \FlyingPress\Config::$config['js_defer_excludes'] = array_unique(array_merge(\FlyingPress\Config::$config['js_defer_excludes'], $this->get_wpm_script_identifiers()));
|
184 |
-
//
|
185 |
-
// if (
|
186 |
-
// method_exists('\FlyingPress\Config', 'update_config') &&
|
187 |
-
// method_exists('\FlyingPress\Purge', 'purge_cached_pages')
|
188 |
-
// ) {
|
189 |
-
// \FlyingPress\Config::update_config(\FlyingPress\Config::$config);
|
190 |
-
// \FlyingPress\Purge::purge_cached_pages();
|
191 |
-
// }
|
192 |
-
// }
|
193 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
194 |
} catch (\Exception $e) {
|
195 |
error_log($e);
|
196 |
}
|
@@ -340,7 +327,7 @@ class Environment_Check {
|
|
340 |
|
341 |
public function ajax_environment_check_handler() {
|
342 |
|
343 |
-
$_post = filter_input_array(INPUT_POST,
|
344 |
|
345 |
if (isset($_post['set'])) {
|
346 |
|
@@ -594,7 +581,7 @@ class Environment_Check {
|
|
594 |
|
595 |
public function is_hosting_cloudways() {
|
596 |
|
597 |
-
$_server = filter_input_array(INPUT_SERVER,
|
598 |
|
599 |
return array_key_exists('cw_allowed_ip', $_server) || preg_match('~/home/.*?cloudways.*~', __FILE__);
|
600 |
}
|
@@ -691,13 +678,115 @@ class Environment_Check {
|
|
691 |
return 0;
|
692 |
}
|
693 |
|
694 |
-
|
695 |
-
|
696 |
-
|
697 |
-
|
698 |
-
|
699 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
700 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
701 |
|
702 |
public function wp_optimize_minify_default_exclusions( $default_exclusions ) {
|
703 |
// $default_exclusions[] = 'something/else.js';
|
@@ -769,7 +858,6 @@ class Environment_Check {
|
|
769 |
}
|
770 |
|
771 |
public function sg_optimizer_js_minify_exclude( $exclude_list ) {
|
772 |
-
|
773 |
$exclude_list[] = 'wpm-front-end-scripts';
|
774 |
$exclude_list[] = 'wpm-front-end-scripts-premium-only';
|
775 |
$exclude_list[] = 'wpm';
|
@@ -793,7 +881,6 @@ class Environment_Check {
|
|
793 |
}
|
794 |
|
795 |
public function sgo_javascript_combine_exclude_move_after( $exclude_list ) {
|
796 |
-
|
797 |
if (is_array($exclude_list)) {
|
798 |
$exclude_list = array_unique(array_merge($exclude_list, $this->get_wpm_script_identifiers()));
|
799 |
}
|
@@ -866,202 +953,17 @@ class Environment_Check {
|
|
866 |
}
|
867 |
}
|
868 |
|
869 |
-
public function
|
870 |
-
|
871 |
-
/**
|
872 |
-
* SiteGround Optimizer
|
873 |
-
*/
|
874 |
-
|
875 |
-
if ($this->is_sg_optimizer_active()) {
|
876 |
-
|
877 |
-
/**
|
878 |
-
* The function wpmFunctionExists needs to be excluded from combination from SGO.
|
879 |
-
* Otherwise, it won't work on pages which include WPM shortcodes.
|
880 |
-
* */
|
881 |
-
|
882 |
-
add_filter('sgo_javascript_combine_excluded_inline_content', function ( $excluded_scripts ) {
|
883 |
-
$excluded_scripts[] = 'wpmFunctionExists';
|
884 |
-
return $excluded_scripts;
|
885 |
-
});
|
886 |
-
|
887 |
-
/**
|
888 |
-
* SGO's defer feature doesn't queue jQuery correctly on some pages,
|
889 |
-
* leading to errors "jQuery not defined" errors on several pages
|
890 |
-
* and thus breaking tracking in those cases.
|
891 |
-
*
|
892 |
-
* Therefore, we need to exclude jquery-core from deferring.
|
893 |
-
* */
|
894 |
-
|
895 |
-
add_filter('sgo_js_async_exclude', function ( $excludes ) {
|
896 |
-
$excludes[] = 'jquery-core';
|
897 |
-
return $excludes;
|
898 |
-
});
|
899 |
-
}
|
900 |
-
|
901 |
-
/**
|
902 |
-
* Litespeed
|
903 |
-
*/
|
904 |
-
|
905 |
if ($this->is_litespeed_active()) {
|
906 |
-
add_filter('
|
907 |
-
if (is_array($excludes)) {
|
908 |
-
$excludes[] = 'wpmFunctionExists';
|
909 |
-
}
|
910 |
-
|
911 |
-
return $excludes;
|
912 |
-
});
|
913 |
}
|
914 |
-
}
|
915 |
|
916 |
-
|
917 |
-
|
918 |
-
$this->compatibility_mode_yoast_seo();
|
919 |
-
|
920 |
-
$this->compatibility_mode_prevent_third_party_js_optimization();
|
921 |
-
}
|
922 |
-
|
923 |
-
protected function compatibility_mode_prevent_third_party_js_optimization() {
|
924 |
-
|
925 |
-
if ($this->is_wp_rocket_active()) {
|
926 |
-
$this->disable_wp_rocket_js_optimization();
|
927 |
-
}
|
928 |
-
|
929 |
-
if ($this->is_flying_press_active()) {
|
930 |
-
$this->disable_flying_press_js_optimization();
|
931 |
-
}
|
932 |
-
|
933 |
-
if ($this->is_optimocha_active()) {
|
934 |
-
$this->disable_optimocha_js_optimization();
|
935 |
-
}
|
936 |
-
|
937 |
-
if ($this->is_wp_optimize_active()) {
|
938 |
-
$this->disable_wp_optimize_js_optimization();
|
939 |
-
}
|
940 |
-
|
941 |
-
if ($this->is_async_javascript_active()) {
|
942 |
-
$this->disable_async_javascript_js_optimization();
|
943 |
-
}
|
944 |
-
|
945 |
-
if ($this->is_sg_optimizer_active()) {
|
946 |
-
$this->disable_sg_optimizer_js_optimization();
|
947 |
-
}
|
948 |
-
|
949 |
-
if ($this->is_litespeed_active()) {
|
950 |
-
$this->disable_litespeed_js_optimization();
|
951 |
-
}
|
952 |
-
|
953 |
-
if ($this->is_autoptimize_active()) {
|
954 |
-
$this->disable_autoptimze_js_optimization();
|
955 |
-
}
|
956 |
-
}
|
957 |
-
|
958 |
-
protected function disable_sg_optimizer_js_optimization() {
|
959 |
-
|
960 |
-
add_filter('sgo_javascript_combine_excluded_inline_content', [$this, 'sg_optimizer_js_exclude_combine_inline_content']);
|
961 |
-
add_filter('sgo_javascript_combine_exclude', [$this, 'sgo_javascript_combine_exclude_move_after']);
|
962 |
-
add_filter('sgo_javascript_combine_exclude_move_after', [$this, 'sgo_javascript_combine_exclude_move_after']);
|
963 |
-
add_filter('sgo_js_minify_exclude', [$this, 'sg_optimizer_js_minify_exclude']);
|
964 |
-
add_filter('sgo_js_async_exclude', [$this, 'sgo_javascript_combine_exclude_move_after']);
|
965 |
-
}
|
966 |
-
|
967 |
-
protected function disable_litespeed_js_optimization() {
|
968 |
-
add_filter('litespeed_optimize_js_excludes', [$this, 'litespeed_optimize_js_excludes']);
|
969 |
-
add_filter('litespeed_optm_js_defer_exc', [$this, 'litespeed_cache_js_defer_exc']);
|
970 |
-
add_filter('litespeed_optm_cssjs', [$this, 'litespeed_optm_cssjs']);
|
971 |
-
add_filter('option_litespeed.conf.optm-js_inline_defer', [$this, 'disable_litespeed_js_inline_after_dom']);
|
972 |
-
}
|
973 |
-
|
974 |
-
protected function disable_autoptimze_js_optimization() {
|
975 |
-
add_filter('autoptimize_filter_js_consider_minified', [$this, 'autoptimize_filter_js_consider_minified']);
|
976 |
-
add_filter('autoptimize_filter_js_dontmove', [$this, 'autoptimize_filter_js_dontmove']);
|
977 |
-
}
|
978 |
-
|
979 |
-
protected function disable_wp_optimize_js_optimization() {
|
980 |
-
// add_filter('wpo_minify_inline_js', '__return_false');
|
981 |
-
add_filter('wp-optimize-minify-default-exclusions', [$this, 'wp_optimize_minify_default_exclusions']);
|
982 |
-
}
|
983 |
-
|
984 |
-
protected function disable_async_javascript_js_optimization() {
|
985 |
-
add_filter('option_aj_plugin_exclusions', function ( $options ) {
|
986 |
-
|
987 |
-
if (!is_array($options)) {
|
988 |
-
$options = [];
|
989 |
-
}
|
990 |
-
|
991 |
-
return array_unique(array_merge($options, [
|
992 |
-
'woocommerce-google-adwords-conversion-tracking-tag',
|
993 |
-
'woopt-pixel-manager-pro',
|
994 |
-
'woocommerce-pixel-manager',
|
995 |
-
'woocommerce-pixel-manager-pro',
|
996 |
-
]));
|
997 |
-
});
|
998 |
-
}
|
999 |
-
|
1000 |
-
protected function disable_optimocha_js_optimization() {
|
1001 |
-
add_filter('option_sbp_options', function ( $options ) {
|
1002 |
-
|
1003 |
-
if (isset($options['js_exclude'])) {
|
1004 |
-
$options['js_exclude'] = $options['js_exclude'] . PHP_EOL . implode(PHP_EOL, $this->get_wpm_script_identifiers());
|
1005 |
-
$js_include = explode(PHP_EOL, $options['js_include']);
|
1006 |
-
$js_include = array_filter($js_include, function ( $string ) {
|
1007 |
-
foreach ($this->get_wpm_script_identifiers() as $value) {
|
1008 |
-
if (strpos($string, $value) !== false) {
|
1009 |
-
return false;
|
1010 |
-
}
|
1011 |
-
}
|
1012 |
-
|
1013 |
-
return true;
|
1014 |
-
});
|
1015 |
-
$options['js_include'] = implode(PHP_EOL, $js_include);
|
1016 |
-
}
|
1017 |
-
|
1018 |
-
return $options;
|
1019 |
-
});
|
1020 |
-
}
|
1021 |
-
|
1022 |
-
protected function disable_flying_press_js_optimization() {
|
1023 |
-
add_filter('pre_update_option_FLYING_PRESS_CONFIG', function ( $options ) {
|
1024 |
-
|
1025 |
-
if (isset($options['js_defer_excludes'])) {
|
1026 |
-
$options['js_defer_excludes'] = array_unique(array_merge($options['js_defer_excludes'], $this->get_wpm_script_identifiers()));
|
1027 |
-
}
|
1028 |
-
|
1029 |
-
return $options;
|
1030 |
-
});
|
1031 |
-
|
1032 |
-
add_filter('option_FLYING_PRESS_CONFIG', function ( $options ) {
|
1033 |
-
|
1034 |
-
if (isset($options['js_defer_excludes'])) {
|
1035 |
-
$options['js_defer_excludes'] = array_unique(array_merge($options['js_defer_excludes'], $this->get_wpm_script_identifiers()));
|
1036 |
-
}
|
1037 |
-
return $options;
|
1038 |
-
});
|
1039 |
-
|
1040 |
-
// Make sure to never delay JS until interaction
|
1041 |
-
// if ($this->is_flying_press_active()) {
|
1042 |
-
// add_filter('option_FLYING_PRESS_CONFIG', function ( $options ) {
|
1043 |
-
// if (isset($options['js_interaction'])) {
|
1044 |
-
// $options['js_interaction'] = false;
|
1045 |
-
// }
|
1046 |
-
// return $options;
|
1047 |
-
// });
|
1048 |
-
// }
|
1049 |
}
|
1050 |
|
1051 |
-
|
1052 |
-
|
1053 |
-
$this->exclude_inline_scripts_from_wp_rocket_using_options();
|
1054 |
-
add_filter('rocket_delay_js_exclusions', [$this, 'add_wp_rocket_exclusions']);
|
1055 |
-
add_filter('rocket_defer_inline_exclusions', [$this, 'add_wp_rocket_exclusions']);
|
1056 |
-
add_filter('rocket_exclude_defer_js', [$this, 'add_wp_rocket_exclusions']);
|
1057 |
-
add_filter('rocket_exclude_js', [$this, 'add_wp_rocket_exclusions']);
|
1058 |
-
add_filter('rocket_minify_excluded_external_js', [$this, 'add_wp_rocket_exclusions']);
|
1059 |
-
add_filter('rocket_excluded_inline_js_content', [$this, 'add_wp_rocket_exclusions']);
|
1060 |
-
}
|
1061 |
-
|
1062 |
-
public function compatibility_mode_yoast_seo() {
|
1063 |
-
|
1064 |
-
if ($this->is_yoast_seo_active() && isset($this->options['facebook']['microdata']) && $this->options['facebook']['microdata']) {
|
1065 |
add_filter('option_wpseo_social', [$this, 'disable_yoast_seo_facebook_social']);
|
1066 |
}
|
1067 |
}
|
@@ -1070,13 +972,11 @@ class Environment_Check {
|
|
1070 |
return [
|
1071 |
'optimize.js',
|
1072 |
'googleoptimize.com/optimize.js',
|
1073 |
-
'jquery',
|
1074 |
'jQuery',
|
1075 |
'jQuery.min.js',
|
1076 |
'jquery.js',
|
1077 |
'jquery.min.js',
|
1078 |
'wpm',
|
1079 |
-
'wpm-js',
|
1080 |
'wpmDataLayer',
|
1081 |
'window.wpmDataLayer',
|
1082 |
'wpm.js',
|
@@ -1128,63 +1028,48 @@ class Environment_Check {
|
|
1128 |
}
|
1129 |
|
1130 |
public function does_url_redirect( $url ) {
|
1131 |
-
|
1132 |
-
|
1133 |
-
|
1134 |
-
|
1135 |
-
|
1136 |
-
|
1137 |
-
'ssl' => [
|
1138 |
-
'verify_peer' => false,
|
1139 |
-
'verify_peer_name' => false,
|
1140 |
-
],
|
1141 |
-
]);
|
1142 |
|
1143 |
// $headers = get_headers($url, 1, $context);
|
1144 |
|
1145 |
-
|
1146 |
|
1147 |
-
|
1148 |
-
|
1149 |
-
|
1150 |
-
|
1151 |
-
$this->order_redirect = false;
|
1152 |
-
return false;
|
1153 |
-
}
|
1154 |
}
|
1155 |
}
|
1156 |
|
1157 |
-
|
1158 |
protected function get_headers_with_stream_context( $url, $context, $assoc = 0 ) {
|
|
|
|
|
|
|
1159 |
|
1160 |
-
$
|
1161 |
-
|
1162 |
-
if (!is_bool($fp)) {
|
1163 |
|
1164 |
-
|
1165 |
-
|
1166 |
-
|
1167 |
-
$headerLines = $metaData['wrapper_data'];
|
1168 |
-
|
1169 |
-
if (!$assoc) {
|
1170 |
-
return $headerLines;
|
1171 |
-
}
|
1172 |
-
|
1173 |
-
$headers = [];
|
1174 |
-
foreach ($headerLines as $line) {
|
1175 |
-
if (strpos($line, 'HTTP') === 0) {
|
1176 |
-
$headers[0] = $line;
|
1177 |
-
continue;
|
1178 |
-
}
|
1179 |
|
1180 |
-
|
1181 |
-
|
|
|
|
|
|
|
1182 |
}
|
1183 |
|
1184 |
-
|
1185 |
-
|
1186 |
-
return [];
|
1187 |
}
|
|
|
|
|
1188 |
}
|
1189 |
|
1190 |
public function get_redirect_url( $url ) {
|
@@ -1221,12 +1106,12 @@ class Environment_Check {
|
|
1221 |
public function get_last_order_id() {
|
1222 |
|
1223 |
$orders = wc_get_orders([
|
1224 |
-
|
1225 |
-
|
1226 |
-
|
1227 |
-
|
1228 |
-
|
1229 |
-
|
1230 |
|
1231 |
// error_log(reset($orders));
|
1232 |
|
7 |
}
|
8 |
|
9 |
class Environment_Check {
|
10 |
+
public $notifications;
|
|
|
11 |
private $documentation;
|
|
|
|
|
12 |
|
13 |
+
public function __construct() {
|
14 |
if (is_admin()) {
|
15 |
|
|
|
|
|
16 |
$this->notifications = new Notifications();
|
17 |
$this->documentation = new Documentation();
|
18 |
|
159 |
|
160 |
public function flush_flying_press_cache() {
|
161 |
try {
|
162 |
+
if (class_exists('\FlyingPress\Config') && class_exists('\FlyingPress\Purge')) {
|
|
|
|
|
163 |
|
164 |
+
// This is the way to update the Flying Press settings.
|
165 |
+
// No other 'normal' way is possible.
|
166 |
+
|
167 |
+
if (!is_array(\FlyingPress\Config::$config['js_defer_excludes'])) {
|
168 |
+
\FlyingPress\Config::$config['js_defer_excludes'] = [];
|
169 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
|
171 |
+
\FlyingPress\Config::$config['js_defer_excludes'] = array_unique(array_merge(\FlyingPress\Config::$config['js_defer_excludes'], $this->get_wpm_script_identifiers()));
|
172 |
+
|
173 |
+
if (
|
174 |
+
method_exists('\FlyingPress\Config', 'update_config') &&
|
175 |
+
method_exists('\FlyingPress\Purge', 'purge_cached_pages')
|
176 |
+
) {
|
177 |
+
\FlyingPress\Config::update_config(\FlyingPress\Config::$config);
|
178 |
+
\FlyingPress\Purge::purge_cached_pages();
|
179 |
+
}
|
180 |
+
}
|
181 |
} catch (\Exception $e) {
|
182 |
error_log($e);
|
183 |
}
|
327 |
|
328 |
public function ajax_environment_check_handler() {
|
329 |
|
330 |
+
$_post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
|
331 |
|
332 |
if (isset($_post['set'])) {
|
333 |
|
581 |
|
582 |
public function is_hosting_cloudways() {
|
583 |
|
584 |
+
$_server = filter_input_array(INPUT_SERVER, FILTER_SANITIZE_STRING);
|
585 |
|
586 |
return array_key_exists('cw_allowed_ip', $_server) || preg_match('~/home/.*?cloudways.*~', __FILE__);
|
587 |
}
|
678 |
return 0;
|
679 |
}
|
680 |
|
681 |
+
public function disable_wp_rocket_js_optimizations( $option ) {
|
682 |
+
$option['minify_concatenate_js'] = 0;
|
683 |
+
// $option['defer_all_js'] = 0;
|
684 |
+
// $option['delay_js'] = 0;
|
685 |
+
return $option;
|
686 |
+
}
|
687 |
+
|
688 |
+
public function permanent_compatibility_mode() {
|
689 |
+
if ($this->is_wp_rocket_active()) {
|
690 |
+
$this->exclude_inline_scripts_from_wp_rocket_using_options();
|
691 |
+
}
|
692 |
+
|
693 |
+
// for testing you need to clear the WP Rocket cache, only then the filters run
|
694 |
+
if ($this->is_wp_rocket_active()) {
|
695 |
+
add_filter('rocket_delay_js_exclusions', [$this, 'add_wp_rocket_exclusions']);
|
696 |
+
add_filter('rocket_defer_inline_exclusions', [$this, 'add_wp_rocket_exclusions']);
|
697 |
+
add_filter('rocket_exclude_defer_js', [$this, 'add_wp_rocket_exclusions']);
|
698 |
+
add_filter('rocket_exclude_js', [$this, 'add_wp_rocket_exclusions']);
|
699 |
+
add_filter('rocket_minify_excluded_external_js', [$this, 'add_wp_rocket_exclusions']);
|
700 |
+
add_filter('rocket_excluded_inline_js_content', [$this, 'add_wp_rocket_exclusions']);
|
701 |
+
}
|
702 |
+
|
703 |
+
if ($this->is_sg_optimizer_active()) {
|
704 |
+
add_filter('sgo_javascript_combine_excluded_inline_content', [$this, 'sg_optimizer_js_exclude_combine_inline_content']);
|
705 |
+
add_filter('sgo_js_minify_exclude', [$this, 'sg_optimizer_js_minify_exclude']);
|
706 |
+
add_filter('sgo_javascript_combine_exclude_move_after', [$this, 'sgo_javascript_combine_exclude_move_after']);
|
707 |
+
}
|
708 |
+
|
709 |
+
if ($this->is_litespeed_active()) {
|
710 |
+
add_filter('litespeed_optm_js_defer_exc', [$this, 'litespeed_cache_js_defer_exc']);
|
711 |
+
add_filter('litespeed_optimize_js_excludes', [$this, 'litespeed_optimize_js_excludes']);
|
712 |
+
add_filter('litespeed_optm_cssjs', [$this, 'litespeed_optm_cssjs']);
|
713 |
+
// add_filter('option_litespeed.conf.optm-js_inline_defer', [$this, 'disable_litespeed_js_inline_after_dom']);
|
714 |
+
|
715 |
+
// litespeed_optm_cssjs
|
716 |
+
// litespeed_optm_html_head
|
717 |
+
}
|
718 |
|
719 |
+
if ($this->is_autoptimize_active()) {
|
720 |
+
add_filter('autoptimize_filter_js_consider_minified', [$this, 'autoptimize_filter_js_consider_minified']);
|
721 |
+
add_filter('autoptimize_filter_js_dontmove', [$this, 'autoptimize_filter_js_dontmove']);
|
722 |
+
}
|
723 |
+
|
724 |
+
if ($this->is_wp_optimize_active()) {
|
725 |
+
// add_filter('wpo_minify_inline_js', '__return_false');
|
726 |
+
add_filter('wp-optimize-minify-default-exclusions', [$this, 'wp_optimize_minify_default_exclusions']);
|
727 |
+
}
|
728 |
+
|
729 |
+
if ($this->is_optimocha_active()) {
|
730 |
+
add_filter('option_sbp_options', function ( $options ) {
|
731 |
+
|
732 |
+
$options['js_exclude'] = $options['js_exclude'] . PHP_EOL . implode(PHP_EOL, $this->get_wpm_script_identifiers());
|
733 |
+
|
734 |
+
$js_include = explode(PHP_EOL, $options['js_include']);
|
735 |
+
|
736 |
+
$js_include = array_filter($js_include, function ( $string ) {
|
737 |
+
foreach ($this->get_wpm_script_identifiers() as $value) {
|
738 |
+
if (strpos($string, $value) !== false) {
|
739 |
+
return false;
|
740 |
+
}
|
741 |
+
}
|
742 |
+
|
743 |
+
return true;
|
744 |
+
});
|
745 |
+
|
746 |
+
$options['js_include'] = implode(PHP_EOL, $js_include);
|
747 |
+
|
748 |
+
return $options;
|
749 |
+
});
|
750 |
+
}
|
751 |
+
|
752 |
+
if ($this->is_async_javascript_active()) {
|
753 |
+
|
754 |
+
// add_filter('option_aj_exclusions', function ($options) {
|
755 |
+
// $options = explode(',', $options);
|
756 |
+
// $options = array_unique(array_merge($options, $this->get_wpm_script_identifiers()));
|
757 |
+
// return implode(',', $options);
|
758 |
+
// });
|
759 |
+
|
760 |
+
add_filter('option_aj_plugin_exclusions', function ( $options ) {
|
761 |
+
|
762 |
+
if (!is_array($options)) {
|
763 |
+
$options = [];
|
764 |
+
}
|
765 |
+
|
766 |
+
return array_unique(array_merge($options, [
|
767 |
+
'woocommerce-google-adwords-conversion-tracking-tag',
|
768 |
+
'woopt-pixel-manager-pro',
|
769 |
+
'woocommerce-pixel-manager',
|
770 |
+
'woocommerce-pixel-manager-pro',
|
771 |
+
]));
|
772 |
+
});
|
773 |
+
}
|
774 |
+
|
775 |
+
if ($this->is_flying_press_active()) {
|
776 |
+
|
777 |
+
add_filter('pre_update_option_FLYING_PRESS_CONFIG', function ( $options ) {
|
778 |
+
|
779 |
+
$options['js_defer_excludes'] = array_unique(array_merge($options['js_defer_excludes'], $this->get_wpm_script_identifiers()));
|
780 |
+
return $options;
|
781 |
+
});
|
782 |
+
|
783 |
+
add_filter('option_FLYING_PRESS_CONFIG', function ( $options ) {
|
784 |
+
|
785 |
+
$options['js_defer_excludes'] = array_unique(array_merge($options['js_defer_excludes'], $this->get_wpm_script_identifiers()));
|
786 |
+
return $options;
|
787 |
+
});
|
788 |
+
}
|
789 |
+
}
|
790 |
|
791 |
public function wp_optimize_minify_default_exclusions( $default_exclusions ) {
|
792 |
// $default_exclusions[] = 'something/else.js';
|
858 |
}
|
859 |
|
860 |
public function sg_optimizer_js_minify_exclude( $exclude_list ) {
|
|
|
861 |
$exclude_list[] = 'wpm-front-end-scripts';
|
862 |
$exclude_list[] = 'wpm-front-end-scripts-premium-only';
|
863 |
$exclude_list[] = 'wpm';
|
881 |
}
|
882 |
|
883 |
public function sgo_javascript_combine_exclude_move_after( $exclude_list ) {
|
|
|
884 |
if (is_array($exclude_list)) {
|
885 |
$exclude_list = array_unique(array_merge($exclude_list, $this->get_wpm_script_identifiers()));
|
886 |
}
|
953 |
}
|
954 |
}
|
955 |
|
956 |
+
public function enable_maximum_compatibility_mode() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
957 |
if ($this->is_litespeed_active()) {
|
958 |
+
add_filter('option_litespeed.conf.optm-js_inline_defer', [$this, 'disable_litespeed_js_inline_after_dom']);
|
|
|
|
|
|
|
|
|
|
|
|
|
959 |
}
|
|
|
960 |
|
961 |
+
// disabling WP Rocket js optimizations not necessary here, since we add permanent script specific exclusions
|
962 |
+
// if ($this->is_wp_rocket_active()) add_filter('option_wp_rocket_settings', [$this, 'disable_wp_rocket_js_optimizations']);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
963 |
}
|
964 |
|
965 |
+
public function enable_maximum_compatibility_mode_yoast_seo() {
|
966 |
+
if ($this->is_yoast_seo_active()) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
967 |
add_filter('option_wpseo_social', [$this, 'disable_yoast_seo_facebook_social']);
|
968 |
}
|
969 |
}
|
972 |
return [
|
973 |
'optimize.js',
|
974 |
'googleoptimize.com/optimize.js',
|
|
|
975 |
'jQuery',
|
976 |
'jQuery.min.js',
|
977 |
'jquery.js',
|
978 |
'jquery.min.js',
|
979 |
'wpm',
|
|
|
980 |
'wpmDataLayer',
|
981 |
'window.wpmDataLayer',
|
982 |
'wpm.js',
|
1028 |
}
|
1029 |
|
1030 |
public function does_url_redirect( $url ) {
|
1031 |
+
$context = stream_context_create([
|
1032 |
+
'ssl' => [
|
1033 |
+
'verify_peer' => false,
|
1034 |
+
'verify_peer_name' => false,
|
1035 |
+
],
|
1036 |
+
]);
|
|
|
|
|
|
|
|
|
|
|
1037 |
|
1038 |
// $headers = get_headers($url, 1, $context);
|
1039 |
|
1040 |
+
$headers = $this->get_headers_with_stream_context($url, $context, 1);
|
1041 |
|
1042 |
+
if (!empty($headers['Location'])) {
|
1043 |
+
return true;
|
1044 |
+
} else {
|
1045 |
+
return false;
|
|
|
|
|
|
|
1046 |
}
|
1047 |
}
|
1048 |
|
1049 |
+
// https://stackoverflow.com/questions/8429342/php-get-headers-set-temporary-stream-context
|
1050 |
protected function get_headers_with_stream_context( $url, $context, $assoc = 0 ) {
|
1051 |
+
$fp = fopen($url, 'r', null, $context);
|
1052 |
+
$metaData = stream_get_meta_data($fp);
|
1053 |
+
fclose($fp);
|
1054 |
|
1055 |
+
$headerLines = $metaData['wrapper_data'];
|
|
|
|
|
1056 |
|
1057 |
+
if (!$assoc) {
|
1058 |
+
return $headerLines;
|
1059 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1060 |
|
1061 |
+
$headers = [];
|
1062 |
+
foreach ($headerLines as $line) {
|
1063 |
+
if (strpos($line, 'HTTP') === 0) {
|
1064 |
+
$headers[0] = $line;
|
1065 |
+
continue;
|
1066 |
}
|
1067 |
|
1068 |
+
list($key, $value) = explode(': ', $line);
|
1069 |
+
$headers[$key] = $value;
|
|
|
1070 |
}
|
1071 |
+
|
1072 |
+
return $headers;
|
1073 |
}
|
1074 |
|
1075 |
public function get_redirect_url( $url ) {
|
1106 |
public function get_last_order_id() {
|
1107 |
|
1108 |
$orders = wc_get_orders([
|
1109 |
+
'limit' => 1,
|
1110 |
+
'orderby' => 'date',
|
1111 |
+
'order' => 'DESC',
|
1112 |
+
'return' => 'ids',
|
1113 |
+
'post_type' => 'shop_order'
|
1114 |
+
]);
|
1115 |
|
1116 |
// error_log(reset($orders));
|
1117 |
|
classes/admin/class-notifications.php
CHANGED
@@ -125,7 +125,7 @@ class Notifications {
|
|
125 |
<div id="wpm-paypal-standard-error-dismissal-button" class="button" style="white-space:normal;">
|
126 |
<?php esc_html_e('Click here to dismiss this warning forever', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
127 |
</div>
|
128 |
-
<div style="white-space:normal; bottom:0; right: 0; margin-bottom:
|
129 |
<a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
|
130 |
target="_blank">
|
131 |
<?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
@@ -174,7 +174,7 @@ class Notifications {
|
|
174 |
data-plugin-slug="<?php echo esc_js($slug); ?>">
|
175 |
<?php esc_html_e('Click here to dismiss this warning forever', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
176 |
</div>
|
177 |
-
<div style="white-space:normal; bottom:0; right: 0; margin-bottom:
|
178 |
<a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
|
179 |
target="_blank">
|
180 |
<?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
125 |
<div id="wpm-paypal-standard-error-dismissal-button" class="button" style="white-space:normal;">
|
126 |
<?php esc_html_e('Click here to dismiss this warning forever', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
127 |
</div>
|
128 |
+
<div style="white-space:normal; bottom:0; right: 0; margin-bottom: 0px; margin-right: 5px;align-self: flex-end;">
|
129 |
<a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
|
130 |
target="_blank">
|
131 |
<?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
174 |
data-plugin-slug="<?php echo esc_js($slug); ?>">
|
175 |
<?php esc_html_e('Click here to dismiss this warning forever', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
176 |
</div>
|
177 |
+
<div style="white-space:normal; bottom:0; right: 0; margin-bottom: 0px; margin-right: 5px;align-self: flex-end;">
|
178 |
<a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
|
179 |
target="_blank">
|
180 |
<?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
|
classes/class-default-options.php
CHANGED
@@ -77,18 +77,14 @@ class Default_Options {
|
|
77 |
'site_id' => ''
|
78 |
],
|
79 |
'shop' => [
|
80 |
-
'order_total_logic'
|
81 |
-
'cookie_consent_mgmt'
|
82 |
-
'cookiebot' => [
|
83 |
-
|
84 |
],
|
85 |
'explicit_consent' => 0,
|
86 |
],
|
87 |
-
'order_deduplication'
|
88 |
-
'disable_tracking_for' => [
|
89 |
-
'administrator',
|
90 |
-
'shop_manager',
|
91 |
-
],
|
92 |
],
|
93 |
'general' => [
|
94 |
'variations_output' => 1,
|
@@ -99,49 +95,17 @@ class Default_Options {
|
|
99 |
];
|
100 |
}
|
101 |
|
102 |
-
public function update_with_defaults( $
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
// copy all default values,
|
111 |
-
// including the subtree if one exists,
|
112 |
-
// into the target array.
|
113 |
-
if (!isset($target_array[$default_key])) {
|
114 |
-
$target_array[$default_key] = $default_value;
|
115 |
-
|
116 |
-
// We only want to keep going down the tree
|
117 |
-
// if the array contains more settings in an associative array,
|
118 |
-
// otherwise we keep the settings of what's in the target array.
|
119 |
-
} elseif ($this->is_associative_array($default_value)) {
|
120 |
-
|
121 |
-
$target_array[$default_key] = $this->update_with_defaults($target_array[$default_key], $default_value);
|
122 |
}
|
123 |
}
|
124 |
|
125 |
-
|
126 |
-
return $target_array;
|
127 |
-
}
|
128 |
-
|
129 |
-
protected function does_contain_nested_arrays( $array ) {
|
130 |
-
|
131 |
-
foreach ($array as $key) {
|
132 |
-
if (is_array($key)) {
|
133 |
-
return true;
|
134 |
-
}
|
135 |
-
}
|
136 |
-
|
137 |
-
return false;
|
138 |
-
}
|
139 |
-
|
140 |
-
protected function is_associative_array( $array ) {
|
141 |
-
if (is_array($array)) {
|
142 |
-
return ( array_values($array) !== $array );
|
143 |
-
} else {
|
144 |
-
return false;
|
145 |
-
}
|
146 |
}
|
147 |
}
|
77 |
'site_id' => ''
|
78 |
],
|
79 |
'shop' => [
|
80 |
+
'order_total_logic' => 0,
|
81 |
+
'cookie_consent_mgmt' => [
|
82 |
+
'cookiebot' => [
|
83 |
+
'active' => 0
|
84 |
],
|
85 |
'explicit_consent' => 0,
|
86 |
],
|
87 |
+
'order_deduplication' => 1
|
|
|
|
|
|
|
|
|
88 |
],
|
89 |
'general' => [
|
90 |
'variations_output' => 1,
|
95 |
];
|
96 |
}
|
97 |
|
98 |
+
public function update_with_defaults( $array_input, $array_default ) {
|
99 |
+
foreach ($array_default as $key => $value) {
|
100 |
+
if (array_key_exists($key, $array_input)) {
|
101 |
+
if (is_array($value)) {
|
102 |
+
$array_input[$key] = $this->update_with_defaults($array_input[$key], $value);
|
103 |
+
}
|
104 |
+
} else {
|
105 |
+
$array_input[$key] = $value;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
106 |
}
|
107 |
}
|
108 |
|
109 |
+
return $array_input;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
}
|
111 |
}
|
classes/pixels/class-cookie-consent-management.php
CHANGED
@@ -88,7 +88,7 @@ class Cookie_Consent_Management {
|
|
88 |
// return the cookie contents, if the cookie is set
|
89 |
public function get_cookie( $cookie_name ) {
|
90 |
|
91 |
-
$_cookie = filter_input_array(INPUT_COOKIE,
|
92 |
|
93 |
return $_cookie[$cookie_name] ? $_cookie[$cookie_name] : null;
|
94 |
}
|
@@ -121,7 +121,7 @@ class Cookie_Consent_Management {
|
|
121 |
// https://wordpress.org/plugins/gdpr-cookie-compliance/
|
122 |
public function is_moove_cookie_prevention_active() {
|
123 |
|
124 |
-
$_cookie = filter_input_array(INPUT_COOKIE,
|
125 |
|
126 |
if (isset($_cookie['moove_gdpr_popup'])) {
|
127 |
|
88 |
// return the cookie contents, if the cookie is set
|
89 |
public function get_cookie( $cookie_name ) {
|
90 |
|
91 |
+
$_cookie = filter_input_array(INPUT_COOKIE, FILTER_SANITIZE_STRING);
|
92 |
|
93 |
return $_cookie[$cookie_name] ? $_cookie[$cookie_name] : null;
|
94 |
}
|
121 |
// https://wordpress.org/plugins/gdpr-cookie-compliance/
|
122 |
public function is_moove_cookie_prevention_active() {
|
123 |
|
124 |
+
$_cookie = filter_input_array(INPUT_COOKIE, FILTER_SANITIZE_STRING);
|
125 |
|
126 |
if (isset($_cookie['moove_gdpr_popup'])) {
|
127 |
|
classes/pixels/class-pixel-manager.php
CHANGED
@@ -2,46 +2,56 @@
|
|
2 |
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
|
|
|
|
|
|
|
|
5 |
use WCPM\Classes\Pixels\Facebook\Facebook_Pixel_Manager ;
|
6 |
use WCPM\Classes\Pixels\Facebook\Facebook_Pixel_Manager_Microdata ;
|
7 |
-
use WCPM\Classes\Pixels\Google\Google ;
|
8 |
use WCPM\Classes\Pixels\Google\Google_Analytics_Refund ;
|
9 |
use WCPM\Classes\Pixels\Google\Google_Pixel_Manager ;
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
if ( !defined( 'ABSPATH' ) ) {
|
12 |
exit;
|
13 |
// Exit if accessed directly
|
14 |
}
|
15 |
|
16 |
-
class Pixel_Manager extends
|
17 |
{
|
18 |
use Trait_Product ;
|
|
|
19 |
use Trait_Shop ;
|
20 |
protected $options ;
|
21 |
protected $options_obj ;
|
22 |
protected $cart ;
|
23 |
protected $facebook_active ;
|
24 |
protected $google_active ;
|
25 |
-
protected $dyn_r_ids ;
|
26 |
protected $transaction_deduper_timeout = 1000 ;
|
|
|
|
|
27 |
protected $position = 1 ;
|
28 |
-
protected $google ;
|
29 |
public function __construct( $options )
|
30 |
{
|
31 |
-
|
32 |
* Initialize options
|
33 |
*/
|
|
|
34 |
$this->options = $options;
|
35 |
$this->options_obj = json_decode( wp_json_encode( $this->options ) );
|
|
|
36 |
$this->options_obj->shop->currency = get_woocommerce_currency();
|
37 |
-
|
38 |
* Set a few states
|
39 |
*/
|
40 |
$this->facebook_active = !empty($this->options_obj->facebook->pixel_id);
|
41 |
-
|
42 |
-
|
43 |
-
$this->google_active = $this->google->google_active();
|
44 |
-
/**
|
45 |
* Inject pixel snippets in head
|
46 |
*/
|
47 |
// add_action('wp_head', function () {
|
@@ -49,9 +59,12 @@ class Pixel_Manager extends Script_Manager
|
|
49 |
// });
|
50 |
add_action( 'wp_head', function () {
|
51 |
$this->inject_wpm_opening();
|
52 |
-
$this->
|
|
|
|
|
|
|
53 |
} );
|
54 |
-
|
55 |
* Initialize all pixels
|
56 |
*/
|
57 |
if ( $this->google_active ) {
|
@@ -60,6 +73,9 @@ class Pixel_Manager extends Script_Manager
|
|
60 |
if ( $this->facebook_active ) {
|
61 |
new Facebook_Pixel_Manager( $this->options );
|
62 |
}
|
|
|
|
|
|
|
63 |
add_action( 'wp_head', function () {
|
64 |
$this->inject_wpm_closing();
|
65 |
// if( isset(WC()->session)) {
|
@@ -67,28 +83,17 @@ class Pixel_Manager extends Script_Manager
|
|
67 |
// error_log(print_r(WC()->session,true));
|
68 |
// }
|
69 |
} );
|
70 |
-
|
71 |
* Front-end script section
|
72 |
*/
|
73 |
-
|
74 |
-
add_action( 'wp_enqueue_scripts', [ $this, 'wpm_front_end_scripts' ] );
|
75 |
-
}
|
76 |
add_action( 'wp_ajax_wpm_get_cart_items', [ $this, 'ajax_wpm_get_cart_items' ] );
|
77 |
add_action( 'wp_ajax_nopriv_wpm_get_cart_items', [ $this, 'ajax_wpm_get_cart_items' ] );
|
78 |
add_action( 'wp_ajax_wpm_get_product_ids', [ $this, 'ajax_wpm_get_product_ids' ] );
|
79 |
add_action( 'wp_ajax_nopriv_wpm_get_product_ids', [ $this, 'ajax_wpm_get_product_ids' ] );
|
80 |
add_action( 'wp_ajax_wpm_purchase_pixels_fired', [ $this, 'ajax_purchase_pixels_fired_handler' ] );
|
81 |
add_action( 'wp_ajax_nopriv_wpm_purchase_pixels_fired', [ $this, 'ajax_purchase_pixels_fired_handler' ] );
|
82 |
-
|
83 |
-
if ( apply_filters( 'wpm_experimental_defer_scripts', false ) ) {
|
84 |
-
add_filter(
|
85 |
-
'script_loader_tag',
|
86 |
-
[ $this, 'experimental_defer_scripts' ],
|
87 |
-
10,
|
88 |
-
2
|
89 |
-
);
|
90 |
-
}
|
91 |
-
/**
|
92 |
* Inject pixel snippets after <body> tag
|
93 |
*/
|
94 |
if ( did_action( 'wp_body_open' ) ) {
|
@@ -96,11 +101,11 @@ class Pixel_Manager extends Script_Manager
|
|
96 |
$this->inject_body_pixels();
|
97 |
} );
|
98 |
}
|
99 |
-
|
100 |
* Inject pixel snippets into wp_footer
|
101 |
*/
|
102 |
add_action( 'wp_footer', [ $this, 'wpm_wp_footer' ] );
|
103 |
-
|
104 |
* Process short codes
|
105 |
*/
|
106 |
new Shortcodes( $this->options );
|
@@ -133,16 +138,6 @@ class Pixel_Manager extends Script_Manager
|
|
133 |
add_action( 'woocommerce_mini_cart_contents', [ $this, 'woocommerce_mini_cart_contents' ] );
|
134 |
}
|
135 |
|
136 |
-
// Thanks to: https://gist.github.com/mishterk/6b7a4d6e5a91086a5a9b05ace304b5ce#file-mark-wordpress-scripts-as-async-or-defer-php
|
137 |
-
public function experimental_defer_scripts( $tag, $handle )
|
138 |
-
{
|
139 |
-
if ( 'wpm' !== $handle ) {
|
140 |
-
return $tag;
|
141 |
-
}
|
142 |
-
return str_replace( ' src', ' defer src', $tag );
|
143 |
-
// defer the script
|
144 |
-
}
|
145 |
-
|
146 |
public function woocommerce_mini_cart_contents()
|
147 |
{
|
148 |
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
|
@@ -158,7 +153,7 @@ class Pixel_Manager extends Script_Manager
|
|
158 |
];
|
159 |
?>
|
160 |
<script>
|
161 |
-
window.wpmDataLayer.cartItemKeys = window.wpmDataLayer.cartItemKeys || {}
|
162 |
window.wpmDataLayer.cartItemKeys['<?php
|
163 |
echo esc_js( $cart_item_key ) ;
|
164 |
?>'] = <?php
|
@@ -169,6 +164,25 @@ class Pixel_Manager extends Script_Manager
|
|
169 |
<?php
|
170 |
}
|
171 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
172 |
// on product page
|
173 |
public function woocommerce_inject_product_data_on_product_page()
|
174 |
{
|
@@ -238,15 +252,36 @@ class Pixel_Manager extends Script_Manager
|
|
238 |
}
|
239 |
|
240 |
// https://support.cloudflare.com/hc/en-us/articles/200169436-How-can-I-have-Rocket-Loader-ignore-specific-JavaScripts-
|
241 |
-
private function
|
242 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
243 |
?>
|
244 |
|
245 |
-
<script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
246 |
|
247 |
-
window.wpmDataLayer = window.wpmDataLayer || {}
|
248 |
window.wpmDataLayer = <?php
|
249 |
-
echo wp_json_encode( $
|
250 |
?>;
|
251 |
|
252 |
</script>
|
@@ -254,199 +289,6 @@ class Pixel_Manager extends Script_Manager
|
|
254 |
<?php
|
255 |
}
|
256 |
|
257 |
-
protected function get_data_for_data_layer()
|
258 |
-
{
|
259 |
-
$data = [
|
260 |
-
'cart' => (object) [],
|
261 |
-
'cart_item_keys' => (object) [],
|
262 |
-
'orderDeduplication' => $this->options['shop']['order_deduplication'] && !$this->is_nodedupe_parameter_set(),
|
263 |
-
'position' => 1,
|
264 |
-
'viewItemListTrigger' => $this->view_item_list_trigger_settings(),
|
265 |
-
'version' => [
|
266 |
-
'number' => WPM_CURRENT_VERSION,
|
267 |
-
'pro' => wpm_fs()->is__premium_only(),
|
268 |
-
],
|
269 |
-
];
|
270 |
-
$data['pixels'] = [
|
271 |
-
'bing' => [
|
272 |
-
'uet_tag_id' => $this->options_obj->bing->uet_tag_id,
|
273 |
-
'dynamic_remarketing' => [
|
274 |
-
'id_type' => $this->get_dyn_r_id_type( 'bing' ),
|
275 |
-
],
|
276 |
-
],
|
277 |
-
'facebook' => [
|
278 |
-
'pixel_id' => $this->options_obj->facebook->pixel_id,
|
279 |
-
'dynamic_remarketing' => [
|
280 |
-
'id_type' => $this->get_dyn_r_id_type( 'facebook' ),
|
281 |
-
],
|
282 |
-
'capi' => (bool) $this->options_obj->facebook->capi->token,
|
283 |
-
],
|
284 |
-
'google' => [
|
285 |
-
'ads' => [
|
286 |
-
'conversionIds' => (object) $this->google->get_google_ads_conversion_ids( is_order_received_page() ),
|
287 |
-
'dynamic_remarketing' => [
|
288 |
-
'status' => (bool) $this->options_obj->google->ads->dynamic_remarketing,
|
289 |
-
'id_type' => $this->get_dyn_r_id_type( 'google' ),
|
290 |
-
'send_events_with_parent_ids' => apply_filters( 'wpm_send_events_with_parent_ids', apply_filters_deprecated(
|
291 |
-
'wooptpm_send_events_with_parent_ids',
|
292 |
-
[ true ],
|
293 |
-
'1.13.0',
|
294 |
-
'wpm_send_events_with_parent_ids'
|
295 |
-
) ),
|
296 |
-
],
|
297 |
-
'google_business_vertical' => $this->google->get_google_business_vertical( $this->options['google']['ads']['google_business_vertical'] ),
|
298 |
-
'phone_conversion_label' => $this->options_obj->google->ads->phone_conversion_label,
|
299 |
-
'phone_conversion_number' => $this->options_obj->google->ads->phone_conversion_number,
|
300 |
-
],
|
301 |
-
'analytics' => [
|
302 |
-
'universal' => [
|
303 |
-
'property_id' => $this->options_obj->google->analytics->universal->property_id,
|
304 |
-
'parameters' => (object) $this->google->get_ga_ua_parameters( $this->options_obj->google->analytics->universal->property_id ),
|
305 |
-
'mp_active' => wpm_fs()->is__premium_only(),
|
306 |
-
],
|
307 |
-
'ga4' => [
|
308 |
-
'measurement_id' => $this->options_obj->google->analytics->ga4->measurement_id,
|
309 |
-
'parameters' => (object) $this->google->get_ga4_parameters( $this->options_obj->google->analytics->ga4->measurement_id ),
|
310 |
-
'mp_active' => $this->options_obj->google->analytics->ga4->api_secret && wpm_fs()->is__premium_only(),
|
311 |
-
],
|
312 |
-
'id_type' => $this->google->get_ga_id_type(),
|
313 |
-
'eec' => (bool) $this->options_obj->google->analytics->eec,
|
314 |
-
],
|
315 |
-
'optimize' => [
|
316 |
-
'container_id' => $this->options_obj->google->optimize->container_id,
|
317 |
-
],
|
318 |
-
'linker' => [
|
319 |
-
'settings' => $this->google->get_google_linker_settings(),
|
320 |
-
],
|
321 |
-
'user_id' => (bool) $this->options_obj->google->user_id,
|
322 |
-
],
|
323 |
-
'hotjar' => [
|
324 |
-
'site_id' => $this->options_obj->hotjar->site_id,
|
325 |
-
],
|
326 |
-
'pinterest' => [
|
327 |
-
'pixel_id' => $this->options_obj->pinterest->pixel_id,
|
328 |
-
'dynamic_remarketing' => [
|
329 |
-
'id_type' => $this->get_dyn_r_id_type( 'pinterest' ),
|
330 |
-
],
|
331 |
-
'enhanced_match' => apply_filters( 'wpm_pinterest_enhanced_match', apply_filters_deprecated(
|
332 |
-
'wooptpm_pinterest_enhanced_match',
|
333 |
-
[ false ],
|
334 |
-
'1.13.0',
|
335 |
-
'wpm_pinterest_enhanced_match'
|
336 |
-
) ),
|
337 |
-
'enhanced_match_email' => $this->get_user_email(),
|
338 |
-
],
|
339 |
-
'snapchat' => [
|
340 |
-
'pixel_id' => $this->options_obj->snapchat->pixel_id,
|
341 |
-
'dynamic_remarketing' => [
|
342 |
-
'id_type' => $this->get_dyn_r_id_type( 'snapchat' ),
|
343 |
-
],
|
344 |
-
],
|
345 |
-
'tiktok' => [
|
346 |
-
'pixel_id' => $this->options_obj->tiktok->pixel_id,
|
347 |
-
'dynamic_remarketing' => [
|
348 |
-
'id_type' => $this->get_dyn_r_id_type( 'tiktok' ),
|
349 |
-
],
|
350 |
-
'purchase_event_name' => apply_filters( 'wpm_tiktok_purchase_event_name', 'PlaceAnOrder' ),
|
351 |
-
],
|
352 |
-
'twitter' => [
|
353 |
-
'pixel_id' => $this->options_obj->twitter->pixel_id,
|
354 |
-
'dynamic_remarketing' => [
|
355 |
-
'id_type' => $this->get_dyn_r_id_type( 'twitter' ),
|
356 |
-
],
|
357 |
-
],
|
358 |
-
];
|
359 |
-
$data = array_merge( $data, $this->get_order_data() );
|
360 |
-
$data['shop'] = $this->get_shop_data();
|
361 |
-
$data['general'] = $this->get_general_data();
|
362 |
-
$data['user'] = $this->get_user_data();
|
363 |
-
// Return and optionally modify the wpm data layer
|
364 |
-
return apply_filters( 'wpm_experimental_data_layer', $data );
|
365 |
-
}
|
366 |
-
|
367 |
-
protected function get_order_data()
|
368 |
-
{
|
369 |
-
if ( !is_order_received_page() ) {
|
370 |
-
return [];
|
371 |
-
}
|
372 |
-
$order = $this->get_order_from_order_received_page();
|
373 |
-
if ( $order && !$this->can_order_confirmation_be_processed( $order ) ) {
|
374 |
-
return [];
|
375 |
-
}
|
376 |
-
$data = [];
|
377 |
-
|
378 |
-
if ( $order ) {
|
379 |
-
$data['order'] = [
|
380 |
-
'id' => (int) $order->get_id(),
|
381 |
-
'number' => (string) $order->get_order_number(),
|
382 |
-
'affiliation' => (string) get_bloginfo( 'name' ),
|
383 |
-
'currency' => (string) $this->get_order_currency( $order ),
|
384 |
-
'value_filtered' => (double) $this->wpm_get_order_total( $order ),
|
385 |
-
'value_regular' => (double) $order->get_total(),
|
386 |
-
'discount' => (double) $order->get_total_discount(),
|
387 |
-
'tax' => (double) $order->get_total_tax(),
|
388 |
-
'shipping' => (double) $order->get_shipping_total(),
|
389 |
-
'coupon' => implode( ',', $order->get_coupon_codes() ),
|
390 |
-
'aw_merchant_id' => ( (int) $this->options['google']['ads']['aw_merchant_id'] ? (int) $this->options['google']['ads']['aw_merchant_id'] : '' ),
|
391 |
-
'aw_feed_country' => (string) $this->get_visitor_country(),
|
392 |
-
'aw_feed_language' => (string) $this->google->get_gmc_language(),
|
393 |
-
'new_customer' => !$this->is_existing_customer( $order ),
|
394 |
-
'quantity' => (int) count( $this->wpm_get_order_items( $order ) ),
|
395 |
-
'items' => $this->get_front_end_order_items( $order ),
|
396 |
-
];
|
397 |
-
$data['products'] = $this->get_order_products( $order );
|
398 |
-
}
|
399 |
-
|
400 |
-
return $data;
|
401 |
-
}
|
402 |
-
|
403 |
-
protected function get_user_data()
|
404 |
-
{
|
405 |
-
$data = [];
|
406 |
-
|
407 |
-
if ( is_user_logged_in() || is_order_received_page() ) {
|
408 |
-
$data['id'] = get_current_user_id();
|
409 |
-
$data['email'] = $this->get_user_email();
|
410 |
-
$data['email_sha256'] = $this->get_user_email( 'sha256' );
|
411 |
-
}
|
412 |
-
|
413 |
-
return $data;
|
414 |
-
}
|
415 |
-
|
416 |
-
protected function get_order_products( $order )
|
417 |
-
{
|
418 |
-
$order_products = [];
|
419 |
-
foreach ( (array) $this->wpm_get_order_items( $order ) as $order_item ) {
|
420 |
-
$order_item_data = $order_item->get_data();
|
421 |
-
if ( 0 !== $order_item_data['variation_id'] ) {
|
422 |
-
// add variation
|
423 |
-
$order_products[$order_item_data['variation_id']] = $this->get_product_data( $order_item_data['variation_id'] );
|
424 |
-
}
|
425 |
-
$order_products[$order_item_data['product_id']] = $this->get_product_data( $order_item_data['product_id'] );
|
426 |
-
}
|
427 |
-
return $order_products;
|
428 |
-
}
|
429 |
-
|
430 |
-
protected function get_product_data( $product_id )
|
431 |
-
{
|
432 |
-
$product = wc_get_product( $product_id );
|
433 |
-
|
434 |
-
if ( !is_object( $product ) ) {
|
435 |
-
$this->log_problematic_product_id( $product_id );
|
436 |
-
return [];
|
437 |
-
}
|
438 |
-
|
439 |
-
return [
|
440 |
-
'product_id' => $product->get_id(),
|
441 |
-
'name' => $product->get_name(),
|
442 |
-
'type' => $product->get_type(),
|
443 |
-
'dyn_r_ids' => $this->get_dyn_r_ids( $product ),
|
444 |
-
'brand' => (string) $this->get_brand_name( $product_id ),
|
445 |
-
'category' => (array) $this->get_product_category( $product_id ),
|
446 |
-
'variant_name' => ( (string) ($product->get_type() === 'variation') ? $this->get_formatted_variant_text( $product ) : '' ),
|
447 |
-
];
|
448 |
-
}
|
449 |
-
|
450 |
public function view_item_list_trigger_settings()
|
451 |
{
|
452 |
$settings = [
|
@@ -468,20 +310,30 @@ class Pixel_Manager extends Script_Manager
|
|
468 |
|
469 |
public function inject_wpm_opening()
|
470 |
{
|
|
|
|
|
|
|
471 |
echo PHP_EOL . '<!-- START WooCommerce Pixel Manager -->' . PHP_EOL ;
|
472 |
}
|
473 |
|
474 |
public function inject_wpm_closing()
|
475 |
{
|
|
|
|
|
|
|
476 |
if ( is_order_received_page() ) {
|
477 |
|
478 |
if ( $this->get_order_from_order_received_page() ) {
|
479 |
$order = $this->get_order_from_order_received_page();
|
|
|
480 |
$this->increase_conversion_count_for_ratings( $order );
|
481 |
}
|
482 |
|
483 |
}
|
484 |
echo PHP_EOL . '<!-- END WooCommerce Pixel Manager -->' . PHP_EOL ;
|
|
|
|
|
|
|
485 |
}
|
486 |
|
487 |
private function increase_conversion_count_for_ratings( $order )
|
@@ -503,6 +355,8 @@ class Pixel_Manager extends Script_Manager
|
|
503 |
$cart_items = $woocommerce->cart->get_cart();
|
504 |
$data = [];
|
505 |
foreach ( $cart_items as $cart_item => $value ) {
|
|
|
|
|
506 |
$product = wc_get_product( $value['data']->get_id() );
|
507 |
|
508 |
if ( !is_object( $product ) ) {
|
@@ -524,7 +378,7 @@ class Pixel_Manager extends Script_Manager
|
|
524 |
'isVariation' => false,
|
525 |
];
|
526 |
|
527 |
-
if (
|
528 |
$parent_product = wc_get_product( $product->get_parent_id() );
|
529 |
|
530 |
if ( $parent_product ) {
|
@@ -555,12 +409,13 @@ class Pixel_Manager extends Script_Manager
|
|
555 |
}
|
556 |
|
557 |
}
|
|
|
558 |
wp_send_json( $data );
|
559 |
}
|
560 |
|
561 |
public function ajax_wpm_get_product_ids()
|
562 |
{
|
563 |
-
$_get = filter_input_array( INPUT_GET,
|
564 |
$product_ids = $_get['productIds'];
|
565 |
|
566 |
if ( !$product_ids ) {
|
@@ -595,7 +450,7 @@ class Pixel_Manager extends Script_Manager
|
|
595 |
// error_log('Invalid security token sent.');
|
596 |
// wp_die();
|
597 |
// }
|
598 |
-
$_post = filter_input_array( INPUT_POST,
|
599 |
$order_id = $_post['order_id'];
|
600 |
update_post_meta( $order_id, '_wpm_conversion_pixel_fired', true );
|
601 |
wp_send_json_success();
|
@@ -606,7 +461,6 @@ class Pixel_Manager extends Script_Manager
|
|
606 |
public function wpm_front_end_scripts()
|
607 |
{
|
608 |
$wpm_dependencies = [ 'jquery' ];
|
609 |
-
// enable polyfill.io with filter
|
610 |
|
611 |
if ( wpm_fs()->is__premium_only() && apply_filters( 'wpm_experimental_inject_polyfill_io', false ) ) {
|
612 |
wp_enqueue_script(
|
@@ -624,7 +478,7 @@ class Pixel_Manager extends Script_Manager
|
|
624 |
WPM_PLUGIN_DIR_PATH . 'js/public/wpm-public.p1.min.js',
|
625 |
$wpm_dependencies,
|
626 |
WPM_CURRENT_VERSION,
|
627 |
-
|
628 |
);
|
629 |
wp_localize_script(
|
630 |
'wpm',
|
@@ -634,12 +488,16 @@ class Pixel_Manager extends Script_Manager
|
|
634 |
'ajax_url' => admin_url( 'admin-ajax.php' ),
|
635 |
]
|
636 |
);
|
637 |
-
|
638 |
-
|
639 |
-
|
640 |
-
|
641 |
-
//
|
642 |
-
|
|
|
|
|
|
|
|
|
643 |
}
|
644 |
|
645 |
private function get_preset_version()
|
@@ -657,7 +515,7 @@ class Pixel_Manager extends Script_Manager
|
|
657 |
// $this->google_pixel_manager->inject_google_optimize_anti_flicker_snippet();
|
658 |
}
|
659 |
|
660 |
-
private function
|
661 |
{
|
662 |
$data = [];
|
663 |
|
@@ -718,36 +576,196 @@ class Pixel_Manager extends Script_Manager
|
|
718 |
}
|
719 |
|
720 |
$data['currency'] = get_woocommerce_currency();
|
721 |
-
|
722 |
-
// $data['mini_cart']['track'] = apply_filters('wpm_track_mini_cart', $data['mini_cart']['track']);
|
723 |
-
$mini_cart_filter_deprecation_message = 'The filter has become obsolete since WPM now tracks cart item data using the browser cache and doesn\'t rely entirely on the server anymore.';
|
724 |
-
apply_filters_deprecated(
|
725 |
'wooptpm_track_mini_cart',
|
726 |
[ true ],
|
727 |
'1.13.0',
|
728 |
-
''
|
729 |
-
$mini_cart_filter_deprecation_message
|
730 |
-
);
|
731 |
-
apply_filters_deprecated(
|
732 |
-
'wpm_track_mini_cart',
|
733 |
-
[ true ],
|
734 |
-
'1.15.5',
|
735 |
-
'',
|
736 |
-
$mini_cart_filter_deprecation_message
|
737 |
);
|
|
|
738 |
$data['cookie_consent_mgmt'] = [
|
739 |
'explicit_consent' => (bool) $this->options_obj->shop->cookie_consent_mgmt->explicit_consent,
|
740 |
];
|
741 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
742 |
}
|
743 |
|
744 |
-
private function
|
745 |
{
|
746 |
$data = [
|
747 |
'variationsOutput' => (bool) $this->options_obj->general->variations_output,
|
748 |
-
'userLoggedIn' => is_user_logged_in(),
|
749 |
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
750 |
return $data;
|
751 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
752 |
|
753 |
}
|
2 |
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
5 |
+
use stdClass ;
|
6 |
+
use WC_Order ;
|
7 |
+
use WCPM\Classes\Admin\Environment_Check ;
|
8 |
+
use WCPM\Classes\Pixels\Bing\Bing_Pixel_Manager ;
|
9 |
use WCPM\Classes\Pixels\Facebook\Facebook_Pixel_Manager ;
|
10 |
use WCPM\Classes\Pixels\Facebook\Facebook_Pixel_Manager_Microdata ;
|
|
|
11 |
use WCPM\Classes\Pixels\Google\Google_Analytics_Refund ;
|
12 |
use WCPM\Classes\Pixels\Google\Google_Pixel_Manager ;
|
13 |
+
use WCPM\Classes\Pixels\Google\Trait_Google ;
|
14 |
+
use WCPM\Classes\Pixels\Hotjar\Hotjar_Pixel ;
|
15 |
+
use WCPM\Classes\Pixels\Pinterest\Pinterest_Pixel_Manager ;
|
16 |
+
use WCPM\Classes\Pixels\Snapchat\Snapchat_Pixel_Manager ;
|
17 |
+
use WCPM\Classes\Pixels\TikTok\TikTok_Pixel_Manager ;
|
18 |
+
use WCPM\Classes\Pixels\Twitter\Twitter_Pixel_Manager ;
|
19 |
|
20 |
if ( !defined( 'ABSPATH' ) ) {
|
21 |
exit;
|
22 |
// Exit if accessed directly
|
23 |
}
|
24 |
|
25 |
+
class Pixel_Manager extends Pixel_Manager_Base
|
26 |
{
|
27 |
use Trait_Product ;
|
28 |
+
use Trait_Google ;
|
29 |
use Trait_Shop ;
|
30 |
protected $options ;
|
31 |
protected $options_obj ;
|
32 |
protected $cart ;
|
33 |
protected $facebook_active ;
|
34 |
protected $google_active ;
|
|
|
35 |
protected $transaction_deduper_timeout = 1000 ;
|
36 |
+
protected $hotjar_pixel ;
|
37 |
+
protected $dyn_r_ids ;
|
38 |
protected $position = 1 ;
|
|
|
39 |
public function __construct( $options )
|
40 |
{
|
41 |
+
/*
|
42 |
* Initialize options
|
43 |
*/
|
44 |
+
// $this->options = get_option(WPM_DB_OPTIONS_NAME);
|
45 |
$this->options = $options;
|
46 |
$this->options_obj = json_decode( wp_json_encode( $this->options ) );
|
47 |
+
$this->options_obj->shop->currency = new stdClass();
|
48 |
$this->options_obj->shop->currency = get_woocommerce_currency();
|
49 |
+
/*
|
50 |
* Set a few states
|
51 |
*/
|
52 |
$this->facebook_active = !empty($this->options_obj->facebook->pixel_id);
|
53 |
+
$this->google_active = $this->google_active();
|
54 |
+
/*
|
|
|
|
|
55 |
* Inject pixel snippets in head
|
56 |
*/
|
57 |
// add_action('wp_head', function () {
|
59 |
// });
|
60 |
add_action( 'wp_head', function () {
|
61 |
$this->inject_wpm_opening();
|
62 |
+
$this->inject_data_layer_init();
|
63 |
+
$this->inject_data_layer_shop();
|
64 |
+
$this->inject_data_layer_general();
|
65 |
+
// $this->inject_data_layer_product();
|
66 |
} );
|
67 |
+
/*
|
68 |
* Initialize all pixels
|
69 |
*/
|
70 |
if ( $this->google_active ) {
|
73 |
if ( $this->facebook_active ) {
|
74 |
new Facebook_Pixel_Manager( $this->options );
|
75 |
}
|
76 |
+
if ( $this->options_obj->hotjar->site_id ) {
|
77 |
+
$this->hotjar_pixel = new Hotjar_Pixel( $this->options );
|
78 |
+
}
|
79 |
add_action( 'wp_head', function () {
|
80 |
$this->inject_wpm_closing();
|
81 |
// if( isset(WC()->session)) {
|
83 |
// error_log(print_r(WC()->session,true));
|
84 |
// }
|
85 |
} );
|
86 |
+
/*
|
87 |
* Front-end script section
|
88 |
*/
|
89 |
+
add_action( 'wp_enqueue_scripts', [ $this, 'wpm_front_end_scripts' ] );
|
|
|
|
|
90 |
add_action( 'wp_ajax_wpm_get_cart_items', [ $this, 'ajax_wpm_get_cart_items' ] );
|
91 |
add_action( 'wp_ajax_nopriv_wpm_get_cart_items', [ $this, 'ajax_wpm_get_cart_items' ] );
|
92 |
add_action( 'wp_ajax_wpm_get_product_ids', [ $this, 'ajax_wpm_get_product_ids' ] );
|
93 |
add_action( 'wp_ajax_nopriv_wpm_get_product_ids', [ $this, 'ajax_wpm_get_product_ids' ] );
|
94 |
add_action( 'wp_ajax_wpm_purchase_pixels_fired', [ $this, 'ajax_purchase_pixels_fired_handler' ] );
|
95 |
add_action( 'wp_ajax_nopriv_wpm_purchase_pixels_fired', [ $this, 'ajax_purchase_pixels_fired_handler' ] );
|
96 |
+
/*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
* Inject pixel snippets after <body> tag
|
98 |
*/
|
99 |
if ( did_action( 'wp_body_open' ) ) {
|
101 |
$this->inject_body_pixels();
|
102 |
} );
|
103 |
}
|
104 |
+
/*
|
105 |
* Inject pixel snippets into wp_footer
|
106 |
*/
|
107 |
add_action( 'wp_footer', [ $this, 'wpm_wp_footer' ] );
|
108 |
+
/*
|
109 |
* Process short codes
|
110 |
*/
|
111 |
new Shortcodes( $this->options );
|
138 |
add_action( 'woocommerce_mini_cart_contents', [ $this, 'woocommerce_mini_cart_contents' ] );
|
139 |
}
|
140 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
public function woocommerce_mini_cart_contents()
|
142 |
{
|
143 |
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
|
153 |
];
|
154 |
?>
|
155 |
<script>
|
156 |
+
window.wpmDataLayer.cartItemKeys = window.wpmDataLayer.cartItemKeys || {};
|
157 |
window.wpmDataLayer.cartItemKeys['<?php
|
158 |
echo esc_js( $cart_item_key ) ;
|
159 |
?>'] = <?php
|
164 |
<?php
|
165 |
}
|
166 |
|
167 |
+
private function get_cart_parent_product_for_pinterest( $product_id )
|
168 |
+
{
|
169 |
+
$product = wc_get_product( $product_id );
|
170 |
+
|
171 |
+
if ( !is_object( $product ) ) {
|
172 |
+
// $this->log_problematic_product_id();
|
173 |
+
wc_get_logger()->debug( 'get_product_data_layer_script received an invalid product', [
|
174 |
+
'source' => 'wpm',
|
175 |
+
] );
|
176 |
+
return '';
|
177 |
+
}
|
178 |
+
|
179 |
+
$this->dyn_r_ids = $this->get_dyn_r_ids( $product );
|
180 |
+
return [
|
181 |
+
'id' => (string) $product->get_id(),
|
182 |
+
'dyn_r_ids' => $this->dyn_r_ids,
|
183 |
+
];
|
184 |
+
}
|
185 |
+
|
186 |
// on product page
|
187 |
public function woocommerce_inject_product_data_on_product_page()
|
188 |
{
|
252 |
}
|
253 |
|
254 |
// https://support.cloudflare.com/hc/en-us/articles/200169436-How-can-I-have-Rocket-Loader-ignore-specific-JavaScripts-
|
255 |
+
private function inject_data_layer_init()
|
256 |
{
|
257 |
+
$data = [
|
258 |
+
'cart' => [],
|
259 |
+
'cart_item_keys' => [],
|
260 |
+
'pixels' => [],
|
261 |
+
'orderDeduplication' => ( $this->options['shop']['order_deduplication'] && !$this->is_nodedupe_parameter_set() ? true : false ),
|
262 |
+
'position' => 1,
|
263 |
+
'viewItemListTrigger' => $this->view_item_list_trigger_settings(),
|
264 |
+
'version' => [
|
265 |
+
'number' => WPM_CURRENT_VERSION,
|
266 |
+
'pro' => wpm_fs()->is__premium_only(),
|
267 |
+
],
|
268 |
+
];
|
269 |
?>
|
270 |
|
271 |
+
<script data-cfasync="false">
|
272 |
+
|
273 |
+
function wpmExists() {
|
274 |
+
return new Promise(function (resolve, reject) {
|
275 |
+
(function waitForWpm() {
|
276 |
+
if (window.wpm) return resolve();
|
277 |
+
setTimeout(waitForWpm, 30);
|
278 |
+
})();
|
279 |
+
});
|
280 |
+
}
|
281 |
|
282 |
+
window.wpmDataLayer = window.wpmDataLayer || {};
|
283 |
window.wpmDataLayer = <?php
|
284 |
+
echo wp_json_encode( $data, JSON_FORCE_OBJECT ) ;
|
285 |
?>;
|
286 |
|
287 |
</script>
|
289 |
<?php
|
290 |
}
|
291 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
292 |
public function view_item_list_trigger_settings()
|
293 |
{
|
294 |
$settings = [
|
310 |
|
311 |
public function inject_wpm_opening()
|
312 |
{
|
313 |
+
if ( ( new Environment_Check() )->is_autoptimize_active() ) {
|
314 |
+
$this->inject_noptimize_opening_tag();
|
315 |
+
}
|
316 |
echo PHP_EOL . '<!-- START WooCommerce Pixel Manager -->' . PHP_EOL ;
|
317 |
}
|
318 |
|
319 |
public function inject_wpm_closing()
|
320 |
{
|
321 |
+
if ( $this->options_obj->hotjar->site_id ) {
|
322 |
+
$this->hotjar_pixel->inject_everywhere();
|
323 |
+
}
|
324 |
if ( is_order_received_page() ) {
|
325 |
|
326 |
if ( $this->get_order_from_order_received_page() ) {
|
327 |
$order = $this->get_order_from_order_received_page();
|
328 |
+
$this->inject_transaction_deduper_script( $order->get_id() );
|
329 |
$this->increase_conversion_count_for_ratings( $order );
|
330 |
}
|
331 |
|
332 |
}
|
333 |
echo PHP_EOL . '<!-- END WooCommerce Pixel Manager -->' . PHP_EOL ;
|
334 |
+
if ( ( new Environment_Check() )->is_autoptimize_active() ) {
|
335 |
+
$this->inject_noptimize_closing_tag();
|
336 |
+
}
|
337 |
}
|
338 |
|
339 |
private function increase_conversion_count_for_ratings( $order )
|
355 |
$cart_items = $woocommerce->cart->get_cart();
|
356 |
$data = [];
|
357 |
foreach ( $cart_items as $cart_item => $value ) {
|
358 |
+
// error_log('qty: ' . $value['quantity']);
|
359 |
+
// error_log(print_r($value['data'], true));
|
360 |
$product = wc_get_product( $value['data']->get_id() );
|
361 |
|
362 |
if ( !is_object( $product ) ) {
|
378 |
'isVariation' => false,
|
379 |
];
|
380 |
|
381 |
+
if ( $product->get_type() == 'variation' ) {
|
382 |
$parent_product = wc_get_product( $product->get_parent_id() );
|
383 |
|
384 |
if ( $parent_product ) {
|
409 |
}
|
410 |
|
411 |
}
|
412 |
+
// error_log(print_r($data, true));
|
413 |
wp_send_json( $data );
|
414 |
}
|
415 |
|
416 |
public function ajax_wpm_get_product_ids()
|
417 |
{
|
418 |
+
$_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_STRING );
|
419 |
$product_ids = $_get['productIds'];
|
420 |
|
421 |
if ( !$product_ids ) {
|
450 |
// error_log('Invalid security token sent.');
|
451 |
// wp_die();
|
452 |
// }
|
453 |
+
$_post = filter_input_array( INPUT_POST, FILTER_SANITIZE_STRING );
|
454 |
$order_id = $_post['order_id'];
|
455 |
update_post_meta( $order_id, '_wpm_conversion_pixel_fired', true );
|
456 |
wp_send_json_success();
|
461 |
public function wpm_front_end_scripts()
|
462 |
{
|
463 |
$wpm_dependencies = [ 'jquery' ];
|
|
|
464 |
|
465 |
if ( wpm_fs()->is__premium_only() && apply_filters( 'wpm_experimental_inject_polyfill_io', false ) ) {
|
466 |
wp_enqueue_script(
|
478 |
WPM_PLUGIN_DIR_PATH . 'js/public/wpm-public.p1.min.js',
|
479 |
$wpm_dependencies,
|
480 |
WPM_CURRENT_VERSION,
|
481 |
+
false
|
482 |
);
|
483 |
wp_localize_script(
|
484 |
'wpm',
|
488 |
'ajax_url' => admin_url( 'admin-ajax.php' ),
|
489 |
]
|
490 |
);
|
491 |
+
// if (wpm_fs()->is__premium_only()) {
|
492 |
+
//
|
493 |
+
// wp_enqueue_script(
|
494 |
+
// 'wpm-premium-only',
|
495 |
+
// WPM_PLUGIN_DIR_PATH . 'js/public/head/wpm__premium_only' . $this->get_script_suffix(),
|
496 |
+
// ['jquery', 'wpm'],
|
497 |
+
// WPM_CURRENT_VERSION,
|
498 |
+
// false
|
499 |
+
// );
|
500 |
+
// }
|
501 |
}
|
502 |
|
503 |
private function get_preset_version()
|
515 |
// $this->google_pixel_manager->inject_google_optimize_anti_flicker_snippet();
|
516 |
}
|
517 |
|
518 |
+
private function inject_data_layer_shop()
|
519 |
{
|
520 |
$data = [];
|
521 |
|
576 |
}
|
577 |
|
578 |
$data['currency'] = get_woocommerce_currency();
|
579 |
+
$data['mini_cart']['track'] = apply_filters_deprecated(
|
|
|
|
|
|
|
580 |
'wooptpm_track_mini_cart',
|
581 |
[ true ],
|
582 |
'1.13.0',
|
583 |
+
'wpm_track_mini_cart'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
584 |
);
|
585 |
+
$data['mini_cart']['track'] = apply_filters( 'wpm_track_mini_cart', $data['mini_cart']['track'] );
|
586 |
$data['cookie_consent_mgmt'] = [
|
587 |
'explicit_consent' => (bool) $this->options_obj->shop->cookie_consent_mgmt->explicit_consent,
|
588 |
];
|
589 |
+
?>
|
590 |
+
|
591 |
+
<script>
|
592 |
+
wpmDataLayer.shop = <?php
|
593 |
+
echo wp_json_encode( $data ) ;
|
594 |
+
?>;
|
595 |
+
</script>
|
596 |
+
<?php
|
597 |
+
if ( $this->options_obj->shop->cookie_consent_mgmt->explicit_consent ) {
|
598 |
+
?>
|
599 |
+
|
600 |
+
<script>
|
601 |
+
if (typeof wpm != "undefined") {
|
602 |
+
wpm.updateConsentCookieValues(true)
|
603 |
+
} else {
|
604 |
+
console.error('wpm is not defined. That means you are deferring the script which you shouldn\'t. wpm must be loaded before the inline scripts run. Visitor tracking will continue to work, but explicit consent mode will be ignored.')
|
605 |
+
}
|
606 |
+
</script>
|
607 |
+
<?php
|
608 |
+
}
|
609 |
}
|
610 |
|
611 |
+
private function inject_data_layer_general()
|
612 |
{
|
613 |
$data = [
|
614 |
'variationsOutput' => (bool) $this->options_obj->general->variations_output,
|
|
|
615 |
];
|
616 |
+
?>
|
617 |
+
|
618 |
+
<script>
|
619 |
+
wpmDataLayer.general = <?php
|
620 |
+
echo wp_json_encode( $data ) ;
|
621 |
+
?>;
|
622 |
+
</script>
|
623 |
+
<?php
|
624 |
+
}
|
625 |
+
|
626 |
+
private function inject_data_layer_product()
|
627 |
+
{
|
628 |
+
global $wp_query, $woocommerce ;
|
629 |
+
|
630 |
+
if ( is_shop() || is_product_category() || is_product_tag() || is_search() ) {
|
631 |
+
// if (!is_cart() || !is_order_received_page()) {
|
632 |
+
$product_ids = [];
|
633 |
+
$posts = $wp_query->posts;
|
634 |
+
foreach ( $posts as $key => $post ) {
|
635 |
+
if ( 'product' == $post->post_type || 'product_variation' == $post->post_type ) {
|
636 |
+
array_push( $product_ids, $post->ID );
|
637 |
+
}
|
638 |
+
}
|
639 |
+
?>
|
640 |
+
|
641 |
+
<script>
|
642 |
+
wpmDataLayer.visible_products = <?php
|
643 |
+
echo wp_json_encode( $this->eec_get_visible_products( $product_ids ) ) ;
|
644 |
+
?>;
|
645 |
+
</script>
|
646 |
+
<?php
|
647 |
+
} elseif ( is_cart() ) {
|
648 |
+
$visible_product_ids = [];
|
649 |
+
$upsell_product_ids = [];
|
650 |
+
$items = $woocommerce->cart->get_cart();
|
651 |
+
foreach ( $items as $item => $values ) {
|
652 |
+
array_push( $visible_product_ids, $values['data']->get_id() );
|
653 |
+
$product = wc_get_product( $values['data']->get_id() );
|
654 |
+
// only continue if WC retrieves a valid product
|
655 |
+
|
656 |
+
if ( is_object( $product ) ) {
|
657 |
+
$single_product_upsell_ids = $product->get_upsell_ids();
|
658 |
+
// error_log(print_r($single_product_upsell_ids,true));
|
659 |
+
foreach ( $single_product_upsell_ids as $item => $value ) {
|
660 |
+
// error_log('item ' . $item);
|
661 |
+
// error_log('value' . $value);
|
662 |
+
if ( !in_array( $value, $upsell_product_ids, true ) ) {
|
663 |
+
array_push( $upsell_product_ids, $value );
|
664 |
+
}
|
665 |
+
}
|
666 |
+
}
|
667 |
+
|
668 |
+
}
|
669 |
+
// error_log(print_r($upsell_product_ids,true));
|
670 |
+
?>
|
671 |
+
|
672 |
+
<script>
|
673 |
+
wpmDataLayer.visible_products = <?php
|
674 |
+
echo wp_json_encode( $this->eec_get_visible_products( $visible_product_ids ) ) ;
|
675 |
+
?>;
|
676 |
+
wpmDataLayer.upsell_products = <?php
|
677 |
+
echo wp_json_encode( $this->eec_get_visible_products( $upsell_product_ids ) ) ;
|
678 |
+
?>;
|
679 |
+
</script>
|
680 |
+
<?php
|
681 |
+
} elseif ( is_product() ) {
|
682 |
+
$visible_product_ids = [];
|
683 |
+
$product = wc_get_product();
|
684 |
+
array_push( $visible_product_ids, $product->get_id() );
|
685 |
+
$related_products = wc_get_related_products( $product->get_id() );
|
686 |
+
foreach ( $related_products as $item => $value ) {
|
687 |
+
array_push( $visible_product_ids, $value );
|
688 |
+
}
|
689 |
+
$upsell_product_ids = $product->get_upsell_ids();
|
690 |
+
foreach ( $upsell_product_ids as $item => $value ) {
|
691 |
+
array_push( $visible_product_ids, $value );
|
692 |
+
}
|
693 |
+
// error_log(print_r($visible_product_ids, true));
|
694 |
+
if ( $product->get_type() === 'grouped' ) {
|
695 |
+
$visible_product_ids = array_merge( $visible_product_ids, $product->get_children() );
|
696 |
+
}
|
697 |
+
?>
|
698 |
+
|
699 |
+
<script>
|
700 |
+
wpmDataLayer.visible_products = <?php
|
701 |
+
echo wp_json_encode( $this->eec_get_visible_products( $visible_product_ids ) ) ;
|
702 |
+
?>;
|
703 |
+
</script>
|
704 |
+
<?php
|
705 |
+
}
|
706 |
+
|
707 |
+
}
|
708 |
+
|
709 |
+
private function eec_get_visible_products( $product_ids )
|
710 |
+
{
|
711 |
+
// error_log(print_r($product_ids, true));
|
712 |
+
$data = [];
|
713 |
+
$position = 1;
|
714 |
+
foreach ( $product_ids as $key => $product_id ) {
|
715 |
+
$product = wc_get_product( $product_id );
|
716 |
+
// only continue if WC retrieves a valid product
|
717 |
+
|
718 |
+
if ( is_object( $product ) ) {
|
719 |
+
$this->dyn_r_ids = $this->get_dyn_r_ids( $product );
|
720 |
+
$data[$product->get_id()] = [
|
721 |
+
'id' => (string) $product->get_id(),
|
722 |
+
'sku' => (string) $product->get_sku(),
|
723 |
+
'name' => (string) $product->get_name(),
|
724 |
+
'price' => (int) $product->get_price(),
|
725 |
+
'brand' => $this->get_brand_name( $product->get_id() ),
|
726 |
+
'category' => (array) $this->get_product_category( $product->get_id() ),
|
727 |
+
'quantity' => (int) 1,
|
728 |
+
'position' => (int) $position,
|
729 |
+
'dyn_r_ids' => $this->dyn_r_ids,
|
730 |
+
];
|
731 |
+
$position++;
|
732 |
+
} else {
|
733 |
+
$this->log_problematic_product_id( $product_id );
|
734 |
+
}
|
735 |
+
|
736 |
+
}
|
737 |
return $data;
|
738 |
}
|
739 |
+
|
740 |
+
protected function inject_transaction_deduper_script( $order_id )
|
741 |
+
{
|
742 |
+
// error_log('order id: ' . $order_id);
|
743 |
+
?>
|
744 |
+
|
745 |
+
<script>
|
746 |
+
jQuery(function () {
|
747 |
+
setTimeout(function () {
|
748 |
+
wpmExists().then(function () {
|
749 |
+
wpm.writeOrderIdToStorage('<?php
|
750 |
+
echo esc_js( $order_id ) ;
|
751 |
+
?>');
|
752 |
+
});
|
753 |
+
}, <?php
|
754 |
+
echo esc_js( $this->transaction_deduper_timeout ) ;
|
755 |
+
?>);
|
756 |
+
});
|
757 |
+
</script>
|
758 |
+
<?php
|
759 |
+
}
|
760 |
+
|
761 |
+
private function inject_noptimize_opening_tag()
|
762 |
+
{
|
763 |
+
echo PHP_EOL . '<!--noptimize-->' ;
|
764 |
+
}
|
765 |
+
|
766 |
+
private function inject_noptimize_closing_tag()
|
767 |
+
{
|
768 |
+
echo '<!--/noptimize-->' . PHP_EOL . PHP_EOL ;
|
769 |
+
}
|
770 |
|
771 |
}
|
classes/pixels/class-pixel.php
CHANGED
@@ -3,6 +3,7 @@
|
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
5 |
use stdClass;
|
|
|
6 |
|
7 |
if (!defined('ABSPATH')) {
|
8 |
exit; // Exit if accessed directly
|
@@ -17,6 +18,7 @@ class Pixel {
|
|
17 |
protected $conversion_label;
|
18 |
protected $dynamic_remarketing;
|
19 |
protected $google_business_vertical;
|
|
|
20 |
protected $ip;
|
21 |
protected $order_total_logic;
|
22 |
protected $product_identifier;
|
@@ -29,17 +31,68 @@ class Pixel {
|
|
29 |
/*
|
30 |
* Initialize options
|
31 |
*/
|
|
|
32 |
$this->options = $options;
|
33 |
$this->options_obj = json_decode(wp_json_encode($this->options));
|
34 |
|
|
|
35 |
$this->options_obj->shop->currency = get_woocommerce_currency();
|
36 |
|
37 |
-
|
38 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
$this->aw_merchant_id = $this->options['google']['ads']['aw_merchant_id'];
|
40 |
$this->conversion_id = $this->options['google']['ads']['conversion_id'];
|
41 |
$this->conversion_label = $this->options['google']['ads']['conversion_label'];
|
42 |
$this->dynamic_remarketing = $this->options['google']['ads']['dynamic_remarketing'];
|
43 |
$this->product_identifier = $this->options['google']['ads']['product_identifier'];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
}
|
45 |
}
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
5 |
use stdClass;
|
6 |
+
use WC_Geolocation;
|
7 |
|
8 |
if (!defined('ABSPATH')) {
|
9 |
exit; // Exit if accessed directly
|
18 |
protected $conversion_label;
|
19 |
protected $dynamic_remarketing;
|
20 |
protected $google_business_vertical;
|
21 |
+
protected $gtag_deactivation;
|
22 |
protected $ip;
|
23 |
protected $order_total_logic;
|
24 |
protected $product_identifier;
|
31 |
/*
|
32 |
* Initialize options
|
33 |
*/
|
34 |
+
// $this->options = get_option(WPM_DB_OPTIONS_NAME);
|
35 |
$this->options = $options;
|
36 |
$this->options_obj = json_decode(wp_json_encode($this->options));
|
37 |
|
38 |
+
$this->options_obj->shop->currency = new stdClass();
|
39 |
$this->options_obj->shop->currency = get_woocommerce_currency();
|
40 |
|
41 |
+
// avoid number output with too many decimals
|
42 |
+
if (version_compare(phpversion(), '7.1', '>=')) {
|
43 |
+
ini_set('serialize_precision', -1);
|
44 |
+
}
|
45 |
+
|
46 |
+
$this->order_total_logic = $this->options['shop']['order_total_logic'];
|
47 |
+
// $this->add_cart_data = $this->options['google']['ads']['add_cart_data'];
|
48 |
+
$this->add_cart_data = $this->options['google']['ads']['aw_merchant_id'] ? true : false;
|
49 |
$this->aw_merchant_id = $this->options['google']['ads']['aw_merchant_id'];
|
50 |
$this->conversion_id = $this->options['google']['ads']['conversion_id'];
|
51 |
$this->conversion_label = $this->options['google']['ads']['conversion_label'];
|
52 |
$this->dynamic_remarketing = $this->options['google']['ads']['dynamic_remarketing'];
|
53 |
$this->product_identifier = $this->options['google']['ads']['product_identifier'];
|
54 |
+
|
55 |
+
if (array_key_exists('gtag', $this->options['google'])) {
|
56 |
+
$this->gtag_deactivation = $this->options['google']['gtag']['deactivation'];
|
57 |
+
}
|
58 |
+
}
|
59 |
+
|
60 |
+
// get an array with all cart product ids
|
61 |
+
public function get_cart_ids( $cart ) {
|
62 |
+
// error_log(print_r($cart, true));
|
63 |
+
// initiate product identifier array
|
64 |
+
$cart_items = [];
|
65 |
+
|
66 |
+
// go through the array and get all product identifiers
|
67 |
+
foreach ((array) $cart as $cart_item) {
|
68 |
+
|
69 |
+
$product_id = $this->get_variation_or_product_id($cart_item, $this->options_obj->general->variations_output);
|
70 |
+
$product = wc_get_product($product_id);
|
71 |
+
|
72 |
+
$product_id_compiled = $this->get_compiled_product_id($product_id, $product->get_sku(), $this->options, '');
|
73 |
+
|
74 |
+
array_push($cart_items, $product_id_compiled);
|
75 |
+
}
|
76 |
+
|
77 |
+
return $cart_items;
|
78 |
+
}
|
79 |
+
|
80 |
+
protected function get_visitor_country() {
|
81 |
+
if ($this->isLocalhost()) {
|
82 |
+
$this->ip = WC_Geolocation::get_external_ip_address();
|
83 |
+
} else {
|
84 |
+
$this->ip = WC_Geolocation::get_ip_address();
|
85 |
+
}
|
86 |
+
|
87 |
+
$location = WC_Geolocation::geolocate_ip($this->ip);
|
88 |
+
|
89 |
+
return $location['country'];
|
90 |
+
}
|
91 |
+
|
92 |
+
protected function isLocalhost() {
|
93 |
+
|
94 |
+
$_server = filter_input_array(INPUT_SERVER, FILTER_SANITIZE_STRING);
|
95 |
+
|
96 |
+
return in_array($_server['REMOTE_ADDR'], ['127.0.0.1', '::1']);
|
97 |
}
|
98 |
}
|
classes/pixels/class-script-manager.php
DELETED
@@ -1,284 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace WCPM\Classes\Pixels;
|
4 |
-
|
5 |
-
use stdClass ;
|
6 |
-
use WCPM\Classes\Admin\Documentation ;
|
7 |
-
use WC_Product ;
|
8 |
-
use WC_Product_Data_Store_CPT ;
|
9 |
-
|
10 |
-
if ( !defined( 'ABSPATH' ) ) {
|
11 |
-
exit;
|
12 |
-
// Exit if accessed directly
|
13 |
-
}
|
14 |
-
|
15 |
-
class Script_Manager
|
16 |
-
{
|
17 |
-
use Trait_Product ;
|
18 |
-
use Trait_Shop ;
|
19 |
-
protected $transaction_deduper_timeout = 2000 ;
|
20 |
-
protected $options ;
|
21 |
-
protected $options_obj ;
|
22 |
-
public function __construct( $options )
|
23 |
-
{
|
24 |
-
/*
|
25 |
-
* Initialize options
|
26 |
-
*/
|
27 |
-
// $this->options = get_option(WPM_DB_OPTIONS_NAME);
|
28 |
-
$this->options = $options;
|
29 |
-
$this->options_obj = json_decode( wp_json_encode( $this->options ) );
|
30 |
-
$this->options_obj->shop->currency = new stdClass();
|
31 |
-
$this->options_obj->shop->currency = get_woocommerce_currency();
|
32 |
-
/*
|
33 |
-
* Inject pixel snippets in head
|
34 |
-
*/
|
35 |
-
add_action( 'wp_head', function () {
|
36 |
-
$this->inject_head_pixels();
|
37 |
-
} );
|
38 |
-
}
|
39 |
-
|
40 |
-
public function inject_head_pixels()
|
41 |
-
{
|
42 |
-
global $woocommerce ;
|
43 |
-
$_post = filter_input_array( INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
|
44 |
-
$this->inject_opening_script_tag();
|
45 |
-
$this->inject_everywhere();
|
46 |
-
|
47 |
-
if ( is_product_category() ) {
|
48 |
-
$this->inject_product_category();
|
49 |
-
} elseif ( is_product_tag() ) {
|
50 |
-
$this->inject_product_tag();
|
51 |
-
} elseif ( is_search() ) {
|
52 |
-
$this->inject_search();
|
53 |
-
} elseif ( is_product() && !isset( $_post['add-to-cart'] ) ) {
|
54 |
-
$product = wc_get_product();
|
55 |
-
$product_id = $product->get_id();
|
56 |
-
$product_attributes = [
|
57 |
-
'brand' => $this->get_brand_name( $product_id ),
|
58 |
-
];
|
59 |
-
if ( $product->is_type( 'variable' ) ) {
|
60 |
-
// find out if attributes have been set in the URL
|
61 |
-
// if not, continue
|
62 |
-
// if yes get the variation id and variation SKU
|
63 |
-
|
64 |
-
if ( $this->query_string_contains_all_variation_attributes( $product ) ) {
|
65 |
-
// get variation product
|
66 |
-
$product_id = $this->get_variation_from_query_string( $product_id, $product );
|
67 |
-
// In case a variable product is misconfigured, wc_get_product($product_id) will not
|
68 |
-
// get a product but a bool. So we need to test it and only run it if
|
69 |
-
// we actually get a product. Basically we fall back to the parent product.
|
70 |
-
if ( is_object( wc_get_product( $product_id ) ) ) {
|
71 |
-
$product = wc_get_product( $product_id );
|
72 |
-
}
|
73 |
-
}
|
74 |
-
|
75 |
-
}
|
76 |
-
|
77 |
-
if ( is_object( $product ) ) {
|
78 |
-
$product_attributes['product_id_compiled'] = $this->get_compiled_product_id(
|
79 |
-
$product_id,
|
80 |
-
$product->get_sku(),
|
81 |
-
$this->options,
|
82 |
-
''
|
83 |
-
);
|
84 |
-
$product_attributes['dyn_r_ids'] = $this->get_dyn_r_ids( $product );
|
85 |
-
$this->inject_product( $product, $product_attributes );
|
86 |
-
} else {
|
87 |
-
$this->log_problematic_product_id( $product_id );
|
88 |
-
}
|
89 |
-
|
90 |
-
} elseif ( $this->is_shop_top_page() ) {
|
91 |
-
$this->inject_shop_top_page();
|
92 |
-
} elseif ( is_cart() && !empty($woocommerce->cart->get_cart()) ) {
|
93 |
-
$cart = $woocommerce->cart->get_cart();
|
94 |
-
$cart_total = WC()->cart->get_cart_contents_total();
|
95 |
-
$this->inject_cart( $cart, $cart_total );
|
96 |
-
} elseif ( is_order_received_page() ) {
|
97 |
-
// $this->is_nodedupe_parameter_set();
|
98 |
-
// get order from URL and evaluate order total
|
99 |
-
|
100 |
-
if ( $this->get_order_from_order_received_page() ) {
|
101 |
-
$order = $this->get_order_from_order_received_page();
|
102 |
-
|
103 |
-
if ( is_user_logged_in() ) {
|
104 |
-
$user = get_current_user_id();
|
105 |
-
} else {
|
106 |
-
$user = $order->get_billing_email();
|
107 |
-
}
|
108 |
-
|
109 |
-
$is_new_customer = !$this->is_existing_customer( $order, $user );
|
110 |
-
$order_total = $this->wpm_get_order_total( $order );
|
111 |
-
// dedupe code
|
112 |
-
if ( $this->can_order_confirmation_be_processed( $order ) ) {
|
113 |
-
$this->inject_order_received_page_dedupe( $order, $order_total, $is_new_customer );
|
114 |
-
}
|
115 |
-
$this->inject_order_received_page_no_dedupe( $order, $order_total, $is_new_customer );
|
116 |
-
}
|
117 |
-
|
118 |
-
}
|
119 |
-
|
120 |
-
$this->inject_closing_script_tag();
|
121 |
-
}
|
122 |
-
|
123 |
-
protected function can_order_confirmation_be_processed( $order )
|
124 |
-
{
|
125 |
-
$conversion_prevention = false;
|
126 |
-
$conversion_prevention = apply_filters_deprecated(
|
127 |
-
'wgact_conversion_prevention',
|
128 |
-
[ $conversion_prevention, $order ],
|
129 |
-
'1.10.2',
|
130 |
-
'wooptpm_conversion_prevention'
|
131 |
-
);
|
132 |
-
$conversion_prevention = apply_filters_deprecated(
|
133 |
-
'wooptpm_conversion_prevention',
|
134 |
-
[ $conversion_prevention, $order ],
|
135 |
-
'1.13.0',
|
136 |
-
'wpm_conversion_prevention'
|
137 |
-
);
|
138 |
-
$conversion_prevention = apply_filters( 'wpm_conversion_prevention', $conversion_prevention, $order );
|
139 |
-
// error_log('conversion_prevention: ' . $conversion_prevention);
|
140 |
-
// error_log('$this->is_nodedupe_parameter_set(): ' . $this->is_nodedupe_parameter_set());
|
141 |
-
// error_log('$order->has_status(\'failed\'): ' . $order->has_status('failed'));
|
142 |
-
// error_log('current_user_can(\'edit_others_pages\'): ' . current_user_can('edit_others_pages'));
|
143 |
-
// error_log("this->options['shop']['order_deduplication']: " . $this->options['shop']['order_deduplication']);
|
144 |
-
// error_log('order id: ' . $order->get_id());
|
145 |
-
// error_log('order number: ' . $order->get_order_number());
|
146 |
-
// error_log('get_post_meta($order->get_order_number(), \'_wpm_conversion_pixel_fired\', true): ' . get_post_meta($order->get_order_number(), '_wpm_conversion_pixel_fired', true));
|
147 |
-
|
148 |
-
if ( $this->is_nodedupe_parameter_set() || !$order->has_status( 'failed' ) && $this->track_user() && false == $conversion_prevention && (!$this->options['shop']['order_deduplication'] || $this->has_conversion_pixel_already_fired( $order ) != true) ) {
|
149 |
-
return true;
|
150 |
-
} else {
|
151 |
-
return false;
|
152 |
-
}
|
153 |
-
|
154 |
-
}
|
155 |
-
|
156 |
-
private function has_conversion_pixel_already_fired( $order )
|
157 |
-
{
|
158 |
-
return false;
|
159 |
-
}
|
160 |
-
|
161 |
-
public function inject_everywhere()
|
162 |
-
{
|
163 |
-
}
|
164 |
-
|
165 |
-
public function inject_product_category()
|
166 |
-
{
|
167 |
-
}
|
168 |
-
|
169 |
-
public function inject_product_tag()
|
170 |
-
{
|
171 |
-
}
|
172 |
-
|
173 |
-
public function inject_search()
|
174 |
-
{
|
175 |
-
}
|
176 |
-
|
177 |
-
public function inject_product( $product, $product_attributes )
|
178 |
-
{
|
179 |
-
}
|
180 |
-
|
181 |
-
public function inject_shop_top_page()
|
182 |
-
{
|
183 |
-
}
|
184 |
-
|
185 |
-
public function inject_cart( $cart, $cart_total )
|
186 |
-
{
|
187 |
-
}
|
188 |
-
|
189 |
-
public function inject_order_received_page_dedupe( $order, $order_total, $is_new_customer )
|
190 |
-
{
|
191 |
-
}
|
192 |
-
|
193 |
-
protected function is_nodedupe_parameter_set()
|
194 |
-
{
|
195 |
-
$_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
|
196 |
-
|
197 |
-
if ( isset( $_get['nodedupe'] ) ) {
|
198 |
-
return true;
|
199 |
-
} else {
|
200 |
-
return false;
|
201 |
-
}
|
202 |
-
|
203 |
-
}
|
204 |
-
|
205 |
-
protected function query_string_contains_all_variation_attributes( $product )
|
206 |
-
{
|
207 |
-
$_server = filter_input_array( INPUT_SERVER, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
|
208 |
-
|
209 |
-
if ( !empty($_server['QUERY_STRING']) ) {
|
210 |
-
parse_str( $_server['QUERY_STRING'], $query_string_attributes );
|
211 |
-
foreach ( array_keys( $product->get_attributes() ) as $variation_attribute => $value ) {
|
212 |
-
if ( !array_key_exists( 'attribute_' . $value, $query_string_attributes ) ) {
|
213 |
-
return false;
|
214 |
-
}
|
215 |
-
}
|
216 |
-
return true;
|
217 |
-
} else {
|
218 |
-
return false;
|
219 |
-
}
|
220 |
-
|
221 |
-
}
|
222 |
-
|
223 |
-
protected function get_variation_from_query_string( $product_id, $product )
|
224 |
-
{
|
225 |
-
$_server = filter_input_array( INPUT_SERVER, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
|
226 |
-
parse_str( $_server['QUERY_STRING'], $query_string_attributes );
|
227 |
-
$search_variation_attributes = [];
|
228 |
-
foreach ( array_keys( $product->get_attributes() ) as $variation_attribute => $value ) {
|
229 |
-
$search_variation_attributes['attribute_' . $value] = $query_string_attributes['attribute_' . $value];
|
230 |
-
}
|
231 |
-
return $this->find_matching_product_variation_id( $product_id, $search_variation_attributes );
|
232 |
-
}
|
233 |
-
|
234 |
-
protected function find_matching_product_variation_id( $product_id, $attributes )
|
235 |
-
{
|
236 |
-
return ( new WC_Product_Data_Store_CPT() )->find_matching_product_variation( new WC_Product( $product_id ), $attributes );
|
237 |
-
}
|
238 |
-
|
239 |
-
protected function conversion_pixels_already_fired_html()
|
240 |
-
{
|
241 |
-
?>
|
242 |
-
|
243 |
-
<!-- ----------------------------------------------------------------------------------------------------
|
244 |
-
The conversion pixels have not been fired. Possible reasons:
|
245 |
-
- The user role has been disabled for tracking.
|
246 |
-
- The order payment has failed.
|
247 |
-
- The pixels have already been fired. To prevent double counting the pixels are only fired once.
|
248 |
-
|
249 |
-
If you want to test the order you have two options:
|
250 |
-
- Turn off order duplication prevention in the advanced settings
|
251 |
-
- Add the '&nodedupe' parameter to the order confirmation URL like this:
|
252 |
-
https://example.test/checkout/order-received/123/?key=wc_order_123abc&nodedupe
|
253 |
-
|
254 |
-
More info on testing: <?php
|
255 |
-
esc_html_e( ( new Documentation() )->get_link( 'test_order' ) );
|
256 |
-
?>
|
257 |
-
|
258 |
-
----------------------------------------------------------------------------------------------------
|
259 |
-
-->
|
260 |
-
<?php
|
261 |
-
}
|
262 |
-
|
263 |
-
private function is_shop_top_page()
|
264 |
-
{
|
265 |
-
|
266 |
-
if ( !is_product() && !is_product_category() && !is_order_received_page() && !is_cart() && !is_search() && is_shop() ) {
|
267 |
-
return true;
|
268 |
-
} else {
|
269 |
-
return false;
|
270 |
-
}
|
271 |
-
|
272 |
-
}
|
273 |
-
|
274 |
-
protected function inject_opening_script_tag()
|
275 |
-
{
|
276 |
-
echo ' <script>' ;
|
277 |
-
}
|
278 |
-
|
279 |
-
protected function inject_closing_script_tag()
|
280 |
-
{
|
281 |
-
echo ' </script>' ;
|
282 |
-
}
|
283 |
-
|
284 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
classes/pixels/class-shortcodes.php
CHANGED
@@ -2,31 +2,27 @@
|
|
2 |
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
5 |
-
use WCPM\Classes\Pixels\Google\
|
6 |
|
7 |
if (!defined('ABSPATH')) {
|
8 |
exit; // Exit if accessed directly
|
9 |
}
|
10 |
|
11 |
class Shortcodes extends Pixel {
|
|
|
12 |
use Trait_Product;
|
13 |
|
14 |
-
private $google;
|
15 |
-
|
16 |
public function __construct( $options ) {
|
17 |
parent::__construct($options);
|
18 |
|
19 |
-
$this->google = new Google($options);
|
20 |
-
|
21 |
add_shortcode('view-item', [$this, 'wpm_view_item']);
|
22 |
add_shortcode('conversion-pixel', [$this, 'wpm_conversion_pixel']);
|
23 |
}
|
24 |
|
25 |
public function wpm_view_item( $attributes ) {
|
26 |
-
$shortcode_attributes = shortcode_atts(
|
27 |
-
|
28 |
-
|
29 |
-
], $attributes);
|
30 |
|
31 |
if ($shortcode_attributes['product-id']) {
|
32 |
|
@@ -42,18 +38,16 @@ class Shortcodes extends Pixel {
|
|
42 |
?>
|
43 |
|
44 |
<script>
|
45 |
-
jQuery(window).on(
|
46 |
-
jQuery(document).trigger(
|
47 |
-
})
|
48 |
</script>
|
49 |
<?php
|
50 |
}
|
51 |
}
|
52 |
|
53 |
public function wpm_conversion_pixel( $attributes ) {
|
54 |
-
$
|
55 |
-
|
56 |
-
$pairs = [
|
57 |
'pixel' => 'all',
|
58 |
'gads-conversion-id' => $this->options_obj->google->ads->conversion_id,
|
59 |
'gads-conversion-label' => '',
|
@@ -67,40 +61,38 @@ class Shortcodes extends Pixel {
|
|
67 |
'ms-ads-event-value' => 0,
|
68 |
'snap-event' => 'SIGN_UP',
|
69 |
'tiktok-event' => 'SubmitForm',
|
70 |
-
];
|
71 |
|
72 |
-
|
73 |
-
|
74 |
-
if ('google-ads' === $shortcode_attributes['pixel']) {
|
75 |
-
if ($this->google->is_google_ads_active()) {
|
76 |
$this->conversion_html_google_ads($shortcode_attributes);
|
77 |
}
|
78 |
-
} elseif ('facebook'
|
79 |
if ($this->options_obj->facebook->pixel_id) {
|
80 |
$this->conversion_html_facebook($shortcode_attributes);
|
81 |
}
|
82 |
-
} elseif ('twitter'
|
83 |
if ($this->options_obj->twitter->pixel_id) {
|
84 |
$this->conversion_html_twitter($shortcode_attributes);
|
85 |
}
|
86 |
-
} elseif ('pinterest'
|
87 |
if ($this->options_obj->pinterest->pixel_id) {
|
88 |
$this->conversion_html_pinterest($shortcode_attributes);
|
89 |
}
|
90 |
-
} elseif ('ms-ads'
|
91 |
if ($this->options_obj->bing->uet_tag_id) {
|
92 |
$this->conversion_html_microsoft_ads($shortcode_attributes);
|
93 |
}
|
94 |
-
} elseif ('snapchat'
|
95 |
if ($this->options_obj->snapchat->pixel_id) {
|
96 |
$this->conversion_html_snapchat($shortcode_attributes);
|
97 |
}
|
98 |
-
} elseif ('tiktok'
|
99 |
if ($this->options_obj->tiktok->pixel_id) {
|
100 |
$this->conversion_html_tiktok($shortcode_attributes);
|
101 |
}
|
102 |
-
} elseif ('all'
|
103 |
-
if ($this->
|
104 |
$this->conversion_html_google_ads($shortcode_attributes);
|
105 |
}
|
106 |
if ($this->options_obj->facebook->pixel_id) {
|
@@ -125,69 +117,53 @@ class Shortcodes extends Pixel {
|
|
125 |
}
|
126 |
|
127 |
private function conversion_html_snapchat( $shortcode_attributes ) {
|
128 |
-
|
129 |
?>
|
130 |
|
131 |
<script>
|
132 |
-
|
133 |
-
snaptr("track", '<?php echo esc_js($shortcode_attributes['snap-event']); ?>')
|
134 |
-
},
|
135 |
-
)
|
136 |
</script>
|
137 |
<?php
|
138 |
}
|
139 |
|
140 |
private function conversion_html_tiktok( $shortcode_attributes ) {
|
141 |
-
|
142 |
?>
|
143 |
|
144 |
<script>
|
145 |
-
|
146 |
-
ttq.track('<?php echo esc_js($shortcode_attributes['tiktok-event']); ?>')
|
147 |
-
},
|
148 |
-
)
|
149 |
</script>
|
150 |
<?php
|
151 |
}
|
152 |
|
153 |
private function conversion_html_google_ads( $shortcode_attributes ) {
|
154 |
-
|
155 |
?>
|
156 |
|
157 |
<script>
|
158 |
-
|
159 |
-
if (wpm.googleConfigConditionsMet("ads")) gtag("event", "conversion", {"send_to": 'AW-<?php echo esc_js($shortcode_attributes['gads-conversion-id']); ?>/<?php echo esc_js($shortcode_attributes['gads-conversion-label']); ?>'})
|
160 |
-
},
|
161 |
-
)
|
162 |
</script>
|
163 |
<?php
|
164 |
}
|
165 |
|
166 |
// https://developers.facebook.com/docs/analytics/send_data/events/
|
167 |
private function conversion_html_facebook( $shortcode_attributes ) {
|
168 |
-
|
169 |
if ($this->options_obj->facebook->capi->token) {
|
170 |
?>
|
171 |
|
172 |
<script>
|
173 |
-
jQuery(window).on(
|
174 |
|
175 |
-
let eventId = wpm.getRandomEventId()
|
176 |
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
})
|
181 |
-
},
|
182 |
-
)
|
183 |
|
184 |
-
jQuery(document).trigger(
|
185 |
event_name : "<?php echo esc_js($shortcode_attributes['fbc-event']); ?>",
|
186 |
event_id : eventId,
|
187 |
user_data : wpm.getFbUserData(),
|
188 |
-
event_source_url: window.location.href
|
189 |
-
})
|
190 |
-
})
|
191 |
|
192 |
</script>
|
193 |
<?php
|
@@ -195,10 +171,7 @@ class Shortcodes extends Pixel {
|
|
195 |
?>
|
196 |
|
197 |
<script>
|
198 |
-
|
199 |
-
fbq("track", '<?php echo esc_js($shortcode_attributes['fbc-event']); ?>')
|
200 |
-
},
|
201 |
-
)
|
202 |
</script>
|
203 |
<?php
|
204 |
}
|
@@ -206,14 +179,10 @@ class Shortcodes extends Pixel {
|
|
206 |
|
207 |
// https://business.twitter.com/en/help/campaign-measurement-and-analytics/conversion-tracking-for-websites.html
|
208 |
private function conversion_html_twitter( $shortcode_attributes ) {
|
209 |
-
|
210 |
?>
|
211 |
|
212 |
<script>
|
213 |
-
|
214 |
-
twq("track", '<?php echo esc_js($shortcode_attributes['twc-event']); ?>')
|
215 |
-
},
|
216 |
-
)
|
217 |
</script>
|
218 |
<?php
|
219 |
}
|
@@ -221,27 +190,20 @@ class Shortcodes extends Pixel {
|
|
221 |
// https://help.pinterest.com/en/business/article/track-conversions-with-pinterest-tag
|
222 |
// https://help.pinterest.com/en/business/article/add-event-codes
|
223 |
private function conversion_html_pinterest( $shortcode_attributes ) {
|
224 |
-
|
225 |
-
if ('' === $shortcode_attributes['pinc-lead-type']) {
|
226 |
?>
|
227 |
|
228 |
<script>
|
229 |
-
|
230 |
-
pintrk("track", '<?php echo esc_js($shortcode_attributes['pinc-event']); ?>')
|
231 |
-
},
|
232 |
-
)
|
233 |
</script>
|
234 |
<?php
|
235 |
} else {
|
236 |
?>
|
237 |
|
238 |
<script>
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
})
|
243 |
-
},
|
244 |
-
)
|
245 |
</script>
|
246 |
<?php
|
247 |
}
|
@@ -252,33 +214,12 @@ class Shortcodes extends Pixel {
|
|
252 |
?>
|
253 |
|
254 |
<script>
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
})
|
262 |
-
},
|
263 |
-
)
|
264 |
-
</script>
|
265 |
-
<?php
|
266 |
-
}
|
267 |
-
|
268 |
-
protected function function_exists_script() {
|
269 |
-
?>
|
270 |
-
|
271 |
-
<script>
|
272 |
-
if (typeof wpmFunctionExists !== "function") {
|
273 |
-
window.wpmFunctionExists = function (functionName) {
|
274 |
-
return new Promise(function (resolve) {
|
275 |
-
(function waitForVar() {
|
276 |
-
if (typeof window[functionName] !== "undefined") return resolve()
|
277 |
-
setTimeout(waitForVar, 1000)
|
278 |
-
})()
|
279 |
-
})
|
280 |
-
}
|
281 |
-
}
|
282 |
</script>
|
283 |
<?php
|
284 |
}
|
2 |
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
5 |
+
use WCPM\Classes\Pixels\Google\Trait_Google;
|
6 |
|
7 |
if (!defined('ABSPATH')) {
|
8 |
exit; // Exit if accessed directly
|
9 |
}
|
10 |
|
11 |
class Shortcodes extends Pixel {
|
12 |
+
use Trait_Google;
|
13 |
use Trait_Product;
|
14 |
|
|
|
|
|
15 |
public function __construct( $options ) {
|
16 |
parent::__construct($options);
|
17 |
|
|
|
|
|
18 |
add_shortcode('view-item', [$this, 'wpm_view_item']);
|
19 |
add_shortcode('conversion-pixel', [$this, 'wpm_conversion_pixel']);
|
20 |
}
|
21 |
|
22 |
public function wpm_view_item( $attributes ) {
|
23 |
+
$shortcode_attributes = shortcode_atts([
|
24 |
+
'product-id' => null,
|
25 |
+
], $attributes);
|
|
|
26 |
|
27 |
if ($shortcode_attributes['product-id']) {
|
28 |
|
38 |
?>
|
39 |
|
40 |
<script>
|
41 |
+
jQuery(window).on('load', function () {
|
42 |
+
jQuery(document).trigger('wpmViewItem', wpm.getProductDetailsFormattedForEvent(<?php echo esc_js($shortcode_attributes['product-id']); ?>));
|
43 |
+
});
|
44 |
</script>
|
45 |
<?php
|
46 |
}
|
47 |
}
|
48 |
|
49 |
public function wpm_conversion_pixel( $attributes ) {
|
50 |
+
$shortcode_attributes = shortcode_atts([
|
|
|
|
|
51 |
'pixel' => 'all',
|
52 |
'gads-conversion-id' => $this->options_obj->google->ads->conversion_id,
|
53 |
'gads-conversion-label' => '',
|
61 |
'ms-ads-event-value' => 0,
|
62 |
'snap-event' => 'SIGN_UP',
|
63 |
'tiktok-event' => 'SubmitForm',
|
64 |
+
], $attributes);
|
65 |
|
66 |
+
if ('google-ads' == $shortcode_attributes['pixel']) {
|
67 |
+
if ($this->is_google_ads_active()) {
|
|
|
|
|
68 |
$this->conversion_html_google_ads($shortcode_attributes);
|
69 |
}
|
70 |
+
} elseif ('facebook' == $shortcode_attributes['pixel']) {
|
71 |
if ($this->options_obj->facebook->pixel_id) {
|
72 |
$this->conversion_html_facebook($shortcode_attributes);
|
73 |
}
|
74 |
+
} elseif ('twitter' == $shortcode_attributes['pixel']) {
|
75 |
if ($this->options_obj->twitter->pixel_id) {
|
76 |
$this->conversion_html_twitter($shortcode_attributes);
|
77 |
}
|
78 |
+
} elseif ('pinterest' == $shortcode_attributes['pixel']) {
|
79 |
if ($this->options_obj->pinterest->pixel_id) {
|
80 |
$this->conversion_html_pinterest($shortcode_attributes);
|
81 |
}
|
82 |
+
} elseif ('ms-ads' == $shortcode_attributes['pixel']) {
|
83 |
if ($this->options_obj->bing->uet_tag_id) {
|
84 |
$this->conversion_html_microsoft_ads($shortcode_attributes);
|
85 |
}
|
86 |
+
} elseif ('snapchat' == $shortcode_attributes['pixel']) {
|
87 |
if ($this->options_obj->snapchat->pixel_id) {
|
88 |
$this->conversion_html_snapchat($shortcode_attributes);
|
89 |
}
|
90 |
+
} elseif ('tiktok' == $shortcode_attributes['pixel']) {
|
91 |
if ($this->options_obj->tiktok->pixel_id) {
|
92 |
$this->conversion_html_tiktok($shortcode_attributes);
|
93 |
}
|
94 |
+
} elseif ('all' == $shortcode_attributes['pixel']) {
|
95 |
+
if ($this->is_google_ads_active()) {
|
96 |
$this->conversion_html_google_ads($shortcode_attributes);
|
97 |
}
|
98 |
if ($this->options_obj->facebook->pixel_id) {
|
117 |
}
|
118 |
|
119 |
private function conversion_html_snapchat( $shortcode_attributes ) {
|
|
|
120 |
?>
|
121 |
|
122 |
<script>
|
123 |
+
snaptr('track', '<?php echo esc_js($shortcode_attributes['snap-event']); ?>');
|
|
|
|
|
|
|
124 |
</script>
|
125 |
<?php
|
126 |
}
|
127 |
|
128 |
private function conversion_html_tiktok( $shortcode_attributes ) {
|
|
|
129 |
?>
|
130 |
|
131 |
<script>
|
132 |
+
ttq.track('<?php echo esc_js($shortcode_attributes['tiktok-event']); ?>');
|
|
|
|
|
|
|
133 |
</script>
|
134 |
<?php
|
135 |
}
|
136 |
|
137 |
private function conversion_html_google_ads( $shortcode_attributes ) {
|
|
|
138 |
?>
|
139 |
|
140 |
<script>
|
141 |
+
if (googleConfigConditionsMet('ads')) gtag('event', 'conversion', {'send_to': 'AW-<?php echo esc_js($shortcode_attributes['gads-conversion-id']); ?>/<?php echo esc_js($shortcode_attributes['gads-conversion-label']); ?>'});
|
|
|
|
|
|
|
142 |
</script>
|
143 |
<?php
|
144 |
}
|
145 |
|
146 |
// https://developers.facebook.com/docs/analytics/send_data/events/
|
147 |
private function conversion_html_facebook( $shortcode_attributes ) {
|
|
|
148 |
if ($this->options_obj->facebook->capi->token) {
|
149 |
?>
|
150 |
|
151 |
<script>
|
152 |
+
jQuery(window).on('load', function () {
|
153 |
|
154 |
+
let eventId = wpm.getRandomEventId();
|
155 |
|
156 |
+
fbq('track', '<?php echo esc_js($shortcode_attributes['fbc-event']); ?>', {}, {
|
157 |
+
eventID: eventId,
|
158 |
+
});
|
|
|
|
|
|
|
159 |
|
160 |
+
jQuery(document).trigger('wpmFbCapiEvent', {
|
161 |
event_name : "<?php echo esc_js($shortcode_attributes['fbc-event']); ?>",
|
162 |
event_id : eventId,
|
163 |
user_data : wpm.getFbUserData(),
|
164 |
+
event_source_url: window.location.href
|
165 |
+
});
|
166 |
+
});
|
167 |
|
168 |
</script>
|
169 |
<?php
|
171 |
?>
|
172 |
|
173 |
<script>
|
174 |
+
fbq('track', '<?php echo esc_js($shortcode_attributes['fbc-event']); ?>');
|
|
|
|
|
|
|
175 |
</script>
|
176 |
<?php
|
177 |
}
|
179 |
|
180 |
// https://business.twitter.com/en/help/campaign-measurement-and-analytics/conversion-tracking-for-websites.html
|
181 |
private function conversion_html_twitter( $shortcode_attributes ) {
|
|
|
182 |
?>
|
183 |
|
184 |
<script>
|
185 |
+
twq('track', '<?php echo esc_js($shortcode_attributes['twc-event']); ?>');
|
|
|
|
|
|
|
186 |
</script>
|
187 |
<?php
|
188 |
}
|
190 |
// https://help.pinterest.com/en/business/article/track-conversions-with-pinterest-tag
|
191 |
// https://help.pinterest.com/en/business/article/add-event-codes
|
192 |
private function conversion_html_pinterest( $shortcode_attributes ) {
|
193 |
+
if ('' == $shortcode_attributes['pinc-lead-type']) {
|
|
|
194 |
?>
|
195 |
|
196 |
<script>
|
197 |
+
pintrk('track', '<?php echo esc_js($shortcode_attributes['pinc-event']); ?>');
|
|
|
|
|
|
|
198 |
</script>
|
199 |
<?php
|
200 |
} else {
|
201 |
?>
|
202 |
|
203 |
<script>
|
204 |
+
pintrk('track', '<?php echo esc_js($shortcode_attributes['pinc-event']); ?>', {
|
205 |
+
lead_type: '<?php echo esc_js($shortcode_attributes['pinc-lead-type']); ?>'
|
206 |
+
});
|
|
|
|
|
|
|
207 |
</script>
|
208 |
<?php
|
209 |
}
|
214 |
?>
|
215 |
|
216 |
<script>
|
217 |
+
window.uetq = window.uetq || [];
|
218 |
+
window.uetq.push('event', '<?php echo esc_js($shortcode_attributes['ms-ads-event']); ?>', {
|
219 |
+
'event_category': '<?php echo esc_js($shortcode_attributes['ms-ads-event-category']); ?>',
|
220 |
+
'event_label' : '<?php echo esc_js($shortcode_attributes['ms-ads-event-label']); ?>',
|
221 |
+
'event_value' : '<?php echo esc_js($shortcode_attributes['ms-ads-event-value']); ?>'
|
222 |
+
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
223 |
</script>
|
224 |
<?php
|
225 |
}
|
classes/pixels/facebook/class-facebook-pixel-manager-microdata.php
CHANGED
@@ -2,13 +2,13 @@
|
|
2 |
|
3 |
namespace WCPM\Classes\Pixels\Facebook;
|
4 |
|
5 |
-
use WCPM\Classes\Pixels\
|
6 |
|
7 |
if (!defined('ABSPATH')) {
|
8 |
exit; // Exit if accessed directly
|
9 |
}
|
10 |
|
11 |
-
class Facebook_Pixel_Manager_Microdata extends
|
12 |
protected $facebook_microdata_pixel;
|
13 |
|
14 |
public function __construct( $options ) {
|
2 |
|
3 |
namespace WCPM\Classes\Pixels\Facebook;
|
4 |
|
5 |
+
use WCPM\Classes\Pixels\Pixel_Manager_Base;
|
6 |
|
7 |
if (!defined('ABSPATH')) {
|
8 |
exit; // Exit if accessed directly
|
9 |
}
|
10 |
|
11 |
+
class Facebook_Pixel_Manager_Microdata extends Pixel_Manager_Base {
|
12 |
protected $facebook_microdata_pixel;
|
13 |
|
14 |
public function __construct( $options ) {
|
classes/pixels/facebook/class-facebook-pixel-manager.php
CHANGED
@@ -3,19 +3,24 @@
|
|
3 |
namespace WCPM\Classes\Pixels\Facebook;
|
4 |
|
5 |
use WCPM\Classes\Http\Facebook_CAPI ;
|
|
|
6 |
|
7 |
if ( !defined( 'ABSPATH' ) ) {
|
8 |
exit;
|
9 |
// Exit if accessed directly
|
10 |
}
|
11 |
|
12 |
-
class Facebook_Pixel_Manager
|
13 |
{
|
|
|
14 |
protected $facebook_capi ;
|
15 |
public function __construct( $options )
|
16 |
{
|
|
|
|
|
|
|
17 |
|
18 |
-
if ( wpm_fs()->is__premium_only() && $
|
19 |
$this->facebook_capi = new Facebook_CAPI( $options );
|
20 |
// Save the Facebook session identifiers on the order so that we can use them later when the order gets paid or completed
|
21 |
// https://woocommerce.github.io/code-reference/files/woocommerce-includes-class-wc-checkout.html#source-view.403
|
@@ -32,5 +37,74 @@ class Facebook_Pixel_Manager
|
|
32 |
}
|
33 |
|
34 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
|
36 |
}
|
3 |
namespace WCPM\Classes\Pixels\Facebook;
|
4 |
|
5 |
use WCPM\Classes\Http\Facebook_CAPI ;
|
6 |
+
use WCPM\Classes\Pixels\Pixel_Manager_Base ;
|
7 |
|
8 |
if ( !defined( 'ABSPATH' ) ) {
|
9 |
exit;
|
10 |
// Exit if accessed directly
|
11 |
}
|
12 |
|
13 |
+
class Facebook_Pixel_Manager extends Pixel_Manager_Base
|
14 |
{
|
15 |
+
protected $facebook_browser_pixel ;
|
16 |
protected $facebook_capi ;
|
17 |
public function __construct( $options )
|
18 |
{
|
19 |
+
parent::__construct( $options );
|
20 |
+
// add_action('wp_enqueue_scripts', [$this, 'wpm_facebook_front_end_scripts']);
|
21 |
+
$this->facebook_browser_pixel = new Facebook_Browser_Pixel( $options );
|
22 |
|
23 |
+
if ( wpm_fs()->is__premium_only() && $this->options_obj->facebook->capi->token ) {
|
24 |
$this->facebook_capi = new Facebook_CAPI( $options );
|
25 |
// Save the Facebook session identifiers on the order so that we can use them later when the order gets paid or completed
|
26 |
// https://woocommerce.github.io/code-reference/files/woocommerce-includes-class-wc-checkout.html#source-view.403
|
37 |
}
|
38 |
|
39 |
}
|
40 |
+
|
41 |
+
public function wpm_facebook_front_end_scripts()
|
42 |
+
{
|
43 |
+
wp_enqueue_script(
|
44 |
+
'wpm-facebook',
|
45 |
+
WPM_PLUGIN_DIR_PATH . 'js/public/footer/facebook' . $this->get_script_suffix(),
|
46 |
+
[ 'jquery', 'wpm' ],
|
47 |
+
// ['jquery'],
|
48 |
+
WPM_CURRENT_VERSION,
|
49 |
+
true
|
50 |
+
);
|
51 |
+
}
|
52 |
+
|
53 |
+
public function inject_everywhere()
|
54 |
+
{
|
55 |
+
$this->facebook_browser_pixel->inject_everywhere();
|
56 |
+
}
|
57 |
+
|
58 |
+
public function inject_search()
|
59 |
+
{
|
60 |
+
$this->facebook_browser_pixel->inject_search();
|
61 |
+
}
|
62 |
+
|
63 |
+
public function inject_product( $product, $product_attributes )
|
64 |
+
{
|
65 |
+
$this->facebook_browser_pixel->inject_product( $product, $product_attributes );
|
66 |
+
}
|
67 |
+
|
68 |
+
public function inject_cart( $cart, $cart_total )
|
69 |
+
{
|
70 |
+
$this->facebook_browser_pixel->inject_cart( $cart, $cart_total );
|
71 |
+
}
|
72 |
+
|
73 |
+
public function inject_order_received_page_dedupe( $order, $order_total, $is_new_customer )
|
74 |
+
{
|
75 |
+
$this->facebook_browser_pixel->inject_order_received_page( $order, $order_total, $is_new_customer );
|
76 |
+
}
|
77 |
+
|
78 |
+
public function inject_order_received_page_no_dedupe( $order, $order_total, $is_new_customer )
|
79 |
+
{
|
80 |
+
}
|
81 |
+
|
82 |
+
protected function inject_opening_script_tag()
|
83 |
+
{
|
84 |
+
echo PHP_EOL ;
|
85 |
+
echo ' <!-- START Facebook scripts -->' . PHP_EOL ;
|
86 |
+
// echo ' <script>';
|
87 |
+
$this->get_formatted_script_tag_new( [
|
88 |
+
'async' => true,
|
89 |
+
'defer' => false,
|
90 |
+
'src' => '',
|
91 |
+
'cookie_category' => 'ads',
|
92 |
+
'pixel_name' => 'facebook-ads',
|
93 |
+
'inject_cfasync' => false,
|
94 |
+
] );
|
95 |
+
echo PHP_EOL ;
|
96 |
+
}
|
97 |
+
|
98 |
+
protected function inject_closing_script_tag()
|
99 |
+
{
|
100 |
+
echo PHP_EOL ;
|
101 |
+
echo ' </script>' ;
|
102 |
+
echo PHP_EOL ;
|
103 |
+
echo ' <!-- END Facebook scripts -->' . PHP_EOL ;
|
104 |
+
}
|
105 |
+
|
106 |
+
protected function inject_closing_script_after_tag()
|
107 |
+
{
|
108 |
+
}
|
109 |
|
110 |
}
|
classes/pixels/google/class-google-ads.php
CHANGED
@@ -54,11 +54,36 @@ class Google_Ads extends Google
|
|
54 |
{
|
55 |
$order_currency = $this->get_order_currency( $order );
|
56 |
// if cart data beta is off and conversion id has been set
|
|
|
57 |
if ( false == $this->add_cart_data && $this->options_obj->google->ads->conversion_id ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
if ( $this->is_dynamic_remarketing_active() ) {
|
59 |
$this->get_dyn_remarketing_purchase_script( $order, $order_total );
|
60 |
}
|
61 |
}
|
|
|
62 |
if ( true == $this->add_cart_data && $this->conversion_id && $this->conversion_label ) {
|
63 |
if ( $this->is_dynamic_remarketing_active() ) {
|
64 |
$this->get_dyn_remarketing_purchase_script( $order, $order_total );
|
@@ -69,41 +94,22 @@ class Google_Ads extends Google
|
|
69 |
public function inject_order_received_page_no_dedupe( $order, $order_total, $is_new_customer )
|
70 |
{
|
71 |
$order_currency = $this->get_order_currency( $order );
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
?>
|
76 |
-
|
77 |
-
if (googleConfigConditionsMet('ads')) gtag('event', 'conversion', <?php
|
78 |
-
echo wp_json_encode( $this->get_google_ads_formatted_purchase_json(
|
79 |
-
$order,
|
80 |
-
$order_total,
|
81 |
-
$order_currency,
|
82 |
-
$is_new_customer
|
83 |
-
) ) ;
|
84 |
-
?>);
|
85 |
|
86 |
-
|
87 |
-
|
88 |
-
|
|
|
|
|
|
|
|
|
|
|
89 |
|
90 |
-
|
91 |
-
echo wp_json_encode( $this->get_google_ads_formatted_conversion_object_cart_data_deactivated( $order, $order_total, $order_currency ) ) ;
|
92 |
-
?>);
|
93 |
-
<?php
|
94 |
-
}
|
95 |
-
|
96 |
}
|
97 |
-
}
|
98 |
|
99 |
-
protected function get_google_ads_formatted_conversion_object_cart_data_deactivated( $order, $order_total, $order_currency )
|
100 |
-
{
|
101 |
-
return [
|
102 |
-
'send_to' => $this->get_google_ads_conversion_ids( true ),
|
103 |
-
'transaction_id' => $order->get_order_number(),
|
104 |
-
'currency' => $order_currency,
|
105 |
-
'value' => $order_total,
|
106 |
-
];
|
107 |
}
|
108 |
|
109 |
private function are_billing_and_shipping_addresses_equal( $order )
|
@@ -165,16 +171,16 @@ class Google_Ads extends Google
|
|
165 |
// });
|
166 |
// ";
|
167 |
echo '
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
}
|
179 |
|
180 |
private function get_order_items_for_google_ads_purchase_script( $order, $dyn_r = false )
|
@@ -184,6 +190,7 @@ class Google_Ads extends Google
|
|
184 |
foreach ( $order_items as $order_item ) {
|
185 |
$product_id = $this->get_variation_or_product_id( $order_item->get_data(), $this->options_obj->general->variations_output );
|
186 |
$product = wc_get_product( $product_id );
|
|
|
187 |
|
188 |
if ( !is_object( $product ) ) {
|
189 |
$this->log_problematic_product_id( $product_id );
|
@@ -191,15 +198,13 @@ class Google_Ads extends Google
|
|
191 |
}
|
192 |
|
193 |
$dyn_r_ids = $this->get_dyn_r_ids( $product );
|
194 |
-
$
|
195 |
-
|
196 |
-
|
197 |
-
'price' => (double) $product->get_price(),
|
198 |
-
];
|
199 |
if ( true === $dyn_r ) {
|
200 |
-
$
|
201 |
}
|
202 |
-
$order_items_array
|
203 |
}
|
204 |
return $order_items_array;
|
205 |
}
|
54 |
{
|
55 |
$order_currency = $this->get_order_currency( $order );
|
56 |
// if cart data beta is off and conversion id has been set
|
57 |
+
|
58 |
if ( false == $this->add_cart_data && $this->options_obj->google->ads->conversion_id ) {
|
59 |
+
// no deduper needed here
|
60 |
+
// Google does this server side
|
61 |
+
|
62 |
+
if ( $this->options_obj->google->ads->conversion_label ) {
|
63 |
+
?>
|
64 |
+
|
65 |
+
if (googleConfigConditionsMet('ads')) gtag('event', 'conversion', {
|
66 |
+
'send_to' : <?php
|
67 |
+
echo wp_json_encode( $this->get_google_ads_conversion_ids( true ) ) ;
|
68 |
+
?>,
|
69 |
+
'value' : <?php
|
70 |
+
echo esc_js( $order_total ) ;
|
71 |
+
?>,
|
72 |
+
'currency' : '<?php
|
73 |
+
echo esc_js( $order_currency ) ;
|
74 |
+
?>',
|
75 |
+
'transaction_id': '<?php
|
76 |
+
echo esc_js( $order->get_order_number() ) ;
|
77 |
+
?>',
|
78 |
+
});
|
79 |
+
<?php
|
80 |
+
}
|
81 |
+
|
82 |
if ( $this->is_dynamic_remarketing_active() ) {
|
83 |
$this->get_dyn_remarketing_purchase_script( $order, $order_total );
|
84 |
}
|
85 |
}
|
86 |
+
|
87 |
if ( true == $this->add_cart_data && $this->conversion_id && $this->conversion_label ) {
|
88 |
if ( $this->is_dynamic_remarketing_active() ) {
|
89 |
$this->get_dyn_remarketing_purchase_script( $order, $order_total );
|
94 |
public function inject_order_received_page_no_dedupe( $order, $order_total, $is_new_customer )
|
95 |
{
|
96 |
$order_currency = $this->get_order_currency( $order );
|
97 |
+
|
98 |
+
if ( true == $this->add_cart_data && $this->conversion_id && $this->conversion_label ) {
|
99 |
+
?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
|
101 |
+
if (googleConfigConditionsMet('ads')) gtag('event', 'purchase', <?php
|
102 |
+
echo wp_json_encode( $this->get_google_ads_formatted_purchase_json(
|
103 |
+
$order,
|
104 |
+
$order_total,
|
105 |
+
$order_currency,
|
106 |
+
$is_new_customer
|
107 |
+
) ) ;
|
108 |
+
?>);
|
109 |
|
110 |
+
<?php
|
|
|
|
|
|
|
|
|
|
|
111 |
}
|
|
|
112 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
}
|
114 |
|
115 |
private function are_billing_and_shipping_addresses_equal( $order )
|
171 |
// });
|
172 |
// ";
|
173 |
echo '
|
174 |
+
wpmExists().then(function(){
|
175 |
+
if (!wpm.isOrderIdStored("' . esc_js( $order->get_id() ) . '")) {
|
176 |
+
if (googleConfigConditionsMet("ads")) gtag("event", "purchase", {
|
177 |
+
send_to: ' . wp_json_encode( $this->get_google_ads_conversion_ids() ) . ',
|
178 |
+
value : ' . esc_js( $order_total ) . ',
|
179 |
+
items : ' . wp_json_encode( $this->get_order_items_for_google_ads_purchase_script( $order, true ) ) . '
|
180 |
+
});
|
181 |
+
}
|
182 |
+
});
|
183 |
+
' ;
|
184 |
}
|
185 |
|
186 |
private function get_order_items_for_google_ads_purchase_script( $order, $dyn_r = false )
|
190 |
foreach ( $order_items as $order_item ) {
|
191 |
$product_id = $this->get_variation_or_product_id( $order_item->get_data(), $this->options_obj->general->variations_output );
|
192 |
$product = wc_get_product( $product_id );
|
193 |
+
$order_items_array = [];
|
194 |
|
195 |
if ( !is_object( $product ) ) {
|
196 |
$this->log_problematic_product_id( $product_id );
|
198 |
}
|
199 |
|
200 |
$dyn_r_ids = $this->get_dyn_r_ids( $product );
|
201 |
+
$item_details_array['id'] = (string) $dyn_r_ids[$this->get_dyn_r_id_type()];
|
202 |
+
$item_details_array['quantity'] = (int) $order_item['quantity'];
|
203 |
+
$item_details_array['price'] = (double) $product->get_price();
|
|
|
|
|
204 |
if ( true === $dyn_r ) {
|
205 |
+
$item_details_array['google_business_vertical'] = (string) $this->google_business_vertical;
|
206 |
}
|
207 |
+
array_push( $order_items_array, $item_details_array );
|
208 |
}
|
209 |
return $order_items_array;
|
210 |
}
|
classes/pixels/google/class-google-analytics-4.php
CHANGED
@@ -48,10 +48,9 @@ class Google_Analytics_4 extends Google_Analytics {
|
|
48 |
'items' => (array) $this->get_formatted_order_items($order),
|
49 |
];
|
50 |
|
51 |
-
|
52 |
-
$gtag_data['send_to'][] = $this->options_obj->google->analytics->ga4->measurement_id;
|
53 |
|
54 |
-
return $gtag_data;
|
55 |
}
|
56 |
|
57 |
protected function get_formatted_order_items( $order, $channel = null ) {
|
48 |
'items' => (array) $this->get_formatted_order_items($order),
|
49 |
];
|
50 |
|
51 |
+
array_push($gtag_data['send_to'], $this->options_obj->google->analytics->ga4->measurement_id);
|
|
|
52 |
|
53 |
+
return wp_json_encode($gtag_data);
|
54 |
}
|
55 |
|
56 |
protected function get_formatted_order_items( $order, $channel = null ) {
|
classes/pixels/google/class-google-analytics-refund.php
CHANGED
@@ -2,6 +2,7 @@
|
|
2 |
|
3 |
namespace WCPM\Classes\Pixels\Google;
|
4 |
|
|
|
5 |
use WC_Order_Refund ;
|
6 |
use WC_Product ;
|
7 |
|
@@ -12,46 +13,10 @@ if ( !defined( 'ABSPATH' ) ) {
|
|
12 |
|
13 |
class Google_Analytics_Refund extends Google_Analytics
|
14 |
{
|
|
|
15 |
public function __construct( $options )
|
16 |
{
|
17 |
parent::__construct( $options );
|
18 |
}
|
19 |
-
|
20 |
-
public function output_refund_to_frontend( $order, $refund, $dataLayer_refund_items = null )
|
21 |
-
{
|
22 |
-
$data = [
|
23 |
-
'send_to' => $this->options_obj->google->analytics->ga4->measurement_id,
|
24 |
-
'affiliation' => get_bloginfo( 'name' ),
|
25 |
-
'currency' => (string) $this->get_order_currency( $order ),
|
26 |
-
'items' => (array) $dataLayer_refund_items,
|
27 |
-
'transaction_id' => (string) $order->get_order_number(),
|
28 |
-
'shipping' => (double) $order->get_shipping_total(),
|
29 |
-
'tax' => (double) $order->get_total_tax(),
|
30 |
-
'value' => (double) $refund->get_amount(),
|
31 |
-
];
|
32 |
-
?>
|
33 |
-
<script>
|
34 |
-
|
35 |
-
if (typeof wpmFunctionExists !== 'function') {
|
36 |
-
window.wpmFunctionExists = function (functionName) {
|
37 |
-
return new Promise(function (resolve) {
|
38 |
-
(function waitForVar() {
|
39 |
-
if (typeof window[functionName] !== 'undefined') return resolve();
|
40 |
-
setTimeout(waitForVar, 1000);
|
41 |
-
})();
|
42 |
-
});
|
43 |
-
}
|
44 |
-
}
|
45 |
-
|
46 |
-
wpmFunctionExists('wpm').then(function () {
|
47 |
-
if (wpm.googleConfigConditionsMet('analytics')) {
|
48 |
-
gtag('event', 'refund', <?php
|
49 |
-
echo wp_json_encode( $data ) ;
|
50 |
-
?>);
|
51 |
-
}
|
52 |
-
})
|
53 |
-
</script>
|
54 |
-
<?php
|
55 |
-
}
|
56 |
|
57 |
}
|
2 |
|
3 |
namespace WCPM\Classes\Pixels\Google;
|
4 |
|
5 |
+
use WC_Order ;
|
6 |
use WC_Order_Refund ;
|
7 |
use WC_Product ;
|
8 |
|
13 |
|
14 |
class Google_Analytics_Refund extends Google_Analytics
|
15 |
{
|
16 |
+
use Trait_Google ;
|
17 |
public function __construct( $options )
|
18 |
{
|
19 |
parent::__construct( $options );
|
20 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
|
22 |
}
|
classes/pixels/google/class-google-analytics.php
CHANGED
@@ -2,6 +2,7 @@
|
|
2 |
|
3 |
namespace WCPM\Classes\Pixels\Google;
|
4 |
|
|
|
5 |
use WCPM\Classes\Pixels\Trait_Shop;
|
6 |
|
7 |
if (!defined('ABSPATH')) {
|
@@ -16,4 +17,51 @@ class Google_Analytics extends Google {
|
|
16 |
|
17 |
$this->pixel_name = 'google_analytics';
|
18 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
}
|
2 |
|
3 |
namespace WCPM\Classes\Pixels\Google;
|
4 |
|
5 |
+
use WCPM\Classes\Admin\Environment_Check;
|
6 |
use WCPM\Classes\Pixels\Trait_Shop;
|
7 |
|
8 |
if (!defined('ABSPATH')) {
|
17 |
|
18 |
$this->pixel_name = 'google_analytics';
|
19 |
}
|
20 |
+
|
21 |
+
protected function get_list_name_by_current_page_type( $list_id ) {
|
22 |
+
$list_names = [
|
23 |
+
'add_payment_method_page' => 'Add Payment Method page',
|
24 |
+
'cart' => 'Cart',
|
25 |
+
'checkout' => 'Checkout Page',
|
26 |
+
'checkout_pay_page' => 'Checkout Pay Page',
|
27 |
+
'front_page' => 'Front Page',
|
28 |
+
'order_received_page' => 'Order Received Page',
|
29 |
+
'product' => 'Product',
|
30 |
+
'product_category' => 'Product Category',
|
31 |
+
'product_detail' => 'Product Detail',
|
32 |
+
'product_tag' => 'Product Tag',
|
33 |
+
'product_taxonomy' => 'Product Taxonomy',
|
34 |
+
'search' => 'Search Page',
|
35 |
+
'shop' => 'Shop Page',
|
36 |
+
];
|
37 |
+
|
38 |
+
return $list_names[$list_id];
|
39 |
+
}
|
40 |
+
|
41 |
+
|
42 |
+
|
43 |
+
|
44 |
+
|
45 |
+
// public function inject_product_list_object($list_id)
|
46 |
+
// {
|
47 |
+
// global $wp_query;
|
48 |
+
//
|
49 |
+
// $items = [];
|
50 |
+
//
|
51 |
+
// $position = 1;
|
52 |
+
//
|
53 |
+
// $posts = $wp_query->posts;
|
54 |
+
//
|
55 |
+
// foreach ($posts as $key => $post) {
|
56 |
+
//
|
57 |
+
// if ($post->post_type == 'product' || $post->post_type == 'product_variation') {
|
58 |
+
//
|
59 |
+
// array_push($items, $this->eec_appweb_get_product_details_array($post->ID, $list_id, $position));
|
60 |
+
//
|
61 |
+
// $position++;
|
62 |
+
// }
|
63 |
+
// }
|
64 |
+
//
|
65 |
+
// $this->output_view_item_list_html($items, $list_id);
|
66 |
+
// }
|
67 |
}
|
classes/pixels/google/class-google-pixel-manager.php
CHANGED
@@ -4,55 +4,145 @@ namespace WCPM\Classes\Pixels\Google;
|
|
4 |
|
5 |
use WCPM\Classes\Http\Google_MP_GA4 ;
|
6 |
use WCPM\Classes\Http\Google_MP_UA ;
|
7 |
-
use WCPM\Classes\Pixels\
|
8 |
|
9 |
if ( !defined( 'ABSPATH' ) ) {
|
10 |
exit;
|
11 |
// Exit if accessed directly
|
12 |
}
|
13 |
|
14 |
-
class Google_Pixel_Manager extends
|
15 |
{
|
|
|
16 |
private $google_pixel ;
|
|
|
|
|
|
|
|
|
17 |
private $google_analytics_ua_http_mp ;
|
18 |
private $google_analytics_4_http_mp ;
|
|
|
|
|
19 |
private $cid_key_ga_ua ;
|
20 |
private $cid_key_ga4 ;
|
21 |
public function __construct( $options )
|
22 |
{
|
23 |
parent::__construct( $options );
|
24 |
$this->google_pixel = new Google( $options );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
}
|
26 |
|
27 |
-
|
28 |
{
|
29 |
-
|
|
|
30 |
if ( is_user_logged_in() ) {
|
31 |
-
|
32 |
-
|
33 |
-
'
|
34 |
-
|
|
|
|
|
|
|
35 |
}
|
36 |
-
|
37 |
}
|
38 |
|
39 |
-
public function
|
40 |
{
|
41 |
-
|
42 |
-
|
43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
}
|
45 |
|
46 |
-
public function
|
47 |
{
|
48 |
-
|
49 |
-
$this->save_gclid_in_order__premium_only( $order );
|
50 |
-
}
|
51 |
}
|
52 |
|
53 |
-
public function
|
|
|
|
|
|
|
|
|
54 |
{
|
55 |
-
// $this->google_pixel->inject_everywhere();
|
56 |
}
|
57 |
|
58 |
public function inject_product_category()
|
@@ -85,12 +175,48 @@ class Google_Pixel_Manager extends Script_Manager
|
|
85 |
// all handled on front-end
|
86 |
}
|
87 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
protected function inject_opening_script_tag()
|
89 |
{
|
|
|
|
|
|
|
90 |
}
|
91 |
|
92 |
protected function inject_closing_script_tag()
|
93 |
{
|
|
|
|
|
|
|
|
|
|
|
94 |
}
|
95 |
|
96 |
}
|
4 |
|
5 |
use WCPM\Classes\Http\Google_MP_GA4 ;
|
6 |
use WCPM\Classes\Http\Google_MP_UA ;
|
7 |
+
use WCPM\Classes\Pixels\Pixel_Manager_Base ;
|
8 |
|
9 |
if ( !defined( 'ABSPATH' ) ) {
|
10 |
exit;
|
11 |
// Exit if accessed directly
|
12 |
}
|
13 |
|
14 |
+
class Google_Pixel_Manager extends Pixel_Manager_Base
|
15 |
{
|
16 |
+
use Trait_Google ;
|
17 |
private $google_pixel ;
|
18 |
+
private $google_ads_pixel ;
|
19 |
+
private $google_analytics_ua_standard_pixel ;
|
20 |
+
private $google_analytics_4_standard_pixel ;
|
21 |
+
private $google_analytics_ua_eec_pixel ;
|
22 |
private $google_analytics_ua_http_mp ;
|
23 |
private $google_analytics_4_http_mp ;
|
24 |
+
// private $google_analytics_ua_refund_pixel;
|
25 |
+
private $google_analytics_4_eec_pixel ;
|
26 |
private $cid_key_ga_ua ;
|
27 |
private $cid_key_ga4 ;
|
28 |
public function __construct( $options )
|
29 |
{
|
30 |
parent::__construct( $options );
|
31 |
$this->google_pixel = new Google( $options );
|
32 |
+
if ( $this->is_google_ads_active() ) {
|
33 |
+
if ( $this->is_google_ads_active() ) {
|
34 |
+
$this->google_ads_pixel = new Google_Ads( $options );
|
35 |
+
}
|
36 |
+
}
|
37 |
+
// add_action('wp_enqueue_scripts', [$this, 'google_front_end_scripts']);
|
38 |
+
|
39 |
+
if ( !wpm_fs()->is__premium_only() || !$this->options_obj->google->analytics->eec ) {
|
40 |
+
if ( $this->is_google_analytics_ua_active() ) {
|
41 |
+
$this->google_analytics_ua_standard_pixel = new Google_Analytics_UA_Standard( $options );
|
42 |
+
}
|
43 |
+
if ( $this->is_google_analytics_4_active() ) {
|
44 |
+
$this->google_analytics_4_standard_pixel = new Google_Analytics_4_Standard( $options );
|
45 |
+
}
|
46 |
+
} else {
|
47 |
+
$this->google_analytics_ua_eec_pixel = new Google_Analytics_UA_EEC( $options );
|
48 |
+
// $this->google_analytics_ua_refund_pixel = new Google_Analytics_UA_Refund_Pixel();
|
49 |
+
$this->google_analytics_4_eec_pixel = new Google_Analytics_4_EEC( $options );
|
50 |
+
|
51 |
+
if ( $this->is_google_analytics_active() ) {
|
52 |
+
// woocommerce_order_status_refunded
|
53 |
+
// woocommerce_order_refunded
|
54 |
+
// woocommerce_order_partially_refunded
|
55 |
+
// https://github.com/woocommerce/woocommerce/blob/b19500728b4b292562afb65eb3a0c0f50d5859de/includes/wc-order-functions.php#L614
|
56 |
+
// woocommerce_order_fully_refunded
|
57 |
+
// https://github.com/woocommerce/woocommerce/blob/b19500728b4b292562afb65eb3a0c0f50d5859de/includes/wc-order-functions.php#L616
|
58 |
+
// how to tell if order is fully refunded
|
59 |
+
// https://github.com/woocommerce/woocommerce/blob/b19500728b4b292562afb65eb3a0c0f50d5859de/includes/wc-order-functions.php#L774
|
60 |
+
$this->google_analytics_ua_http_mp = new Google_MP_UA( $options );
|
61 |
+
$this->google_analytics_4_http_mp = new Google_MP_GA4( $options );
|
62 |
+
$this->cid_key_ga_ua = 'google_cid_' . $this->options_obj->google->analytics->universal->property_id;
|
63 |
+
$this->cid_key_ga4 = 'google_cid_' . $this->options_obj->google->analytics->ga4->measurement_id;
|
64 |
+
// error_log('running mp scripts');
|
65 |
+
// add_action('woocommerce_order_refunded', [$this, 'google_analytics_eec_action_woocommerce_order_refunded__premium_only'], 10, 2);
|
66 |
+
// Save the Google cid on the order so that we can use it later when the order gets paid or completed
|
67 |
+
// https://woocommerce.github.io/code-reference/files/woocommerce-includes-class-wc-checkout.html#source-view.403
|
68 |
+
add_action( 'woocommerce_checkout_order_created', [ $this, 'google_analytics_save_cid_on_order__premium_only' ] );
|
69 |
+
// Process the purchase through the GA Measurement Protocol when they are paid, when they change to processing, or
|
70 |
+
// when they are manually set to completed.
|
71 |
+
// https://docs.woocommerce.com/document/managing-orders/
|
72 |
+
// Maybe also use woocommerce_pre_payment_complete
|
73 |
+
// https://woocommerce.github.io/code-reference/files/woocommerce-includes-class-wc-order.html#source-view.105
|
74 |
+
add_action( 'woocommerce_order_status_processing', [ $this, 'google_analytics_mp_report_purchase__premium_only' ] );
|
75 |
+
add_action( 'woocommerce_payment_complete', [ $this, 'google_analytics_mp_report_purchase__premium_only' ] );
|
76 |
+
add_action( 'woocommerce_order_status_completed', [ $this, 'google_analytics_mp_report_purchase__premium_only' ] );
|
77 |
+
// Process total an partial refunds
|
78 |
+
add_action(
|
79 |
+
'woocommerce_order_fully_refunded',
|
80 |
+
[ $this, 'google_analytics_mp_send_full_refund__premium_only' ],
|
81 |
+
10,
|
82 |
+
2
|
83 |
+
);
|
84 |
+
add_action(
|
85 |
+
'woocommerce_order_partially_refunded',
|
86 |
+
[ $this, 'google_analytics_mp_send_partial_refund__premium_only' ],
|
87 |
+
10,
|
88 |
+
2
|
89 |
+
);
|
90 |
+
// Process subscription renewals
|
91 |
+
// https://docs.woocommerce.com/document/subscriptions/develop/action-reference/
|
92 |
+
add_action(
|
93 |
+
'woocommerce_subscription_renewal_payment_complete',
|
94 |
+
[ $this, 'google_analytics_mp_report_subscription_purchase_renewal__premium_only' ],
|
95 |
+
10,
|
96 |
+
2
|
97 |
+
);
|
98 |
+
}
|
99 |
+
|
100 |
+
}
|
101 |
+
|
102 |
+
add_action( 'init', [ $this, 'run_on_init' ] );
|
103 |
}
|
104 |
|
105 |
+
public function run_on_init()
|
106 |
{
|
107 |
+
// function to only fire gtag login once after login
|
108 |
+
// and then wait for the next session
|
109 |
if ( is_user_logged_in() ) {
|
110 |
+
|
111 |
+
if ( !isset( $_COOKIE['gtag_logged_in'] ) ) {
|
112 |
+
add_action( 'wp_footer', [ $this, 'output_gtag_login' ] );
|
113 |
+
// the cookie expires after the session
|
114 |
+
setcookie( 'gtag_logged_in', 'true' );
|
115 |
+
}
|
116 |
+
|
117 |
}
|
|
|
118 |
}
|
119 |
|
120 |
+
public function output_gtag_login()
|
121 |
{
|
122 |
+
$data = [
|
123 |
+
'user_id' => get_current_user_id(),
|
124 |
+
];
|
125 |
+
?>
|
126 |
+
|
127 |
+
<script>
|
128 |
+
gtag('event', 'login', <?php
|
129 |
+
echo wp_json_encode( $data ) ;
|
130 |
+
?>);
|
131 |
+
</script>
|
132 |
+
<?php
|
133 |
}
|
134 |
|
135 |
+
public function inject_everywhere()
|
136 |
{
|
137 |
+
$this->google_pixel->inject_everywhere();
|
|
|
|
|
138 |
}
|
139 |
|
140 |
+
// public function inject_product_category()
|
141 |
+
// {
|
142 |
+
// $this->google_pixel->inject_product_category();
|
143 |
+
// }
|
144 |
+
public function google_front_end_scripts()
|
145 |
{
|
|
|
146 |
}
|
147 |
|
148 |
public function inject_product_category()
|
175 |
// all handled on front-end
|
176 |
}
|
177 |
|
178 |
+
public function inject_order_received_page_dedupe( $order, $order_total, $is_new_customer )
|
179 |
+
{
|
180 |
+
if ( $this->is_google_ads_active() ) {
|
181 |
+
$this->google_ads_pixel->inject_order_received_page_dedupe( $order, $order_total, $is_new_customer );
|
182 |
+
}
|
183 |
+
|
184 |
+
if ( !wpm_fs()->is__premium_only() || !$this->options_obj->google->analytics->eec ) {
|
185 |
+
if ( $this->is_google_analytics_ua_active() ) {
|
186 |
+
$this->google_analytics_ua_standard_pixel->inject_order_received_page( $order, $order_total, $is_new_customer );
|
187 |
+
}
|
188 |
+
if ( $this->is_google_analytics_4_active() ) {
|
189 |
+
$this->google_analytics_4_standard_pixel->inject_order_received_page( $order, $order_total, $is_new_customer );
|
190 |
+
}
|
191 |
+
} else {
|
192 |
+
if ( $this->is_google_analytics_4_active() && !$this->options_obj->google->analytics->ga4->api_secret ) {
|
193 |
+
$this->google_analytics_4_eec_pixel->inject_order_received_page( $order, $order_total, $is_new_customer );
|
194 |
+
}
|
195 |
+
}
|
196 |
+
|
197 |
+
}
|
198 |
+
|
199 |
+
public function inject_order_received_page_no_dedupe( $order, $order_total, $is_new_customer )
|
200 |
+
{
|
201 |
+
if ( $this->is_google_ads_active() ) {
|
202 |
+
$this->google_ads_pixel->inject_order_received_page_no_dedupe( $order, $order_total, $is_new_customer );
|
203 |
+
}
|
204 |
+
}
|
205 |
+
|
206 |
protected function inject_opening_script_tag()
|
207 |
{
|
208 |
+
echo PHP_EOL ;
|
209 |
+
echo ' <!-- START Google scripts -->' . PHP_EOL ;
|
210 |
+
// echo PHP_EOL;
|
211 |
}
|
212 |
|
213 |
protected function inject_closing_script_tag()
|
214 |
{
|
215 |
+
echo PHP_EOL ;
|
216 |
+
echo "\t\t" . '//# sourceURL=wpmGoogleInlineScripts.js' . PHP_EOL ;
|
217 |
+
echo "\t\t" . '</script>' ;
|
218 |
+
echo PHP_EOL . PHP_EOL ;
|
219 |
+
echo "\t" . '<!-- END Google scripts -->' . PHP_EOL ;
|
220 |
}
|
221 |
|
222 |
}
|
classes/pixels/google/class-google.php
CHANGED
@@ -13,167 +13,338 @@ if ( !defined( 'ABSPATH' ) ) {
|
|
13 |
|
14 |
class Google extends Pixel
|
15 |
{
|
|
|
16 |
use Trait_Shop ;
|
|
|
17 |
public function __construct( $options )
|
18 |
{
|
19 |
parent::__construct( $options );
|
20 |
$this->google_business_vertical = $this->get_google_business_vertical( $this->options['google']['ads']['google_business_vertical'] );
|
21 |
-
$this->
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
] );
|
32 |
-
return [];
|
33 |
-
}
|
34 |
-
|
35 |
-
$dyn_r_ids = $this->get_dyn_r_ids( $product );
|
36 |
-
|
37 |
-
if ( $product->get_type() === 'variation' ) {
|
38 |
-
$parent_product = wc_get_product( $product->get_parent_id() );
|
39 |
-
$name = $parent_product->get_name();
|
40 |
-
} else {
|
41 |
-
$name = $product->get_name();
|
42 |
-
}
|
43 |
-
|
44 |
-
return [
|
45 |
-
'id' => (string) $dyn_r_ids[$this->get_ga_id_type()],
|
46 |
-
'name' => (string) $name,
|
47 |
-
'quantity' => (int) $order_item['quantity'],
|
48 |
-
'affiliation' => (string) get_bloginfo( 'name' ),
|
49 |
-
'brand' => (string) $this->get_brand_name( $product->get_id() ),
|
50 |
-
'category' => implode( ',', $this->get_product_category( $product->get_id() ) ),
|
51 |
-
'category_array' => $this->get_product_category( $product->get_id() ),
|
52 |
-
'variant' => ( (string) ($product->get_type() === 'variation') ? $this->get_formatted_variant_text( $product ) : '' ),
|
53 |
-
'price' => (double) $this->wpm_get_order_item_price( $order_item, $product ),
|
54 |
-
];
|
55 |
-
}
|
56 |
-
|
57 |
-
public function get_ga_id_type()
|
58 |
-
{
|
59 |
-
$ga_id_type = 'post_id';
|
60 |
-
$ga_id_type = apply_filters_deprecated(
|
61 |
-
'wooptpm_product_id_type_for_google_analytics',
|
62 |
-
[ $ga_id_type ],
|
63 |
'1.13.0',
|
64 |
-
'
|
65 |
);
|
66 |
-
|
67 |
-
|
68 |
}
|
69 |
|
70 |
-
public function
|
71 |
{
|
72 |
-
|
73 |
-
if ( $this->options_obj->google->
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
}
|
82 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
}
|
84 |
|
85 |
-
public function
|
86 |
{
|
87 |
-
|
88 |
-
if ( $this->
|
89 |
-
|
90 |
-
} else {
|
91 |
-
return false;
|
92 |
}
|
93 |
-
|
|
|
|
|
|
|
94 |
}
|
95 |
|
96 |
-
|
97 |
{
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
|
|
|
|
105 |
}
|
106 |
|
107 |
-
|
108 |
{
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
}
|
117 |
|
118 |
-
|
|
|
119 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
120 |
|
121 |
-
if ( $
|
122 |
-
return
|
123 |
} else {
|
124 |
-
return
|
125 |
}
|
126 |
|
127 |
}
|
128 |
|
129 |
-
|
|
|
130 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
131 |
|
132 |
-
if ( $
|
133 |
-
|
134 |
-
|
135 |
-
|
|
|
|
|
|
|
136 |
}
|
137 |
|
138 |
}
|
139 |
|
140 |
-
|
141 |
{
|
142 |
|
143 |
-
if (
|
144 |
-
$
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
return (double) $product->get_price();
|
152 |
}
|
153 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
} else {
|
155 |
-
return
|
156 |
}
|
157 |
|
158 |
}
|
159 |
|
160 |
-
|
161 |
{
|
162 |
-
$categories = array_unique( $categories );
|
163 |
|
164 |
-
if (
|
165 |
-
$
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
|
|
|
|
170 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
171 |
}
|
172 |
-
|
173 |
-
return $item_details_array;
|
174 |
}
|
175 |
|
176 |
-
|
177 |
{
|
178 |
$verticals = [
|
179 |
0 => 'retail',
|
@@ -189,218 +360,283 @@ class Google extends Pixel
|
|
189 |
return $verticals[$id];
|
190 |
}
|
191 |
|
192 |
-
|
193 |
{
|
194 |
-
$
|
195 |
-
$
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
'1.13.0',
|
205 |
-
'wpm_google_ads_conversion_identifiers'
|
206 |
-
);
|
207 |
-
$this->google_ads_conversion_identifiers = apply_filters( 'wpm_google_ads_conversion_identifiers', $this->google_ads_conversion_identifiers );
|
208 |
-
$formatted_conversion_ids = [];
|
209 |
-
|
210 |
-
if ( $purchase ) {
|
211 |
-
foreach ( $this->google_ads_conversion_identifiers as $conversion_id => $conversion_label ) {
|
212 |
-
$conversion_id = $this->extract_google_ads_id( $conversion_id );
|
213 |
-
if ( $conversion_id ) {
|
214 |
-
$formatted_conversion_ids['AW-' . $conversion_id] = $conversion_label;
|
215 |
-
}
|
216 |
}
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
|
|
|
|
223 |
}
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
protected function extract_google_ads_id( $string )
|
230 |
-
{
|
231 |
-
$re = '/\\d{9,11}/';
|
232 |
-
|
233 |
-
if ( $string ) {
|
234 |
-
preg_match(
|
235 |
-
$re,
|
236 |
-
$string,
|
237 |
-
$matches,
|
238 |
-
PREG_OFFSET_CAPTURE,
|
239 |
-
0
|
240 |
-
);
|
241 |
-
if ( is_array( $matches[0] ) ) {
|
242 |
-
return $matches[0][0];
|
243 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
244 |
}
|
245 |
-
|
246 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
}
|
248 |
|
249 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
250 |
{
|
251 |
-
$
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
|
259 |
-
if (
|
260 |
-
$
|
|
|
|
|
|
|
|
|
|
|
261 |
} else {
|
262 |
-
|
263 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
264 |
}
|
265 |
|
266 |
-
return $
|
267 |
}
|
268 |
|
269 |
-
protected function
|
270 |
{
|
271 |
-
|
272 |
-
if ( $order->get_billing_first_name() ) {
|
273 |
-
$customer_data['first_name'] = (string) $order->get_billing_first_name();
|
274 |
-
}
|
275 |
-
if ( $order->get_billing_last_name() ) {
|
276 |
-
$customer_data['last_name'] = (string) $order->get_billing_last_name();
|
277 |
-
}
|
278 |
-
if ( $order->get_billing_address_1() ) {
|
279 |
-
$customer_data['street'] = (string) $order->get_billing_address_1();
|
280 |
-
}
|
281 |
-
if ( $order->get_billing_city() ) {
|
282 |
-
$customer_data['city'] = (string) $order->get_billing_city();
|
283 |
-
}
|
284 |
-
if ( $order->get_billing_state() ) {
|
285 |
-
$customer_data['region'] = (string) $order->get_billing_state();
|
286 |
-
}
|
287 |
-
if ( $order->get_billing_postcode() ) {
|
288 |
-
$customer_data['postal_code'] = (string) $order->get_billing_postcode();
|
289 |
-
}
|
290 |
-
if ( $order->get_billing_country() ) {
|
291 |
-
$customer_data['country'] = (string) $order->get_billing_country();
|
292 |
-
}
|
293 |
-
return $customer_data;
|
294 |
}
|
295 |
|
296 |
-
protected function
|
297 |
{
|
298 |
-
$
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
}
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
if ( $order->get_shipping_city() ) {
|
309 |
-
$customer_data['city'] = (string) $order->get_shipping_city();
|
310 |
-
}
|
311 |
-
if ( $order->get_shipping_state() ) {
|
312 |
-
$customer_data['region'] = (string) $order->get_shipping_state();
|
313 |
-
}
|
314 |
-
if ( $order->get_shipping_postcode() ) {
|
315 |
-
$customer_data['postal_code'] = (string) $order->get_shipping_postcode();
|
316 |
-
}
|
317 |
-
if ( $order->get_shipping_country() ) {
|
318 |
-
$customer_data['country'] = (string) $order->get_shipping_country();
|
319 |
}
|
320 |
-
|
|
|
321 |
}
|
322 |
|
323 |
-
private function
|
324 |
{
|
325 |
|
326 |
-
if ( $
|
327 |
-
return
|
|
|
|
|
|
|
|
|
328 |
} else {
|
329 |
-
return
|
330 |
}
|
331 |
|
332 |
}
|
333 |
|
334 |
-
|
335 |
{
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
'
|
344 |
-
[
|
345 |
'1.13.0',
|
346 |
-
'
|
347 |
-
)
|
348 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
349 |
}
|
350 |
|
351 |
-
|
352 |
{
|
353 |
-
|
354 |
-
if (
|
355 |
-
|
356 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
357 |
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
358 |
}
|
359 |
-
$ga_4_parameters = apply_filters_deprecated(
|
360 |
-
'wooptpm_ga_4_parameters',
|
361 |
-
[ $ga_4_parameters, $id ],
|
362 |
-
'1.13.0',
|
363 |
-
'wpm_ga_4_parameters'
|
364 |
-
);
|
365 |
-
return apply_filters( 'wpm_ga_4_parameters', $ga_4_parameters, $id );
|
366 |
-
}
|
367 |
|
368 |
-
public function get_ga_ua_parameters( $id )
|
369 |
-
{
|
370 |
-
$ga_ua_parameters = [
|
371 |
-
'anonymize_ip' => true,
|
372 |
-
'link_attribution' => (bool) $this->options_obj->google->analytics->link_attribution,
|
373 |
-
];
|
374 |
-
if ( $this->options_obj->google->user_id && is_user_logged_in() ) {
|
375 |
-
$ga_ua_parameters['user_id'] = get_current_user_id();
|
376 |
-
}
|
377 |
-
$ga_ua_parameters = apply_filters_deprecated(
|
378 |
-
'woopt_pm_analytics_parameters',
|
379 |
-
[ $ga_ua_parameters, $id ],
|
380 |
-
'1.10.10',
|
381 |
-
'wooptpm_ga_ua_parameters'
|
382 |
-
);
|
383 |
-
$ga_ua_parameters = apply_filters_deprecated(
|
384 |
-
'wooptpm_ga_ua_parameters',
|
385 |
-
[ $ga_ua_parameters, $id ],
|
386 |
-
'1.13.0',
|
387 |
-
'wpm_ga_ua_parameters'
|
388 |
-
);
|
389 |
-
return apply_filters( 'wpm_ga_ua_parameters', $ga_ua_parameters, $id );
|
390 |
}
|
391 |
|
392 |
-
|
393 |
{
|
394 |
-
|
395 |
-
$item_index = 1;
|
396 |
-
foreach ( $refund->get_items() as $item_id => $item ) {
|
397 |
-
// $product = new WC_Product($refund_item->get_product_id());
|
398 |
-
$order_item_data = $this->google->get_order_item_data( $item );
|
399 |
-
$data['pr' . $item_index . 'id'] = $order_item_data['id'];
|
400 |
-
$data['pr' . $item_index . 'qt'] = -1 * $order_item_data['quantity'];
|
401 |
-
$item_index++;
|
402 |
-
}
|
403 |
-
return $data;
|
404 |
}
|
405 |
|
406 |
}
|
13 |
|
14 |
class Google extends Pixel
|
15 |
{
|
16 |
+
use Trait_Google ;
|
17 |
use Trait_Shop ;
|
18 |
+
protected $google_ads_conversion_identifiers ;
|
19 |
public function __construct( $options )
|
20 |
{
|
21 |
parent::__construct( $options );
|
22 |
$this->google_business_vertical = $this->get_google_business_vertical( $this->options['google']['ads']['google_business_vertical'] );
|
23 |
+
$this->google_ads_conversion_identifiers[$this->conversion_id] = $this->conversion_label;
|
24 |
+
$this->google_ads_conversion_identifiers = apply_filters_deprecated(
|
25 |
+
'wgact_google_ads_conversion_identifiers',
|
26 |
+
[ $this->google_ads_conversion_identifiers ],
|
27 |
+
'1.10.2',
|
28 |
+
'wooptpm_google_ads_conversion_identifiers'
|
29 |
+
);
|
30 |
+
$this->google_ads_conversion_identifiers = apply_filters_deprecated(
|
31 |
+
'wooptpm_google_ads_conversion_identifiers',
|
32 |
+
[ $this->google_ads_conversion_identifiers ],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
'1.13.0',
|
34 |
+
'wpm_google_ads_conversion_identifiers'
|
35 |
);
|
36 |
+
$this->google_ads_conversion_identifiers = apply_filters( 'wpm_google_ads_conversion_identifiers', $this->google_ads_conversion_identifiers );
|
37 |
+
$this->pixel_name = 'google_ads';
|
38 |
}
|
39 |
|
40 |
+
public function inject_everywhere()
|
41 |
{
|
42 |
+
$this->inject_data_layer_pixels();
|
43 |
+
if ( $this->options_obj->google->optimize->container_id ) {
|
44 |
+
// echo '<script async ';
|
45 |
+
// echo 'src="https://www.googleoptimize.com/optimize.js?id=' . $this->options_obj->google->optimize->container_id . '"';
|
46 |
+
// echo ' data-wpm-src="https://www.googleoptimize.com/optimize.js?id=' . $this->options_obj->google->optimize->container_id . '"';
|
47 |
+
// echo $this->script_type_value('analytics');
|
48 |
+
// echo '></script>';
|
49 |
+
// echo PHP_EOL;
|
50 |
+
// echo $this->get_formatted_script_tag_new([
|
51 |
+
// 'async' => true,
|
52 |
+
// 'defer' => false,
|
53 |
+
// 'src' => "https://www.googleoptimize.com/optimize.js?id=" . $this->options_obj->google->optimize->container_id,
|
54 |
+
// 'cookie_category' => 'analytics',
|
55 |
+
// 'pixel_name' => 'google-optimize',
|
56 |
+
// 'inject_cfasync' => false,
|
57 |
+
//
|
58 |
+
// ]) . PHP_EOL;
|
59 |
+
$this->get_formatted_script_tag_new( [
|
60 |
+
'async' => true,
|
61 |
+
'defer' => false,
|
62 |
+
'src' => 'https://www.googleoptimize.com/optimize.js?id=' . $this->options_obj->google->optimize->container_id,
|
63 |
+
'cookie_category' => 'analytics',
|
64 |
+
'pixel_name' => 'google-optimize',
|
65 |
+
'inject_cfasync' => false,
|
66 |
+
] );
|
67 |
}
|
68 |
+
// echo "\t\t" . '<script async src="https://www.googletagmanager.com/gtag/js?id=' . $this->get_gtag_id() . '"' . $this->explicit_consent_mode_type_value($this->get_cookie_category()) . '></script>';
|
69 |
+
// echo "\t\t";
|
70 |
+
// echo '<script async ';
|
71 |
+
// echo 'src="https://www.googletagmanager.com/gtag/js?id=' . $this->get_gtag_id() . '"';
|
72 |
+
// echo !$this->options_obj->google->consent_mode->active ? ' data-wpm-src="https://www.googletagmanager.com/gtag/js?id=' . $this->get_gtag_id() . '"' : '';
|
73 |
+
// echo !$this->options_obj->google->consent_mode->active ? $this->script_type_value($this->get_cookie_category()) : '';
|
74 |
+
// echo '></script>';
|
75 |
+
// echo "\t\t" . $this->get_formatted_script_tag_new([
|
76 |
+
// 'async' => true,
|
77 |
+
// 'defer' => false,
|
78 |
+
// 'src' => 'https://www.googletagmanager.com/gtag/js?id=' . $this->get_gtag_id(),
|
79 |
+
// 'cookie_category' => $this->get_cookie_category(),
|
80 |
+
// 'pixel_name' => 'google',
|
81 |
+
// 'inject_cfasync' => false,
|
82 |
+
//
|
83 |
+
//
|
84 |
+
// ]) . PHP_EOL;
|
85 |
+
$this->get_formatted_script_tag_new( [
|
86 |
+
'async' => true,
|
87 |
+
'defer' => false,
|
88 |
+
'src' => 'https://www.googletagmanager.com/gtag/js?id=' . $this->get_gtag_id(),
|
89 |
+
'cookie_category' => $this->get_cookie_category(),
|
90 |
+
'pixel_name' => 'google',
|
91 |
+
'inject_cfasync' => false,
|
92 |
+
] );
|
93 |
+
$this->get_modified_script_opening_tag();
|
94 |
+
$this->get_google_init_js();
|
95 |
+
foreach ( $this->google_ads_conversion_identifiers as $conversion_id => $conversion_label ) {
|
96 |
+
echo esc_js( ( $this->options_obj->google->ads->conversion_id ? $this->gtag_config( $conversion_id, 'ads' ) : '' ) ) . PHP_EOL ;
|
97 |
+
}
|
98 |
+
?>
|
99 |
+
|
100 |
+
<?php
|
101 |
+
echo esc_js( ( $this->options_obj->google->analytics->universal->property_id ? $this->gtag_config( $this->options_obj->google->analytics->universal->property_id, 'ga_ua' ) : '' ) ) . PHP_EOL ;
|
102 |
+
?>
|
103 |
+
|
104 |
+
<?php
|
105 |
+
echo esc_js( ( $this->options_obj->google->analytics->ga4->measurement_id ? $this->gtag_config( $this->options_obj->google->analytics->ga4->measurement_id, 'ga_4' ) : '' ) ) ;
|
106 |
+
?>
|
107 |
+
|
108 |
+
<?php
|
109 |
+
if ( $this->is_google_ads_active() && $this->options_obj->google->ads->phone_conversion_number && $this->options_obj->google->ads->phone_conversion_label ) {
|
110 |
+
$this->inject_phone_conversion_number_html__premium_only();
|
111 |
+
}
|
112 |
+
// if ($this->options_obj->google->consent_mode->active && (new Environment_Check())->is_borlabs_cookie_active()) {
|
113 |
+
// echo $this->inject_borlabs_consent_mode_update();
|
114 |
+
// }
|
115 |
+
// $this->inject_closing_script_tag();
|
116 |
}
|
117 |
|
118 |
+
public function get_cookie_category()
|
119 |
{
|
120 |
+
$data = [];
|
121 |
+
if ( $this->options_obj->google->analytics->universal->property_id || $this->options_obj->google->analytics->ga4->measurement_id ) {
|
122 |
+
$data[] = 'analytics';
|
|
|
|
|
123 |
}
|
124 |
+
if ( $this->options_obj->google->ads->conversion_id ) {
|
125 |
+
$data[] = 'ads';
|
126 |
+
}
|
127 |
+
return implode( ',', $data );
|
128 |
}
|
129 |
|
130 |
+
private function get_modified_script_opening_tag()
|
131 |
{
|
132 |
+
$this->get_formatted_script_tag_new( [
|
133 |
+
'async' => true,
|
134 |
+
'defer' => false,
|
135 |
+
'src' => '',
|
136 |
+
'cookie_category' => 'analytics,ads',
|
137 |
+
'pixel_name' => 'google',
|
138 |
+
'inject_cfasync' => false,
|
139 |
+
'cookiebot-cookieconsent' => $this->options_obj->shop->cookie_consent_mgmt->cookiebot->active || ( new Environment_Check() )->is_some_cmp_active(),
|
140 |
+
] );
|
141 |
}
|
142 |
|
143 |
+
protected function get_google_init_js()
|
144 |
{
|
145 |
+
// @formatter:off
|
146 |
+
?>
|
147 |
+
|
148 |
+
function googleConfigConditionsMet(type){
|
149 |
+
if (typeof wpm != 'undefined' && typeof wpm.googleConfigConditionsMet === 'function') {
|
150 |
+
return wpm.googleConfigConditionsMet(type)
|
151 |
+
} else {
|
152 |
+
console.error('wpm is not defined. That means you are deferring the script which you shouldn\'t. wpm must be loaded before the inline scripts run. Visitor tracking will continue to work, but visitor cookie consent will be ignored.')
|
153 |
+
return true
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
+
function getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings){
|
158 |
+
if (typeof wpm != 'undefined' && typeof wpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings === 'function') {
|
159 |
+
return wpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings)
|
160 |
+
} else {
|
161 |
+
console.error('wpm is not defined. That means you are deferring the script which you shouldn\'t. wpm must be loaded before the inline scripts run. Visitor tracking will continue to work, but visitor cookie consent will be ignored.')
|
162 |
+
return true
|
163 |
+
}
|
164 |
+
}
|
165 |
+
|
166 |
+
window.dataLayer = window.dataLayer || [];
|
167 |
+
|
168 |
+
window.gtag = function gtag() {
|
169 |
+
dataLayer.push(arguments);
|
170 |
+
}
|
171 |
+
<?php
|
172 |
+
// $this->consent_mode_gtag_html();
|
173 |
+
$this->consent_mode_gtag_html_new();
|
174 |
+
// $this->linker_html();
|
175 |
+
$this->linker_html_new();
|
176 |
+
?>
|
177 |
+
|
178 |
+
gtag('js', new Date());
|
179 |
+
|
180 |
+
<?php
|
181 |
+
// @formatter:on
|
182 |
}
|
183 |
|
184 |
+
// https://developers.google.com/gtagjs/devguide/linker
|
185 |
+
private function linker_html()
|
186 |
{
|
187 |
+
$linker_domains = apply_filters_deprecated(
|
188 |
+
'wooptpm_google_cross_domain_linker_settings',
|
189 |
+
[ null ],
|
190 |
+
'1.13.0',
|
191 |
+
'wpm_google_cross_domain_linker_settings'
|
192 |
+
);
|
193 |
+
$linker_domains = apply_filters( 'wpm_google_cross_domain_linker_settings', $linker_domains );
|
194 |
|
195 |
+
if ( $linker_domains ) {
|
196 |
+
return "\t\t" . 'gtag("set", "linker", ' . wp_json_encode( $linker_domains ) . ');';
|
197 |
} else {
|
198 |
+
return '';
|
199 |
}
|
200 |
|
201 |
}
|
202 |
|
203 |
+
// https://developers.google.com/gtagjs/devguide/linker
|
204 |
+
private function linker_html_new()
|
205 |
{
|
206 |
+
$linker_domains = apply_filters_deprecated(
|
207 |
+
'wooptpm_google_cross_domain_linker_settings',
|
208 |
+
[ null ],
|
209 |
+
'1.13.0',
|
210 |
+
'wpm_google_cross_domain_linker_settings'
|
211 |
+
);
|
212 |
+
$linker_domains = apply_filters( 'wpm_google_cross_domain_linker_settings', $linker_domains );
|
213 |
|
214 |
+
if ( $linker_domains ) {
|
215 |
+
?>
|
216 |
+
|
217 |
+
gtag("set", "linker", <?php
|
218 |
+
echo wp_json_encode( $linker_domains ) ;
|
219 |
+
?>);
|
220 |
+
<?php
|
221 |
}
|
222 |
|
223 |
}
|
224 |
|
225 |
+
private function consent_mode_gtag_html()
|
226 |
{
|
227 |
|
228 |
+
if ( $this->options_obj->google->consent_mode->active ) {
|
229 |
+
$data = [
|
230 |
+
'ad_storage' => 'denied',
|
231 |
+
'analytics_storage' => 'denied',
|
232 |
+
'wait_for_update' => 500,
|
233 |
+
];
|
234 |
+
if ( $this->options_obj->google->consent_mode->regions ) {
|
235 |
+
$data['region'] = $this->options_obj->google->consent_mode->regions;
|
|
|
236 |
}
|
237 |
+
// needs to be output as text
|
238 |
+
$ads_data_redaction = apply_filters_deprecated(
|
239 |
+
'wooptpm_google_ads_data_redaction',
|
240 |
+
[ true ],
|
241 |
+
'1.13.0',
|
242 |
+
'wpm_google_ads_data_redaction'
|
243 |
+
);
|
244 |
+
$ads_data_redaction = ( apply_filters( 'wpm_google_ads_data_redaction', $ads_data_redaction ) ? 'true' : 'false' );
|
245 |
+
// needs to be output as text
|
246 |
+
$url_passthrough = apply_filters_deprecated(
|
247 |
+
'wooptpm_google_url_passthrough',
|
248 |
+
[ true ],
|
249 |
+
'1.13.0',
|
250 |
+
'wpm_google_url_passthrough'
|
251 |
+
);
|
252 |
+
$url_passthrough = ( apply_filters( 'wpm_google_url_passthrough', $url_passthrough ) ? 'true' : 'false' );
|
253 |
+
// return "
|
254 |
+
// let google_consent_settings = " . wp_json_encode($data) . ";
|
255 |
+
//
|
256 |
+
// google_consent_settings = getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings);
|
257 |
+
//
|
258 |
+
//// console.log(google_consent_settings);
|
259 |
+
//
|
260 |
+
// gtag('consent', 'default', google_consent_settings);
|
261 |
+
// gtag('set', 'ads_data_redaction', " . $ads_data_redaction . ");
|
262 |
+
// gtag('set', 'url_passthrough', " . $url_passthrough . ");" . PHP_EOL;
|
263 |
+
return '
|
264 |
+
let google_consent_settings = ' . wp_json_encode( $data ) . ';
|
265 |
+
|
266 |
+
google_consent_settings = getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings);
|
267 |
+
|
268 |
+
// console.log(google_consent_settings);
|
269 |
+
|
270 |
+
gtag("consent", "default", google_consent_settings);
|
271 |
+
gtag("set", "ads_data_redaction", ' . $ads_data_redaction . ');
|
272 |
+
gtag("set", "url_passthrough", ' . $url_passthrough . ');' . PHP_EOL;
|
273 |
} else {
|
274 |
+
return '';
|
275 |
}
|
276 |
|
277 |
}
|
278 |
|
279 |
+
private function consent_mode_gtag_html_new()
|
280 |
{
|
|
|
281 |
|
282 |
+
if ( $this->options_obj->google->consent_mode->active ) {
|
283 |
+
$data = [
|
284 |
+
'ad_storage' => 'denied',
|
285 |
+
'analytics_storage' => 'denied',
|
286 |
+
'wait_for_update' => 500,
|
287 |
+
];
|
288 |
+
if ( $this->options_obj->google->consent_mode->regions ) {
|
289 |
+
$data['region'] = $this->options_obj->google->consent_mode->regions;
|
290 |
}
|
291 |
+
// needs to be output as text
|
292 |
+
$ads_data_redaction = apply_filters_deprecated(
|
293 |
+
'wooptpm_google_ads_data_redaction',
|
294 |
+
[ true ],
|
295 |
+
'1.13.0',
|
296 |
+
'wpm_google_ads_data_redaction'
|
297 |
+
);
|
298 |
+
$ads_data_redaction = ( apply_filters( 'wpm_google_ads_data_redaction', $ads_data_redaction ) ? 'true' : 'false' );
|
299 |
+
// needs to be output as text
|
300 |
+
$url_passthrough = apply_filters_deprecated(
|
301 |
+
'wooptpm_google_url_passthrough',
|
302 |
+
[ true ],
|
303 |
+
'1.13.0',
|
304 |
+
'wpm_google_url_passthrough'
|
305 |
+
);
|
306 |
+
$url_passthrough = ( apply_filters( 'wpm_google_url_passthrough', $url_passthrough ) ? 'true' : 'false' );
|
307 |
+
// return "
|
308 |
+
// let google_consent_settings = " . wp_json_encode($data) . ";
|
309 |
+
//
|
310 |
+
// google_consent_settings = getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings);
|
311 |
+
//
|
312 |
+
//// console.log(google_consent_settings);
|
313 |
+
//
|
314 |
+
// gtag('consent', 'default', google_consent_settings);
|
315 |
+
// gtag('set', 'ads_data_redaction', " . $ads_data_redaction . ");
|
316 |
+
// gtag('set', 'url_passthrough', " . $url_passthrough . ");" . PHP_EOL;
|
317 |
+
// return '
|
318 |
+
// let google_consent_settings = ' . wp_json_encode($data) . ';
|
319 |
+
//
|
320 |
+
// google_consent_settings = getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings);
|
321 |
+
//
|
322 |
+
//// console.log(google_consent_settings);
|
323 |
+
//
|
324 |
+
// gtag("consent", "default", google_consent_settings);
|
325 |
+
// gtag("set", "ads_data_redaction", ' . $ads_data_redaction . ');
|
326 |
+
// gtag("set", "url_passthrough", ' . $url_passthrough . ');' . PHP_EOL;
|
327 |
+
?>
|
328 |
+
|
329 |
+
let google_consent_settings = <?php
|
330 |
+
echo wp_json_encode( $data ) ;
|
331 |
+
?>
|
332 |
+
|
333 |
+
google_consent_settings = getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings)
|
334 |
+
|
335 |
+
gtag("consent", "default", google_consent_settings)
|
336 |
+
gtag("set", "ads_data_redaction", <?php
|
337 |
+
esc_html_e( $ads_data_redaction );
|
338 |
+
?>)
|
339 |
+
gtag("set", "url_passthrough", <?php
|
340 |
+
esc_html_e( $url_passthrough );
|
341 |
+
?>)
|
342 |
+
<?php
|
343 |
}
|
344 |
+
|
|
|
345 |
}
|
346 |
|
347 |
+
protected function get_google_business_vertical( $id )
|
348 |
{
|
349 |
$verticals = [
|
350 |
0 => 'retail',
|
360 |
return $verticals[$id];
|
361 |
}
|
362 |
|
363 |
+
protected function get_formatted_order_items( $order, $channel = '' )
|
364 |
{
|
365 |
+
$order_items = $this->wpm_get_order_items( $order );
|
366 |
+
$order_items_array = [];
|
367 |
+
$list_position = 1;
|
368 |
+
foreach ( (array) $order_items as $order_item ) {
|
369 |
+
$product_id = $this->get_variation_or_product_id( $order_item->get_data(), $this->options_obj->general->variations_output );
|
370 |
+
$product = wc_get_product( $product_id );
|
371 |
+
|
372 |
+
if ( !is_object( $product ) ) {
|
373 |
+
$this->log_problematic_product_id( $product_id );
|
374 |
+
continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
375 |
}
|
376 |
+
|
377 |
+
$item_details_array = [];
|
378 |
+
$dyn_r_ids = $this->get_dyn_r_ids( $product );
|
379 |
+
|
380 |
+
if ( 'ads' === $channel ) {
|
381 |
+
$item_details_array['id'] = (string) $dyn_r_ids[$this->get_dyn_r_id_type()];
|
382 |
+
} else {
|
383 |
+
$item_details_array['id'] = (string) $dyn_r_ids[$this->get_ga_id_type()];
|
384 |
}
|
385 |
+
|
386 |
+
$item_details_array['quantity'] = (int) $order_item['quantity'];
|
387 |
+
$item_details_array['price'] = (double) $product->get_price();
|
388 |
+
if ( $this->is_google_ads_active() ) {
|
389 |
+
$item_details_array['google_business_vertical'] = (string) $this->google_business_vertical;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
390 |
}
|
391 |
+
|
392 |
+
if ( $this->is_google_analytics_active() && 'ads' != $channel ) {
|
393 |
+
$item_details_array['name'] = (string) $product->get_name();
|
394 |
+
// $item_details_array['list_name'] = '';
|
395 |
+
$item_details_array['brand'] = (string) $this->get_brand_name( $product_id );
|
396 |
+
$item_details_array['category'] = (array) $this->get_product_category( $product_id );
|
397 |
+
// $item_details_array['variant'] = '';
|
398 |
+
$item_details_array['list_position'] = (int) $list_position++;
|
399 |
+
}
|
400 |
+
|
401 |
+
array_push( $order_items_array, $item_details_array );
|
402 |
}
|
403 |
+
// apply filter to $order_items_array
|
404 |
+
$order_items_array = apply_filters_deprecated(
|
405 |
+
'wgact_filter',
|
406 |
+
[ $order_items_array ],
|
407 |
+
'1.10.2',
|
408 |
+
'',
|
409 |
+
'This filter has been deprecated without replacement.'
|
410 |
+
);
|
411 |
+
return $order_items_array;
|
412 |
}
|
413 |
|
414 |
+
protected function get_event_purchase(
|
415 |
+
$order,
|
416 |
+
$order_total,
|
417 |
+
$order_currency,
|
418 |
+
$is_new_customer,
|
419 |
+
$channel
|
420 |
+
)
|
421 |
{
|
422 |
+
$gtag_data = [
|
423 |
+
'send_to' => [],
|
424 |
+
'transaction_id' => (string) $order->get_order_number(),
|
425 |
+
'currency' => (string) $order_currency,
|
426 |
+
'discount' => (double) $order->get_total_discount(),
|
427 |
+
'items' => (array) $this->get_formatted_order_items( $order, $channel ),
|
428 |
+
];
|
429 |
|
430 |
+
if ( 'ads' === $channel ) {
|
431 |
+
$gtag_data['send_to'] = $this->get_google_ads_conversion_ids( true );
|
432 |
+
$gtag_data['value'] = (double) $order_total;
|
433 |
+
$gtag_data['aw_merchant_id'] = (int) $this->aw_merchant_id;
|
434 |
+
$gtag_data['aw_feed_country'] = (string) $this->get_visitor_country();
|
435 |
+
$gtag_data['aw_feed_language'] = (string) $this->get_gmc_language();
|
436 |
+
$gtag_data['new_customer'] = (string) $is_new_customer;
|
437 |
} else {
|
438 |
+
|
439 |
+
if ( 'ga_ua' === $channel ) {
|
440 |
+
if ( $this->options_obj->google->analytics->universal->property_id ) {
|
441 |
+
array_push( $gtag_data['send_to'], $this->options_obj->google->analytics->universal->property_id );
|
442 |
+
}
|
443 |
+
// if ($this->options_obj->google->analytics->ga4->measurement_id) array_push($gtag_data['send_to'], $this->options_obj->google->analytics->ga4->measurement_id);
|
444 |
+
$gtag_data['affiliation'] = (string) get_bloginfo( 'name' );
|
445 |
+
$gtag_data['tax'] = (double) $order->get_total_tax();
|
446 |
+
$gtag_data['shipping'] = (double) $order->get_total_shipping();
|
447 |
+
$gtag_data['value'] = (double) $order->get_total();
|
448 |
+
} else {
|
449 |
+
|
450 |
+
if ( 'ga_4' === $channel ) {
|
451 |
+
// if ($this->options_obj->google->analytics->universal->property_id) array_push($gtag_data['send_to'], $this->options_obj->google->analytics->universal->property_id);
|
452 |
+
if ( $this->options_obj->google->analytics->ga4->measurement_id ) {
|
453 |
+
array_push( $gtag_data['send_to'], $this->options_obj->google->analytics->ga4->measurement_id );
|
454 |
+
}
|
455 |
+
$gtag_data['affiliation'] = (string) get_bloginfo( 'name' );
|
456 |
+
$gtag_data['tax'] = (double) $order->get_total_tax();
|
457 |
+
$gtag_data['shipping'] = (double) $order->get_total_shipping();
|
458 |
+
$gtag_data['value'] = (double) $order->get_total();
|
459 |
+
}
|
460 |
+
|
461 |
+
}
|
462 |
+
|
463 |
}
|
464 |
|
465 |
+
return wp_json_encode( $gtag_data );
|
466 |
}
|
467 |
|
468 |
+
protected function get_gmc_language()
|
469 |
{
|
470 |
+
return strtoupper( substr( get_locale(), 0, 2 ) );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
471 |
}
|
472 |
|
473 |
+
protected function get_google_ads_conversion_ids( $purchase = false )
|
474 |
{
|
475 |
+
$formatted_conversion_ids = [];
|
476 |
+
|
477 |
+
if ( $purchase ) {
|
478 |
+
foreach ( $this->google_ads_conversion_identifiers as $conversion_id => $conversion_label ) {
|
479 |
+
array_push( $formatted_conversion_ids, 'AW-' . $conversion_id . '/' . $conversion_label );
|
480 |
+
}
|
481 |
+
} else {
|
482 |
+
foreach ( $this->google_ads_conversion_identifiers as $conversion_id => $conversion_label ) {
|
483 |
+
array_push( $formatted_conversion_ids, 'AW-' . $conversion_id );
|
484 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
485 |
}
|
486 |
+
|
487 |
+
return $formatted_conversion_ids;
|
488 |
}
|
489 |
|
490 |
+
private function get_gtag_id()
|
491 |
{
|
492 |
|
493 |
+
if ( $this->options_obj->google->analytics->universal->property_id ) {
|
494 |
+
return $this->options_obj->google->analytics->universal->property_id;
|
495 |
+
} elseif ( $this->options_obj->google->analytics->ga4->measurement_id ) {
|
496 |
+
return $this->options_obj->google->analytics->ga4->measurement_id;
|
497 |
+
} elseif ( $this->options_obj->google->ads->conversion_id ) {
|
498 |
+
return 'AW-' . $this->options_obj->google->ads->conversion_id;
|
499 |
} else {
|
500 |
+
return '';
|
501 |
}
|
502 |
|
503 |
}
|
504 |
|
505 |
+
private function inject_data_layer_pixels()
|
506 |
{
|
507 |
+
$data = [
|
508 |
+
'google' => [
|
509 |
+
'ads' => [
|
510 |
+
'dynamic_remarketing' => [
|
511 |
+
'status' => (bool) $this->options_obj->google->ads->dynamic_remarketing,
|
512 |
+
'id_type' => $this->get_dyn_r_id_type(),
|
513 |
+
'send_events_with_parent_ids' => apply_filters( 'wpm_send_events_with_parent_ids', apply_filters_deprecated(
|
514 |
+
'wooptpm_send_events_with_parent_ids',
|
515 |
+
[ true ],
|
516 |
'1.13.0',
|
517 |
+
'wpm_send_events_with_parent_ids'
|
518 |
+
) ),
|
519 |
+
],
|
520 |
+
'conversionIds' => $this->get_google_ads_conversion_ids(),
|
521 |
+
'google_business_vertical' => $this->google_business_vertical,
|
522 |
+
],
|
523 |
+
'analytics' => [
|
524 |
+
'universal' => [
|
525 |
+
'property_id' => $this->options_obj->google->analytics->universal->property_id,
|
526 |
+
],
|
527 |
+
'ga4' => [
|
528 |
+
'measurement_id' => $this->options_obj->google->analytics->ga4->measurement_id,
|
529 |
+
],
|
530 |
+
'id_type' => $this->get_ga_id_type(),
|
531 |
+
'eec' => (bool) $this->options_obj->google->analytics->eec,
|
532 |
+
],
|
533 |
+
'consent_mode' => [
|
534 |
+
'active' => (bool) $this->options_obj->google->consent_mode->active,
|
535 |
+
],
|
536 |
+
],
|
537 |
+
];
|
538 |
+
?>
|
539 |
+
|
540 |
+
<script>
|
541 |
+
wpmDataLayer.pixels = <?php
|
542 |
+
echo wp_json_encode( $data ) ;
|
543 |
+
?>;
|
544 |
+
</script>
|
545 |
+
<?php
|
546 |
}
|
547 |
|
548 |
+
protected function gtag_config( $id, $channel = '' )
|
549 |
{
|
550 |
+
|
551 |
+
if ( 'ads' === $channel ) {
|
552 |
+
|
553 |
+
if ( $this->options_obj->google->ads->enhanced_conversions ) {
|
554 |
+
// return PHP_EOL . "\t\t\t" . 'if (googleConfigConditionsMet("ads")) gtag("config", "AW-' . $id . '", {"allow_enhanced_conversions":true});' . PHP_EOL;
|
555 |
+
?>
|
556 |
+
|
557 |
+
if (googleConfigConditionsMet("ads")) gtag("config", "AW-<?php
|
558 |
+
echo esc_js( $id ) ;
|
559 |
+
?>", {"allow_enhanced_conversions":true});
|
560 |
+
<?php
|
561 |
+
} else {
|
562 |
+
// return PHP_EOL . "\t\t\t" . 'if (googleConfigConditionsMet("ads")) gtag("config", "AW-' . $id . '");' . PHP_EOL;
|
563 |
+
?>
|
564 |
+
if (googleConfigConditionsMet("ads")) gtag("config", "AW-<?php
|
565 |
+
echo esc_js( $id ) ;
|
566 |
+
?>");
|
567 |
+
<?php
|
568 |
+
}
|
569 |
+
|
570 |
+
} elseif ( 'ga_ua' === $channel ) {
|
571 |
+
$ga_ua_parameters = [
|
572 |
+
'anonymize_ip' => 'true',
|
573 |
+
'link_attribution' => ( $this->options_obj->google->analytics->link_attribution ? 'true' : 'false' ),
|
574 |
];
|
575 |
+
if ( $this->options_obj->google->user_id && is_user_logged_in() ) {
|
576 |
+
$ga_ua_parameters['user_id'] = get_current_user_id();
|
577 |
+
}
|
578 |
+
$ga_ua_parameters = apply_filters_deprecated(
|
579 |
+
'woopt_pm_analytics_parameters',
|
580 |
+
[ $ga_ua_parameters, $id ],
|
581 |
+
'1.10.10',
|
582 |
+
'wooptpm_ga_ua_parameters'
|
583 |
+
);
|
584 |
+
$ga_ua_parameters = apply_filters_deprecated(
|
585 |
+
'wooptpm_ga_ua_parameters',
|
586 |
+
[ $ga_ua_parameters, $id ],
|
587 |
+
'1.13.0',
|
588 |
+
'wpm_ga_ua_parameters'
|
589 |
+
);
|
590 |
+
$ga_ua_parameters = apply_filters( 'wpm_ga_ua_parameters', $ga_ua_parameters, $id );
|
591 |
+
// return "\t" . 'if (googleConfigConditionsMet("analytics")) gtag("config", "' . $id . '", ' . wp_json_encode($ga_ua_parameters) . ');';
|
592 |
+
?>
|
593 |
+
if (googleConfigConditionsMet("analytics")) gtag("config", "<?php
|
594 |
+
echo esc_js( $id ) ;
|
595 |
+
?>", <?php
|
596 |
+
echo wp_json_encode( $ga_ua_parameters ) ;
|
597 |
+
?>);
|
598 |
+
|
599 |
+
<?php
|
600 |
+
} elseif ( 'ga_4' === $channel ) {
|
601 |
+
$ga_4_parameters = [];
|
602 |
+
if ( $this->options_obj->google->user_id && is_user_logged_in() ) {
|
603 |
+
$ga_4_parameters = [
|
604 |
+
'user_id' => get_current_user_id(),
|
605 |
+
];
|
606 |
+
}
|
607 |
+
$ga_4_parameters = apply_filters_deprecated(
|
608 |
+
'wooptpm_ga_4_parameters',
|
609 |
+
[ $ga_4_parameters, $id ],
|
610 |
+
'1.13.0',
|
611 |
+
'wpm_ga_4_parameters'
|
612 |
+
);
|
613 |
+
$ga_4_parameters = apply_filters( 'wpm_ga_4_parameters', $ga_4_parameters, $id );
|
614 |
+
|
615 |
+
if ( empty($ga_4_parameters) ) {
|
616 |
+
// return "\t" . 'if (googleConfigConditionsMet("analytics")) gtag("config", "' . $id . '");';
|
617 |
+
?>
|
618 |
+
if (googleConfigConditionsMet("analytics")) gtag("config", "<?php
|
619 |
+
echo esc_js( $id ) ;
|
620 |
+
?>");
|
621 |
+
<?php
|
622 |
+
} else {
|
623 |
+
// return "\t" . 'if (googleConfigConditionsMet("analytics")) gtag("config", "' . $id . '", ' . wp_json_encode($ga_4_parameters) . ');';
|
624 |
+
?>
|
625 |
+
if (googleConfigConditionsMet("analytics")) gtag("config", "<?php
|
626 |
+
echo esc_js( $id ) ;
|
627 |
+
?>", <?php
|
628 |
+
echo wp_json_encode( $ga_4_parameters ) ;
|
629 |
+
?>);
|
630 |
+
<?php
|
631 |
+
}
|
632 |
+
|
633 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
634 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
635 |
}
|
636 |
|
637 |
+
private function inject_borlabs_consent_mode_update()
|
638 |
{
|
639 |
+
return "\n (function updateGoogleConsentMode() {\n if (typeof BorlabsCookie == 'undefined' || typeof gtag == 'undefined') {\n window.setTimeout(updateGoogleConsentMode, 50);\n } else {\n if (window.BorlabsCookie.checkCookieGroupConsent('statistics')) {\n// console.log('update analytics_storage to granted');\n\n gtag('consent', 'update', {\n 'analytics_storage': 'granted'\n });\n }\n \n if (window.BorlabsCookie.checkCookieGroupConsent('marketing')) {\n// console.log('update ad_storage to granted');\n gtag('consent', 'update', {\n 'ad_storage': 'granted'\n });\n }\n }\n })();" . PHP_EOL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
640 |
}
|
641 |
|
642 |
}
|
classes/pixels/google/trait-google.php
CHANGED
@@ -2,384 +2,175 @@
|
|
2 |
|
3 |
namespace WCPM\Classes\Pixels\Google;
|
4 |
|
5 |
-
use
|
6 |
-
use WCPM\Classes\Pixels\Trait_Shop ;
|
7 |
|
8 |
-
if (
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
}
|
12 |
|
13 |
-
trait Trait_Google
|
14 |
-
{
|
15 |
-
|
16 |
-
protected $google_ads_conversion_identifiers ;
|
17 |
-
protected function get_ga_id_type()
|
18 |
-
{
|
19 |
-
$ga_id_type = 'post_id';
|
20 |
-
$ga_id_type = apply_filters_deprecated(
|
21 |
-
'wooptpm_product_id_type_for_google_analytics',
|
22 |
-
[ $ga_id_type ],
|
23 |
-
'1.13.0',
|
24 |
-
'wpm_product_id_type_for_google_analytics'
|
25 |
-
);
|
26 |
-
// Change the output of the product ID type for Google Analytics
|
27 |
-
return apply_filters( 'wpm_product_id_type_for_google_analytics', $ga_id_type );
|
28 |
-
}
|
29 |
-
|
30 |
-
protected function google_active()
|
31 |
-
{
|
32 |
-
|
33 |
-
if ( $this->options_obj->google->analytics->universal->property_id ) {
|
34 |
-
return true;
|
35 |
-
} elseif ( $this->options_obj->google->analytics->ga4->measurement_id ) {
|
36 |
-
return true;
|
37 |
-
} elseif ( $this->options_obj->google->ads->conversion_id ) {
|
38 |
-
return true;
|
39 |
-
} else {
|
40 |
-
return false;
|
41 |
-
}
|
42 |
-
|
43 |
-
}
|
44 |
-
|
45 |
-
protected function is_google_ads_active()
|
46 |
-
{
|
47 |
-
|
48 |
-
if ( $this->options['google']['ads']['conversion_id'] ) {
|
49 |
-
return true;
|
50 |
-
} else {
|
51 |
-
return false;
|
52 |
-
}
|
53 |
-
|
54 |
-
}
|
55 |
-
|
56 |
-
protected function is_google_analytics_active()
|
57 |
-
{
|
58 |
-
|
59 |
-
if ( $this->is_google_analytics_ua_active() || $this->is_google_analytics_4_active() ) {
|
60 |
-
return true;
|
61 |
-
} else {
|
62 |
-
return false;
|
63 |
-
}
|
64 |
-
|
65 |
-
}
|
66 |
-
|
67 |
-
protected function is_google_analytics_ua_active()
|
68 |
-
{
|
69 |
-
|
70 |
-
if ( $this->options_obj->google->analytics->universal->property_id ) {
|
71 |
-
return true;
|
72 |
-
} else {
|
73 |
-
return false;
|
74 |
-
}
|
75 |
-
|
76 |
-
}
|
77 |
-
|
78 |
-
protected function is_google_analytics_4_active()
|
79 |
-
{
|
80 |
-
|
81 |
-
if ( $this->options_obj->google->analytics->ga4->measurement_id ) {
|
82 |
-
return true;
|
83 |
-
} else {
|
84 |
-
return false;
|
85 |
-
}
|
86 |
-
|
87 |
-
}
|
88 |
-
|
89 |
-
protected function is_google_analytics_4_mp_active()
|
90 |
-
{
|
91 |
-
|
92 |
-
if ( $this->options_obj->google->analytics->ga4->measurement_id && $this->options_obj->google->analytics->ga4->api_secret ) {
|
93 |
-
return true;
|
94 |
-
} else {
|
95 |
-
return false;
|
96 |
-
}
|
97 |
-
|
98 |
-
}
|
99 |
-
|
100 |
-
protected function get_order_item_data( $order_item )
|
101 |
-
{
|
102 |
-
$product = $order_item->get_product();
|
103 |
-
|
104 |
-
if ( !is_object( $product ) ) {
|
105 |
-
wc_get_logger()->debug( 'get_order_item_data received an order item which is not a valid product: ' . $order_item->get_id(), [
|
106 |
-
'source' => 'wpm',
|
107 |
-
] );
|
108 |
-
return [];
|
109 |
-
}
|
110 |
-
|
111 |
-
$dyn_r_ids = $this->get_dyn_r_ids( $product );
|
112 |
-
|
113 |
-
if ( $product->get_type() === 'variation' ) {
|
114 |
-
$parent_product = wc_get_product( $product->get_parent_id() );
|
115 |
-
$name = $parent_product->get_name();
|
116 |
-
} else {
|
117 |
-
$name = $product->get_name();
|
118 |
-
}
|
119 |
-
|
120 |
-
return [
|
121 |
-
'id' => (string) $dyn_r_ids[$this->get_ga_id_type()],
|
122 |
-
'name' => (string) $name,
|
123 |
-
'quantity' => (int) $order_item['quantity'],
|
124 |
-
'affiliation' => (string) get_bloginfo( 'name' ),
|
125 |
-
'brand' => (string) $this->get_brand_name( $product->get_id() ),
|
126 |
-
'category' => implode( ',', $this->get_product_category( $product->get_id() ) ),
|
127 |
-
'category_array' => $this->get_product_category( $product->get_id() ),
|
128 |
-
'variant' => ( (string) ($product->get_type() === 'variation') ? $this->get_formatted_variant_text( $product ) : '' ),
|
129 |
-
'price' => (double) $this->wpm_get_order_item_price( $order_item, $product ),
|
130 |
-
];
|
131 |
-
}
|
132 |
-
|
133 |
-
protected function wpm_get_order_item_price( $order_item, $product )
|
134 |
-
{
|
135 |
-
|
136 |
-
if ( ( new Environment_Check( $this->options ) )->is_woo_discount_rules_active() ) {
|
137 |
-
$item_value = $order_item->get_meta( '_advanced_woo_discount_item_total_discount' );
|
138 |
-
|
139 |
-
if ( is_array( $item_value ) && array_key_exists( 'discounted_price', $item_value ) && 0 != $item_value['discounted_price'] ) {
|
140 |
-
return (double) $item_value['discounted_price'];
|
141 |
-
} elseif ( is_array( $item_value ) && array_key_exists( 'initial_price', $item_value ) && 0 != $item_value['initial_price'] ) {
|
142 |
-
return (double) $item_value['initial_price'];
|
143 |
-
} else {
|
144 |
-
return (double) $product->get_price();
|
145 |
-
}
|
146 |
-
|
147 |
-
} else {
|
148 |
-
return (double) $product->get_price();
|
149 |
-
}
|
150 |
-
|
151 |
-
}
|
152 |
-
|
153 |
-
protected function add_categories_to_ga4_product_items( $item_details_array, $categories )
|
154 |
-
{
|
155 |
-
$categories = array_unique( $categories );
|
156 |
-
|
157 |
-
if ( count( $categories ) > 0 ) {
|
158 |
-
$max_categories = 5;
|
159 |
-
$item_details_array['item_category'] = $categories[0];
|
160 |
-
$max = ( count( $categories ) > $max_categories ? $max_categories : count( $categories ) );
|
161 |
-
for ( $i = 1 ; $i < $max ; $i++ ) {
|
162 |
-
$item_details_array['item_category' . ($i + 1)] = $categories[$i];
|
163 |
-
}
|
164 |
-
}
|
165 |
-
|
166 |
-
return $item_details_array;
|
167 |
-
}
|
168 |
-
|
169 |
-
protected function get_google_business_vertical( $id )
|
170 |
-
{
|
171 |
-
$verticals = [
|
172 |
-
0 => 'retail',
|
173 |
-
1 => 'education',
|
174 |
-
2 => 'flights',
|
175 |
-
3 => 'hotel_rental',
|
176 |
-
4 => 'jobs',
|
177 |
-
5 => 'local',
|
178 |
-
6 => 'real_estate',
|
179 |
-
7 => 'travel',
|
180 |
-
8 => 'custom',
|
181 |
-
];
|
182 |
-
return $verticals[$id];
|
183 |
-
}
|
184 |
-
|
185 |
-
protected function get_google_ads_conversion_ids( $purchase = false )
|
186 |
-
{
|
187 |
-
$this->google_ads_conversion_identifiers[$this->options['google']['ads']['conversion_id']] = $this->options['google']['ads']['conversion_label'];
|
188 |
-
$this->google_ads_conversion_identifiers = apply_filters_deprecated(
|
189 |
-
'wgact_google_ads_conversion_identifiers',
|
190 |
-
[ $this->google_ads_conversion_identifiers ],
|
191 |
-
'1.10.2',
|
192 |
-
'wooptpm_google_ads_conversion_identifiers'
|
193 |
-
);
|
194 |
-
$this->google_ads_conversion_identifiers = apply_filters_deprecated(
|
195 |
-
'wooptpm_google_ads_conversion_identifiers',
|
196 |
-
[ $this->google_ads_conversion_identifiers ],
|
197 |
-
'1.13.0',
|
198 |
-
'wpm_google_ads_conversion_identifiers'
|
199 |
-
);
|
200 |
-
$this->google_ads_conversion_identifiers = apply_filters( 'wpm_google_ads_conversion_identifiers', $this->google_ads_conversion_identifiers );
|
201 |
-
$formatted_conversion_ids = [];
|
202 |
-
|
203 |
-
if ( $purchase ) {
|
204 |
-
foreach ( $this->google_ads_conversion_identifiers as $conversion_id => $conversion_label ) {
|
205 |
-
$conversion_id = $this->extract_google_ads_id( $conversion_id );
|
206 |
-
if ( $conversion_id ) {
|
207 |
-
$formatted_conversion_ids['AW-' . $conversion_id] = $conversion_label;
|
208 |
-
}
|
209 |
-
}
|
210 |
-
} else {
|
211 |
-
foreach ( $this->google_ads_conversion_identifiers as $conversion_id => $conversion_label ) {
|
212 |
-
$conversion_id = $this->extract_google_ads_id( $conversion_id );
|
213 |
-
if ( $conversion_id ) {
|
214 |
-
$formatted_conversion_ids['AW-' . $conversion_id] = '';
|
215 |
-
}
|
216 |
-
}
|
217 |
-
}
|
218 |
-
|
219 |
-
return $formatted_conversion_ids;
|
220 |
-
}
|
221 |
-
|
222 |
-
protected function extract_google_ads_id( $string )
|
223 |
-
{
|
224 |
-
$re = '/\\d{9,11}/';
|
225 |
-
|
226 |
-
if ( $string ) {
|
227 |
-
preg_match(
|
228 |
-
$re,
|
229 |
-
$string,
|
230 |
-
$matches,
|
231 |
-
PREG_OFFSET_CAPTURE,
|
232 |
-
0
|
233 |
-
);
|
234 |
-
if ( is_array( $matches[0] ) ) {
|
235 |
-
return $matches[0][0];
|
236 |
-
}
|
237 |
-
}
|
238 |
-
|
239 |
-
return '';
|
240 |
-
}
|
241 |
-
|
242 |
-
protected function get_google_ads_enhanced_conversion_data( $order )
|
243 |
-
{
|
244 |
-
$customer_data = [];
|
245 |
-
if ( $order->get_billing_email() ) {
|
246 |
-
$customer_data['email'] = (string) $order->get_billing_email();
|
247 |
-
}
|
248 |
-
if ( $order->get_billing_phone() ) {
|
249 |
-
$customer_data['phone_number'] = $this->get_e164_formatted_phone_number( (string) $order->get_billing_phone(), (string) $order->get_billing_country() );
|
250 |
-
}
|
251 |
-
|
252 |
-
if ( $this->are_billing_and_shipping_addresses_equal( $order ) ) {
|
253 |
-
$customer_data['address'] = $this->get_billing_address_details( $order );
|
254 |
-
} else {
|
255 |
-
$customer_data['address'][] = $this->get_billing_address_details( $order );
|
256 |
-
$customer_data['address'][] = $this->get_shipping_address_details( $order );
|
257 |
-
}
|
258 |
-
|
259 |
-
return $customer_data;
|
260 |
-
}
|
261 |
-
|
262 |
-
protected function get_billing_address_details( $order )
|
263 |
-
{
|
264 |
-
$customer_data = [];
|
265 |
-
if ( $order->get_billing_first_name() ) {
|
266 |
-
$customer_data['first_name'] = (string) $order->get_billing_first_name();
|
267 |
-
}
|
268 |
-
if ( $order->get_billing_last_name() ) {
|
269 |
-
$customer_data['last_name'] = (string) $order->get_billing_last_name();
|
270 |
-
}
|
271 |
-
if ( $order->get_billing_address_1() ) {
|
272 |
-
$customer_data['street'] = (string) $order->get_billing_address_1();
|
273 |
-
}
|
274 |
-
if ( $order->get_billing_city() ) {
|
275 |
-
$customer_data['city'] = (string) $order->get_billing_city();
|
276 |
-
}
|
277 |
-
if ( $order->get_billing_state() ) {
|
278 |
-
$customer_data['region'] = (string) $order->get_billing_state();
|
279 |
-
}
|
280 |
-
if ( $order->get_billing_postcode() ) {
|
281 |
-
$customer_data['postal_code'] = (string) $order->get_billing_postcode();
|
282 |
-
}
|
283 |
-
if ( $order->get_billing_country() ) {
|
284 |
-
$customer_data['country'] = (string) $order->get_billing_country();
|
285 |
-
}
|
286 |
-
return $customer_data;
|
287 |
-
}
|
288 |
-
|
289 |
-
protected function get_shipping_address_details( $order )
|
290 |
-
{
|
291 |
-
$customer_data = [];
|
292 |
-
if ( $order->get_shipping_first_name() ) {
|
293 |
-
$customer_data['first_name'] = (string) $order->get_shipping_first_name();
|
294 |
-
}
|
295 |
-
if ( $order->get_shipping_last_name() ) {
|
296 |
-
$customer_data['last_name'] = (string) $order->get_shipping_last_name();
|
297 |
-
}
|
298 |
-
if ( $order->get_shipping_address_1() ) {
|
299 |
-
$customer_data['street'] = (string) $order->get_shipping_address_1();
|
300 |
-
}
|
301 |
-
if ( $order->get_shipping_city() ) {
|
302 |
-
$customer_data['city'] = (string) $order->get_shipping_city();
|
303 |
-
}
|
304 |
-
if ( $order->get_shipping_state() ) {
|
305 |
-
$customer_data['region'] = (string) $order->get_shipping_state();
|
306 |
-
}
|
307 |
-
if ( $order->get_shipping_postcode() ) {
|
308 |
-
$customer_data['postal_code'] = (string) $order->get_shipping_postcode();
|
309 |
-
}
|
310 |
-
if ( $order->get_shipping_country() ) {
|
311 |
-
$customer_data['country'] = (string) $order->get_shipping_country();
|
312 |
-
}
|
313 |
-
return $customer_data;
|
314 |
-
}
|
315 |
-
|
316 |
-
private function are_billing_and_shipping_addresses_equal( $order )
|
317 |
-
{
|
318 |
-
|
319 |
-
if ( $order->get_billing_first_name() === $order->get_shipping_first_name() && $order->get_billing_last_name() === $order->get_shipping_last_name() && $order->get_billing_address_1() === $order->get_shipping_address_1() && $order->get_billing_city() === $order->get_shipping_city() && $order->get_billing_state() === $order->get_shipping_state() && $order->get_billing_postcode() === $order->get_shipping_postcode() && $order->get_billing_country() === $order->get_shipping_country() ) {
|
320 |
-
return true;
|
321 |
-
} else {
|
322 |
-
return false;
|
323 |
-
}
|
324 |
-
|
325 |
-
}
|
326 |
-
|
327 |
-
protected function get_gmc_language()
|
328 |
-
{
|
329 |
-
return strtoupper( substr( get_locale(), 0, 2 ) );
|
330 |
-
}
|
331 |
-
|
332 |
-
// https://developers.google.com/gtagjs/devguide/linker
|
333 |
-
protected function get_google_linker_settings()
|
334 |
-
{
|
335 |
-
$linker_settings = apply_filters_deprecated(
|
336 |
-
'wooptpm_google_cross_domain_linker_settings',
|
337 |
-
[ null ],
|
338 |
-
'1.13.0',
|
339 |
-
'wpm_google_cross_domain_linker_settings'
|
340 |
-
);
|
341 |
-
return apply_filters( 'wpm_google_cross_domain_linker_settings', $linker_settings );
|
342 |
-
}
|
343 |
-
|
344 |
-
protected function get_ga4_parameters( $id )
|
345 |
-
{
|
346 |
-
$ga_4_parameters = [];
|
347 |
-
if ( $this->options_obj->google->user_id && is_user_logged_in() ) {
|
348 |
-
$ga_4_parameters = [
|
349 |
-
'user_id' => get_current_user_id(),
|
350 |
-
];
|
351 |
-
}
|
352 |
-
$ga_4_parameters = apply_filters_deprecated(
|
353 |
-
'wooptpm_ga_4_parameters',
|
354 |
-
[ $ga_4_parameters, $id ],
|
355 |
-
'1.13.0',
|
356 |
-
'wpm_ga_4_parameters'
|
357 |
-
);
|
358 |
-
return apply_filters( 'wpm_ga_4_parameters', $ga_4_parameters, $id );
|
359 |
-
}
|
360 |
-
|
361 |
-
protected function get_ga_ua_parameters( $id )
|
362 |
-
{
|
363 |
-
$ga_ua_parameters = [
|
364 |
-
'anonymize_ip' => true,
|
365 |
-
'link_attribution' => (bool) $this->options_obj->google->analytics->link_attribution,
|
366 |
-
];
|
367 |
-
if ( $this->options_obj->google->user_id && is_user_logged_in() ) {
|
368 |
-
$ga_ua_parameters['user_id'] = get_current_user_id();
|
369 |
-
}
|
370 |
-
$ga_ua_parameters = apply_filters_deprecated(
|
371 |
-
'woopt_pm_analytics_parameters',
|
372 |
-
[ $ga_ua_parameters, $id ],
|
373 |
-
'1.10.10',
|
374 |
-
'wooptpm_ga_ua_parameters'
|
375 |
-
);
|
376 |
-
$ga_ua_parameters = apply_filters_deprecated(
|
377 |
-
'wooptpm_ga_ua_parameters',
|
378 |
-
[ $ga_ua_parameters, $id ],
|
379 |
-
'1.13.0',
|
380 |
-
'wpm_ga_ua_parameters'
|
381 |
-
);
|
382 |
-
return apply_filters( 'wpm_ga_ua_parameters', $ga_ua_parameters, $id );
|
383 |
-
}
|
384 |
|
385 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
namespace WCPM\Classes\Pixels\Google;
|
4 |
|
5 |
+
use WCPM\Classes\Admin\Environment_Check;
|
|
|
6 |
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit; // Exit if accessed directly
|
|
|
9 |
}
|
10 |
|
11 |
+
trait Trait_Google {
|
12 |
+
protected function get_ga_id_type() {
|
13 |
+
$ga_id_type = 'post_id';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
|
15 |
+
$ga_id_type = apply_filters_deprecated('wooptpm_product_id_type_for_google_analytics', [$ga_id_type], '1.13.0', 'wpm_product_id_type_for_google_analytics');
|
16 |
+
$ga_id_type = apply_filters('wpm_product_id_type_for_google_analytics', $ga_id_type);
|
17 |
+
|
18 |
+
return $ga_id_type;
|
19 |
+
}
|
20 |
+
|
21 |
+
protected function google_active() {
|
22 |
+
if ($this->options_obj->google->analytics->universal->property_id) {
|
23 |
+
return true;
|
24 |
+
} elseif ($this->options_obj->google->analytics->ga4->measurement_id) {
|
25 |
+
return true;
|
26 |
+
} elseif ($this->options_obj->google->ads->conversion_id) {
|
27 |
+
return true;
|
28 |
+
} else {
|
29 |
+
return false;
|
30 |
+
}
|
31 |
+
}
|
32 |
+
|
33 |
+
protected function is_google_ads_active() {
|
34 |
+
if ($this->options['google']['ads']['conversion_id']) {
|
35 |
+
|
36 |
+
return true;
|
37 |
+
} else {
|
38 |
+
return false;
|
39 |
+
}
|
40 |
+
}
|
41 |
+
|
42 |
+
private function is_dynamic_remarketing_active() {
|
43 |
+
if ($this->options_obj->google->ads->dynamic_remarketing && $this->options_obj->google->ads->conversion_id) {
|
44 |
+
return true;
|
45 |
+
} else {
|
46 |
+
return false;
|
47 |
+
}
|
48 |
+
}
|
49 |
+
|
50 |
+
// protected function is_google_ads_active()
|
51 |
+
// {
|
52 |
+
// if ($this->options_obj->google->ads->conversion_id && $this->options_obj->google->ads->conversion_label) {
|
53 |
+
// return true;
|
54 |
+
// } else {
|
55 |
+
// return false;
|
56 |
+
// }
|
57 |
+
// }
|
58 |
+
|
59 |
+
protected function is_google_analytics_active() {
|
60 |
+
if ($this->is_google_analytics_ua_active() || $this->is_google_analytics_4_active()) {
|
61 |
+
return true;
|
62 |
+
} else {
|
63 |
+
return false;
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
protected function is_google_analytics_ua_active() {
|
68 |
+
if ($this->options_obj->google->analytics->universal->property_id) {
|
69 |
+
return true;
|
70 |
+
} else {
|
71 |
+
return false;
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
protected function is_google_analytics_4_active() {
|
76 |
+
if ($this->options_obj->google->analytics->ga4->measurement_id) {
|
77 |
+
return true;
|
78 |
+
} else {
|
79 |
+
return false;
|
80 |
+
}
|
81 |
+
}
|
82 |
+
|
83 |
+
protected function is_google_analytics_4_mp_active() {
|
84 |
+
if ($this->options_obj->google->analytics->ga4->measurement_id && $this->options_obj->google->analytics->ga4->api_secret) {
|
85 |
+
return true;
|
86 |
+
} else {
|
87 |
+
return false;
|
88 |
+
}
|
89 |
+
}
|
90 |
+
|
91 |
+
protected function get_order_currency( $order ) {
|
92 |
+
// use the right function to get the currency depending on the WooCommerce version
|
93 |
+
return $this->woocommerce_3_and_above() ? $order->get_currency() : $order->get_order_currency();
|
94 |
+
}
|
95 |
+
|
96 |
+
protected function woocommerce_3_and_above() {
|
97 |
+
global $woocommerce;
|
98 |
+
if (version_compare($woocommerce->version, 3.0, '>=')) {
|
99 |
+
return true;
|
100 |
+
} else {
|
101 |
+
return false;
|
102 |
+
}
|
103 |
+
}
|
104 |
+
|
105 |
+
protected function get_order_item_data( $order_item ) {
|
106 |
+
$product = $order_item->get_product();
|
107 |
+
|
108 |
+
if (!is_object($product)) {
|
109 |
+
|
110 |
+
// $this->log_problematic_product_id();
|
111 |
+
wc_get_logger()->debug('get_order_item_data received an order item which is not a valid product: ' . $order_item->get_id(), ['source' => 'wpm']);
|
112 |
+
return [];
|
113 |
+
}
|
114 |
+
|
115 |
+
$dyn_r_ids = $this->get_dyn_r_ids($product);
|
116 |
+
|
117 |
+
if ($product->get_type() === 'variation') {
|
118 |
+
$parent_product = wc_get_product($product->get_parent_id());
|
119 |
+
$name = $parent_product->get_name();
|
120 |
+
} else {
|
121 |
+
$name = $product->get_name();
|
122 |
+
}
|
123 |
+
|
124 |
+
return [
|
125 |
+
'id' => (string) $dyn_r_ids[$this->get_ga_id_type()],
|
126 |
+
'name' => (string) $name,
|
127 |
+
'quantity' => (int) $order_item['quantity'],
|
128 |
+
'affiliation' => (string) get_bloginfo('name'),
|
129 |
+
// 'coupon' => '',
|
130 |
+
// 'discount' => 0,
|
131 |
+
'brand' => (string) $this->get_brand_name($product->get_id()),
|
132 |
+
// https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#pr_ca
|
133 |
+
'category' => implode(',', $this->get_product_category($product->get_id())),
|
134 |
+
'category_array' => $this->get_product_category($product->get_id()),
|
135 |
+
'variant' => (string) ( $product->get_type() === 'variation' ) ? $this->get_formatted_variant_text($product) : '',
|
136 |
+
// 'tax' => 0,
|
137 |
+
'price' => (float) $this->wpm_get_order_item_price($order_item, $product),
|
138 |
+
// 'list_name' => ,
|
139 |
+
// 'currency' => '',
|
140 |
+
];
|
141 |
+
}
|
142 |
+
|
143 |
+
protected function wpm_get_order_item_price( $order_item, $product ) {
|
144 |
+
if (( new Environment_Check() )->is_woo_discount_rules_active()) {
|
145 |
+
$item_value = $order_item->get_meta('_advanced_woo_discount_item_total_discount');
|
146 |
+
if (is_array($item_value) && array_key_exists('discounted_price', $item_value) && 0 != $item_value['discounted_price']) {
|
147 |
+
return (float) $item_value['discounted_price'];
|
148 |
+
} elseif (is_array($item_value) && array_key_exists('initial_price', $item_value) && 0 != $item_value['initial_price']) {
|
149 |
+
return (float) $item_value['initial_price'];
|
150 |
+
} else {
|
151 |
+
return (float) $product->get_price();
|
152 |
+
}
|
153 |
+
} else {
|
154 |
+
return (float) $product->get_price();
|
155 |
+
}
|
156 |
+
}
|
157 |
+
|
158 |
+
protected function add_categories_to_ga4_product_items( $item_details_array, $categories ) {
|
159 |
+
$categories = array_unique($categories);
|
160 |
+
|
161 |
+
if (count($categories) > 0) {
|
162 |
+
|
163 |
+
$max_categories = 5;
|
164 |
+
|
165 |
+
$item_details_array['item_category'] = $categories[0];
|
166 |
+
|
167 |
+
$max = count($categories) > $max_categories ? $max_categories : count($categories);
|
168 |
+
|
169 |
+
for ($i = 1; $i < $max; $i++) {
|
170 |
+
$item_details_array['item_category' . ( $i + 1 )] = $categories[$i];
|
171 |
+
}
|
172 |
+
}
|
173 |
+
|
174 |
+
return $item_details_array;
|
175 |
+
}
|
176 |
+
}
|
classes/pixels/trait-product.php
CHANGED
@@ -3,14 +3,12 @@
|
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
5 |
use WCPM\Classes\Admin\Environment_Check;
|
6 |
-
use WCPM\Classes\Pixels\Google\Google;
|
7 |
|
8 |
if (!defined('ABSPATH')) {
|
9 |
exit; // Exit if accessed directly
|
10 |
}
|
11 |
|
12 |
trait Trait_Product {
|
13 |
-
|
14 |
protected function get_formatted_variant_text( $product ) {
|
15 |
$variant_text_array = [];
|
16 |
|
@@ -27,8 +25,7 @@ trait Trait_Product {
|
|
27 |
}
|
28 |
|
29 |
protected function get_variation_or_product_id( $item, $variations_output = true ) {
|
30 |
-
|
31 |
-
if (0 <> $item['variation_id'] && true === $variations_output) {
|
32 |
return $item['variation_id'];
|
33 |
} else {
|
34 |
return $item['product_id'];
|
@@ -38,13 +35,19 @@ trait Trait_Product {
|
|
38 |
// https://stackoverflow.com/a/56278308/4688612
|
39 |
// https://stackoverflow.com/a/39034036/4688612
|
40 |
public function get_brand_name( $product_id ) {
|
|
|
|
|
|
|
|
|
41 |
|
42 |
$brand_taxonomy = 'pa_brand';
|
43 |
|
44 |
-
if (( new Environment_Check(
|
45 |
$brand_taxonomy = 'yith_product_brand';
|
46 |
-
}
|
47 |
-
|
|
|
|
|
48 |
}
|
49 |
|
50 |
$brand_taxonomy = apply_filters_deprecated('wooptpm_custom_brand_taxonomy', [$brand_taxonomy], '1.13.0', 'wpm_custom_brand_taxonomy');
|
@@ -52,6 +55,10 @@ trait Trait_Product {
|
|
52 |
// Use custom brand_taxonomy
|
53 |
$brand_taxonomy = apply_filters('wpm_custom_brand_taxonomy', $brand_taxonomy);
|
54 |
|
|
|
|
|
|
|
|
|
55 |
if ($this->get_brand_by_taxonomy($product_id, $brand_taxonomy)) {
|
56 |
return $this->get_brand_by_taxonomy($product_id, $brand_taxonomy);
|
57 |
} elseif ($this->get_brand_by_taxonomy($product_id, 'pa_' . $brand_taxonomy)) {
|
@@ -62,7 +69,6 @@ trait Trait_Product {
|
|
62 |
}
|
63 |
|
64 |
public function get_brand_by_taxonomy( $product_id, $taxonomy ) {
|
65 |
-
|
66 |
if (taxonomy_exists($taxonomy)) {
|
67 |
$brand_names = wp_get_post_terms($product_id, $taxonomy, ['fields' => 'names']);
|
68 |
return reset($brand_names);
|
@@ -73,19 +79,13 @@ trait Trait_Product {
|
|
73 |
|
74 |
// get an array with all product categories
|
75 |
public function get_product_category( $product_id ) {
|
76 |
-
|
77 |
-
if ($this->is_variable_product_by_id($product_id)) {
|
78 |
-
$product = wc_get_product($product_id);
|
79 |
-
$product_id = $product->get_parent_id();
|
80 |
-
}
|
81 |
-
|
82 |
$prod_cats = get_the_terms($product_id, 'product_cat');
|
83 |
$prod_cats_output = [];
|
84 |
|
85 |
// only continue with the loop if one or more product categories have been set for the product
|
86 |
if (!empty($prod_cats)) {
|
87 |
foreach ((array) $prod_cats as $key) {
|
88 |
-
$prod_cats_output
|
89 |
}
|
90 |
|
91 |
// apply filter to the $prod_cats_output array
|
@@ -95,15 +95,7 @@ trait Trait_Product {
|
|
95 |
return $prod_cats_output;
|
96 |
}
|
97 |
|
98 |
-
protected function is_variable_product_by_id( $product_id ) {
|
99 |
-
|
100 |
-
$product = wc_get_product($product_id);
|
101 |
-
|
102 |
-
return $product->get_type() === 'variable';
|
103 |
-
}
|
104 |
-
|
105 |
protected function get_compiled_product_id( $product_id, $product_sku, $options, $channel = '' ) {
|
106 |
-
|
107 |
// depending on setting use product IDs or SKUs
|
108 |
if (0 == $this->options['google']['ads']['product_identifier'] || 'ga_ua' === $channel || 'ga_4' === $channel) {
|
109 |
return (string) $product_id;
|
@@ -121,7 +113,6 @@ trait Trait_Product {
|
|
121 |
}
|
122 |
|
123 |
protected function get_dyn_r_ids( $product ) {
|
124 |
-
|
125 |
$dyn_r_ids = [
|
126 |
'post_id' => (string) $product->get_id(),
|
127 |
'sku' => (string) $product->get_sku() ? $product->get_sku() : $product->get_id(),
|
@@ -135,7 +126,6 @@ trait Trait_Product {
|
|
135 |
}
|
136 |
|
137 |
protected function log_problematic_product_id( $product_id = 0 ) {
|
138 |
-
|
139 |
wc_get_logger()->debug(
|
140 |
'WooCommerce detects the page ID ' . $product_id . ' as product, but when invoked by wc_get_product( ' . $product_id . ' ) it returns no product object',
|
141 |
['source' => 'wpm']
|
@@ -143,7 +133,6 @@ trait Trait_Product {
|
|
143 |
}
|
144 |
|
145 |
protected function get_order_item_ids( $order ) {
|
146 |
-
|
147 |
$order_items = $this->wpm_get_order_items($order);
|
148 |
$order_items_array = [];
|
149 |
|
@@ -158,6 +147,7 @@ trait Trait_Product {
|
|
158 |
|
159 |
$dyn_r_ids = $this->get_dyn_r_ids($product);
|
160 |
$product_id_compiled = $dyn_r_ids[$this->get_dyn_r_id_type()];
|
|
|
161 |
array_push($order_items_array, $product_id_compiled);
|
162 |
} else {
|
163 |
|
@@ -169,7 +159,6 @@ trait Trait_Product {
|
|
169 |
}
|
170 |
|
171 |
protected function get_order_items_formatted_for_purchase_event( $order ) {
|
172 |
-
|
173 |
$order_items = $this->wpm_get_order_items($order);
|
174 |
$order_items_formatted = [];
|
175 |
|
@@ -185,6 +174,7 @@ trait Trait_Product {
|
|
185 |
|
186 |
$dyn_r_ids = $this->get_dyn_r_ids($product);
|
187 |
$product_id_compiled = $dyn_r_ids[$this->get_dyn_r_id_type()];
|
|
|
188 |
|
189 |
$product_details['id'] = $product_id_compiled;
|
190 |
$product_details['name'] = $product->get_name();
|
@@ -193,6 +183,8 @@ trait Trait_Product {
|
|
193 |
$product_details['brand'] = $this->get_brand_name($product_id);
|
194 |
$product_details['category'] = implode(',', $this->get_product_category($product_id));
|
195 |
|
|
|
|
|
196 |
if ($product->is_type('variation')) {
|
197 |
$product_details['variant'] = $this->get_formatted_variant_text($product);
|
198 |
|
@@ -205,6 +197,7 @@ trait Trait_Product {
|
|
205 |
}
|
206 |
|
207 |
$order_items_formatted[] = $product_details;
|
|
|
208 |
} else {
|
209 |
|
210 |
$this->log_problematic_product_id($product_id);
|
@@ -214,11 +207,9 @@ trait Trait_Product {
|
|
214 |
return $order_items_formatted;
|
215 |
}
|
216 |
|
217 |
-
protected function get_dyn_r_id_type( $pixel_name = null ) {
|
218 |
|
219 |
-
|
220 |
-
|
221 |
-
}
|
222 |
|
223 |
if (0 == $this->options_obj->google->ads->product_identifier) {
|
224 |
$this->dyn_r_id_type = 'post_id';
|
@@ -230,7 +221,7 @@ trait Trait_Product {
|
|
230 |
$this->dyn_r_id_type = 'gla';
|
231 |
}
|
232 |
|
233 |
-
//
|
234 |
$this->dyn_r_id_type = apply_filters_deprecated('wooptpm_product_id_type_for_' . $this->pixel_name, [$this->dyn_r_id_type], '1.13.0', 'wpm_product_id_type_for_');
|
235 |
$this->dyn_r_id_type = apply_filters('wpm_product_id_type_for_' . $this->pixel_name, $this->dyn_r_id_type);
|
236 |
|
@@ -238,47 +229,10 @@ trait Trait_Product {
|
|
238 |
}
|
239 |
|
240 |
protected function wpm_get_order_items( $order ) {
|
241 |
-
|
242 |
$order_items = apply_filters_deprecated('wooptpm_order_items', [$order->get_items(), $order], '1.13.0', 'wpm_order_items');
|
243 |
-
|
244 |
-
// Give option to filter order items
|
245 |
-
// then return
|
246 |
return apply_filters('wpm_order_items', $order_items, $order);
|
247 |
}
|
248 |
|
249 |
-
protected function get_front_end_order_items( $order ) {
|
250 |
-
|
251 |
-
$order_items = $this->wpm_get_order_items($order);
|
252 |
-
$order_items_formatted = [];
|
253 |
-
|
254 |
-
foreach ((array) $order_items as $order_item) {
|
255 |
-
|
256 |
-
$order_item_data = $order_item->get_data();
|
257 |
-
|
258 |
-
$product = $order_item->get_product();
|
259 |
-
|
260 |
-
if (!is_object($product)) {
|
261 |
-
|
262 |
-
wc_get_logger()->debug('get_order_item_data received an order item which is not a valid product: ' . $order_item->get_id(), ['source' => 'wpm']);
|
263 |
-
return [];
|
264 |
-
}
|
265 |
-
|
266 |
-
$order_items_formatted[$order_item_data['product_id']] = [
|
267 |
-
'id' => $order_item_data['product_id'],
|
268 |
-
'variation_id' => $order_item_data['variation_id'],
|
269 |
-
'name' => $order_item_data['name'],
|
270 |
-
'quantity' => $order_item_data['quantity'],
|
271 |
-
'price' => ( new Google($this->options) )->wpm_get_order_item_price($order_item, $product),
|
272 |
-
'subtotal' => (float) number_format($order_item_data['subtotal'], 2, '.', ''),
|
273 |
-
'subtotal_tax' => (float) number_format($order_item_data['subtotal_tax'], 2, '.', ''),
|
274 |
-
'total' => (float) number_format($order_item_data['total'], 2, '.', ''),
|
275 |
-
'total_tax' => (float) number_format($order_item_data['total_tax'], 2, '.', ''),
|
276 |
-
];
|
277 |
-
}
|
278 |
-
|
279 |
-
return $order_items_formatted;
|
280 |
-
}
|
281 |
-
|
282 |
public function buffer_get_product_data_layer_script( $product, $set_position = true, $meta_tag = false ) {
|
283 |
|
284 |
ob_start();
|
@@ -289,23 +243,50 @@ trait Trait_Product {
|
|
289 |
}
|
290 |
|
291 |
public function get_product_data_layer_script( $product, $set_position = true, $meta_tag = false ) {
|
292 |
-
|
293 |
if (!is_object($product)) {
|
|
|
|
|
294 |
wc_get_logger()->debug('get_product_data_layer_script received an invalid product', ['source' => 'wpm']);
|
|
|
295 |
return '';
|
296 |
}
|
297 |
|
298 |
$data = $this->get_product_details_for_datalayer($product);
|
299 |
|
300 |
-
//
|
301 |
-
|
|
|
302 |
$tag = $meta_tag ? "meta name='wpm-dataLayer-meta' content='" . $product->get_id() . "'" : "input type='hidden'";
|
303 |
|
|
|
|
|
|
|
|
|
|
|
|
|
304 |
$this->get_product_data_layer_script_html_part_1($tag, $product, $data, $set_position, $meta_tag);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
305 |
}
|
306 |
|
307 |
protected function get_product_data_layer_script_html_part_1( $tag, $product, $data, $set_position, $meta_tag ) {
|
308 |
-
|
309 |
if ($meta_tag) {
|
310 |
?>
|
311 |
<meta name="pm-dataLayer-meta" content="<?php esc_html_e($product->get_id()); ?>" class="wpmProductId"
|
@@ -318,27 +299,29 @@ trait Trait_Product {
|
|
318 |
}
|
319 |
|
320 |
?>
|
321 |
-
<script>
|
322 |
-
|
323 |
window.wpmDataLayer.products[<?php esc_html_e($product->get_id()); ?>] = <?php echo wp_json_encode($data); ?>;
|
324 |
-
<?php $set_position ? $this->get_product_data_layer_script_html_part_2($product)
|
325 |
</script>
|
326 |
<?php
|
|
|
327 |
}
|
328 |
|
329 |
protected function get_product_data_layer_script_html_part_2( $product ) {
|
330 |
?>
|
331 |
window.wpmDataLayer.products[<?php esc_html_e($product->get_id()); ?>]['position'] = window.wpmDataLayer.position++
|
332 |
<?php
|
|
|
333 |
}
|
334 |
|
335 |
-
public function get_product_details_for_datalayer( $product ) {
|
336 |
|
|
|
337 |
global $woocommerce_wpml;
|
338 |
|
339 |
$dyn_r_ids = $this->get_dyn_r_ids($product);
|
340 |
|
341 |
-
if (( new Environment_Check(
|
342 |
$price = $woocommerce_wpml->multi_currency->prices->get_product_price_in_currency($product->get_id(), get_woocommerce_currency());
|
343 |
} else {
|
344 |
$price = $product->get_price();
|
@@ -353,11 +336,11 @@ trait Trait_Product {
|
|
353 |
'category' => $this->get_product_category($product->get_id()),
|
354 |
'quantity' => 1,
|
355 |
'dyn_r_ids' => $dyn_r_ids,
|
356 |
-
'isVariable' => $product->get_type()
|
357 |
'isVariation' => false,
|
358 |
];
|
359 |
|
360 |
-
if ($product->get_type()
|
361 |
|
362 |
$parent_product = wc_get_product($product->get_parent_id());
|
363 |
if ($parent_product) {
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
5 |
use WCPM\Classes\Admin\Environment_Check;
|
|
|
6 |
|
7 |
if (!defined('ABSPATH')) {
|
8 |
exit; // Exit if accessed directly
|
9 |
}
|
10 |
|
11 |
trait Trait_Product {
|
|
|
12 |
protected function get_formatted_variant_text( $product ) {
|
13 |
$variant_text_array = [];
|
14 |
|
25 |
}
|
26 |
|
27 |
protected function get_variation_or_product_id( $item, $variations_output = true ) {
|
28 |
+
if (0 <> $item['variation_id'] && true == $variations_output) {
|
|
|
29 |
return $item['variation_id'];
|
30 |
} else {
|
31 |
return $item['product_id'];
|
35 |
// https://stackoverflow.com/a/56278308/4688612
|
36 |
// https://stackoverflow.com/a/39034036/4688612
|
37 |
public function get_brand_name( $product_id ) {
|
38 |
+
// return $this->get_brand_by_taxonomy($product_id, 'product_brand') ?: // for Woocommerce Brands plugin
|
39 |
+
// $this->get_brand_by_taxonomy($product_id, 'yith_product_brand') ?: // for YITH WooCommerce Brands plugin
|
40 |
+
// $this->get_brand_by_taxonomy($product_id, 'pa_brand') ?: // for a custom product attribute
|
41 |
+
// '';
|
42 |
|
43 |
$brand_taxonomy = 'pa_brand';
|
44 |
|
45 |
+
if (( new Environment_Check() )->is_yith_wc_brands_active()) {
|
46 |
$brand_taxonomy = 'yith_product_brand';
|
47 |
+
} else {
|
48 |
+
if (( new Environment_Check() )->is_woocommerce_brands_active()) {
|
49 |
+
$brand_taxonomy = 'product_brand';
|
50 |
+
}
|
51 |
}
|
52 |
|
53 |
$brand_taxonomy = apply_filters_deprecated('wooptpm_custom_brand_taxonomy', [$brand_taxonomy], '1.13.0', 'wpm_custom_brand_taxonomy');
|
55 |
// Use custom brand_taxonomy
|
56 |
$brand_taxonomy = apply_filters('wpm_custom_brand_taxonomy', $brand_taxonomy);
|
57 |
|
58 |
+
// return $this->get_brand_by_taxonomy($product_id, $brand_taxonomy) ?:
|
59 |
+
// $this->get_brand_by_taxonomy($product_id, 'pa_' . $brand_taxonomy) ?:
|
60 |
+
// '';
|
61 |
+
|
62 |
if ($this->get_brand_by_taxonomy($product_id, $brand_taxonomy)) {
|
63 |
return $this->get_brand_by_taxonomy($product_id, $brand_taxonomy);
|
64 |
} elseif ($this->get_brand_by_taxonomy($product_id, 'pa_' . $brand_taxonomy)) {
|
69 |
}
|
70 |
|
71 |
public function get_brand_by_taxonomy( $product_id, $taxonomy ) {
|
|
|
72 |
if (taxonomy_exists($taxonomy)) {
|
73 |
$brand_names = wp_get_post_terms($product_id, $taxonomy, ['fields' => 'names']);
|
74 |
return reset($brand_names);
|
79 |
|
80 |
// get an array with all product categories
|
81 |
public function get_product_category( $product_id ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
$prod_cats = get_the_terms($product_id, 'product_cat');
|
83 |
$prod_cats_output = [];
|
84 |
|
85 |
// only continue with the loop if one or more product categories have been set for the product
|
86 |
if (!empty($prod_cats)) {
|
87 |
foreach ((array) $prod_cats as $key) {
|
88 |
+
array_push($prod_cats_output, $key->name);
|
89 |
}
|
90 |
|
91 |
// apply filter to the $prod_cats_output array
|
95 |
return $prod_cats_output;
|
96 |
}
|
97 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
protected function get_compiled_product_id( $product_id, $product_sku, $options, $channel = '' ) {
|
|
|
99 |
// depending on setting use product IDs or SKUs
|
100 |
if (0 == $this->options['google']['ads']['product_identifier'] || 'ga_ua' === $channel || 'ga_4' === $channel) {
|
101 |
return (string) $product_id;
|
113 |
}
|
114 |
|
115 |
protected function get_dyn_r_ids( $product ) {
|
|
|
116 |
$dyn_r_ids = [
|
117 |
'post_id' => (string) $product->get_id(),
|
118 |
'sku' => (string) $product->get_sku() ? $product->get_sku() : $product->get_id(),
|
126 |
}
|
127 |
|
128 |
protected function log_problematic_product_id( $product_id = 0 ) {
|
|
|
129 |
wc_get_logger()->debug(
|
130 |
'WooCommerce detects the page ID ' . $product_id . ' as product, but when invoked by wc_get_product( ' . $product_id . ' ) it returns no product object',
|
131 |
['source' => 'wpm']
|
133 |
}
|
134 |
|
135 |
protected function get_order_item_ids( $order ) {
|
|
|
136 |
$order_items = $this->wpm_get_order_items($order);
|
137 |
$order_items_array = [];
|
138 |
|
147 |
|
148 |
$dyn_r_ids = $this->get_dyn_r_ids($product);
|
149 |
$product_id_compiled = $dyn_r_ids[$this->get_dyn_r_id_type()];
|
150 |
+
// $product_id_compiled = $this->get_compiled_product_id($product_id, $product->get_sku(), $this->options, '');
|
151 |
array_push($order_items_array, $product_id_compiled);
|
152 |
} else {
|
153 |
|
159 |
}
|
160 |
|
161 |
protected function get_order_items_formatted_for_purchase_event( $order ) {
|
|
|
162 |
$order_items = $this->wpm_get_order_items($order);
|
163 |
$order_items_formatted = [];
|
164 |
|
174 |
|
175 |
$dyn_r_ids = $this->get_dyn_r_ids($product);
|
176 |
$product_id_compiled = $dyn_r_ids[$this->get_dyn_r_id_type()];
|
177 |
+
// $product_id_compiled = $this->get_compiled_product_id($product_id, $product->get_sku(), $this->options, '');
|
178 |
|
179 |
$product_details['id'] = $product_id_compiled;
|
180 |
$product_details['name'] = $product->get_name();
|
183 |
$product_details['brand'] = $this->get_brand_name($product_id);
|
184 |
$product_details['category'] = implode(',', $this->get_product_category($product_id));
|
185 |
|
186 |
+
// error_log('type: ' . $product->get_type());
|
187 |
+
|
188 |
if ($product->is_type('variation')) {
|
189 |
$product_details['variant'] = $this->get_formatted_variant_text($product);
|
190 |
|
197 |
}
|
198 |
|
199 |
$order_items_formatted[] = $product_details;
|
200 |
+
// array_push($order_items_formatted, $product_details);
|
201 |
} else {
|
202 |
|
203 |
$this->log_problematic_product_id($product_id);
|
207 |
return $order_items_formatted;
|
208 |
}
|
209 |
|
|
|
210 |
|
211 |
+
protected function get_dyn_r_id_type() {
|
212 |
+
// $dyn_r_id_type = '';
|
|
|
213 |
|
214 |
if (0 == $this->options_obj->google->ads->product_identifier) {
|
215 |
$this->dyn_r_id_type = 'post_id';
|
221 |
$this->dyn_r_id_type = 'gla';
|
222 |
}
|
223 |
|
224 |
+
// if you want to change the dyn_r_id type for Google programmatically
|
225 |
$this->dyn_r_id_type = apply_filters_deprecated('wooptpm_product_id_type_for_' . $this->pixel_name, [$this->dyn_r_id_type], '1.13.0', 'wpm_product_id_type_for_');
|
226 |
$this->dyn_r_id_type = apply_filters('wpm_product_id_type_for_' . $this->pixel_name, $this->dyn_r_id_type);
|
227 |
|
229 |
}
|
230 |
|
231 |
protected function wpm_get_order_items( $order ) {
|
|
|
232 |
$order_items = apply_filters_deprecated('wooptpm_order_items', [$order->get_items(), $order], '1.13.0', 'wpm_order_items');
|
|
|
|
|
|
|
233 |
return apply_filters('wpm_order_items', $order_items, $order);
|
234 |
}
|
235 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
236 |
public function buffer_get_product_data_layer_script( $product, $set_position = true, $meta_tag = false ) {
|
237 |
|
238 |
ob_start();
|
243 |
}
|
244 |
|
245 |
public function get_product_data_layer_script( $product, $set_position = true, $meta_tag = false ) {
|
|
|
246 |
if (!is_object($product)) {
|
247 |
+
|
248 |
+
// $this->log_problematic_product_id();
|
249 |
wc_get_logger()->debug('get_product_data_layer_script received an invalid product', ['source' => 'wpm']);
|
250 |
+
|
251 |
return '';
|
252 |
}
|
253 |
|
254 |
$data = $this->get_product_details_for_datalayer($product);
|
255 |
|
256 |
+
// if placed in <head> it must be a <meta> tag else, it can be an <input> tag
|
257 |
+
// $tag = $meta_tag ? "meta" : "input";
|
258 |
+
// added name and content to meta in order to pass W3 validation test at https://validator.w3.org/nu/
|
259 |
$tag = $meta_tag ? "meta name='wpm-dataLayer-meta' content='" . $product->get_id() . "'" : "input type='hidden'";
|
260 |
|
261 |
+
// $html = "
|
262 |
+
// <$tag class='wpmProductId' data-id='" . $product->get_id() . "'>
|
263 |
+
// <script type=\"text/javascript\" data-cfasync=\"false\">
|
264 |
+
// window.wpmDataLayer.products = window.wpmDataLayer.products || {};
|
265 |
+
// window.wpmDataLayer.products[" . $product->get_id() . "] = " . wp_json_encode($data) . ";";
|
266 |
+
|
267 |
$this->get_product_data_layer_script_html_part_1($tag, $product, $data, $set_position, $meta_tag);
|
268 |
+
|
269 |
+
// $html = '
|
270 |
+
// <' . $tag . ' class="wpmProductId" data-id="' . $product->get_id() . '">
|
271 |
+
// <script type="text/javascript" data-cfasync="false">
|
272 |
+
// window.wpmDataLayer.products = window.wpmDataLayer.products || {};
|
273 |
+
// window.wpmDataLayer.products[' . $product->get_id() . '] = ' . wp_json_encode($data) . ';';
|
274 |
+
|
275 |
+
// if (true === $set_position) {
|
276 |
+
//
|
277 |
+
//// $html .= "
|
278 |
+
//// window.wpmDataLayer.products[{$product->get_id()}]['position'] = window.wpmDataLayer.position++;";
|
279 |
+
////
|
280 |
+
// $this->get_product_data_layer_script_html_part_2($product);
|
281 |
+
// }
|
282 |
+
|
283 |
+
// $html .= '</script>';
|
284 |
+
// echo '</script>';
|
285 |
+
|
286 |
+
// return $html;
|
287 |
}
|
288 |
|
289 |
protected function get_product_data_layer_script_html_part_1( $tag, $product, $data, $set_position, $meta_tag ) {
|
|
|
290 |
if ($meta_tag) {
|
291 |
?>
|
292 |
<meta name="pm-dataLayer-meta" content="<?php esc_html_e($product->get_id()); ?>" class="wpmProductId"
|
299 |
}
|
300 |
|
301 |
?>
|
302 |
+
<script type="text/javascript" data-cfasync="false">
|
303 |
+
window.wpmDataLayer.products = window.wpmDataLayer.products || {};
|
304 |
window.wpmDataLayer.products[<?php esc_html_e($product->get_id()); ?>] = <?php echo wp_json_encode($data); ?>;
|
305 |
+
<?php true === $set_position ? '' : $this->get_product_data_layer_script_html_part_2($product); ?>
|
306 |
</script>
|
307 |
<?php
|
308 |
+
|
309 |
}
|
310 |
|
311 |
protected function get_product_data_layer_script_html_part_2( $product ) {
|
312 |
?>
|
313 |
window.wpmDataLayer.products[<?php esc_html_e($product->get_id()); ?>]['position'] = window.wpmDataLayer.position++
|
314 |
<?php
|
315 |
+
|
316 |
}
|
317 |
|
|
|
318 |
|
319 |
+
public function get_product_details_for_datalayer( $product ) {
|
320 |
global $woocommerce_wpml;
|
321 |
|
322 |
$dyn_r_ids = $this->get_dyn_r_ids($product);
|
323 |
|
324 |
+
if (( new Environment_Check() )->is_wpml_woocommerce_multi_currency_active()) {
|
325 |
$price = $woocommerce_wpml->multi_currency->prices->get_product_price_in_currency($product->get_id(), get_woocommerce_currency());
|
326 |
} else {
|
327 |
$price = $product->get_price();
|
336 |
'category' => $this->get_product_category($product->get_id()),
|
337 |
'quantity' => 1,
|
338 |
'dyn_r_ids' => $dyn_r_ids,
|
339 |
+
'isVariable' => $product->get_type() == 'variable',
|
340 |
'isVariation' => false,
|
341 |
];
|
342 |
|
343 |
+
if ($product->get_type() == 'variation') {
|
344 |
|
345 |
$parent_product = wc_get_product($product->get_parent_id());
|
346 |
if ($parent_product) {
|
classes/pixels/trait-shop.php
CHANGED
@@ -2,288 +2,237 @@
|
|
2 |
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
5 |
-
use libphonenumber\NumberParseException;
|
6 |
-
use libphonenumber\PhoneNumberFormat;
|
7 |
-
use libphonenumber\PhoneNumberUtil;
|
8 |
-
use WC_Geolocation;
|
9 |
|
10 |
-
if (!defined('ABSPATH')) {
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
trait Trait_Shop {
|
15 |
-
|
16 |
-
protected function get_list_name_suffix() {
|
17 |
-
$list_suffix = '';
|
18 |
-
|
19 |
-
if (is_product_category()) {
|
20 |
-
|
21 |
-
$category = get_queried_object();
|
22 |
-
$list_suffix = ' | ' . $category->name;
|
23 |
-
$list_suffix = $this->add_parent_category_name($category, $list_suffix);
|
24 |
-
} else {
|
25 |
-
if (is_product_tag()) {
|
26 |
-
$tag = get_queried_object();
|
27 |
-
$list_suffix = ' | ' . $tag->name;
|
28 |
-
}
|
29 |
-
}
|
30 |
-
|
31 |
-
return $list_suffix;
|
32 |
-
}
|
33 |
-
|
34 |
-
protected function add_parent_category_name( $category, $list_suffix ) {
|
35 |
-
if ($category->parent > 0) {
|
36 |
-
|
37 |
-
$parent_category = get_term_by('id', $category->parent, 'product_cat');
|
38 |
-
$list_suffix = ' | ' . $parent_category->name . $list_suffix;
|
39 |
-
$list_suffix = $this->add_parent_category_name($parent_category, $list_suffix);
|
40 |
-
}
|
41 |
-
|
42 |
-
return $list_suffix;
|
43 |
-
}
|
44 |
-
|
45 |
-
protected function get_list_id_suffix() {
|
46 |
-
$list_suffix = '';
|
47 |
-
|
48 |
-
if (is_product_category()) {
|
49 |
-
$category = get_queried_object();
|
50 |
-
$list_suffix = '.' . $category->slug;
|
51 |
-
$list_suffix = $this->add_parent_category_id($category, $list_suffix);
|
52 |
-
} else {
|
53 |
-
if (is_product_tag()) {
|
54 |
-
$tag = get_queried_object();
|
55 |
-
$list_suffix = '.' . $tag->slug;
|
56 |
-
}
|
57 |
-
}
|
58 |
-
|
59 |
-
return $list_suffix;
|
60 |
-
}
|
61 |
-
|
62 |
-
protected function add_parent_category_id( $category, $list_suffix ) {
|
63 |
-
if ($category->parent > 0) {
|
64 |
-
|
65 |
-
$parent_category = get_term_by('id', $category->parent, 'product_cat');
|
66 |
-
$list_suffix = '.' . $parent_category->slug . $list_suffix;
|
67 |
-
$list_suffix = $this->add_parent_category_id($parent_category, $list_suffix);
|
68 |
-
}
|
69 |
-
|
70 |
-
return $list_suffix;
|
71 |
-
}
|
72 |
-
|
73 |
-
// https://stackoverflow.com/a/49616130/4688612
|
74 |
-
protected function get_order_from_order_received_page() {
|
75 |
-
if ($this->get_order_from_query_vars()) {
|
76 |
-
return $this->get_order_from_query_vars();
|
77 |
-
} else {
|
78 |
-
if ($this->get_order_with_url_order_key()) {
|
79 |
-
return $this->get_order_with_url_order_key();
|
80 |
-
} else {
|
81 |
-
return false;
|
82 |
-
}
|
83 |
-
}
|
84 |
-
}
|
85 |
-
|
86 |
-
protected function wpm_get_order_total( $order ) {
|
87 |
-
|
88 |
-
$order_total = 0 == $this->options_obj->shop->order_total_logic ? $order->get_subtotal() - $order->get_total_discount() : $order->get_total();
|
89 |
-
|
90 |
-
// filter to adjust the order value
|
91 |
-
$order_total = apply_filters_deprecated('wgact_conversion_value_filter', [$order_total, $order], '1.10.2', 'wooptpm_conversion_value_filter');
|
92 |
-
$order_total = apply_filters_deprecated('wooptpm_conversion_value_filter', [$order_total, $order], '1.13.0', 'wpm_conversion_value_filter');
|
93 |
-
$order_total = apply_filters('wpm_conversion_value_filter', $order_total, $order);
|
94 |
-
|
95 |
-
return number_format((float) $order_total, 2, '.', '');
|
96 |
-
|
97 |
-
}
|
98 |
-
|
99 |
-
protected function get_order_from_query_vars() {
|
100 |
-
global $wp;
|
101 |
-
|
102 |
-
$order_id = absint($wp->query_vars['order-received']);
|
103 |
-
|
104 |
-
if ($order_id && 0 != $order_id && wc_get_order($order_id)) {
|
105 |
-
|
106 |
-
return wc_get_order($order_id);
|
107 |
-
} else {
|
108 |
-
|
109 |
-
wc_get_logger()->debug(
|
110 |
-
'WooCommerce couldn\'t retrieve the order ID from $wp->query_vars[\'order-received\']',
|
111 |
-
['source' => 'wpm']
|
112 |
-
);
|
113 |
-
|
114 |
-
wc_get_logger()->debug(
|
115 |
-
print_r($wp->query_vars, true),
|
116 |
-
['source' => 'wpm']
|
117 |
-
);
|
118 |
-
|
119 |
-
return false;
|
120 |
-
}
|
121 |
-
}
|
122 |
-
|
123 |
-
protected function get_order_with_url_order_key() {
|
124 |
-
|
125 |
-
$_get = filter_input_array(INPUT_GET, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
126 |
-
|
127 |
-
if (isset($_get['key'])) {
|
128 |
-
$order_key = $_get['key'];
|
129 |
-
return wc_get_order(wc_get_order_id_by_order_key($order_key));
|
130 |
-
} else {
|
131 |
-
|
132 |
-
wc_get_logger()->debug(
|
133 |
-
'WooCommerce couldn\'t retrieve the order ID from order key in the URL',
|
134 |
-
['source' => 'wpm']
|
135 |
-
);
|
136 |
-
|
137 |
-
$order_key = $_get['key'] ? $_get['key'] : '';
|
138 |
-
wc_get_logger()->debug(
|
139 |
-
'URL order key: ' . $order_key,
|
140 |
-
['source' => 'wpm']
|
141 |
-
);
|
142 |
-
|
143 |
-
return false;
|
144 |
-
}
|
145 |
-
}
|
146 |
-
|
147 |
-
protected function get_order_currency( $order ) {
|
148 |
-
// use the right function to get the currency depending on the WooCommerce version
|
149 |
-
return $this->woocommerce_3_and_above() ? $order->get_currency() : $order->get_order_currency();
|
150 |
-
}
|
151 |
-
|
152 |
-
protected function woocommerce_3_and_above() {
|
153 |
-
global $woocommerce;
|
154 |
-
if (version_compare($woocommerce->version, 3.0, '>=')) {
|
155 |
-
return true;
|
156 |
-
} else {
|
157 |
-
return false;
|
158 |
-
}
|
159 |
-
}
|
160 |
-
|
161 |
-
// https://stackoverflow.com/a/46216073/4688612
|
162 |
-
// https://github.com/woocommerce/woocommerce/wiki/wc_get_orders-and-WC_Order_Query#description
|
163 |
-
protected function is_existing_customer( $order, $value = 0 ) {
|
164 |
-
|
165 |
-
if (is_numeric($value)) { // Based on user ID (registered users)
|
166 |
-
$meta_key = '_customer_user';
|
167 |
-
$meta_value = 0 == $value ? get_current_user_id() : (int) $value;
|
168 |
-
} else { // Based on billing email (Guest users)
|
169 |
-
$meta_key = '_billing_email';
|
170 |
-
$meta_value = sanitize_email($value);
|
171 |
-
}
|
172 |
-
|
173 |
-
$orders = wc_get_orders([
|
174 |
-
'return' => 'ids',
|
175 |
-
'meta_key' => $meta_key,
|
176 |
-
'meta_value' => $meta_value,
|
177 |
-
// 'orderby' => 'date',
|
178 |
-
// 'order' => 'DESC',
|
179 |
-
'post_status' => wc_get_is_paid_statuses(),
|
180 |
-
'limit' => 1,
|
181 |
-
]);
|
182 |
-
|
183 |
-
// Return a boolean value based on orders count
|
184 |
-
return count($orders) > 0;
|
185 |
-
}
|
186 |
-
|
187 |
-
protected function get_user_ip() {
|
188 |
-
|
189 |
-
if ($this->is_localhost()) {
|
190 |
-
$ip = WC_Geolocation::get_external_ip_address();
|
191 |
-
} else {
|
192 |
-
$ip = WC_Geolocation::get_ip_address();
|
193 |
-
}
|
194 |
-
|
195 |
-
// only set the IP if it is a public address
|
196 |
-
$ip = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
|
197 |
-
|
198 |
-
// Remove the IPv6 to IPv4 mapping in case the IP contains one
|
199 |
-
// and return the IP plain public IPv4 or IPv6 IP
|
200 |
-
// https://en.wikipedia.org/wiki/IPv6_address
|
201 |
-
return str_replace('::ffff:', '', $ip);
|
202 |
-
}
|
203 |
-
|
204 |
-
protected function get_visitor_country() {
|
205 |
-
|
206 |
-
$location = WC_Geolocation::geolocate_ip($this->get_user_ip());
|
207 |
-
|
208 |
-
return $location['country'];
|
209 |
-
}
|
210 |
-
|
211 |
-
protected function is_localhost() {
|
212 |
-
|
213 |
-
$_server = filter_input_array(INPUT_SERVER, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
214 |
-
|
215 |
-
// If the IP is local, return true, else false
|
216 |
-
// https://stackoverflow.com/a/13818647/4688612
|
217 |
-
return !filter_var(
|
218 |
-
$_server['REMOTE_ADDR'],
|
219 |
-
FILTER_VALIDATE_IP,
|
220 |
-
FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
|
221 |
-
);
|
222 |
-
}
|
223 |
-
|
224 |
-
protected function get_user_email( $algo = null ) {
|
225 |
-
|
226 |
-
if (is_user_logged_in()) {
|
227 |
-
$current_user = wp_get_current_user();
|
228 |
-
$email = $current_user->user_email;
|
229 |
-
} elseif (is_order_received_page()) {
|
230 |
-
$order = $this->get_order_from_order_received_page();
|
231 |
-
|
232 |
-
if ($order) {
|
233 |
-
$email = $order->get_billing_email();
|
234 |
-
} else {
|
235 |
-
$email = '';
|
236 |
-
}
|
237 |
-
} else {
|
238 |
-
$email = '';
|
239 |
-
}
|
240 |
-
|
241 |
-
// encrypt email
|
242 |
-
if ($email && $algo && in_array($algo, hash_algos(), true)) {
|
243 |
-
$email = hash($algo, $email);
|
244 |
-
}
|
245 |
-
|
246 |
-
return $email;
|
247 |
-
}
|
248 |
-
|
249 |
-
private function get_e164_formatted_phone_number( $number, $country ) {
|
250 |
-
try {
|
251 |
-
$phone_util = PhoneNumberUtil::getInstance();
|
252 |
-
$number_parsed = $phone_util->parse($number, $country);
|
253 |
-
return $phone_util->format($number_parsed, PhoneNumberFormat::E164);
|
254 |
-
} catch (NumberParseException $e) {
|
255 |
-
error_log($e);
|
256 |
-
return $number;
|
257 |
-
}
|
258 |
-
}
|
259 |
-
|
260 |
-
protected function track_user( $user_id = null ) {
|
261 |
-
|
262 |
-
$user = null;
|
263 |
-
|
264 |
-
if (0 === $user_id) { // If anonymous visitor then track
|
265 |
-
return true;
|
266 |
-
} elseif ($user_id && 0 <= $user_id) { // If user ID is known, get the user
|
267 |
-
$user = get_user_by('id', $user_id);
|
268 |
-
} elseif (null === $user_id && is_user_logged_in()) { // If user id is not given, but the user is logged in, get the user
|
269 |
-
$user = wp_get_current_user();
|
270 |
-
}
|
271 |
-
|
272 |
-
// Find out if the user has a role that is restricted from tracking
|
273 |
-
if ($user) {
|
274 |
-
|
275 |
-
foreach ($user->roles as $role) {
|
276 |
-
if (in_array($role, $this->options_obj->shop->disable_tracking_for, true)) {
|
277 |
-
return false;
|
278 |
-
}
|
279 |
-
}
|
280 |
-
}
|
281 |
-
|
282 |
-
return true;
|
283 |
-
}
|
284 |
-
|
285 |
-
protected function do_not_track_user( $user_id = null ) {
|
286 |
-
return !$this->track_user($user_id);
|
287 |
-
}
|
288 |
}
|
289 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
namespace WCPM\Classes\Pixels;
|
4 |
|
|
|
|
|
|
|
|
|
5 |
|
6 |
+
if ( !defined( 'ABSPATH' ) ) {
|
7 |
+
exit;
|
8 |
+
// Exit if accessed directly
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
}
|
10 |
|
11 |
+
trait Trait_Shop
|
12 |
+
{
|
13 |
+
protected function get_formatted_script_tag_new( $components )
|
14 |
+
{
|
15 |
+
$allowed_protocols = [
|
16 |
+
'http' => [],
|
17 |
+
'https' => [],
|
18 |
+
];
|
19 |
+
echo PHP_EOL ;
|
20 |
+
|
21 |
+
if ( $components['src'] ) {
|
22 |
+
echo "\t" . '<script ' . wp_kses( $this->print_script_components( $components ), [], $allowed_protocols ) . '></script>' ;
|
23 |
+
} else {
|
24 |
+
echo "\t" . '<script ' . wp_kses( $this->print_script_components( $components ), [], $allowed_protocols ) . '>' ;
|
25 |
+
}
|
26 |
+
|
27 |
+
echo PHP_EOL ;
|
28 |
+
}
|
29 |
+
|
30 |
+
protected function print_script_components( $components )
|
31 |
+
{
|
32 |
+
$attributes[] = $this->get_script_async_defer( $components );
|
33 |
+
$attributes[] = $this->get_script_src( $components['src'] );
|
34 |
+
$attributes[] = $this->get_script_type_value( $components['cookie_category'] );
|
35 |
+
$attributes[] = $this->get_script_cookie_category( $components['cookie_category'] );
|
36 |
+
$attributes[] = $this->get_script_data_wpm_pixel_name( $components['pixel_name'] );
|
37 |
+
$attributes[] = $this->get_script_cfasync( $components['inject_cfasync'] );
|
38 |
+
$attributes[] = $this->get_script_cookiebot_cookieconsent( $components );
|
39 |
+
return implode( ' ', array_filter( $attributes ) );
|
40 |
+
}
|
41 |
+
|
42 |
+
protected function get_script_cookiebot_cookieconsent( $components )
|
43 |
+
{
|
44 |
+
if ( array_key_exists( 'cookiebot-cookieconsent', $components ) && $components['cookiebot-cookieconsent'] ) {
|
45 |
+
return 'data-cookieconsent="ignore"';
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
protected function get_script_cfasync( $cfasync )
|
50 |
+
{
|
51 |
+
if ( $cfasync ) {
|
52 |
+
return 'data-cfasync="false"';
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
protected function get_script_data_wpm_pixel_name( $pixel_name )
|
57 |
+
{
|
58 |
+
return 'data-wpm-pixel-name="' . $pixel_name . '"';
|
59 |
+
}
|
60 |
+
|
61 |
+
protected function get_script_src( $src )
|
62 |
+
{
|
63 |
+
|
64 |
+
if ( $src ) {
|
65 |
+
if ( !$this->options_obj->shop->cookie_consent_mgmt->explicit_consent ) {
|
66 |
+
return $this->print_script_src_orig( $src );
|
67 |
+
}
|
68 |
+
return $this->print_script_src_data_wpm( $src );
|
69 |
+
}
|
70 |
+
|
71 |
+
}
|
72 |
+
|
73 |
+
protected function print_script_src_orig( $src )
|
74 |
+
{
|
75 |
+
return 'src="' . $src . '"';
|
76 |
+
}
|
77 |
+
|
78 |
+
protected function print_script_src_data_wpm( $src )
|
79 |
+
{
|
80 |
+
return 'data-wpm-src="' . $src . '"';
|
81 |
+
}
|
82 |
+
|
83 |
+
private function get_script_async_defer( $components )
|
84 |
+
{
|
85 |
+
if ( $components['src'] ) {
|
86 |
+
// A script tag can't have both async and defer attributes,
|
87 |
+
// therefore fall back to a default if both are set.
|
88 |
+
// Otherwise, use the one that is set.
|
89 |
+
|
90 |
+
if ( $components['async'] && $components['defer'] ) {
|
91 |
+
return 'async';
|
92 |
+
} else {
|
93 |
+
|
94 |
+
if ( $components['async'] ) {
|
95 |
+
return 'async';
|
96 |
+
} else {
|
97 |
+
if ( $components['defer'] ) {
|
98 |
+
return 'defer';
|
99 |
+
}
|
100 |
+
}
|
101 |
+
|
102 |
+
}
|
103 |
+
|
104 |
+
}
|
105 |
+
}
|
106 |
+
|
107 |
+
public function get_script_type_value( $cookie_category )
|
108 |
+
{
|
109 |
+
return 'type="text/javascript"';
|
110 |
+
}
|
111 |
+
|
112 |
+
protected function get_script_cookie_category( $cookie_category )
|
113 |
+
{
|
114 |
+
return 'data-wpm-cookie-category="' . $cookie_category . '"';
|
115 |
+
}
|
116 |
+
|
117 |
+
protected function get_list_name_suffix()
|
118 |
+
{
|
119 |
+
$list_suffix = '';
|
120 |
+
|
121 |
+
if ( is_product_category() ) {
|
122 |
+
$category = get_queried_object();
|
123 |
+
$list_suffix = ' | ' . $category->name;
|
124 |
+
$list_suffix = $this->add_parent_category_name( $category, $list_suffix );
|
125 |
+
} else {
|
126 |
+
|
127 |
+
if ( is_product_tag() ) {
|
128 |
+
$tag = get_queried_object();
|
129 |
+
$list_suffix = ' | ' . $tag->name;
|
130 |
+
}
|
131 |
+
|
132 |
+
}
|
133 |
+
|
134 |
+
return $list_suffix;
|
135 |
+
}
|
136 |
+
|
137 |
+
protected function add_parent_category_name( $category, $list_suffix )
|
138 |
+
{
|
139 |
+
|
140 |
+
if ( $category->parent > 0 ) {
|
141 |
+
$parent_category = get_term_by( 'id', $category->parent, 'product_cat' );
|
142 |
+
$list_suffix = ' | ' . $parent_category->name . $list_suffix;
|
143 |
+
$list_suffix = $this->add_parent_category_name( $parent_category, $list_suffix );
|
144 |
+
}
|
145 |
+
|
146 |
+
return $list_suffix;
|
147 |
+
}
|
148 |
+
|
149 |
+
protected function get_list_id_suffix()
|
150 |
+
{
|
151 |
+
$list_suffix = '';
|
152 |
+
|
153 |
+
if ( is_product_category() ) {
|
154 |
+
$category = get_queried_object();
|
155 |
+
$list_suffix = '.' . $category->slug;
|
156 |
+
$list_suffix = $this->add_parent_category_id( $category, $list_suffix );
|
157 |
+
} else {
|
158 |
+
|
159 |
+
if ( is_product_tag() ) {
|
160 |
+
$tag = get_queried_object();
|
161 |
+
$list_suffix = '.' . $tag->slug;
|
162 |
+
}
|
163 |
+
|
164 |
+
}
|
165 |
+
|
166 |
+
return $list_suffix;
|
167 |
+
}
|
168 |
+
|
169 |
+
protected function add_parent_category_id( $category, $list_suffix )
|
170 |
+
{
|
171 |
+
|
172 |
+
if ( $category->parent > 0 ) {
|
173 |
+
$parent_category = get_term_by( 'id', $category->parent, 'product_cat' );
|
174 |
+
$list_suffix = '.' . $parent_category->slug . $list_suffix;
|
175 |
+
$list_suffix = $this->add_parent_category_id( $parent_category, $list_suffix );
|
176 |
+
}
|
177 |
+
|
178 |
+
return $list_suffix;
|
179 |
+
}
|
180 |
+
|
181 |
+
// https://stackoverflow.com/a/49616130/4688612
|
182 |
+
protected function get_order_from_order_received_page()
|
183 |
+
{
|
184 |
+
|
185 |
+
if ( $this->get_order_from_query_vars() ) {
|
186 |
+
return $this->get_order_from_query_vars();
|
187 |
+
} else {
|
188 |
+
|
189 |
+
if ( $this->get_order_with_url_order_key() ) {
|
190 |
+
return $this->get_order_with_url_order_key();
|
191 |
+
} else {
|
192 |
+
return false;
|
193 |
+
}
|
194 |
+
|
195 |
+
}
|
196 |
+
|
197 |
+
}
|
198 |
+
|
199 |
+
protected function get_order_from_query_vars()
|
200 |
+
{
|
201 |
+
global $wp ;
|
202 |
+
$order_id = absint( $wp->query_vars['order-received'] );
|
203 |
+
|
204 |
+
if ( $order_id && 0 != $order_id && wc_get_order( $order_id ) ) {
|
205 |
+
return wc_get_order( $order_id );
|
206 |
+
} else {
|
207 |
+
wc_get_logger()->debug( 'WooCommerce couldn\'t retrieve the order ID from $wp->query_vars[\'order-received\']', [
|
208 |
+
'source' => 'wpm',
|
209 |
+
] );
|
210 |
+
wc_get_logger()->debug( print_r( $wp->query_vars, true ), [
|
211 |
+
'source' => 'wpm',
|
212 |
+
] );
|
213 |
+
return false;
|
214 |
+
}
|
215 |
+
|
216 |
+
}
|
217 |
+
|
218 |
+
protected function get_order_with_url_order_key()
|
219 |
+
{
|
220 |
+
$_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_STRING );
|
221 |
+
|
222 |
+
if ( isset( $_get['key'] ) ) {
|
223 |
+
$order_key = $_get['key'];
|
224 |
+
return wc_get_order( wc_get_order_id_by_order_key( $order_key ) );
|
225 |
+
} else {
|
226 |
+
wc_get_logger()->debug( 'WooCommerce couldn\'t retrieve the order ID from order key in the URL', [
|
227 |
+
'source' => 'wpm',
|
228 |
+
] );
|
229 |
+
$order_key = ( $_get['key'] ? $_get['key'] : '' );
|
230 |
+
wc_get_logger()->debug( 'URL order key: ' . $order_key, [
|
231 |
+
'source' => 'wpm',
|
232 |
+
] );
|
233 |
+
return false;
|
234 |
+
}
|
235 |
+
|
236 |
+
}
|
237 |
+
|
238 |
+
}
|
css/admin.css
CHANGED
@@ -47,7 +47,7 @@
|
|
47 |
.developer-banner {
|
48 |
background: #f3f5f6;
|
49 |
color: #0071a1;
|
50 |
-
padding:
|
51 |
margin-bottom: 20px;
|
52 |
border-radius: 3px;
|
53 |
border-style: solid;
|
@@ -174,4 +174,4 @@ input:checked + .slider:before {
|
|
174 |
text-decoration: none;
|
175 |
margin-left: 5px;
|
176 |
margin-right: 5px;
|
177 |
-
}
|
47 |
.developer-banner {
|
48 |
background: #f3f5f6;
|
49 |
color: #0071a1;
|
50 |
+
padding: 0px 10px;
|
51 |
margin-bottom: 20px;
|
52 |
border-radius: 3px;
|
53 |
border-style: solid;
|
174 |
text-decoration: none;
|
175 |
margin-left: 5px;
|
176 |
margin-right: 5px;
|
177 |
+
}
|
js/admin/ask-for-rating.js
DELETED
@@ -1,37 +0,0 @@
|
|
1 |
-
jQuery(function () {
|
2 |
-
|
3 |
-
jQuery('.wpm-rating-success-notice').show();
|
4 |
-
|
5 |
-
// go and rate it or already done
|
6 |
-
jQuery(document).on('click', '#wpm-rate-it', function (e) {
|
7 |
-
process_click(e, 'rating_done');
|
8 |
-
|
9 |
-
let win = window.open('https://wordpress.org/support/view/plugin-reviews/woocommerce-google-adwords-conversion-tracking-tag?rate=5#postform', '_blank');
|
10 |
-
win.focus();
|
11 |
-
});
|
12 |
-
|
13 |
-
jQuery(document).on('click', '#wpm-already-did', function (e) {
|
14 |
-
process_click(e, 'rating_done');
|
15 |
-
});
|
16 |
-
|
17 |
-
// maybe rate later
|
18 |
-
jQuery(document).on('click', '#wpm-maybe-later', function (e) {
|
19 |
-
process_click(e, 'later');
|
20 |
-
});
|
21 |
-
|
22 |
-
function process_click(e, set) {
|
23 |
-
|
24 |
-
e.preventDefault();
|
25 |
-
|
26 |
-
let data = {
|
27 |
-
'action': 'wpm_dismissed_notice_handler',
|
28 |
-
'set' : set
|
29 |
-
};
|
30 |
-
|
31 |
-
jQuery.post(ajaxurl, data, function (response) {
|
32 |
-
// console.log('Got this from the server: ' + response);
|
33 |
-
// console.log('update rating done');
|
34 |
-
});
|
35 |
-
jQuery('.wpm-rating-success-notice').remove();
|
36 |
-
}
|
37 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/admin/environment-check.js
DELETED
@@ -1,84 +0,0 @@
|
|
1 |
-
jQuery(function () {
|
2 |
-
|
3 |
-
// disable incompatible plugin warning
|
4 |
-
jQuery(document).on('click', '.incompatible-plugin-error-dismissal-button', function (e) {
|
5 |
-
e.preventDefault();
|
6 |
-
|
7 |
-
let data = {
|
8 |
-
'action' : 'environment_check_handler',
|
9 |
-
'disable_warning': jQuery(this).data('plugin-slug'),
|
10 |
-
};
|
11 |
-
|
12 |
-
wpm_send_ajax_data(data);
|
13 |
-
});
|
14 |
-
|
15 |
-
|
16 |
-
// disable WP Rocket JavaScript concatenation
|
17 |
-
jQuery(document).on('click', '#wpm-wp-rocket-js-concatenation-disable', function (e) {
|
18 |
-
e.preventDefault();
|
19 |
-
|
20 |
-
let data = {
|
21 |
-
'action': 'environment_check_handler',
|
22 |
-
'set' : 'disable_wp_rocket_javascript_concatenation'
|
23 |
-
};
|
24 |
-
|
25 |
-
wpm_send_ajax_data(data);
|
26 |
-
});
|
27 |
-
|
28 |
-
// dismiss WP Rocket JavaScript concatenation error
|
29 |
-
jQuery(document).on('click', '#wpm-dismiss-wp-rocket-js-concatenation-error', function (e) {
|
30 |
-
e.preventDefault();
|
31 |
-
|
32 |
-
let data = {
|
33 |
-
'action': 'environment_check_handler',
|
34 |
-
'set' : 'dismiss_wp_rocket_javascript_concatenation_error'
|
35 |
-
};
|
36 |
-
|
37 |
-
wpm_send_ajax_data(data);
|
38 |
-
});
|
39 |
-
|
40 |
-
// disable WP Rocket JavaScript concatenation
|
41 |
-
jQuery(document).on('click', '#wpm-litespeed-inline-js-dom-ready-disable', function (e) {
|
42 |
-
e.preventDefault();
|
43 |
-
|
44 |
-
let data = {
|
45 |
-
'action': 'environment_check_handler',
|
46 |
-
'set' : 'disable_litespeed_inline_js_dom_ready'
|
47 |
-
};
|
48 |
-
|
49 |
-
wpm_send_ajax_data(data);
|
50 |
-
});
|
51 |
-
|
52 |
-
// dismiss WP Rocket JavaScript concatenation error
|
53 |
-
jQuery(document).on('click', '#wpm-dismiss-litespeed-inline-js-dom-ready-error', function (e) {
|
54 |
-
e.preventDefault();
|
55 |
-
|
56 |
-
let data = {
|
57 |
-
'action': 'environment_check_handler',
|
58 |
-
'set' : 'dismiss_litespeed_inline_js_dom_ready'
|
59 |
-
};
|
60 |
-
|
61 |
-
wpm_send_ajax_data(data);
|
62 |
-
});
|
63 |
-
|
64 |
-
// dismiss PayPal standard payment gateway warning
|
65 |
-
jQuery(document).on('click', '#wpm-paypal-standard-error-dismissal-button', function (e) {
|
66 |
-
e.preventDefault();
|
67 |
-
|
68 |
-
let data = {
|
69 |
-
'action': 'environment_check_handler',
|
70 |
-
'set' : 'dismiss_paypal_standard_warning'
|
71 |
-
};
|
72 |
-
|
73 |
-
wpm_send_ajax_data(data);
|
74 |
-
});
|
75 |
-
|
76 |
-
});
|
77 |
-
|
78 |
-
function wpm_send_ajax_data(data) {
|
79 |
-
jQuery.post(ajaxurl, data, function (response) {
|
80 |
-
// console.log('Got this from the server: ' + response);
|
81 |
-
// console.log('update rating done');
|
82 |
-
location.reload();
|
83 |
-
});
|
84 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/admin/freemius-keep-deactivate-button-enabled.js
DELETED
@@ -1,22 +0,0 @@
|
|
1 |
-
(function () {
|
2 |
-
try {
|
3 |
-
|
4 |
-
let observer = new MutationObserver(function (mutations) {
|
5 |
-
mutations.forEach(function (mutation) {
|
6 |
-
if (mutation.attributeName === "class") {
|
7 |
-
let attributeValue = jQuery(mutation.target).prop(mutation.attributeName);
|
8 |
-
if (attributeValue.includes('disabled')) {
|
9 |
-
jQuery('.fs-modal').find('.button-deactivate').removeClass('disabled');
|
10 |
-
}
|
11 |
-
}
|
12 |
-
});
|
13 |
-
});
|
14 |
-
|
15 |
-
observer.observe(jQuery('.fs-modal').find('.button-deactivate')[0], {
|
16 |
-
attributes: true
|
17 |
-
});
|
18 |
-
|
19 |
-
} catch (error) {
|
20 |
-
console.error(error);
|
21 |
-
}
|
22 |
-
})();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/admin/helpers.js
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
jQuery(function () {
|
2 |
-
|
3 |
-
// copy debug info textarea
|
4 |
-
jQuery("#debug-info-button").click(function () {
|
5 |
-
jQuery("#debug-info-textarea").select();
|
6 |
-
document.execCommand('copy');
|
7 |
-
});
|
8 |
-
|
9 |
-
jQuery("#wpm_pro_version_demo").on('click', function () {
|
10 |
-
jQuery("#submit").click();
|
11 |
-
});
|
12 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/admin/main-freemius.js
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
import freemius_keep_deactivate_button_enabled from "./freemius-keep-deactivate-button-enabled.js"
|
|
js/admin/main.js
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
import ask_for_rating from "./ask-for-rating.js"
|
2 |
-
import environment_check from "./environment-check.js"
|
3 |
-
import helpers from "./helpers.js"
|
4 |
-
import script_blocker_warning from "./script-blocker-warning.js"
|
5 |
-
import tabs from "./tabs.js"
|
6 |
-
|
7 |
-
|
8 |
-
// console.log('WooCommerce Pixel Manager admin script')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/admin/script-blocker-warning.js
DELETED
@@ -1,13 +0,0 @@
|
|
1 |
-
function wpm_hide_script_blocker_warning() {
|
2 |
-
jQuery('#script-blocker-notice').hide();
|
3 |
-
}
|
4 |
-
|
5 |
-
// try to hide as soon as this script is loaded
|
6 |
-
// might be too early in some cases, as the HTML is not rendered yet
|
7 |
-
wpm_hide_script_blocker_warning();
|
8 |
-
|
9 |
-
// if all other earlier attempts to hide did fail
|
10 |
-
// run the function after entire DOM has been loaded
|
11 |
-
jQuery(function () {
|
12 |
-
wpm_hide_script_blocker_warning();
|
13 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/admin/tabs.js
DELETED
@@ -1,172 +0,0 @@
|
|
1 |
-
jQuery(function () {
|
2 |
-
|
3 |
-
let sections = [];
|
4 |
-
let subsections = {};
|
5 |
-
|
6 |
-
// hide unnecessary elements
|
7 |
-
jQuery('.section').closest('tr').hide();
|
8 |
-
|
9 |
-
// collect information on sections
|
10 |
-
jQuery('.section').each(function () {
|
11 |
-
sections.push({
|
12 |
-
'slug' : jQuery(this).data('sectionSlug'),
|
13 |
-
'title': jQuery(this).data('sectionTitle'),
|
14 |
-
});
|
15 |
-
});
|
16 |
-
|
17 |
-
// collect information on subsections
|
18 |
-
jQuery('.subsection').each(function () {
|
19 |
-
|
20 |
-
subsections[jQuery(this).data('sectionSlug')] = subsections[jQuery(this).data('sectionSlug')] || [];
|
21 |
-
|
22 |
-
subsections[jQuery(this).data('sectionSlug')].push({
|
23 |
-
'title': jQuery(this).data('subsectionTitle'),
|
24 |
-
'slug' : jQuery(this).data('subsectionSlug')
|
25 |
-
});
|
26 |
-
});
|
27 |
-
|
28 |
-
// create tabs for sections
|
29 |
-
sections.forEach(
|
30 |
-
function (section) {
|
31 |
-
jQuery(".nav-tab-wrapper").append("<a href=\"#\" class=\"nav-tab\" data-section-slug=\"" + section['slug'] + "\">" + section['title'] + "</a>");
|
32 |
-
});
|
33 |
-
|
34 |
-
// create tabs for each subsections
|
35 |
-
jQuery(".nav-tab-wrapper").after(createSubtabUlHtml(subsections));
|
36 |
-
|
37 |
-
// create on-click events on section tabs that toggle the views
|
38 |
-
jQuery(".nav-tab-wrapper a").on('click', function (e) {
|
39 |
-
e.preventDefault();
|
40 |
-
|
41 |
-
// show clicked tab as active
|
42 |
-
jQuery(this).addClass("nav-tab-active").siblings().removeClass("nav-tab-active");
|
43 |
-
|
44 |
-
// toggle the sections visible / invisible based on clicked tab
|
45 |
-
|
46 |
-
let sectionSlug = jQuery(this).data('section-slug')
|
47 |
-
toggleSections(sectionSlug, sections);
|
48 |
-
|
49 |
-
// if subsection exists, click on first subsection
|
50 |
-
if (sectionSlug in subsections) {
|
51 |
-
jQuery("ul[data-section-slug=" + sectionSlug + "]").children(':first').trigger('click')
|
52 |
-
}
|
53 |
-
});
|
54 |
-
|
55 |
-
// create on-click events on subsection tabs that toggle the views
|
56 |
-
jQuery(".subnav-li").on('click', function (e) {
|
57 |
-
e.preventDefault();
|
58 |
-
|
59 |
-
// jQuery(this).hide();
|
60 |
-
jQuery(this)
|
61 |
-
.addClass('subnav-li-active').removeClass('subnav-li-inactive')
|
62 |
-
.siblings()
|
63 |
-
.addClass('subnav-li-inactive').removeClass('subnav-li-active');
|
64 |
-
|
65 |
-
toggleSubsection(jQuery(this).parent().data('section-slug'), jQuery(this).data('subsection-slug'));
|
66 |
-
});
|
67 |
-
|
68 |
-
// if someone access a plugin tab by deep link, open the right tab
|
69 |
-
// or fallback to default (first tab)
|
70 |
-
|
71 |
-
// if deeplink is being opened open the according section and subsection
|
72 |
-
if (getSectionParams()) {
|
73 |
-
|
74 |
-
let sectionParams = getSectionParams();
|
75 |
-
|
76 |
-
jQuery("a[data-section-slug=" + sectionParams['section'] + "]").trigger('click');
|
77 |
-
|
78 |
-
if (sectionParams['subsection'] !== false) {
|
79 |
-
jQuery("ul[data-section-slug=" + sectionParams['section'] + "]").children("[data-subsection-slug=" + sectionParams['subsection'] + "]").trigger('click')
|
80 |
-
}
|
81 |
-
} else {
|
82 |
-
jQuery("a[data-section-slug=" + sections[0]['slug'] + "]").trigger('click');
|
83 |
-
}
|
84 |
-
});
|
85 |
-
|
86 |
-
// creates the html with all subsection elements
|
87 |
-
function createSubtabUlHtml(subsections) {
|
88 |
-
|
89 |
-
let subsectionsKeys = Object.keys(subsections);
|
90 |
-
|
91 |
-
let html = '';
|
92 |
-
|
93 |
-
subsectionsKeys.forEach(function (subsectionKey) {
|
94 |
-
html += '<ul class="subnav-tabs" data-section-slug="' + subsectionKey + '">';
|
95 |
-
|
96 |
-
let subtabs = subsections[subsectionKey];
|
97 |
-
|
98 |
-
subtabs.forEach(function (subtab) {
|
99 |
-
html += '<li class="subnav-li subnav-li-inactive" data-subsection-slug="' + subtab['slug'] + '">' + subtab['title'] + '</li>'
|
100 |
-
});
|
101 |
-
|
102 |
-
html += '</ul>';
|
103 |
-
});
|
104 |
-
|
105 |
-
return html;
|
106 |
-
}
|
107 |
-
|
108 |
-
// if section (and subsection) URL parameters are set,
|
109 |
-
// return them, otherwise return false
|
110 |
-
function getSectionParams() {
|
111 |
-
const queryString = window.location.search;
|
112 |
-
const urlParams = new URLSearchParams(queryString);
|
113 |
-
|
114 |
-
if (urlParams.get('section')) {
|
115 |
-
return {
|
116 |
-
'section' : urlParams.get('section'),
|
117 |
-
'subsection': urlParams.get('subsection')
|
118 |
-
};
|
119 |
-
} else {
|
120 |
-
return false;
|
121 |
-
}
|
122 |
-
}
|
123 |
-
|
124 |
-
// toggles the sections
|
125 |
-
function toggleSections(sectionSlug, sections) {
|
126 |
-
|
127 |
-
jQuery("#wpm_settings_form > h2").nextUntil(".submit").andSelf().hide();
|
128 |
-
jQuery(".subnav-tabs").hide();
|
129 |
-
jQuery(".subnav-tabs[data-section-slug=" + sectionSlug + "]").show();
|
130 |
-
|
131 |
-
let sectionPos = sections.findIndex((arrayElement) => arrayElement['slug'] === sectionSlug);
|
132 |
-
|
133 |
-
jQuery("div[data-section-slug=" + sectionSlug + "]").closest("table").prevAll("h2:first").next().nextUntil("h2, .submit").andSelf().show();
|
134 |
-
|
135 |
-
// set the URL with the active tab parameter
|
136 |
-
setUrl(sections[sectionPos]['slug']);
|
137 |
-
}
|
138 |
-
|
139 |
-
function toggleSubsection(sectionSlug, subsectionSlug) {
|
140 |
-
|
141 |
-
jQuery("#wpm_settings_form > h2").nextUntil(".submit").andSelf().hide();
|
142 |
-
jQuery("[data-section-slug=" + sectionSlug + "][data-subsection-slug=" + subsectionSlug + "]").closest("tr").siblings().andSelf().hide();
|
143 |
-
|
144 |
-
jQuery("[data-section-slug=" + sectionSlug + "][data-subsection-slug=" + subsectionSlug + "]").closest("table").show();
|
145 |
-
jQuery("[data-section-slug=" + sectionSlug + "][data-subsection-slug=" + subsectionSlug + "]").closest("tr").nextUntil(jQuery("[data-section-slug=" + sectionSlug + "][data-subsection-slug]").closest('tr')).show();
|
146 |
-
|
147 |
-
// set the URL with the active tab parameter
|
148 |
-
setUrl(sectionSlug, subsectionSlug);
|
149 |
-
}
|
150 |
-
|
151 |
-
// sets the new URL parameters
|
152 |
-
function setUrl(sectionSlug, subsectionSlug = "") {
|
153 |
-
|
154 |
-
const queryString = window.location.search;
|
155 |
-
const urlParams = new URLSearchParams(queryString);
|
156 |
-
|
157 |
-
urlParams.delete('section');
|
158 |
-
urlParams.delete('subsection');
|
159 |
-
|
160 |
-
let newParams = "section=" + sectionSlug;
|
161 |
-
newParams += subsectionSlug ? "&subsection=" + subsectionSlug : "";
|
162 |
-
|
163 |
-
history.pushState('', 'wpm' + sectionSlug, document.location.pathname + "?page=wpm&" + newParams);
|
164 |
-
|
165 |
-
// make WP remember which was the selected tab on a save and return to the same tab after saving
|
166 |
-
jQuery('input[name ="_wp_http_referer"]').val(getAdminPath() + "?page=wpm&" + newParams + "&settings-updated=true");
|
167 |
-
}
|
168 |
-
|
169 |
-
function getAdminPath() {
|
170 |
-
let url = new URL(jQuery('#wp-admin-canonical').attr('href'));
|
171 |
-
return url.pathname;
|
172 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/admin/wpm-admin-freemius.p1.min.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
(()=>{var e={
|
2 |
//# sourceMappingURL=wpm-admin-freemius.p1.min.js.map
|
1 |
+
(()=>{var e={44:()=>{!function(){try{new MutationObserver((function(e){e.forEach((function(e){"class"===e.attributeName&&jQuery(e.target).prop(e.attributeName).includes("disabled")&&jQuery(".fs-modal").find(".button-deactivate").removeClass("disabled")}))})).observe(jQuery(".fs-modal").find(".button-deactivate")[0],{attributes:!0})}catch(e){console.error(e)}}()}},t={};function r(o){var a=t[o];if(void 0!==a)return a.exports;var n=t[o]={exports:{}};return e[o](n,n.exports,r),n.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";r(44)})()})();
|
2 |
//# sourceMappingURL=wpm-admin-freemius.p1.min.js.map
|
js/admin/wpm-admin-freemius.p1.min.js.map
CHANGED
@@ -1 +1 @@
|
|
1 |
-
{"version":3,"file":"wpm-admin-freemius.p1.min.js","mappings":"sBAAA,WACC,IAEgB,IAAIA,kBAAiB,SAAUC,GAC7CA,EAAUC,SAAQ,SAAUC,GACI,UAA3BA,EAASC,eACSC,OAAOF,EAASG,QAAQC,KAAKJ,EAASC,eACxCI,SAAS,aAC3BH,OAAO,aAAaI,KAAK,sBAAsBC,YAAY,
|
1 |
+
{"version":3,"file":"wpm-admin-freemius.p1.min.js","mappings":"sBAAA,WACC,IAEgB,IAAIA,kBAAiB,SAAUC,GAC7CA,EAAUC,SAAQ,SAAUC,GACI,UAA3BA,EAASC,eACSC,OAAOF,EAASG,QAAQC,KAAKJ,EAASC,eACxCI,SAAS,aAC3BH,OAAO,aAAaI,KAAK,sBAAsBC,YAAY,kBAOtDC,QAAQN,OAAO,aAAaI,KAAK,sBAAsB,GAAI,CACnEG,YAAY,IAGZ,MAAOC,GACRC,QAAQD,MAAMA,IApBhB,KCCIE,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,IAOV,OAHAE,EAAoBL,GAAUI,EAAQA,EAAOD,QAASJ,GAG/CK,EAAOD,QCpBfJ,EAAoBO,EAAKF,IACxB,IAAIG,EAASH,GAAUA,EAAOI,WAC7B,IAAOJ,EAAiB,QACxB,IAAM,EAEP,OADAL,EAAoBU,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,GCLRR,EAAoBU,EAAI,CAACN,EAASQ,KACjC,IAAI,IAAIC,KAAOD,EACXZ,EAAoBc,EAAEF,EAAYC,KAASb,EAAoBc,EAAEV,EAASS,IAC5EE,OAAOC,eAAeZ,EAASS,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3Eb,EAAoBc,EAAI,CAACK,EAAK5B,IAAUwB,OAAOK,UAAUC,eAAeC,KAAKH,EAAK5B,G","sources":["webpack://wgact/./src/js/admin/freemius-keep-deactivate-button-enabled.jsx","webpack://wgact/webpack/bootstrap","webpack://wgact/webpack/runtime/compat get default export","webpack://wgact/webpack/runtime/define property getters","webpack://wgact/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["(function () {\n\ttry {\n\n\t\tlet observer = new MutationObserver(function (mutations) {\n\t\t\tmutations.forEach(function (mutation) {\n\t\t\t\tif (mutation.attributeName === \"class\") {\n\t\t\t\t\tlet attributeValue = jQuery(mutation.target).prop(mutation.attributeName);\n\t\t\t\t\tif (attributeValue.includes('disabled')) {\n\t\t\t\t\t\tjQuery('.fs-modal').find('.button-deactivate').removeClass('disabled');\n\t\t\t\t\t\t;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tobserver.observe(jQuery('.fs-modal').find('.button-deactivate')[0], {\n\t\t\tattributes: true\n\t\t});\n\n\t} catch (error) {\n\t\tconsole.error(error);\n\t}\n})();\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))"],"names":["MutationObserver","mutations","forEach","mutation","attributeName","jQuery","target","prop","includes","find","removeClass","observe","attributes","error","console","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prototype","hasOwnProperty","call"],"sourceRoot":""}
|
js/admin/wpm-admin.p1.min.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
(()=>{var e={
|
2 |
//# sourceMappingURL=wpm-admin.p1.min.js.map
|
1 |
+
(()=>{var e={494:()=>{jQuery((function(){function e(e,t){e.preventDefault();let n={action:"wpm_dismissed_notice_handler",set:t};jQuery.post(ajaxurl,n,(function(e){})),jQuery(".wpm-rating-success-notice").remove()}jQuery(".wpm-rating-success-notice").show(),jQuery(document).on("click","#wpm-rate-it",(function(t){e(t,"rating_done"),window.open("https://wordpress.org/support/view/plugin-reviews/woocommerce-google-adwords-conversion-tracking-tag?rate=5#postform","_blank").focus()})),jQuery(document).on("click","#wpm-already-did",(function(t){e(t,"rating_done")})),jQuery(document).on("click","#wpm-maybe-later",(function(t){e(t,"later")}))}))},877:()=>{function e(e){jQuery.post(ajaxurl,e,(function(e){location.reload()}))}jQuery((function(){jQuery(document).on("click",".incompatible-plugin-error-dismissal-button",(function(t){t.preventDefault(),e({action:"environment_check_handler",disable_warning:jQuery(this).data("plugin-slug")})})),jQuery(document).on("click","#wpm-wp-rocket-js-concatenation-disable",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"disable_wp_rocket_javascript_concatenation"})})),jQuery(document).on("click","#wpm-dismiss-wp-rocket-js-concatenation-error",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"dismiss_wp_rocket_javascript_concatenation_error"})})),jQuery(document).on("click","#wpm-litespeed-inline-js-dom-ready-disable",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"disable_litespeed_inline_js_dom_ready"})})),jQuery(document).on("click","#wpm-dismiss-litespeed-inline-js-dom-ready-error",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"dismiss_litespeed_inline_js_dom_ready"})})),jQuery(document).on("click","#wpm-paypal-standard-error-dismissal-button",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"dismiss_paypal_standard_warning"})}))}))},327:()=>{jQuery((function(){jQuery("#debug-info-button").click((function(){jQuery("#debug-info-textarea").select(),document.execCommand("copy")})),jQuery("#wpm_pro_version_demo").on("click",(function(){jQuery("#submit").click()}))}))},299:()=>{function e(){jQuery("#script-blocker-notice").hide()}e(),jQuery((function(){e()}))},163:()=>{function e(){const e=window.location.search,t=new URLSearchParams(e);return!!t.get("section")&&{section:t.get("section"),subsection:t.get("subsection")}}function t(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const i=window.location.search,s=new URLSearchParams(i);s.delete("section"),s.delete("subsection");let a="section="+e;a+=t?"&subsection="+t:"",history.pushState("","wpm"+e,document.location.pathname+"?page=wpm&"+a),jQuery('input[name ="_wp_http_referer"]').val(n()+"?page=wpm&"+a+"&settings-updated=true")}function n(){return new URL(jQuery("#wp-admin-canonical").attr("href")).pathname}jQuery((function(){let n=[],i={};if(jQuery(".section").closest("tr").hide(),jQuery(".section").each((function(){n.push({slug:jQuery(this).data("sectionSlug"),title:jQuery(this).data("sectionTitle")})})),jQuery(".subsection").each((function(){i[jQuery(this).data("sectionSlug")]=i[jQuery(this).data("sectionSlug")]||[],i[jQuery(this).data("sectionSlug")].push({title:jQuery(this).data("subsectionTitle"),slug:jQuery(this).data("subsectionSlug")})})),n.forEach((function(e){jQuery(".nav-tab-wrapper").append('<a href="#" class="nav-tab" data-section-slug="'+e.slug+'">'+e.title+"</a>")})),jQuery(".nav-tab-wrapper").after(function(e){let t=Object.keys(e),n="";return t.forEach((function(t){n+='<ul class="subnav-tabs" data-section-slug="'+t+'">',e[t].forEach((function(e){n+='<li class="subnav-li subnav-li-inactive" data-subsection-slug="'+e.slug+'">'+e.title+"</li>"})),n+="</ul>"})),n}(i)),jQuery(".nav-tab-wrapper a").on("click",(function(e){e.preventDefault(),jQuery(this).addClass("nav-tab-active").siblings().removeClass("nav-tab-active");let s=jQuery(this).data("section-slug");!function(e,n){jQuery("#wpm_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery(".subnav-tabs").hide(),jQuery(".subnav-tabs[data-section-slug="+e+"]").show();let i=n.findIndex((t=>t.slug===e));jQuery("div[data-section-slug="+e+"]").closest("table").prevAll("h2:first").next().nextUntil("h2, .submit").andSelf().show(),t(n[i].slug)}(s,n),s in i&&jQuery("ul[data-section-slug="+s+"]").children(":first").trigger("click")})),jQuery(".subnav-li").on("click",(function(e){var n,i;e.preventDefault(),jQuery(this).addClass("subnav-li-active").removeClass("subnav-li-inactive").siblings().addClass("subnav-li-inactive").removeClass("subnav-li-active"),n=jQuery(this).parent().data("section-slug"),i=jQuery(this).data("subsection-slug"),jQuery("#wpm_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery("[data-section-slug="+n+"][data-subsection-slug="+i+"]").closest("tr").siblings().andSelf().hide(),jQuery("[data-section-slug="+n+"][data-subsection-slug="+i+"]").closest("table").show(),jQuery("[data-section-slug="+n+"][data-subsection-slug="+i+"]").closest("tr").nextUntil(jQuery("[data-section-slug="+n+"][data-subsection-slug]").closest("tr")).show(),t(n,i)})),e()){let t=e();jQuery("a[data-section-slug="+t.section+"]").trigger("click"),!1!==t.subsection&&jQuery("ul[data-section-slug="+t.section+"]").children("[data-subsection-slug="+t.subsection+"]").trigger("click")}else jQuery("a[data-section-slug="+n[0].slug+"]").trigger("click")}))}},t={};function n(i){var s=t[i];if(void 0!==s)return s.exports;var a=t[i]={exports:{}};return e[i](a,a.exports,n),a.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";n(494),n(877),n(327),n(299),n(163)})()})();
|
2 |
//# sourceMappingURL=wpm-admin.p1.min.js.map
|
js/admin/wpm-admin.p1.min.js.map
CHANGED
@@ -1 +1 @@
|
|
1 |
-
{"version":3,"file":"wpm-admin.p1.min.js","mappings":"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","sources":["webpack://WooCommerce-Pixel-Manager/./src/js/admin/ask-for-rating.js","webpack://WooCommerce-Pixel-Manager/./src/js/admin/environment-check.js","webpack://WooCommerce-Pixel-Manager/./src/js/admin/helpers.js","webpack://WooCommerce-Pixel-Manager/./src/js/admin/script-blocker-warning.js","webpack://WooCommerce-Pixel-Manager/./src/js/admin/tabs.js","webpack://WooCommerce-Pixel-Manager/webpack/bootstrap","webpack://WooCommerce-Pixel-Manager/webpack/runtime/compat get default export","webpack://WooCommerce-Pixel-Manager/webpack/runtime/define property getters","webpack://WooCommerce-Pixel-Manager/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["jQuery(function () {\n\n\tjQuery('.wpm-rating-success-notice').show();\n\n\t// go and rate it or already done\n\tjQuery(document).on('click', '#wpm-rate-it', function (e) {\n\t\tprocess_click(e, 'rating_done');\n\n\t\tlet win = window.open('https://wordpress.org/support/view/plugin-reviews/woocommerce-google-adwords-conversion-tracking-tag?rate=5#postform', '_blank');\n\t\twin.focus();\n\t});\n\n\tjQuery(document).on('click', '#wpm-already-did', function (e) {\n\t\tprocess_click(e, 'rating_done');\n\t});\n\n\t// maybe rate later\n\tjQuery(document).on('click', '#wpm-maybe-later', function (e) {\n\t\tprocess_click(e, 'later');\n\t});\n\n\tfunction process_click(e, set) {\n\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'wpm_dismissed_notice_handler',\n\t\t\t'set' : set\n\t\t};\n\n\t\tjQuery.post(ajaxurl, data, function (response) {\n\t\t\t// console.log('Got this from the server: ' + response);\n\t\t\t// console.log('update rating done');\n\t\t});\n\t\tjQuery('.wpm-rating-success-notice').remove();\n\t}\n});\n","jQuery(function () {\n\n\t// disable incompatible plugin warning\n\tjQuery(document).on('click', '.incompatible-plugin-error-dismissal-button', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action' : 'environment_check_handler',\n\t\t\t'disable_warning': jQuery(this).data('plugin-slug'),\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\n\t// disable WP Rocket JavaScript concatenation\n\tjQuery(document).on('click', '#wpm-wp-rocket-js-concatenation-disable', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'disable_wp_rocket_javascript_concatenation'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\t// dismiss WP Rocket JavaScript concatenation error\n\tjQuery(document).on('click', '#wpm-dismiss-wp-rocket-js-concatenation-error', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'dismiss_wp_rocket_javascript_concatenation_error'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\t// disable WP Rocket JavaScript concatenation\n\tjQuery(document).on('click', '#wpm-litespeed-inline-js-dom-ready-disable', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'disable_litespeed_inline_js_dom_ready'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\t// dismiss WP Rocket JavaScript concatenation error\n\tjQuery(document).on('click', '#wpm-dismiss-litespeed-inline-js-dom-ready-error', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'dismiss_litespeed_inline_js_dom_ready'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\t// dismiss PayPal standard payment gateway warning\n\tjQuery(document).on('click', '#wpm-paypal-standard-error-dismissal-button', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'dismiss_paypal_standard_warning'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n});\n\nfunction wpm_send_ajax_data(data) {\n\tjQuery.post(ajaxurl, data, function (response) {\n\t\t// console.log('Got this from the server: ' + response);\n\t\t// console.log('update rating done');\n\t\tlocation.reload();\n\t});\n}\n","jQuery(function () {\n\n\t// copy debug info textarea\n\tjQuery(\"#debug-info-button\").click(function () {\n\t\tjQuery(\"#debug-info-textarea\").select();\n\t\tdocument.execCommand('copy');\n\t});\n\n\tjQuery(\"#wpm_pro_version_demo\").on('click', function () {\n\t\tjQuery(\"#submit\").click();\n\t});\n});\n","function wpm_hide_script_blocker_warning() {\n\tjQuery('#script-blocker-notice').hide();\n}\n\n// try to hide as soon as this script is loaded\n// might be too early in some cases, as the HTML is not rendered yet\nwpm_hide_script_blocker_warning();\n\n// if all other earlier attempts to hide did fail\n// run the function after entire DOM has been loaded\njQuery(function () {\n\twpm_hide_script_blocker_warning();\n});\n","jQuery(function () {\n\n\tlet sections = [];\n\tlet subsections = {};\n\n\t// hide unnecessary elements\n\tjQuery('.section').closest('tr').hide();\n\n\t// collect information on sections\n\tjQuery('.section').each(function () {\n\t\tsections.push({\n\t\t\t'slug' : jQuery(this).data('sectionSlug'),\n\t\t\t'title': jQuery(this).data('sectionTitle'),\n\t\t});\n\t});\n\n\t// collect information on subsections\n\tjQuery('.subsection').each(function () {\n\n\t\tsubsections[jQuery(this).data('sectionSlug')] = subsections[jQuery(this).data('sectionSlug')] || [];\n\n\t\tsubsections[jQuery(this).data('sectionSlug')].push({\n\t\t\t'title': jQuery(this).data('subsectionTitle'),\n\t\t\t'slug' : jQuery(this).data('subsectionSlug')\n\t\t});\n\t});\n\n\t// create tabs for sections\n\tsections.forEach(\n\t\tfunction (section) {\n\t\t\tjQuery(\".nav-tab-wrapper\").append(\"<a href=\\\"#\\\" class=\\\"nav-tab\\\" data-section-slug=\\\"\" + section['slug'] + \"\\\">\" + section['title'] + \"</a>\");\n\t\t});\n\n\t// create tabs for each subsections\n\tjQuery(\".nav-tab-wrapper\").after(createSubtabUlHtml(subsections));\n\n\t// create on-click events on section tabs that toggle the views\n\tjQuery(\".nav-tab-wrapper a\").on('click', function (e) {\n\t\te.preventDefault();\n\n\t\t// show clicked tab as active\n\t\tjQuery(this).addClass(\"nav-tab-active\").siblings().removeClass(\"nav-tab-active\");\n\n\t\t// toggle the sections visible / invisible based on clicked tab\n\n\t\tlet sectionSlug = jQuery(this).data('section-slug')\n\t\ttoggleSections(sectionSlug, sections);\n\n\t\t// if subsection exists, click on first subsection\n\t\tif (sectionSlug in subsections) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionSlug + \"]\").children(':first').trigger('click')\n\t\t}\n\t});\n\n\t// create on-click events on subsection tabs that toggle the views\n\tjQuery(\".subnav-li\").on('click', function (e) {\n\t\te.preventDefault();\n\n\t\t// jQuery(this).hide();\n\t\tjQuery(this)\n\t\t\t.addClass('subnav-li-active').removeClass('subnav-li-inactive')\n\t\t\t.siblings()\n\t\t\t.addClass('subnav-li-inactive').removeClass('subnav-li-active');\n\n\t\ttoggleSubsection(jQuery(this).parent().data('section-slug'), jQuery(this).data('subsection-slug'));\n\t});\n\n\t// if someone access a plugin tab by deep link, open the right tab\n\t// or fallback to default (first tab)\n\n\t// if deeplink is being opened open the according section and subsection\n\tif (getSectionParams()) {\n\n\t\tlet sectionParams = getSectionParams();\n\n\t\tjQuery(\"a[data-section-slug=\" + sectionParams['section'] + \"]\").trigger('click');\n\n\t\tif (sectionParams['subsection'] !== false) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionParams['section'] + \"]\").children(\"[data-subsection-slug=\" + sectionParams['subsection'] + \"]\").trigger('click')\n\t\t}\n\t} else {\n\t\tjQuery(\"a[data-section-slug=\" + sections[0]['slug'] + \"]\").trigger('click');\n\t}\n});\n\n// creates the html with all subsection elements\nfunction createSubtabUlHtml(subsections) {\n\n\tlet subsectionsKeys = Object.keys(subsections);\n\n\tlet html = '';\n\n\tsubsectionsKeys.forEach(function (subsectionKey) {\n\t\thtml += '<ul class=\"subnav-tabs\" data-section-slug=\"' + subsectionKey + '\">';\n\n\t\tlet subtabs = subsections[subsectionKey];\n\n\t\tsubtabs.forEach(function (subtab) {\n\t\t\thtml += '<li class=\"subnav-li subnav-li-inactive\" data-subsection-slug=\"' + subtab['slug'] + '\">' + subtab['title'] + '</li>'\n\t\t});\n\n\t\thtml += '</ul>';\n\t});\n\n\treturn html;\n}\n\n// if section (and subsection) URL parameters are set,\n// return them, otherwise return false\nfunction getSectionParams() {\n\tconst queryString = window.location.search;\n\tconst urlParams = new URLSearchParams(queryString);\n\n\tif (urlParams.get('section')) {\n\t\treturn {\n\t\t\t'section' : urlParams.get('section'),\n\t\t\t'subsection': urlParams.get('subsection')\n\t\t};\n\t} else {\n\t\treturn false;\n\t}\n}\n\n// toggles the sections\nfunction toggleSections(sectionSlug, sections) {\n\n\tjQuery(\"#wpm_settings_form > h2\").nextUntil(\".submit\").andSelf().hide();\n\tjQuery(\".subnav-tabs\").hide();\n\tjQuery(\".subnav-tabs[data-section-slug=\" + sectionSlug + \"]\").show();\n\n\tlet sectionPos = sections.findIndex((arrayElement) => arrayElement['slug'] === sectionSlug);\n\n\tjQuery(\"div[data-section-slug=\" + sectionSlug + \"]\").closest(\"table\").prevAll(\"h2:first\").next().nextUntil(\"h2, .submit\").andSelf().show();\n\n\t// set the URL with the active tab parameter\n\tsetUrl(sections[sectionPos]['slug']);\n}\n\nfunction toggleSubsection(sectionSlug, subsectionSlug) {\n\n\tjQuery(\"#wpm_settings_form > h2\").nextUntil(\".submit\").andSelf().hide();\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").siblings().andSelf().hide();\n\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"table\").show();\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").nextUntil(jQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug]\").closest('tr')).show();\n\n\t// set the URL with the active tab parameter\n\tsetUrl(sectionSlug, subsectionSlug);\n}\n\n// sets the new URL parameters\nfunction setUrl(sectionSlug, subsectionSlug = \"\") {\n\n\tconst queryString = window.location.search;\n\tconst urlParams = new URLSearchParams(queryString);\n\n\turlParams.delete('section');\n\turlParams.delete('subsection');\n\n\tlet newParams = \"section=\" + sectionSlug;\n\tnewParams += subsectionSlug ? \"&subsection=\" + subsectionSlug : \"\";\n\n\thistory.pushState('', 'wpm' + sectionSlug, document.location.pathname + \"?page=wpm&\" + newParams);\n\n\t// make WP remember which was the selected tab on a save and return to the same tab after saving\n\tjQuery('input[name =\"_wp_http_referer\"]').val(getAdminPath() + \"?page=wpm&\" + newParams + \"&settings-updated=true\");\n}\n\nfunction getAdminPath() {\n\tlet url = new URL(jQuery('#wp-admin-canonical').attr('href'));\n\treturn url.pathname;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))"],"names":["jQuery","process_click","e","set","preventDefault","data","post","ajaxurl","response","remove","show","document","on","window","open","focus","wpm_send_ajax_data","location","reload","this","click","select","execCommand","wpm_hide_script_blocker_warning","hide","getSectionParams","queryString","search","urlParams","URLSearchParams","get","setUrl","sectionSlug","subsectionSlug","delete","newParams","history","pushState","pathname","val","getAdminPath","URL","attr","sections","subsections","closest","each","push","forEach","section","append","after","subsectionsKeys","Object","keys","html","subsectionKey","subtab","createSubtabUlHtml","addClass","siblings","removeClass","nextUntil","andSelf","sectionPos","findIndex","arrayElement","prevAll","next","toggleSections","children","trigger","parent","sectionParams","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","defineProperty","enumerable","obj","prop","prototype","hasOwnProperty","call"],"sourceRoot":""}
|
1 |
+
{"version":3,"file":"wpm-admin.p1.min.js","mappings":"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","sources":["webpack://wgact/./src/js/admin/ask-for-rating.jsx","webpack://wgact/./src/js/admin/environment-check.jsx","webpack://wgact/./src/js/admin/helpers.jsx","webpack://wgact/./src/js/admin/script-blocker-warning.jsx","webpack://wgact/./src/js/admin/tabs.jsx","webpack://wgact/webpack/bootstrap","webpack://wgact/webpack/runtime/compat get default export","webpack://wgact/webpack/runtime/define property getters","webpack://wgact/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["jQuery(function () {\n\n\tjQuery('.wpm-rating-success-notice').show();\n\n\t// go and rate it or already done\n\tjQuery(document).on('click', '#wpm-rate-it', function (e) {\n\t\tprocess_click(e, 'rating_done');\n\n\t\tlet win = window.open('https://wordpress.org/support/view/plugin-reviews/woocommerce-google-adwords-conversion-tracking-tag?rate=5#postform', '_blank');\n\t\twin.focus();\n\t});\n\n\tjQuery(document).on('click', '#wpm-already-did', function (e) {\n\t\tprocess_click(e, 'rating_done');\n\t});\n\n\t// maybe rate later\n\tjQuery(document).on('click', '#wpm-maybe-later', function (e) {\n\t\tprocess_click(e, 'later');\n\t});\n\n\tfunction process_click(e, set) {\n\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'wpm_dismissed_notice_handler',\n\t\t\t'set' : set\n\t\t};\n\n\t\tjQuery.post(ajaxurl, data, function (response) {\n\t\t\t// console.log('Got this from the server: ' + response);\n\t\t\t// console.log('update rating done');\n\t\t});\n\t\tjQuery('.wpm-rating-success-notice').remove();\n\t}\n});\n","jQuery(function () {\n\n\t// disable incompatible plugin warning\n\tjQuery(document).on('click', '.incompatible-plugin-error-dismissal-button', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action' : 'environment_check_handler',\n\t\t\t'disable_warning': jQuery(this).data('plugin-slug'),\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\n\t// disable WP Rocket JavaScript concatenation\n\tjQuery(document).on('click', '#wpm-wp-rocket-js-concatenation-disable', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'disable_wp_rocket_javascript_concatenation'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\t// dismiss WP Rocket JavaScript concatenation error\n\tjQuery(document).on('click', '#wpm-dismiss-wp-rocket-js-concatenation-error', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'dismiss_wp_rocket_javascript_concatenation_error'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\t// disable WP Rocket JavaScript concatenation\n\tjQuery(document).on('click', '#wpm-litespeed-inline-js-dom-ready-disable', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'disable_litespeed_inline_js_dom_ready'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\t// dismiss WP Rocket JavaScript concatenation error\n\tjQuery(document).on('click', '#wpm-dismiss-litespeed-inline-js-dom-ready-error', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'dismiss_litespeed_inline_js_dom_ready'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n\t// dismiss PayPal standard payment gateway warning\n\tjQuery(document).on('click', '#wpm-paypal-standard-error-dismissal-button', function (e) {\n\t\te.preventDefault();\n\n\t\tlet data = {\n\t\t\t'action': 'environment_check_handler',\n\t\t\t'set' : 'dismiss_paypal_standard_warning'\n\t\t};\n\n\t\twpm_send_ajax_data(data);\n\t});\n\n});\n\nfunction wpm_send_ajax_data(data) {\n\tjQuery.post(ajaxurl, data, function (response) {\n\t\t// console.log('Got this from the server: ' + response);\n\t\t// console.log('update rating done');\n\t\tlocation.reload();\n\t});\n}\n","jQuery(function () {\n\n\t// copy debug info textarea\n\tjQuery(\"#debug-info-button\").click(function () {\n\t\tjQuery(\"#debug-info-textarea\").select();\n\t\tdocument.execCommand('copy');\n\t});\n\n\tjQuery(\"#wpm_pro_version_demo\").on('click', function () {\n\t\tjQuery(\"#submit\").click();\n\t});\n});\n","function wpm_hide_script_blocker_warning() {\n\tjQuery('#script-blocker-notice').hide();\n}\n\n// try to hide as soon as this script is loaded\n// might be too early in some cases, as the HTML is not rendered yet\nwpm_hide_script_blocker_warning();\n\n// if all other earlier attempts to hide did fail\n// run the function after entire DOM has been loaded\njQuery(function () {\n\twpm_hide_script_blocker_warning();\n});\n","jQuery(function () {\n\n\tlet sections = [];\n\tlet subsections = {};\n\n\t// hide unnecessary elements\n\tjQuery('.section').closest('tr').hide();\n\n\t// collect information on sections\n\tjQuery('.section').each(function () {\n\t\tsections.push({\n\t\t\t'slug' : jQuery(this).data('sectionSlug'),\n\t\t\t'title': jQuery(this).data('sectionTitle'),\n\t\t});\n\t});\n\n\t// collect information on subsections\n\tjQuery('.subsection').each(function () {\n\n\t\tsubsections[jQuery(this).data('sectionSlug')] = subsections[jQuery(this).data('sectionSlug')] || [];\n\n\t\tsubsections[jQuery(this).data('sectionSlug')].push({\n\t\t\t'title': jQuery(this).data('subsectionTitle'),\n\t\t\t'slug' : jQuery(this).data('subsectionSlug')\n\t\t});\n\t});\n\n\t// create tabs for sections\n\tsections.forEach(\n\t\tfunction (section) {\n\t\t\tjQuery(\".nav-tab-wrapper\").append(\"<a href=\\\"#\\\" class=\\\"nav-tab\\\" data-section-slug=\\\"\" + section['slug'] + \"\\\">\" + section['title'] + \"</a>\");\n\t\t});\n\n\t// create tabs for each subsections\n\tjQuery(\".nav-tab-wrapper\").after(createSubtabUlHtml(subsections));\n\n\t// create on-click events on section tabs that toggle the views\n\tjQuery(\".nav-tab-wrapper a\").on('click', function (e) {\n\t\te.preventDefault();\n\n\t\t// show clicked tab as active\n\t\tjQuery(this).addClass(\"nav-tab-active\").siblings().removeClass(\"nav-tab-active\");\n\n\t\t// toggle the sections visible / invisible based on clicked tab\n\n\t\tlet sectionSlug = jQuery(this).data('section-slug')\n\t\ttoggleSections(sectionSlug, sections);\n\n\t\t// if subsection exists, click on first subsection\n\t\tif (sectionSlug in subsections) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionSlug + \"]\").children(':first').trigger('click')\n\t\t}\n\t});\n\n\t// create on-click events on subsection tabs that toggle the views\n\tjQuery(\".subnav-li\").on('click', function (e) {\n\t\te.preventDefault();\n\n\t\t// jQuery(this).hide();\n\t\tjQuery(this)\n\t\t\t.addClass('subnav-li-active').removeClass('subnav-li-inactive')\n\t\t\t.siblings()\n\t\t\t.addClass('subnav-li-inactive').removeClass('subnav-li-active');\n\n\t\ttoggleSubsection(jQuery(this).parent().data('section-slug'), jQuery(this).data('subsection-slug'));\n\t});\n\n\t// if someone access a plugin tab by deep link, open the right tab\n\t// or fallback to default (first tab)\n\n\t// if deeplink is being opened open the according section and subsection\n\tif (getSectionParams()) {\n\n\t\tlet sectionParams = getSectionParams();\n\n\t\tjQuery(\"a[data-section-slug=\" + sectionParams['section'] + \"]\").trigger('click');\n\n\t\tif (sectionParams['subsection'] !== false) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionParams['section'] + \"]\").children(\"[data-subsection-slug=\" + sectionParams['subsection'] + \"]\").trigger('click')\n\t\t}\n\t} else {\n\t\tjQuery(\"a[data-section-slug=\" + sections[0]['slug'] + \"]\").trigger('click');\n\t}\n});\n\n// creates the html with all subsection elements\nfunction createSubtabUlHtml(subsections) {\n\n\tlet subsectionsKeys = Object.keys(subsections);\n\n\tlet html = '';\n\n\tsubsectionsKeys.forEach(function (subsectionKey) {\n\t\thtml += '<ul class=\"subnav-tabs\" data-section-slug=\"' + subsectionKey + '\">';\n\n\t\tlet subtabs = subsections[subsectionKey];\n\n\t\tsubtabs.forEach(function (subtab) {\n\t\t\thtml += '<li class=\"subnav-li subnav-li-inactive\" data-subsection-slug=\"' + subtab['slug'] + '\">' + subtab['title'] + '</li>'\n\t\t});\n\n\t\thtml += '</ul>';\n\t});\n\n\treturn html;\n}\n\n// if section (and subsection) URL parameters are set,\n// return them, otherwise return false\nfunction getSectionParams() {\n\tconst queryString = window.location.search;\n\tconst urlParams = new URLSearchParams(queryString);\n\n\tif (urlParams.get('section')) {\n\t\treturn {\n\t\t\t'section' : urlParams.get('section'),\n\t\t\t'subsection': urlParams.get('subsection')\n\t\t};\n\t} else {\n\t\treturn false;\n\t}\n}\n\n// toggles the sections\nfunction toggleSections(sectionSlug, sections) {\n\n\tjQuery(\"#wpm_settings_form > h2\").nextUntil(\".submit\").andSelf().hide();\n\tjQuery(\".subnav-tabs\").hide();\n\tjQuery(\".subnav-tabs[data-section-slug=\" + sectionSlug + \"]\").show();\n\n\tlet sectionPos = sections.findIndex((arrayElement) => arrayElement['slug'] === sectionSlug);\n\n\tjQuery(\"div[data-section-slug=\" + sectionSlug + \"]\").closest(\"table\").prevAll(\"h2:first\").next().nextUntil(\"h2, .submit\").andSelf().show();\n\n\t// set the URL with the active tab parameter\n\tsetUrl(sections[sectionPos]['slug']);\n}\n\nfunction toggleSubsection(sectionSlug, subsectionSlug) {\n\n\tjQuery(\"#wpm_settings_form > h2\").nextUntil(\".submit\").andSelf().hide();\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").siblings().andSelf().hide();\n\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"table\").show();\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").nextUntil(jQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug]\").closest('tr')).show();\n\n\t// set the URL with the active tab parameter\n\tsetUrl(sectionSlug, subsectionSlug);\n}\n\n// sets the new URL parameters\nfunction setUrl(sectionSlug, subsectionSlug = \"\") {\n\n\tconst queryString = window.location.search;\n\tconst urlParams = new URLSearchParams(queryString);\n\n\turlParams.delete('section');\n\turlParams.delete('subsection');\n\n\tlet newParams = \"section=\" + sectionSlug;\n\tnewParams += subsectionSlug ? \"&subsection=\" + subsectionSlug : \"\";\n\n\thistory.pushState('', 'wpm' + sectionSlug, document.location.pathname + \"?page=wpm&\" + newParams);\n\n\t// make WP remember which was the selected tab on a save and return to the same tab after saving\n\tjQuery('input[name =\"_wp_http_referer\"]').val(getAdminPath() + \"?page=wpm&\" + newParams + \"&settings-updated=true\");\n}\n\nfunction getAdminPath() {\n\tlet url = new URL(jQuery('#wp-admin-canonical').attr('href'));\n\treturn url.pathname;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))"],"names":["jQuery","process_click","e","set","preventDefault","data","post","ajaxurl","response","remove","show","document","on","window","open","focus","wpm_send_ajax_data","location","reload","this","click","select","execCommand","wpm_hide_script_blocker_warning","hide","getSectionParams","queryString","search","urlParams","URLSearchParams","get","setUrl","sectionSlug","subsectionSlug","delete","newParams","history","pushState","pathname","val","getAdminPath","URL","attr","sections","subsections","closest","each","push","forEach","section","append","after","subsectionsKeys","Object","keys","html","subsectionKey","subtab","createSubtabUlHtml","addClass","siblings","removeClass","nextUntil","andSelf","sectionPos","findIndex","arrayElement","prevAll","next","toggleSections","children","trigger","parent","sectionParams","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","defineProperty","enumerable","obj","prop","prototype","hasOwnProperty","call"],"sourceRoot":""}
|
js/public/wpm-public.p1.min.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
(()=>{var e={164:()=>{jQuery(document).on("wpmLoadPixels",(function(){var e,t,o,a,r,n;null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.facebook)||void 0===o||!o.pixel_id||null!==(a=wpmDataLayer)&&void 0!==a&&null!==(r=a.pixels)&&void 0!==r&&null!==(n=r.facebook)&&void 0!==n&&n.loaded||wpm.canIFire("ads","facebook-ads")&&wpm.loadFacebookPixel()})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var o,a,r;if(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.facebook)||void 0===r||!r.loaded)return;let e=wpm.getRandomEventId();fbq("track","AddToCart",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:e}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToCart",event_id:e,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmBeginCheckout",(function(e){try{var t,o,a;if(null===(t=wpmDataLayer)||void 0===t||null===(o=t.pixels)||void 0===o||null===(a=o.facebook)||void 0===a||!a.loaded)return;let e=wpm.getRandomEventId();fbq("track","InitiateCheckout",{},{eventID:e}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"InitiateCheckout",event_id:e,user_data:wpm.getFbUserData(),event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToWishlist",(function(e,t){try{var o,a,r;if(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.facebook)||void 0===r||!r.loaded)return;let e=wpm.getRandomEventId();fbq("track","AddToWishlist",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:e}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToWishlist",event_id:e,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var o,a,r;if(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.facebook)||void 0===r||!r.loaded)return;wpm.fbViewContent(t)}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,o;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.facebook)||void 0===o||!o.loaded)return;let a=wpm.getRandomEventId();fbq("track","Search",{},{eventID:a}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"Search",event_id:a,user_data:wpm.getFbUserData(),event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmLoadAlways",(function(){try{var e,t,o;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.facebook)||void 0===o||!o.loaded)return;wpm.setFbUserData()}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.facebook)||void 0===o||!o.loaded)return;fbq("track","Purchase",{content_type:"product",value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,content_ids:wpm.facebookContentIds()},{eventID:wpmDataLayer.order.id})}catch(e){console.error(e)}}))},1:()=>{!function(e,t,o){let a;e.loadFacebookPixel=function(){try{wpmDataLayer.pixels.facebook.loaded=!0,e=window,t=document,o="script",e.fbq||(a=e.fbq=function(){a.callMethod?a.callMethod.apply(a,arguments):a.queue.push(arguments)},e._fbq||(e._fbq=a),a.push=a,a.loaded=!0,a.version="2.0",a.queue=[],(r=t.createElement(o)).async=!0,r.src="https://connect.facebook.net/en_US/fbevents.js",(n=t.getElementsByTagName(o)[0]).parentNode.insertBefore(r,n)),fbq("init",wpmDataLayer.pixels.facebook.pixel_id),fbq("track","PageView")}catch(o){console.error(o)}var e,t,o,a,r,n},e.getRandomEventId=function(){return(Math.random()+1).toString(36).substring(2)},e.getFbUserData=function(){return a||e.getFbUserDataFromBrowser()},e.setFbUserData=function(){a=e.getFbUserDataFromBrowser()},e.getFbUserDataFromBrowser=function(){return{fbp:e.getCookie("_fbp"),fbc:e.getCookie("_fbc"),client_user_agent:navigator.userAgent}},e.fbViewContent=function(t){try{var o,a,r;if(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.facebook)||void 0===r||!r.loaded)return;let n=e.getRandomEventId();fbq("track","ViewContent",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],currency:wpmDataLayer.shop.currency,value:t.price},{eventID:n}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"ViewContent",event_id:n,user_data:e.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}},e.facebookContentIds=function(){let e=[];for(const[a,r]of Object.entries(wpmDataLayer.order.items)){var t,o;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput&&0!==r.variation_id?e.push(String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type])):e.push(String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))}return e}}(window.wpm=window.wpm||{},jQuery)},12:(e,t,o)=>{o(1),o(164)},165:()=>{jQuery(document).on("wpmViewItemList",(function(e,t){try{var o,a,r,n,i,s,d,l,c,u,p;if(jQuery.isEmptyObject(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.ads)||void 0===n?void 0:n.conversionIds))return;if(null===(i=wpmDataLayer)||void 0===i||null===(s=i.pixels)||void 0===s||null===(d=s.google)||void 0===d||null===(l=d.ads)||void 0===l||null===(c=l.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;if(null!==(u=wpmDataLayer)&&void 0!==u&&null!==(p=u.general)&&void 0!==p&&p.variationsOutput&&t.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids)return;if(!t)return;wpm.gtagLoaded().then((function(){gtag("event","view_item_list",{send_to:wpm.getGoogleAdsConversionIdentifiers(),items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var o,a,r,n,i,s,d,l,c;if(jQuery.isEmptyObject(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.ads)||void 0===n?void 0:n.conversionIds))return;if(null===(i=wpmDataLayer)||void 0===i||null===(s=i.pixels)||void 0===s||null===(d=s.google)||void 0===d||null===(l=d.ads)||void 0===l||null===(c=l.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","add_to_cart",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:t.quantity*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:t.quantity,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var o,a,r,n,i,s,d,l,c;if(jQuery.isEmptyObject(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.ads)||void 0===n?void 0:n.conversionIds))return;if(null===(i=wpmDataLayer)||void 0===i||null===(s=i.pixels)||void 0===s||null===(d=s.google)||void 0===d||null===(l=d.ads)||void 0===l||null===(c=l.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","view_item",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:(t.quantity?t.quantity:1)*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:t.quantity?t.quantity:1,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,o,a,r,n,i,s,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.ads)||void 0===a?void 0:a.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(n=r.pixels)||void 0===n||null===(i=n.google)||void 0===i||null===(s=i.ads)||void 0===s||null===(d=s.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;let u=[];for(const[e,t]of Object.entries(wpmDataLayer.products)){var l,c;if(null!==(l=wpmDataLayer)&&void 0!==l&&null!==(c=l.general)&&void 0!==c&&c.variationsOutput&&t.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids)return;u.push({id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical})}wpm.gtagLoaded().then((function(){gtag("event","view_search_results",{send_to:wpm.getGoogleAdsConversionIdentifiers(),items:u})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o,a,r,n,i,s,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.ads)||void 0===a?void 0:a.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(n=r.pixels)||void 0===n||null===(i=n.google)||void 0===i||null===(s=i.ads)||void 0===s||null===(d=s.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:wpmDataLayer.order.value_filtered,items:wpm.getGoogleAdsDynamicRemarketingOrderItems()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmLogin",(function(){try{var e,t,o,a,r,n,i,s,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.ads)||void 0===a?void 0:a.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(n=r.pixels)||void 0===n||null===(i=n.google)||void 0===i||null===(s=i.ads)||void 0===s||null===(d=s.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","login",{send_to:wpm.getGoogleAdsConversionIdentifiers()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o,a,r,n;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.ads)||void 0===a?void 0:a.conversionIds))return;if(!wpm.googleConfigConditionsMet("ads"))return;let i={},s={};i={send_to:wpm.getGoogleAdsConversionIdentifiersWithLabel(),transaction_id:wpmDataLayer.order.number,value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,new_customer:wpmDataLayer.order.new_customer},null!==(r=wpmDataLayer)&&void 0!==r&&null!==(n=r.order)&&void 0!==n&&n.aw_merchant_id&&(s={discount:wpmDataLayer.order.discount,aw_merchant_id:wpmDataLayer.order.aw_merchant_id,aw_feed_country:wpmDataLayer.order.aw_feed_country,aw_feed_language:wpmDataLayer.order.aw_feed_language,items:wpm.getGoogleAdsRegularOrderItems()}),wpm.gtagLoaded().then((function(){gtag("event","conversion",{...i,...s})}))}catch(e){console.error(e)}}))},42:()=>{!function(e,t,o){let a=[];e.getGoogleAdsConversionIdentifiersWithLabel=function(){for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))a.push(e+"/"+t);return a},e.getGoogleAdsConversionIdentifiers=function(){let e=[];for(const[t,o]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))e.push(t);return e},e.getGoogleAdsRegularOrderItems=function(){let e=[];for(const[a,r]of Object.entries(wpmDataLayer.order.items)){var t,o;let a;a={quantity:r.quantity,price:r.price},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput&&0!==r.variation_id?(a.id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(a)):(a.id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(a))}return e},e.getGoogleAdsDynamicRemarketingOrderItems=function(){let e=[];for(const[a,r]of Object.entries(wpmDataLayer.order.items)){var t,o;let a;a={quantity:r.quantity,price:r.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput&&0!==r.variation_id?(a.id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(a)):(a.id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(a))}return e}}(window.wpm=window.wpm||{},jQuery)},190:(e,t,o)=>{o(42),o(165)},625:()=>{jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o,a,r,n,i,s,d,l;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.analytics)||void 0===a||null===(r=a.universal)||void 0===r||!r.property_id)return;if(null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.universal)&&void 0!==l&&l.mp_active)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:[wpmDataLayer.pixels.google.analytics.universal.property_id],transaction_id:wpmDataLayer.order.number,affiliation:wpmDataLayer.order.affiliation,currency:wpmDataLayer.order.currency,value:wpmDataLayer.order.value_regular,discount:wpmDataLayer.order.discount,tax:wpmDataLayer.order.tax,shipping:wpmDataLayer.order.shipping,coupon:wpmDataLayer.order.coupon,items:wpm.getGAUAOrderItems()})}))}catch(e){console.error(e)}}))},19:()=>{!function(e,t,o){e.getGAUAOrderItems=function(){let e=[],t=1;for(const[r,n]of Object.entries(wpmDataLayer.order.items)){var o,a;let r;r={quantity:n.quantity,price:n.price,name:n.name,currency:wpmDataLayer.order.currency,category:wpmDataLayer.products[n.id].category.join("/"),list_position:t},null!==(o=wpmDataLayer)&&void 0!==o&&null!==(a=o.general)&&void 0!==a&&a.variationsOutput&&0!==n.variation_id?(r.id=String(wpmDataLayer.products[n.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),r.variant=wpmDataLayer.products[n.variation_id].variant_name,r.brand=wpmDataLayer.products[n.variation_id].brand):(r.id=String(wpmDataLayer.products[n.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),r.brand=wpmDataLayer.products[n.id].brand),e.push(r),t++}return e}}(window.wpm=window.wpm||{},jQuery)},562:(e,t,o)=>{o(19),o(625)},572:()=>{jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o,a,r,n,i,s,d,l;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.analytics)||void 0===a||null===(r=a.ga4)||void 0===r||!r.measurement_id)return;if(null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.ga4)&&void 0!==l&&l.mp_active)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:[wpmDataLayer.pixels.google.analytics.ga4.measurement_id],transaction_id:wpmDataLayer.order.number,affiliation:wpmDataLayer.order.affiliation,currency:wpmDataLayer.order.currency,value:wpmDataLayer.order.value_regular,discount:wpmDataLayer.order.discount,tax:wpmDataLayer.order.tax,shipping:wpmDataLayer.order.shipping,coupon:wpmDataLayer.order.coupon,items:wpm.getGA4OrderItems()})}))}catch(e){console.error(e)}}))},228:()=>{!function(e,t,o){e.getGA4OrderItems=function(){let e=[];for(const[a,r]of Object.entries(wpmDataLayer.order.items)){var t,o;let a;a={quantity:r.quantity,price:r.price,item_name:r.name,currency:wpmDataLayer.order.currency,item_category:wpmDataLayer.products[r.id].category.join("/")},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput&&0!==r.variation_id?(a.item_id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),a.item_variant=wpmDataLayer.products[r.variation_id].variant_name,a.item_brand=wpmDataLayer.products[r.variation_id].brand):(a.item_id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),a.item_brand=wpmDataLayer.products[r.id].brand),e.push(a)}return e}}(window.wpm=window.wpm||{},jQuery)},522:(e,t,o)=>{o(228),o(572)},774:(e,t,o)=>{o(562),o(522)},294:()=>{jQuery(document).on("wpmLoadPixels",(function(){var e,t,o;void 0===(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o?void 0:o.state)&&(wpm.canGoogleLoad()?wpm.loadGoogle():wpm.logPreventedPixelLoading("google","analytics / ads"))}))},860:()=>{!function(e,t,o){e.googleConfigConditionsMet=function(t){var o,a,r,n;return!(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.consent_mode)||void 0===n||!n.active)||("category"===e.getConsentValues().mode?!0===e.getConsentValues().categories[t]:"pixel"===e.getConsentValues().mode&&e.getConsentValues().pixels.includes("google-"+t))},e.getVisitorConsentStatusAndUpdateGoogleConsentSettings=function(t){return"category"===e.getConsentValues().mode?(e.getConsentValues().categories.analytics&&(t.analytics_storage="granted"),e.getConsentValues().categories.ads&&(t.ad_storage="granted")):"pixel"===e.getConsentValues().mode&&(t.analytics_storage=e.getConsentValues().pixels.includes("google-analytics")?"granted":"denied",t.ad_storage=e.getConsentValues().pixels.includes("google-ads")?"granted":"denied"),t},e.updateGoogleConsentMode=function(){let e=!(arguments.length>0&&arguments[0]!==o)||arguments[0],t=!(arguments.length>1&&arguments[1]!==o)||arguments[1];try{if(!window.gtag||!wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent)return;gtag("consent","update",{analytics_storage:e?"granted":"denied",ad_storage:t?"granted":"denied"})}catch(e){console.error(e)}},e.fireGtagGoogleAds=function(){try{var e,t,o,a,r,n,i,s,d,l,c,u,p,g,m,y,w,v,f,_,h;if(wpmDataLayer.pixels.google.ads.state="loading",null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(o=t.google)&&void 0!==o&&null!==(a=o.ads)&&void 0!==a&&null!==(r=a.enhanced_conversions)&&void 0!==r&&r.active)for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))gtag("config",e,{allow_enhanced_conversions:!0});else for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))gtag("config",e);null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.ads)&&void 0!==d&&d.conversionIds&&null!==(l=wpmDataLayer)&&void 0!==l&&null!==(c=l.pixels)&&void 0!==c&&null!==(u=c.google)&&void 0!==u&&null!==(p=u.ads)&&void 0!==p&&p.phone_conversion_label&&null!==(g=wpmDataLayer)&&void 0!==g&&null!==(m=g.pixels)&&void 0!==m&&null!==(y=m.google)&&void 0!==y&&null!==(w=y.ads)&&void 0!==w&&w.phone_conversion_number&>ag("config",Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]+"/"+wpmDataLayer.pixels.google.ads.phone_conversion_label,{phone_conversion_number:wpmDataLayer.pixels.google.ads.phone_conversion_number}),"order_received_page"===wpmDataLayer.shop.page_type&&null!==(v=wpmDataLayer)&&void 0!==v&&null!==(f=v.order)&&void 0!==f&&null!==(_=f.google)&&void 0!==_&&null!==(h=_.ads)&&void 0!==h&&h.enhanced_conversion_data&&(window.enhanced_conversion_data=wpmDataLayer.order.google.ads.enhanced_conversion_data),wpmDataLayer.pixels.google.ads.state="ready"}catch(e){console.error(e)}},e.fireGtagGoogleAnalyticsUA=function(){try{wpmDataLayer.pixels.google.analytics.universal.state="loading",gtag("config",wpmDataLayer.pixels.google.analytics.universal.property_id,wpmDataLayer.pixels.google.analytics.universal.parameters),wpmDataLayer.pixels.google.analytics.universal.state="ready"}catch(e){console.error(e)}},e.fireGtagGoogleAnalyticsGA4=function(){try{wpmDataLayer.pixels.google.analytics.ga4.state="loading",gtag("config",wpmDataLayer.pixels.google.analytics.ga4.measurement_id,wpmDataLayer.pixels.google.analytics.ga4.parameters),wpmDataLayer.pixels.google.analytics.ga4.state="ready"}catch(e){console.error(e)}},e.isGoogleActive=function(){var e,t,o,a,r,n,i,s,d,l,c,u,p,g;return!(!(null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(o=t.google)&&void 0!==o&&null!==(a=o.analytics)&&void 0!==a&&null!==(r=a.universal)&&void 0!==r&&r.property_id||null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.ga4)&&void 0!==l&&l.measurement_id)&&jQuery.isEmptyObject(null===(c=wpmDataLayer)||void 0===c||null===(u=c.pixels)||void 0===u||null===(p=u.google)||void 0===p||null===(g=p.ads)||void 0===g?void 0:g.conversionIds))},e.getGoogleGtagId=function(){var e,t,o,a,r,n,i,s,d,l;return null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(o=t.google)&&void 0!==o&&null!==(a=o.analytics)&&void 0!==a&&null!==(r=a.universal)&&void 0!==r&&r.property_id?wpmDataLayer.pixels.google.analytics.universal.property_id:null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.ga4)&&void 0!==l&&l.measurement_id?wpmDataLayer.pixels.google.analytics.ga4.measurement_id:Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]},e.loadGoogle=function(){e.isGoogleActive()&&(wpmDataLayer.pixels.google.state="loading",e.loadScriptAndCacheIt("https://www.googletagmanager.com/gtag/js?id="+e.getGoogleGtagId()).done((function(t,o){try{var a,r,n,i,s,d,l,c,u,p,g,m,y,w,v,f,_,h,L,D,C,b;if(window.dataLayer=window.dataLayer||[],window.gtag=function(){dataLayer.push(arguments)},null!==(a=wpmDataLayer)&&void 0!==a&&null!==(r=a.pixels)&&void 0!==r&&null!==(n=r.google)&&void 0!==n&&null!==(i=n.consent_mode)&&void 0!==i&&i.active){var x,j,k,I;let t={ad_storage:wpmDataLayer.pixels.google.consent_mode.ad_storage,analytics_storage:wpmDataLayer.pixels.google.consent_mode.analytics_storage,wait_for_update:wpmDataLayer.pixels.google.consent_mode.wait_for_update};null!==(x=wpmDataLayer)&&void 0!==x&&null!==(j=x.pixels)&&void 0!==j&&null!==(k=j.google)&&void 0!==k&&null!==(I=k.consent_mode)&&void 0!==I&&I.region&&(t.region=wpmDataLayer.pixels.google.consent_mode.region),t=e.getVisitorConsentStatusAndUpdateGoogleConsentSettings(t),gtag("consent","default",t),gtag("set","ads_data_redaction",wpmDataLayer.pixels.google.consent_mode.ads_data_redaction),gtag("set","url_passthrough",wpmDataLayer.pixels.google.consent_mode.url_passthrough)}null!==(s=wpmDataLayer)&&void 0!==s&&null!==(d=s.pixels)&&void 0!==d&&null!==(l=d.google)&&void 0!==l&&null!==(c=l.linker)&&void 0!==c&&c.settings&>ag("set","linker",wpmDataLayer.pixels.google.linker.settings),gtag("js",new Date),jQuery.isEmptyObject(null===(u=wpmDataLayer)||void 0===u||null===(p=u.pixels)||void 0===p||null===(g=p.google)||void 0===g||null===(m=g.ads)||void 0===m?void 0:m.conversionIds)||(e.googleConfigConditionsMet("ads")?e.fireGtagGoogleAds():e.logPreventedPixelLoading("google-ads","ads")),null!==(y=wpmDataLayer)&&void 0!==y&&null!==(w=y.pixels)&&void 0!==w&&null!==(v=w.google)&&void 0!==v&&null!==(f=v.analytics)&&void 0!==f&&null!==(_=f.universal)&&void 0!==_&&_.property_id&&(e.googleConfigConditionsMet("analytics")?e.fireGtagGoogleAnalyticsUA():e.logPreventedPixelLoading("google-universal-analytics","analytics")),null!==(h=wpmDataLayer)&&void 0!==h&&null!==(L=h.pixels)&&void 0!==L&&null!==(D=L.google)&&void 0!==D&&null!==(C=D.analytics)&&void 0!==C&&null!==(b=C.ga4)&&void 0!==b&&b.measurement_id&&(e.googleConfigConditionsMet("analytics")?e.fireGtagGoogleAnalyticsGA4():e.logPreventedPixelLoading("ga4","analytics")),wpmDataLayer.pixels.google.state="ready"}catch(e){console.error(e)}})))},e.canGoogleLoad=function(){var t,o,a,r;return!(null===(t=wpmDataLayer)||void 0===t||null===(o=t.pixels)||void 0===o||null===(a=o.google)||void 0===a||null===(r=a.consent_mode)||void 0===r||!r.active)||("category"===e.getConsentValues().mode?!(!e.getConsentValues().categories.ads&&!e.getConsentValues().categories.analytics):"pixel"===e.getConsentValues().mode?e.getConsentValues().pixels.includes("google-ads")||e.getConsentValues().pixels.includes("google-analytics"):(console.error("Couldn't find a valid load condition for Google mode in wpmConsentValues"),!1))},e.gtagLoaded=function(){return new Promise((function(e,t){var o,a,r;void 0===(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r?void 0:r.state)&&t();let n=0;!function o(){var a,r,i;return"ready"===(null===(a=wpmDataLayer)||void 0===a||null===(r=a.pixels)||void 0===r||null===(i=r.google)||void 0===i?void 0:i.state)?e():n>=5e3?t():(n+=200,void setTimeout(o,200))}()}))}}(window.wpm=window.wpm||{},jQuery)},580:(e,t,o)=>{o(860),o(294)},69:(e,t,o)=>{o(580),o(190),o(774),o(463)},945:()=>{jQuery(document).on("wpmLoadPixels",(function(){var e,t,o,a,r,n,i,s;null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.optimize)||void 0===a||!a.container_id||null!==(r=wpmDataLayer)&&void 0!==r&&null!==(n=r.pixels)&&void 0!==n&&null!==(i=n.google)&&void 0!==i&&null!==(s=i.optimize)&&void 0!==s&&s.loaded||wpm.canIFire("analytics","google-optimize")&&wpm.load_google_optimize_pixel()}))},962:()=>{!function(e,t,o){e.load_google_optimize_pixel=function(){try{wpmDataLayer.pixels.google.optimize.loaded=!0,e.loadScriptAndCacheIt("https://www.googleoptimize.com/optimize.js?id="+wpmDataLayer.pixels.google.optimize.container_id)}catch(e){console.error(e)}}}(window.wpm=window.wpm||{},jQuery)},463:(e,t,o)=>{o(962),o(945)},300:()=>{jQuery(document).on("wpmLoadPixels",(function(){var e,t,o,a,r,n,i,s,d;null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.hotjar)||void 0===o||!o.site_id||null!==(a=wpmDataLayer)&&void 0!==a&&null!==(r=a.pixels)&&void 0!==r&&null!==(n=r.hotjar)&&void 0!==n&&n.loaded||!wpm.canIFire("analytics","hotjar")||null!==(i=wpmDataLayer)&&void 0!==i&&null!==(s=i.pixels)&&void 0!==s&&null!==(d=s.hotjar)&&void 0!==d&&d.loaded||wpm.load_hotjar_pixel()}))},376:()=>{!function(e,t,o){e.load_hotjar_pixel=function(){try{wpmDataLayer.pixels.hotjar.loaded=!0,e=window,t=document,e.hj=e.hj||function(){(e.hj.q=e.hj.q||[]).push(arguments)},e._hjSettings={hjid:wpmDataLayer.pixels.hotjar.site_id,hjsv:6},o=t.getElementsByTagName("head")[0],(a=t.createElement("script")).async=1,a.src="https://static.hotjar.com/c/hotjar-"+e._hjSettings.hjid+".js?sv="+e._hjSettings.hjsv,o.appendChild(a)}catch(e){console.error(e)}var e,t,o,a}}(window.wpm=window.wpm||{},jQuery)},787:(e,t,o)=>{o(376),o(300)},299:()=>{jQuery(document).on("click",".remove_from_cart_button, .remove",(function(){try{let e=new URL(jQuery(this).attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e);wpm.removeProductFromCart(t)}catch(e){console.error(e)}})),jQuery(document).on("click",".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button",(function(){try{if("product"===wpmDataLayer.shop.page_type){if(void 0!==jQuery(this).attr("href")&&jQuery(this).attr("href").includes("add-to-cart")){let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}else if("simple"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).val();wpm.addProductToCart(t,e)}else if("variable"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("[name='variation_id']").val();wpm.addProductToCart(t,e)}else if("grouped"===wpmDataLayer.shop.product_type)jQuery(".woocommerce-grouped-product-list-item").each((function(){let e=Number(jQuery(this).find(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).attr("class"),o=wpm.getPostIdFromString(t);wpm.addProductToCart(o,e)}));else if("bundle"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("input[name=add-to-cart]").val();wpm.addProductToCart(t,e)}}else{let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}}catch(e){console.error(e)}})),jQuery(document).one("click","a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)",(function(e){try{if(jQuery(e.target).closest("a").attr("href")){let t=jQuery(e.target).closest("a").attr("href");if(t.includes("add-to-cart=")){let e=t.match(/(add-to-cart=)(\d+)/);e&&wpm.addProductToCart(e[2],1)}}}catch(e){console.error(e)}})),jQuery(document).on("click",".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product",(function(){try{let e=jQuery(this).nextAll(".wpmProductId:first").data("id");if(e){if(e=getIdBasedOndVariationsOutputSetting(e),!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmSelectContentGaUa",t),jQuery(document).trigger("wpmSelectItem",t)}}}catch(e){console.error(e)}})),jQuery(document).one("click",".checkout-button, .cart-checkout-button, .button.checkout",(function(){jQuery(document).trigger("wpmBeginCheckout")})),jQuery(document).on("input","#billing_email",(function(){wpm.isEmail(jQuery(this).val())&&(wpm.fireCheckoutProgress(2),wpm.emailSelected=!0)})),jQuery(document).on("click",".wc_payment_methods",(function(){!1===wpm.paymentMethodSelected&&wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),wpm.paymentMethodSelected=!0})),jQuery(document).one("click","#place_order",(function(){!1===wpm.emailSelected&&wpm.fireCheckoutProgress(2),!1===wpm.paymentMethodSelected&&(wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),wpm.fireCheckoutProgress(4)})),jQuery(document).on("click","[name='update_cart']",(function(){try{jQuery(".cart_item").each((function(){let e=new URL(jQuery(this).find(".product-remove").find("a").attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e),o=jQuery(this).find(".qty").val();0===o?wpm.removeProductFromCart(t):o<wpmDataLayer.cart[t].quantity?wpm.removeProductFromCart(t,wpmDataLayer.cart[t].quantity-o):o>wpmDataLayer.cart[t].quantity&&wpm.addProductToCart(t,o-wpmDataLayer.cart[t].quantity)}))}catch(e){console.error(e),wpm.getCartItemsFromBackend()}})),jQuery(document).on("click",".add_to_wishlist, .wl-add-to",(function(){try{let e;if(jQuery(this).data("productid")?e=jQuery(this).data("productid"):jQuery(this).data("product-id")&&(e=jQuery(this).data("product-id")),!e)throw Error("Wasn't able to retrieve a productId");let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmAddToWishlist",t)}catch(e){console.error(e)}})),jQuery(document).on("updated_cart_totals",(function(){jQuery(document).trigger("wpmViewCart")})),jQuery(".single_variation_wrap").on("show_variation",(function(e,t){try{let e=getIdBasedOndVariationsOutputSetting(t.variation_id);if(!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmViewItem",t)}}catch(e){console.error(e)}})),jQuery(".single_variation_wrap").on("hide_variation",(function(){try{var e,t;let o=jQuery("body").attr("class").match(/(postid-)(\d+)/)[2];if(!o)throw Error("Wasn't able to retrieve a productId");if("variable"===wpmDataLayer.shop.product_type&&null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.general)&&void 0!==t&&t.variationsOutput)for(const[e,t]of Object.entries(wpmDataLayer.products))if("parentId"in t){o=t.id;break}if(wpmDataLayer.products&&wpmDataLayer.products[o]){let e=wpm.getProductDetailsFormattedForEvent(o);jQuery(document).trigger("wpmViewItem",e)}}catch(e){console.error(e)}})),jQuery(window).on("wpmLoad",(function(){try{wpm.doesWooCommerceCartExist()&&wpm.getCartItems()}catch(e){console.error(e)}})),jQuery(window).on("wpmLoad",(function(){wpmDataLayer.products=wpmDataLayer.products||{};let e=wpm.getAddToCartLinkProductIds();wpm.getProductsFromBackend(e)})),jQuery(window).on("wpmLoad",(function(){if(!wpm.getCookie("wpmReferrer"))if(document.referrer){let e=new URL(document.referrer).hostname;e!==window.location.host?wpm.setCookie("wpmReferrer",e):wpm.setCookie("wpmReferrer","")}else wpm.setCookie("wpmReferrer","")})),jQuery(window).on("wpmLoad",(function(){try{var e;if("undefined"!=typeof wpmDataLayer&&(null===(e=wpmDataLayer)||void 0===e||!e.wpmLoadFired)){var t,o;if(jQuery(document).trigger("wpmLoadAlways"),"product"===wpmDataLayer.shop.page_type&&"variable"!==wpmDataLayer.shop.product_type&&wpm.getMainProductIdFromProductPage()){let e=wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());jQuery(document).trigger("wpmViewItem",e)}else"product_category"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmCategory"):"search"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmSearch"):"cart"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmViewCart"):"order_received_page"===wpmDataLayer.shop.page_type&&wpmDataLayer.order?wpm.isOrderIdStored(wpmDataLayer.order.id)||(jQuery(document).trigger("wpmOrderReceivedPage"),wpm.writeOrderIdToStorage(wpmDataLayer.order.id)):jQuery(document).trigger("wpmEverywhereElse");null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.user)&&void 0!==o&&o.id&&!wpm.hasLoginEventFired()&&(jQuery(document).trigger("wpmLogin"),wpm.setLoginEventFired()),wpmDataLayer.wpmLoadFired=!0}}catch(e){console.error(e)}})),jQuery(window).on("wpmPreLoadPixels",(function(){var e,t,o;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.shop)&&void 0!==t&&null!==(o=t.cookie_consent_mgmt)&&void 0!==o&&o.explicit_consent&&wpm.updateConsentCookieValues(!0),jQuery(document).trigger("wpmLoadPixels",{})}))},584:()=>{!function(e,t,o){const a="_wpm_order_ids",r="_wpm_endpoint_available",n="/wp-json/";function i(){return""!==e.getCookie(a)}e.emailSelected=!1,e.paymentMethodSelected=!1,e.useRestEndpoint=function(){return e.isSessionStorageAvailable()&&e.isRestEndpointAvailable()&&e.isBelowRestErrorThreshold()},e.isBelowRestErrorThreshold=function(){return window.sessionStorage.getItem(0)<=10},e.isRestEndpointAvailable=function(){if(window.sessionStorage.getItem(r))return JSON.parse(window.sessionStorage.getItem(r));e.testEndpoint()},e.isSessionStorageAvailable=function(){return!!window.sessionStorage},e.testEndpoint=function(){let e=arguments.length>0&&arguments[0]!==o?arguments[0]:location.protocol+"//"+location.host+n,t=arguments.length>1&&arguments[1]!==o?arguments[1]:r;jQuery.ajax(e,{type:"HEAD",timeout:1e3,statusCode:{200:function(e){window.sessionStorage.setItem(t,JSON.stringify(!0))},404:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))},0:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))}}}).then((e=>{}))},e.isWpmRestEndpointAvailable=function(){let t=arguments.length>0&&arguments[0]!==o?arguments[0]:r;return!!e.getCookie(t)},e.writeOrderIdToStorage=function(t){if(window.Storage)if(null===localStorage.getItem(a)){let e=[];e.push(t),window.localStorage.setItem(a,JSON.stringify(e))}else{let e=JSON.parse(localStorage.getItem(a));e.includes(t)||(e.push(t),window.localStorage.setItem(a,JSON.stringify(e)))}else{let o=new Date;o.setDate(o.getDate()+365);let r=[];i()&&(r=JSON.parse(e.getCookie(a))),r.includes(t)||(r.push(t),document.cookie="_wpm_order_ids="+JSON.stringify(r)+";expires="+o.toUTCString())}"function"==typeof e.storeOrderIdOnServer&&wpmDataLayer.orderDeduplication&&e.storeOrderIdOnServer(t)},e.isOrderIdStored=function(t){return wpmDataLayer.orderDeduplication?window.Storage?null!==localStorage.getItem(a)&&JSON.parse(localStorage.getItem(a)).includes(t):!!i()&&JSON.parse(e.getCookie(a)).includes(t):(console.log("order duplication prevention: off"),!1)},e.isEmail=function(e){return/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)},e.removeProductFromCart=function(t){let a=arguments.length>1&&arguments[1]!==o?arguments[1]:null;try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");let o;if(o=null==a?wpmDataLayer.cart[t].quantity:a,wpmDataLayer.cart[t]){let r=e.getProductDetailsFormattedForEvent(t,o);jQuery(document).trigger("wpmRemoveFromCart",r),null==a||wpmDataLayer.cart[t].quantity===a?(delete wpmDataLayer.cart[t],sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):(wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity-o,sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart)))}}catch(e){console.error(e)}},getIdBasedOndVariationsOutputSetting=function(e){try{var t,o;return null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput?e:wpmDataLayer.products[e].isVariation?wpmDataLayer.products[e].parentId:e}catch(e){console.error(e)}},e.addProductToCart=function(t,o){try{var a;if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");if(null!==(a=wpmDataLayer)&&void 0!==a&&a.products[t]){var r;let a=e.getProductDetailsFormattedForEvent(t,o);jQuery(document).trigger("wpmAddToCart",a),null!==(r=wpmDataLayer)&&void 0!==r&&r.cart[t]?wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity+o:("cart"in wpmDataLayer||(wpmDataLayer.cart={}),wpmDataLayer.cart[t]=e.getProductDetailsFormattedForEvent(t,o)),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))}}catch(t){console.error(t),e.getCartItemsFromBackend()}},e.getCartItems=function(){sessionStorage?sessionStorage.getItem("wpmDataLayerCart")&&"order_received_page"!==wpmDataLayer.shop.page_type?e.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem("wpmDataLayerCart"))):sessionStorage.setItem("wpmDataLayerCart",JSON.stringify({})):e.getCartItemsFromBackend()},e.getCartItemsFromBackend=function(){try{let t={action:"wpm_get_cart_items"};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:t,success:function(t){t.cart||(t.cart={}),e.saveCartObjectToDataLayer(t.cart),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(t.cart))}})}catch(e){console.error(e)}},e.getProductsFromBackend=function(t){if((t=t.filter((e=>!wpmDataLayer.products.hasOwnProperty(e))))&&0!==t.length)try{let o={action:"wpm_get_product_ids",productIds:t};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:o,success:function(e){wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},error:function(e){console.log(e)}})}catch(e){console.error(e)}},e.saveCartObjectToDataLayer=function(e){wpmDataLayer.cart=e,wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},e.fireCheckoutOption=function(e){let t=arguments.length>1&&arguments[1]!==o?arguments[1]:null,a=arguments.length>2&&arguments[2]!==o?arguments[2]:null,r={step:e,checkout_option:t,value:a};jQuery(document).trigger("wpmFireCheckoutOption",r)},e.fireCheckoutProgress=function(e){let t={step:e};jQuery(document).trigger("wpmFireCheckoutProgress",t)},e.getPostIdFromString=function(e){try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("wpmViewItemList",e.getProductDataForViewItemEvent(t))},e.getProductDataForViewItemEvent=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");try{if(wpmDataLayer.products[t])return e.getProductDetailsFormattedForEvent(t)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=function(){try{return["simple","variable","grouped","composite","bundle"].indexOf(wpmDataLayer.shop.product_type)>=0&&jQuery(".wpmProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=function(e){jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:wpmDataLayer.viewItemListTrigger.opacity,"background-color":wpmDataLayer.viewItemListTrigger.backgroundColor})},e.getSearchTermFromUrl=function(){try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let s,d={};e.observerCallback=function(t,o){t.forEach((t=>{try{let a,r=jQuery(t.target).data("ioid");if(a=jQuery(t.target).next(".wpmProductId").length?jQuery(t.target).next(".wpmProductId").data("id"):jQuery(t.target).find(".wpmProductId").data("id"),!a)throw Error("wpmProductId element not found");t.isIntersecting?d[r]=setTimeout((()=>{e.triggerViewItemList(a),wpmDataLayer.viewItemListTrigger.testMode&&e.viewItemListTriggerTestMode(t.target),!1===wpmDataLayer.viewItemListTrigger.repeat&&o.unobserve(t.target)}),wpmDataLayer.viewItemListTrigger.timeout):(clearTimeout(d[r]),wpmDataLayer.viewItemListTrigger.testMode&&jQuery(t.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}}))};let l,c=0;e.startIntersectionObserverToWatch=function(){try{e.urlHasParameter("vildemomode")&&(wpmDataLayer.viewItemListTrigger.testMode=!0),s=new IntersectionObserver(e.observerCallback,{threshold:wpmDataLayer.viewItemListTrigger.threshold}),l=jQuery(".wpmProductId").map((function(e,t){return jQuery(t).parent().hasClass("type-product")||jQuery(t).parent().hasClass("product")||jQuery(t).parent().hasClass("product-item-inner")?jQuery(t).parent():jQuery(t).prev().hasClass("wc-block-grid__product")||jQuery(t).prev().hasClass("product")||jQuery(t).prev().hasClass("product-small")||jQuery(t).prev().hasClass("woocommerce-LoopProduct-link")?jQuery(this).prev():jQuery(t).closest(".product").length?jQuery(t).closest(".product"):void 0})),l.each((function(e,t){jQuery(t[0]).data("ioid",c++),s.observe(t[0])}))}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=function(){try{let e=jQuery(".wpmProductId:eq(0)").parents().has(jQuery(".wpmProductId:eq(1)").parents()).first();e.length&&u.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};let u=new MutationObserver((function(e){e.forEach((function(e){let t=e.addedNodes;null!==t&&jQuery(t).each((function(){(jQuery(this).hasClass("type-product")||jQuery(this).hasClass("product-small")||jQuery(this).hasClass("wc-block-grid__product"))&&p(this)&&(jQuery(this).data("ioid",c++),s.observe(this))}))}))})),p=function(e){return!(!jQuery(e).find(".wpmProductId").length&&!jQuery(e).siblings(".wpmProductId").length)};e.setCookie=function(e){let t=arguments.length>1&&arguments[1]!==o?arguments[1]:"",a=arguments.length>2&&arguments[2]!==o?arguments[2]:null;if(a){let o=new Date;o.setTime(o.getTime()+24*a*60*60*1e3);let r="expires="+o.toUTCString();document.cookie=e+"="+t+";"+r+";path=/"}else document.cookie=e+"="+t+";path=/"},e.getCookie=function(e){let t=e+"=",o=decodeURIComponent(document.cookie).split(";");for(let e=0;e<o.length;e++){let a=o[e];for(;" "==a.charAt(0);)a=a.substring(1);if(0==a.indexOf(t))return a.substring(t.length,a.length)}return""},e.getWpmSessionData=function(){if(window.sessionStorage){let e=window.sessionStorage.getItem("_wpm");return null!==e?JSON.parse(e):{}}return{}},e.setWpmSessionData=function(e){window.sessionStorage&&window.sessionStorage.setItem("_wpm",JSON.stringify(e))},e.storeOrderIdOnServer=function(t){try{let o={action:"wpm_purchase_pixels_fired",order_id:t,nonce:e.nonce};jQuery.ajax({type:"post",dataType:"json",url:e.ajax_url,data:o,success:function(e){!1===e.success&&console.log(e)},error:function(e){console.log(e)}})}catch(e){console.error(e)}},e.getProductIdByCartItemKeyUrl=function(e){let t,o=new URLSearchParams(e.search).get("remove_item");return t=0===wpmDataLayer.cartItemKeys[o].variation_id?wpmDataLayer.cartItemKeys[o].product_id:wpmDataLayer.cartItemKeys[o].variation_id,t},e.getAddToCartLinkProductIds=function(){return jQuery("a").map((function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let t=e.match(/(add-to-cart=)(\d+)/);if(t)return t[2]}})).get()},e.getProductDetailsFormattedForEvent=function(e){let t=arguments.length>1&&arguments[1]!==o?arguments[1]:1,a={id:e.toString(),dyn_r_ids:wpmDataLayer.products[e].dyn_r_ids,name:wpmDataLayer.products[e].name,list_name:wpmDataLayer.shop.list_name,brand:wpmDataLayer.products[e].brand,category:wpmDataLayer.products[e].category,variant:wpmDataLayer.products[e].variant,list_position:wpmDataLayer.products[e].position,quantity:t,price:wpmDataLayer.products[e].price,currency:wpmDataLayer.shop.currency,isVariable:wpmDataLayer.products[e].isVariable,isVariation:wpmDataLayer.products[e].isVariation,parentId:wpmDataLayer.products[e].parentId};return a.isVariation&&(a.parentId_dyn_r_ids=wpmDataLayer.products[e].parentId_dyn_r_ids),a},e.setReferrerToCookie=function(){e.getCookie("wpmReferrer")||e.setCookie("wpmReferrer",document.referrer)},e.getReferrerFromCookie=function(){return e.getCookie("wpmReferrer")?e.getCookie("wpmReferrer"):null},e.getClidFromBrowser=function(){let t,a=arguments.length>0&&arguments[0]!==o?arguments[0]:"gclid";return t={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(t[a])?e.getCookie(t[a]).match(/(GCL.[\d]*.)(.*)/)[2]:""},e.getUserAgent=function(){return navigator.userAgent},e.getViewPort=function(){return{width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}};let g=function(){let t=e.getCookie("cmplz_statistics"),o=e.getCookie("cmplz_marketing");return!(!e.getCookie("cmplz_consent_status")&&!e.getCookie("cmplz_banner-status"))&&{analytics:"allow"===t,ads:"allow"===o,visitorHasChosen:!0}},m=function(){let t=e.getCookie("cookielawinfo-checkbox-analytics")||e.getCookie("cookielawinfo-checkbox-analytiques"),o=e.getCookie("cookielawinfo-checkbox-advertisement")||e.getCookie("cookielawinfo-checkbox-publicite"),a=e.getCookie("CookieLawInfoConsent");return!(!t&&!o)&&{analytics:"yes"===t,ads:"yes"===o,visitorHasChosen:!!a}},y={categories:{},pixels:[],mode:"category",visitorHasChosen:!1};e.getConsentValues=function(){return y},e.setConsentValueCategories=function(){let e=arguments.length>0&&arguments[0]!==o&&arguments[0],t=arguments.length>1&&arguments[1]!==o&&arguments[1];y.categories.analytics=e,y.categories.ads=t},e.updateConsentCookieValues=function(){let t,a=arguments.length>0&&arguments[0]!==o&&arguments[0];if(t=e.getCookie("CookieConsent"))t=decodeURI(t),y.categories.analytics=t.indexOf("statistics:true")>=0,y.categories.ads=t.indexOf("marketing:true")>=0,y.visitorHasChosen=!0;else if(t=e.getCookie("CookieScriptConsent"))t=JSON.parse(t),"reject"===t.action?(y.categories.analytics=!1,y.categories.ads=!1):2===t.categories.length?(y.categories.analytics=!0,y.categories.ads=!0):(y.categories.analytics=t.categories.indexOf("performance")>=0,y.categories.ads=t.categories.indexOf("targeting")>=0),y.visitorHasChosen=!0;else if(t=e.getCookie("borlabs-cookie")){var r,n,i,s,d,l,c,u;t=decodeURI(t),t=JSON.parse(t),y.categories.analytics=!(null===(r=t)||void 0===r||null===(n=r.consents)||void 0===n||!n.statistics),y.categories.ads=!(null===(i=t)||void 0===i||null===(s=i.consents)||void 0===s||!s.marketing),y.visitorHasChosen=!0,y.pixels=[...(null===(d=t)||void 0===d||null===(l=d.consents)||void 0===l?void 0:l.statistics)||[],...(null===(c=t)||void 0===c||null===(u=c.consents)||void 0===u?void 0:u.marketing)||[]],y.mode="pixel"}else(t=g())?(y.categories.analytics=!0===t.analytics,y.categories.ads=!0===t.ads,y.visitorHasChosen=t.visitorHasChosen):(t=e.getCookie("cookie_notice_accepted"))?(y.categories.analytics=!0,y.categories.ads=!0,y.visitorHasChosen=!0):(t=e.getCookie("hu-consent"))?(t=JSON.parse(t),y.categories.analytics=!!t.categories[3],y.categories.ads=!!t.categories[4],y.visitorHasChosen=!0):(t=m())?(y.categories.analytics=!0===t.analytics,y.categories.ads=!0===t.ads,y.visitorHasChosen=!0===t.visitorHasChosen):(t=e.getCookie("moove_gdpr_popup"))?(t=JSON.parse(t),y.categories.analytics="1"===t.thirdparty,y.categories.ads="1"===t.advanced,y.visitorHasChosen=!0):(y.categories.analytics=!a,y.categories.ads=!a)},e.updateConsentCookieValues(),e.setConsentDefaultValuesToExplicit=function(){y.categories={analytics:!1,ads:!1}},e.canIFire=function(t,o){let a;return"category"===y.mode?a=!!y.categories[t]:"pixel"===y.mode?a=y.pixels.includes(o):(console.error("Couldn't find a valid consent mode in wpmConsentValues"),a=!1),!!a||(e.logPreventedPixelLoading(o,t),!1)},e.logPreventedPixelLoading=function(e,t){var o,a,r;null!==(o=wpmDataLayer)&&void 0!==o&&null!==(a=o.shop)&&void 0!==a&&null!==(r=a.cookie_consent_mgmt)&&void 0!==r&&r.explicit_consent?console.log('WooCommerce Pixel Manager: The "'+e+" (category: "+t+')" pixel has not fired because you have not given consent for it yet. (WPM is in explicit consent mode.)'):console.log('WooCommerce Pixel Manager: The "'+e+" (category: "+t+')" pixel has not fired because you have removed consent for this pixel. (WPM is in implicit consent mode.)')},e.scriptTagObserver=new MutationObserver((o=>{o.forEach((o=>{let{addedNodes:a}=o;[...a].forEach((o=>{t(o).data("wpm-cookie-category")&&(e.shouldScriptBeActive(o)?e.unblockScript(o):e.blockScript(o))}))}))})),e.scriptTagObserver.observe(document.head,{childList:!0,subtree:!0}),window.addEventListener("DOMContentLoaded",(()=>e.scriptTagObserver.disconnect())),e.shouldScriptBeActive=function(e){var o,a,r,n;return!((wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent||y.visitorHasChosen)&&("category"!==y.mode||!t(e).data("wpm-cookie-category").split(",").some((e=>y.categories[e])))&&("pixel"!==y.mode||!y.pixels.includes(t(e).data("wpm-pixel-name")))&&("pixel"!==y.mode||"google"!==t(e).data("wpm-pixel-name")||!["google-analytics","google-ads"].some((e=>y.pixels.includes(e))))&&(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.consent_mode)||void 0===n||!n.active||"google"!==t(e).data("wpm-pixel-name")))},e.unblockScript=function(e){let a=arguments.length>1&&arguments[1]!==o&&arguments[1];a&&t(e).remove();let r=t(e).data("wpm-src");r&&t(e).attr("src",r),e.type="text/javascript",a&&t(e).appendTo("head"),jQuery(document).trigger("wpmPreLoadPixels",{})},e.blockScript=function(e){let a=arguments.length>1&&arguments[1]!==o&&arguments[1];a&&t(e).remove(),t(e).attr("src")&&t(e).removeAttr("src"),e.type="blocked/javascript",a&&t(e).appendTo("head")},e.unblockAllScripts=function(){let a=!(arguments.length>0&&arguments[0]!==o)||arguments[0],r=!(arguments.length>1&&arguments[1]!==o)||arguments[1];t.each(t('script[type="blocked/javascript"]'),(function(o,n){(t(n).data("wpm-cookie-category").includes("analytics")&&a||t(n).data("wpm-cookie-category").includes("ads")&&r)&&e.unblockScript(n,!0)})),jQuery(document).trigger("wpmPreLoadPixels",{})},e.unblockSelectedPixels=function(){t.each(t('script[type="blocked/javascript"]'),(function(o,a){(y.pixels.includes(t(a).data("wpm-pixel-name"))||"google"===t(a).data("wpm-pixel-name")&&["google-analytics","google-ads"].some((e=>y.pixels.includes(e))))&&e.unblockScript(a,!0)})),jQuery(document).trigger("wpmPreLoadPixels",{})},window.addEventListener("borlabs-cookie-consent-saved",(function(){e.updateConsentCookieValues(),"pixel"===y.mode?(e.unblockSelectedPixels(),e.updateGoogleConsentMode(y.pixels.includes("google-analytics"),y.pixels.includes("google-ads"))):(e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads))})),window.addEventListener("CookiebotOnAccept",(function(){Cookiebot.consent.statistics&&(y.categories.analytics=!0),Cookiebot.consent.marketing&&(y.categories.ads=!0),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)}),!1),window.addEventListener("CookieScriptAccept",(function(t){t.detail.categories.includes("performance")&&(y.categories.analytics=!0),t.detail.categories.includes("targeting")&&(y.categories.ads=!0),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),window.addEventListener("CookieScriptAcceptAll",(function(){e.unblockAllScripts(!0,!0),e.updateGoogleConsentMode(!0,!0)})),document.addEventListener("cmplzStatusChange",(function(){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),document.addEventListener("setCookieNotice",(function(){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),e.huObserver=new MutationObserver((function(t){t.forEach((t=>{let{addedNodes:o}=t;[...o].forEach((t=>{"hu"===t.id&&jQuery(".hu-cookies-save").on("click",(function(){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)}))}))}))})),window.hu&&e.huObserver.observe(document.documentElement||document.body,{childList:!0,subtree:!0}),e.version=function(){console.log(wpmDataLayer.version)},e.loadScriptAndCacheIt=function(e,t){return t=jQuery.extend(t||{},{dataType:"script",cache:!0,url:e}),jQuery.ajax(t)},e.getOrderItemPrice=function(e){return(e.total+e.total_tax)/e.quantity},e.hasLoginEventFired=function(){let t=e.getWpmSessionData();return null==t?void 0:t.loginEventFired},e.setLoginEventFired=function(){let t=e.getWpmSessionData();t.loginEventFired=!0,e.setWpmSessionData(t)},e.wpmDataLayerExists=function(){return new Promise((function(e){!function t(){if("undefined"!=typeof wpmDataLayer)return e();setTimeout(t,50)}()}))},e.jQueryExists=function(){return new Promise((function(e){!function t(){if("undefined"!=typeof jQuery)return e();setTimeout(t,100)}()}))},e.pageLoaded=function(){return new Promise((function(e){!function t(){if("complete"===document.readyState)return e();setTimeout(t,50)}()}))},e.pageReady=function(){return new Promise((function(e){!function t(){if("interactive"===document.readyState||"complete"===document.readyState)return e();setTimeout(t,50)}()}))},e.isMiniCartActive=function(){if(window.sessionStorage){for(const[e,t]of Object.entries(window.sessionStorage))if(e.includes("wc_fragments"))return!0;return!1}return!1},e.doesWooCommerceCartExist=function(){return document.cookie.includes("woocommerce_items_in_cart")},e.urlHasParameter=function(e){return new URLSearchParams(window.location.search).has(e)},window.wpmLoaded={}}(window.wpm=window.wpm||{},jQuery)},534:(e,t,o)=>{o(584)},207:()=>{wpm.wpmDataLayerExists().then((function(){console.log("WooCommerce Pixel Manager: "+(wpmDataLayer.version.pro?"Pro":"Free")+" Version "+wpmDataLayer.version.number+" loaded"),jQuery(document).trigger("wpmPreLoadPixels",{})})).then((function(){wpm.pageLoaded().then((function(){jQuery(document).trigger("wpmLoad",{})}))})),wpm.pageReady().then((function(){wpm.wpmDataLayerExists().then((function(){wpm.startIntersectionObserverToWatch(),wpm.startProductsMutationObserverToWatch()}))}))}},t={};function o(a){var r=t[a];if(void 0!==r)return r.exports;var n=t[a]={exports:{}};return e[a](n,n.exports,o),n.exports}o(534),wpm.jQueryExists().then((function(){o(299),o(69),o(12),o(787),o(207)}))})();
|
2 |
//# sourceMappingURL=wpm-public.p1.min.js.map
|
1 |
+
(()=>{var e={398:()=>{!function(e,t,a){let r;e.getRandomEventId=function(){return(Math.random()+1).toString(36).substring(2)},e.getFbUserData=function(){return r||e.getFbUserDataFromBrowser()},e.setFbUserData=function(){r=e.getFbUserDataFromBrowser()},e.getFbUserDataFromBrowser=function(){return{fbp:e.getCookie("_fbp"),fbc:e.getCookie("_fbc"),client_user_agent:navigator.userAgent}},e.fbViewContent=function(t){if(!window.fbq)return;let a=e.getRandomEventId();fbq("track","ViewContent",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],currency:wpmDataLayer.shop.currency,value:t.price},{eventID:a}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"ViewContent",event_id:a,user_data:e.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}}(window.wpm=window.wpm||{},jQuery),jQuery((function(){wpmDataLayer?.pixels?.facebook&&(jQuery(document).on("wpmAddToCart",(function(e,t){if(!window.fbq)return;let a=wpm.getRandomEventId();fbq("track","AddToCart",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:a}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToCart",event_id:a,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})})),jQuery(document).on("wpmBeginCheckout",(function(e){if(!window.fbq)return;let t=wpm.getRandomEventId();fbq("track","InitiateCheckout",{},{eventID:t}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"InitiateCheckout",event_id:t,user_data:wpm.getFbUserData(),event_source_url:window.location.href})})),jQuery(document).on("wpmAddToWishlist",(function(e,t){if(!window.fbq)return;let a=wpm.getRandomEventId();fbq("track","AddToWishlist",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:a}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToWishlist",event_id:a,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})})),jQuery(document).on("wpmViewItem",(function(e,t){window.fbq&&wpm.fbViewContent(t)})))})),jQuery(window).on("load",(function(){wpmDataLayer?.pixels?.facebook&&(wpm.setFbUserData(),wpmExists().then((function(){try{if("product"===wpmDataLayer.shop.page_type&&"variable"!==wpmDataLayer.shop.product_type&&wpm.getMainProductIdFromProductPage()){let e=wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());wpm.fbViewContent(e)}else if("search"===wpmDataLayer.shop.page_type){if(!window.fbq)return;let e=wpm.getRandomEventId();fbq("track","Search",{},{eventID:e}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"Search",event_id:e,user_data:wpm.getFbUserData(),event_source_url:window.location.href})}}catch(e){console.log(e)}})))}))},832:()=>{jQuery((function(){wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status&&(jQuery(document).on("wpmViewItemList",(function(e,t){wpmDataLayer.general.variationsOutput&&t.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids||t&&googleConfigConditionsMet("ads")&>ag("event","view_item_list",{send_to:wpmDataLayer.pixels.google.ads.conversionIds,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})})),jQuery(document).on("wpmAddToCart",(function(e,t){gtag("event","add_to_cart",{send_to:wpmDataLayer.pixels.google.ads.conversionIds,value:t.quantity*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:t.quantity,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})})),jQuery(document).on("wpmViewItem",(function(e,t){gtag("event","view_item",{send_to:wpmDataLayer.pixels.google.ads.conversionIds,value:t.quantity*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:1,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})})))})),jQuery(window).on("load",(function(){wpmExists().then((function(){try{if("product"===wpmDataLayer.shop.page_type&&"variable"!==wpmDataLayer.shop.product_type&&wpm.getMainProductIdFromProductPage()){let e=wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());gtag("event","view_item",{send_to:wpmDataLayer.pixels.google.ads.conversionIds,value:1*e.price,items:[{id:e.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}else if("search"===wpmDataLayer.shop.page_type){let e=[];for(const[t,a]of Object.entries(wpmDataLayer.products)){if(wpmDataLayer.general.variationsOutput&&a.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids)return;e.push({id:a.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical})}gtag("event","view_search_results",{send_to:wpmDataLayer.pixels.google.ads.conversionIds,items:e})}}catch(e){console.log(e)}}))}))},712:()=>{!function(e,t,a){const r="_wpm_order_ids",o="_wpm_endpoint_available",i="/wp-json/";function n(){return""!==e.getCookie(r)}e.useRestEndpoint=function(){return e.isSessionStorageAvailable()&&e.isRestEndpointAvailable()&&e.isBelowRestErrorThreshold()},e.isBelowRestErrorThreshold=function(){return window.sessionStorage.getItem(0)<=10},e.isRestEndpointAvailable=function(){if(window.sessionStorage.getItem(o))return JSON.parse(window.sessionStorage.getItem(o));e.testEndpoint()},e.isSessionStorageAvailable=function(){return!!window.sessionStorage},e.testEndpoint=function(){let e=arguments.length>0&&arguments[0]!==a?arguments[0]:location.protocol+"//"+location.host+i,t=arguments.length>1&&arguments[1]!==a?arguments[1]:o;jQuery.ajax(e,{type:"HEAD",timeout:1e3,statusCode:{200:function(e){window.sessionStorage.setItem(t,JSON.stringify(!0))},404:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))},0:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))}}}).then((e=>{}))},e.isWpmRestEndpointAvailable=function(){let t=arguments.length>0&&arguments[0]!==a?arguments[0]:o;return!!e.getCookie(t)},e.writeOrderIdToStorage=function(t){if(window.Storage)if(null===localStorage.getItem(r)){let e=[];e.push(t),window.localStorage.setItem(r,JSON.stringify(e))}else{let e=JSON.parse(localStorage.getItem(r));e.includes(t)||(e.push(t),window.localStorage.setItem(r,JSON.stringify(e)))}else{let a=new Date;a.setDate(a.getDate()+365);let o=[];n()&&(o=JSON.parse(e.getCookie(r))),o.includes(t)||(o.push(t),document.cookie="_wpm_order_ids="+JSON.stringify(o)+";expires="+a.toUTCString())}"function"==typeof e.storeOrderIdOnServer&&wpmDataLayer.orderDeduplication&&e.storeOrderIdOnServer(t)},e.isOrderIdStored=function(t){return wpmDataLayer.orderDeduplication?window.Storage?null!==localStorage.getItem(r)&&JSON.parse(localStorage.getItem(r)).includes(t):!!n()&&JSON.parse(e.getCookie(r)).includes(t):(console.log("order deduplication: off"),!1)},e.isEmail=function(e){return/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)},e.removeProductFromCart=function(t){let r=arguments.length>1&&arguments[1]!==a?arguments[1]:null;try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");let a;if(a=null==r?wpmDataLayer.cart[t].quantity:r,wpmDataLayer.cart[t]){let o=e.getProductDetailsFormattedForEvent(t,a);jQuery(document).trigger("wpmRemoveFromCart",o),null==r||wpmDataLayer.cart[t].quantity===r?(delete wpmDataLayer.cart[t],sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):(wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity-a,sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart)))}}catch(e){console.log(e)}},getIdBasedOndVariationsOutputSetting=function(e){try{return wpmDataLayer.general.variationsOutput?e:wpmDataLayer.products[e].isVariation?wpmDataLayer.products[e].parentId:e}catch(e){console.log(e)}},e.addProductToCart=function(t,r){try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products[t]){let o=e.getProductDetailsFormattedForEvent(t,r);jQuery(document).trigger("wpmAddToCart",o),wpmDataLayer.cart!==a&&wpmDataLayer.cart[t]!==a?(wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity+r,sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):wpmDataLayer.cart?(wpmDataLayer.cart[t]=e.getProductDetailsFormattedForEvent(t,r),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):(wpmDataLayer.cart={[t]:e.getProductDetailsFormattedForEvent(t,r)},sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart)))}}catch(t){console.log(t),e.getCartItemsFromBackend()}},e.getCartItems=function(){sessionStorage?sessionStorage.getItem("wpmDataLayerCart")&&"order_received_page"!==wpmDataLayer.shop.page_type?e.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem("wpmDataLayerCart"))):sessionStorage.setItem("wpmDataLayerCart",JSON.stringify({})):e.getCartItemsFromBackend()},e.getCartItemsFromBackend=function(){try{let t={action:"wpm_get_cart_items"};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:t,success:function(t){t.cart||(t.cart={}),e.saveCartObjectToDataLayer(t.cart),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(t.cart))}})}catch(e){console.log(e)}},e.getProductsFromBackend=function(t){if((t=t.filter((e=>!wpmDataLayer.products.hasOwnProperty(e))))&&0!==t.length)try{let a={action:"wpm_get_product_ids",productIds:t};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:a,success:function(e){wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},error:function(e){console.log(e)}})}catch(e){console.log(e)}},e.saveCartObjectToDataLayer=function(e){wpmDataLayer.cart=e,wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},e.fireCheckoutOption=function(e){let t=arguments.length>1&&arguments[1]!==a?arguments[1]:null,r=arguments.length>2&&arguments[2]!==a?arguments[2]:null,o={step:e,checkout_option:t,value:r};jQuery(document).trigger("wpmFireCheckoutOption",o)},e.fireCheckoutProgress=function(e){let t={step:e};jQuery(document).trigger("wpmFireCheckoutProgress",t)},e.getPostIdFromString=function(e){try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.log(e)}},e.triggerViewItemList=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("wpmViewItemList",e.getProductDataForViewItemEvent(t))},e.getProductDataForViewItemEvent=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");try{if(wpmDataLayer.products[t])return e.getProductDetailsFormattedForEvent(t)}catch(e){console.log(e)}},e.getMainProductIdFromProductPage=function(){try{return["simple","variable","grouped","composite","bundle"].indexOf(wpmDataLayer.shop.product_type)>=0&&jQuery(".wpmProductId:first").data("id")}catch(e){console.log(e)}},e.viewItemListTriggerTestMode=function(e){jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:wpmDataLayer.viewItemListTrigger.opacity,"background-color":wpmDataLayer.viewItemListTrigger.backgroundColor})},e.getSearchTermFromUrl=function(){try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.log(e)}};let s,c={};e.observerCallback=function(t,a){t.forEach((t=>{try{let r,o=jQuery(t.target).data("ioid");if(r=jQuery(t.target).next(".wpmProductId").length?jQuery(t.target).next(".wpmProductId").data("id"):jQuery(t.target).find(".wpmProductId").data("id"),!r)throw Error("wpmProductId element not found");t.isIntersecting?c[o]=setTimeout((()=>{e.triggerViewItemList(r),wpmDataLayer.viewItemListTrigger.testMode&&e.viewItemListTriggerTestMode(t.target),!1===wpmDataLayer.viewItemListTrigger.repeat&&a.unobserve(t.target)}),wpmDataLayer.viewItemListTrigger.timeout):(clearTimeout(c[o]),wpmDataLayer.viewItemListTrigger.testMode&&jQuery(t.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.log(e)}}))};let d,u=0;e.startIntersectionObserverToWatch=function(){try{new URLSearchParams(window.location.search).has("vildemomode")&&(wpmDataLayer.viewItemListTrigger.testMode=!0),s=new IntersectionObserver(e.observerCallback,{threshold:wpmDataLayer.viewItemListTrigger.threshold}),d=jQuery(".wpmProductId").map((function(e,t){return jQuery(t).parent().hasClass("type-product")||jQuery(t).parent().hasClass("product")||jQuery(t).parent().hasClass("product-item-inner")?jQuery(t).parent():jQuery(t).prev().hasClass("wc-block-grid__product")||jQuery(t).prev().hasClass("product")||jQuery(t).prev().hasClass("product-small")||jQuery(t).prev().hasClass("woocommerce-LoopProduct-link")?jQuery(this).prev():jQuery(t).closest(".product").length?jQuery(t).closest(".product"):void 0})),d.each((function(e,t){jQuery(t[0]).data("ioid",u++),s.observe(t[0])}))}catch(e){console.log(e)}},e.startProductsMutationObserverToWatch=function(){try{let e=jQuery(".wpmProductId:eq(0)").parents().has(jQuery(".wpmProductId:eq(1)").parents()).first();e.length&&p.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.log(e)}};let p=new MutationObserver((function(e){e.forEach((function(e){let t=e.addedNodes;null!==t&&jQuery(t).each((function(){(jQuery(this).hasClass("type-product")||jQuery(this).hasClass("product-small")||jQuery(this).hasClass("wc-block-grid__product"))&&l(this)&&(jQuery(this).data("ioid",u++),s.observe(this))}))}))})),l=function(e){return!(!jQuery(e).find(".wpmProductId").length&&!jQuery(e).siblings(".wpmProductId").length)};e.setCookie=function(e){let t=arguments.length>1&&arguments[1]!==a?arguments[1]:"",r=arguments.length>2&&arguments[2]!==a?arguments[2]:null;if(r){let a=new Date;a.setTime(a.getTime()+24*r*60*60*1e3);let o="expires="+a.toUTCString();document.cookie=e+"="+t+";"+o+";path=/"}else document.cookie=e+"="+t+";path=/"},e.getCookie=function(e){let t=e+"=",a=decodeURIComponent(document.cookie).split(";");for(let e=0;e<a.length;e++){let r=a[e];for(;" "==r.charAt(0);)r=r.substring(1);if(0==r.indexOf(t))return r.substring(t.length,r.length)}return""},e.storeOrderIdOnServer=function(t){try{let a={action:"wpm_purchase_pixels_fired",order_id:t,nonce:e.nonce};jQuery.ajax({type:"post",dataType:"json",url:e.ajax_url,data:a,success:function(e){!1===e.success&&console.log(e)},error:function(e){console.log(e)}})}catch(e){console.log(e)}},e.getProductIdByCartItemKeyUrl=function(e){let t=new URLSearchParams(e.search).get("remove_item"),a=null;return a=0===wpmDataLayer.cartItemKeys[t].variation_id?wpmDataLayer.cartItemKeys[t].product_id:wpmDataLayer.cartItemKeys[t].variation_id,a},e.getAddToCartLinkProductIds=function(){return jQuery("a").map((function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let t=e.match(/(add-to-cart=)(\d+)/);if(t)return t[2]}})).get()},e.getProductDetailsFormattedForEvent=function(e){let t=arguments.length>1&&arguments[1]!==a?arguments[1]:1,r={id:e.toString(),dyn_r_ids:wpmDataLayer.products[e].dyn_r_ids,name:wpmDataLayer.products[e].name,list_name:wpmDataLayer.shop.list_name,brand:wpmDataLayer.products[e].brand,category:wpmDataLayer.products[e].category,variant:wpmDataLayer.products[e].variant,list_position:wpmDataLayer.products[e].position,quantity:t,price:wpmDataLayer.products[e].price,currency:wpmDataLayer.shop.currency,isVariable:wpmDataLayer.products[e].isVariable,isVariation:wpmDataLayer.products[e].isVariation,parentId:wpmDataLayer.products[e].parentId};return r.isVariation&&(r.parentId_dyn_r_ids=wpmDataLayer.products[e].parentId_dyn_r_ids),r},e.setReferrerToCookie=function(){e.getCookie("wpmReferrer")||e.setCookie("wpmReferrer",document.referrer)},e.getReferrerFromCookie=function(){return e.getCookie("wpmReferrer")?e.getCookie("wpmReferrer"):null},e.getClidFromBrowser=function(){let t,r=arguments.length>0&&arguments[0]!==a?arguments[0]:"gclid";return t={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(t[r])?e.getCookie(t[r]).match(/(GCL.[\d]*.)(.*)/)[2]:""},e.getUserAgent=function(){return navigator.userAgent},e.getViewPort=function(){return{width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}};let g=function(){let t=e.getCookie("cmplz_statistics"),a=e.getCookie("cmplz_marketing");return!(!e.getCookie("cmplz_consent_status")&&!e.getCookie("cmplz_banner-status"))&&{analytics:"allow"===t,ads:"allow"===a,visitorHasChosen:!0}},m=function(){let t=e.getCookie("cookielawinfo-checkbox-analytics"),a=e.getCookie("cookielawinfo-checkbox-advertisement"),r=e.getCookie("CookieLawInfoConsent");return!(!t&&!a)&&{analytics:"yes"===t,ads:"yes"===a,visitorHasChosen:!!r}},y={categories:{},pixels:[],mode:"category",visitorHasChosen:!1};e.getConsentValues=function(){return y},e.updateConsentCookieValues=function(){let t,r=arguments.length>0&&arguments[0]!==a&&arguments[0];(t=e.getCookie("CookieConsent"))?(t=decodeURI(t),y.categories.analytics=t.indexOf("statistics:true")>=0,y.categories.ads=t.indexOf("marketing:true")>=0,y.visitorHasChosen=!0):(t=e.getCookie("CookieScriptConsent"))?(t=JSON.parse(t),"reject"===t.action?(y.categories.analytics=!1,y.categories.ads=!1):2===t.categories.length?(y.categories.analytics=!0,y.categories.ads=!0):(y.categories.analytics=t.categories.indexOf("performance")>=0,y.categories.ads=t.categories.indexOf("targeting")>=0),y.visitorHasChosen=!0):(t=e.getCookie("borlabs-cookie"))?(t=decodeURI(t),t=JSON.parse(t),y.categories.analytics=!!t?.consents?.statistics,y.categories.ads=!!t?.consents?.marketing,y.visitorHasChosen=!0,y.pixels=[...t?.consents?.statistics||[],...t?.consents?.marketing||[]],y.mode="pixel"):(t=g())?(y.categories.analytics=!0===t.analytics,y.categories.ads=!0===t.ads,y.visitorHasChosen=t.visitorHasChosen):(t=e.getCookie("cookie_notice_accepted"))?(y.categories.analytics=!0,y.categories.ads=!0,y.visitorHasChosen=!0):(t=e.getCookie("hu-consent"))?(t=JSON.parse(t),y.categories.analytics=!!t.categories[3],y.categories.ads=!!t.categories[4],y.visitorHasChosen=!0):(t=m())?(y.categories.analytics=!0===t.analytics,y.categories.ads=!0===t.ads,y.visitorHasChosen=!0===t.visitorHasChosen):(t=e.getCookie("moove_gdpr_popup"))?(t=JSON.parse(t),y.categories.analytics="1"===t.thirdparty,y.categories.ads="1"===t.advanced,y.visitorHasChosen=!0):(y.categories.analytics=!r,y.categories.ads=!r)},e.updateConsentCookieValues(),e.setConsentDefaultValuesToExplicit=function(){y.categories={analytics:!1,ads:!1}},e.scriptTagObserver=new MutationObserver((a=>{a.forEach((a=>{let{addedNodes:r}=a;[...r].forEach((a=>{t(a).data("wpm-cookie-category")&&(e.shouldScriptBeActive(a)?e.unblockScript(a):e.blockScript(a))}))}))})),e.scriptTagObserver.observe(document.head,{childList:!0,subtree:!0}),window.addEventListener("DOMContentLoaded",(()=>e.scriptTagObserver.disconnect())),e.shouldScriptBeActive=function(e){return!((wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent||y.visitorHasChosen)&&("category"!==y.mode||!t(e).data("wpm-cookie-category").split(",").some((e=>y.categories[e])))&&("pixel"!==y.mode||!y.pixels.includes(t(e).data("wpm-pixel-name")))&&("pixel"!==y.mode||"google"!==t(e).data("wpm-pixel-name")||!["google-analytics","google-ads"].some((e=>y.pixels.includes(e))))&&(!wpmDataLayer?.pixels?.google?.consent_mode?.active||"google"!==t(e).data("wpm-pixel-name")))},e.unblockScript=function(e){let r=arguments.length>1&&arguments[1]!==a&&arguments[1];r&&t(e).remove();let o=t(e).data("wpm-src");o&&t(e).attr("src",o),e.type="text/javascript",r&&t(e).appendTo("head")},e.blockScript=function(e){let r=arguments.length>1&&arguments[1]!==a&&arguments[1];r&&t(e).remove(),t(e).attr("src")&&t(e).removeAttr("src"),e.type="blocked/javascript",r&&t(e).appendTo("head")},e.unblockAllScripts=function(){let r=!(arguments.length>0&&arguments[0]!==a)||arguments[0],o=!(arguments.length>1&&arguments[1]!==a)||arguments[1];t.each(t('script[type="blocked/javascript"]'),(function(a,i){(t(i).data("wpm-cookie-category").includes("analytics")&&r||t(i).data("wpm-cookie-category").includes("ads")&&o)&&e.unblockScript(i,!0)}))},e.unblockSelectedPixels=function(){t.each(t('script[type="blocked/javascript"]'),(function(a,r){(y.pixels.includes(t(r).data("wpm-pixel-name"))||"google"===t(r).data("wpm-pixel-name")&&["google-analytics","google-ads"].some((e=>y.pixels.includes(e))))&&e.unblockScript(r,!0)}))},e.googleConfigConditionsMet=function(e){return!!wpmDataLayer.pixels.google.consent_mode.active||("category"===y.mode?!0===y.categories[e]:"pixel"===y.mode&&y.pixels.includes("google-"+e))},e.getVisitorConsentStatusAndUpdateGoogleConsentSettings=function(e){return"category"===y.mode?(y.categories.analytics&&(e.analytics_storage="granted"),y.categories.ads&&(e.ad_storage="granted")):"pixel"===y.mode&&(e.analytics_storage=y.pixels.includes("google-analytics")?"granted":"denied",e.ad_storage=y.pixels.includes("google-ads")?"granted":"denied"),e},e.updateGoogleConsentMode=function(){let e=!(arguments.length>0&&arguments[0]!==a)||arguments[0],t=!(arguments.length>1&&arguments[1]!==a)||arguments[1];window.gtag&&wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent&>ag("consent","update",{analytics_storage:e?"granted":"denied",ad_storage:t?"granted":"denied"})},window.addEventListener("borlabs-cookie-consent-saved",(function(t){e.updateConsentCookieValues(),"pixel"===y.mode?(e.unblockSelectedPixels(),e.updateGoogleConsentMode(y.pixels.includes("google-analytics"),y.pixels.includes("google-ads"))):(e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads))})),window.addEventListener("CookiebotOnAccept",(function(t){Cookiebot.consent.statistics&&(y.categories.analytics=!0),Cookiebot.consent.marketing&&(y.categories.ads=!0),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)}),!1),window.addEventListener("CookieScriptAccept",(function(t){t.detail.categories.includes("performance")&&(y.categories.analytics=!0),t.detail.categories.includes("targeting")&&(y.categories.ads=!0),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),window.addEventListener("CookieScriptAcceptAll",(function(t){e.unblockAllScripts(!0,!0),e.updateGoogleConsentMode(!0,!0)})),document.addEventListener("cmplzStatusChange",(function(t){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),document.addEventListener("setCookieNotice",(function(t){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),e.huObserver=new MutationObserver((function(t){t.forEach((t=>{let{addedNodes:a}=t;[...a].forEach((t=>{"hu"===t.id&&jQuery(".hu-cookies-save").on("click",(function(t){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)}))}))}))})),window.hu&&e.huObserver.observe(document.documentElement||document.body,{childList:!0,subtree:!0}),e.version=function(){console.log(wpmDataLayer.version)},window.wpmLoaded={}}(window.wpm=window.wpm||{},jQuery),jQuery((function(){wpm.startIntersectionObserverToWatch(),wpm.startProductsMutationObserverToWatch(),jQuery("body"),jQuery(".products, .product"),jQuery(document).on("click",".remove_from_cart_button, .remove",(function(e){try{let e=new URL(jQuery(this).attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e);wpm.removeProductFromCart(t)}catch(e){console.log(e)}})),jQuery(document).on("click",".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button",(function(e){try{if("product"===wpmDataLayer.shop.page_type){if(void 0!==jQuery(this).attr("href")&&jQuery(this).attr("href").includes("add-to-cart")){let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}else if("simple"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).val();wpm.addProductToCart(t,e)}else if("variable"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("[name='variation_id']").val();wpm.addProductToCart(t,e)}else if("grouped"===wpmDataLayer.shop.product_type)jQuery(".woocommerce-grouped-product-list-item").each((function(){let e=Number(jQuery(this).find(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).attr("class"),a=wpm.getPostIdFromString(t);wpm.addProductToCart(a,e)}));else if("bundle"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("input[name=add-to-cart]").val();wpm.addProductToCart(t,e)}}else{let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}}catch(e){console.log(e)}})),jQuery(document).one("click","a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)",(function(e){try{if(jQuery(e.target).closest("a").attr("href")){let t=jQuery(e.target).closest("a").attr("href");if(t.includes("add-to-cart=")){let e=t.match(/(add-to-cart=)(\d+)/);e&&wpm.addProductToCart(e[2],1)}}}catch(e){console.log(e)}})),jQuery(document).on("click",".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product",(function(e){try{let e=jQuery(this).nextAll(".wpmProductId:first").data("id");if(e){if(e=getIdBasedOndVariationsOutputSetting(e),!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmSelectContentGaUa",t),jQuery(document).trigger("wpmSelectItem",t)}}}catch(e){console.log(e)}})),jQuery(document).one("click",".checkout-button, .cart-checkout-button, .button.checkout",(function(e){jQuery(document).trigger("wpmBeginCheckout")}));let e=!1;jQuery(document).on("input","#billing_email",(function(){wpm.isEmail(jQuery(this).val())&&(wpm.fireCheckoutProgress(2),e=!0)}));let t=!1;jQuery(document).on("click",".wc_payment_methods",(function(){!1===t&&wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),t=!0})),jQuery(document).one("click","#place_order",(function(){!1===e&&wpm.fireCheckoutProgress(2),!1===t&&(wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),wpm.fireCheckoutProgress(4)})),jQuery(document).on("click","[name='update_cart']",(function(e){try{jQuery(".cart_item").each((function(){let e=new URL(jQuery(this).find(".product-remove").find("a").attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e),a=jQuery(this).find(".qty").val();0===a?wpm.removeProductFromCart(t):a<wpmDataLayer.cart[t].quantity?wpm.removeProductFromCart(t,wpmDataLayer.cart[t].quantity-a):a>wpmDataLayer.cart[t].quantity&&wpm.addProductToCart(t,a-wpmDataLayer.cart[t].quantity)}))}catch(e){console.log(e),wpm.getCartItemsFromBackend()}})),jQuery(".single_variation_wrap").on("show_variation",(function(e,t){try{let e=getIdBasedOndVariationsOutputSetting(t.variation_id);if(!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmViewItem",t)}}catch(e){console.log(e)}})),jQuery(document).on("click",".add_to_wishlist, .wl-add-to",(function(){try{let e;if(jQuery(this).data("productid")?e=jQuery(this).data("productid"):jQuery(this).data("product-id")&&(e=jQuery(this).data("product-id")),!e)throw Error("Wasn't able to retrieve a productId");let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmAddToWishlist",t)}catch(e){console.log(e)}})),jQuery(document).on("updated_cart_totals",(function(){jQuery(document).trigger("wpmViewCart")}))})),jQuery(document).ajaxSend((function(e,t,a){a.url.includes("get_refreshed_fragments")&&sessionStorage&&(sessionStorage.getItem("wpmMiniCartActive")||sessionStorage.setItem("wpmMiniCartActive",JSON.stringify(!0)))})),jQuery(window).on("load",(function(){try{JSON.parse(sessionStorage.getItem("wpmMiniCartActive"))&&JSON.parse(sessionStorage.getItem("wpmFirstPageLoad"))&&!0===wpmDataLayer.shop.mini_cart.track?wpm.getCartItems():sessionStorage.setItem("wpmFirstPageLoad",JSON.stringify(!0))}catch(e){console.log(e)}})),jQuery(window).on("load",(function(){wpmDataLayer.products=wpmDataLayer.products||{};let e=wpm.getAddToCartLinkProductIds();wpm.getProductsFromBackend(e)})),jQuery(window).on("load",(function(){if(!wpm.getCookie("wpmReferrer"))if(document.referrer){let e=new URL(document.referrer).hostname;e!==window.location.host?wpm.setCookie("wpmReferrer",e):wpm.setCookie("wpmReferrer","")}else wpm.setCookie("wpmReferrer","")}))}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,a),i.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";a(712),a(832),a(398)})()})();
|
2 |
//# sourceMappingURL=wpm-public.p1.min.js.map
|
js/public/wpm-public.p1.min.js.map
CHANGED
@@ -1 +1 @@
|
|
1 |
-
{"version":3,"file":"wpm-public.p1.min.js","mappings":"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","sources":["webpack://WooCommerce-Pixel-Manager/./src/js/public/facebook/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/facebook/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/facebook/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/ads/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/ads/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/ads/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga3/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga3/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga3/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga4/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga4/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga4/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/base/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/base/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/base/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/optimize/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/optimize/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/optimize/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/hotjar/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/hotjar/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/hotjar/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm/functions_loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm/init.js","webpack://WooCommerce-Pixel-Manager/webpack/bootstrap","webpack://WooCommerce-Pixel-Manager/./src/js/public/main.js"],"sourcesContent":["/**\n * All event listeners\n * */\n\n// Load pixel event\njQuery(document).on(\"wpmLoadPixels\", function () {\n\n\tif (wpmDataLayer?.pixels?.facebook?.pixel_id && !wpmDataLayer?.pixels?.facebook?.loaded) {\n\t\tif (wpm.canIFire(\"ads\", \"facebook-ads\")) wpm.loadFacebookPixel()\n\t}\n})\n\n// AddToCart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\t// console.log('eventId: ' + eventId);\n\n\t\tfbq(\"track\", \"AddToCart\", {\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tcontent_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tvalue : parseFloat(product.quantity * product.price),\n\t\t\tcurrency : product.currency,\n\t\t}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\n\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"AddToCart\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tproduct_data : product,\n\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// InitiateCheckout event\njQuery(document).on(\"wpmBeginCheckout\", function (event) {\n\n\ttry {\n\t\t// console.log('firing facebook ads InitiateCheckout event');\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"InitiateCheckout\", {}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"InitiateCheckout\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// AddToWishlist event\njQuery(document).on(\"wpmAddToWishlist\", function (event, product) {\n\n\ttry {\n\t\t// console.log('firing facebook ads AddToWishlist event');\n\t\t// console.log(product);\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"AddToWishlist\", {\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tcontent_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tvalue : parseFloat(product.quantity * product.price),\n\t\t\tcurrency : product.currency,\n\t\t}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\n\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"AddToWishlist\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tproduct_data : product,\n\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// ViewContent event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\t// console.log('firing facebook ads ViewContent event');\n\t\t// console.log(product);\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\twpm.fbViewContent(product)\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"Search\", {}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"Search\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// load always event\njQuery(document).on(\"wpmLoadAlways\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\twpm.setFbUserData()\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view order received page event\n// https://developers.pinterest.com/docs/tag/conversion/\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tfbq(\"track\", \"Purchase\",\n\t\t\t{\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tcontent_ids : wpm.facebookContentIds(),\n\t\t\t},\n\t\t\t{eventID: wpmDataLayer.order.id},\n\t\t)\n\n\n\t\t// console.log(wpm.facebookContentIds())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Add functions for Facebook\n * */\n\n(function (wpm, $, undefined) {\n\n\tlet fBUserData\n\n\twpm.loadFacebookPixel = function () {\n\n\t\ttry {\n\t\t\twpmDataLayer.pixels.facebook.loaded = true\n\n\t\t\t// @formatter:off\n\t\t\t!function(f,b,e,v,n,t,s)\n\t\t\t{if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n\t\t\t\tn.callMethod.apply(n,arguments):n.queue.push(arguments)};\n\t\t\t\tif(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n\t\t\t\tn.queue=[];t=b.createElement(e);t.async=!0;\n\t\t\t\tt.src=v;s=b.getElementsByTagName(e)[0];\n\t\t\t\ts.parentNode.insertBefore(t,s)}(window, document,'script',\n\t\t\t\t'https://connect.facebook.net/en_US/fbevents.js');\n\t\t\t// @formatter:on\n\n\t\t\tfbq(\"init\", wpmDataLayer.pixels.facebook.pixel_id)\n\t\t\tfbq(\"track\", \"PageView\")\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getRandomEventId = function () {\n\t\treturn (Math.random() + 1).toString(36).substring(2)\n\t}\n\n\twpm.getFbUserData = function () {\n\t\t// We need the first one for InitiateCheckout\n\t\t// where getting the user_data from the browser is too slow\n\t\t// using wpm.getCookie(), so we cache the user_data earlier.\n\t\t// And we need the second one because the ViewContent hit happens too fast\n\t\t// after adding a variation to the cart because the function to cache\n\t\t// the user_data is too slow. But we can get the user_data using wpm.getCookie()\n\t\t// because we don't move away from the page and can wait for the browser\n\t\t// to get it.\n\t\tif (fBUserData) {\n\t\t\treturn fBUserData\n\t\t} else {\n\t\t\treturn wpm.getFbUserDataFromBrowser()\n\t\t}\n\t}\n\n\twpm.setFbUserData = function () {\n\t\tfBUserData = wpm.getFbUserDataFromBrowser()\n\t}\n\n\twpm.getFbUserDataFromBrowser = function () {\n\t\treturn {\n\t\t\tfbp : wpm.getCookie(\"_fbp\"),\n\t\t\tfbc : wpm.getCookie(\"_fbc\"),\n\t\t\tclient_user_agent: navigator.userAgent,\n\t\t}\n\t}\n\n\twpm.fbViewContent = function (product) {\n\n\t\ttry {\n\t\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\t\tlet eventId = wpm.getRandomEventId()\n\n\t\t\tfbq(\"track\", \"ViewContent\", {\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tcontent_name: product.name,\n\t\t\t\t// content_category: product.category,\n\t\t\t\tcontent_ids: product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\t\tvalue : product.price,\n\t\t\t}, {\n\t\t\t\teventID: eventId,\n\t\t\t})\n\n\t\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\t\tevent_name : \"ViewContent\",\n\t\t\t\tevent_id : eventId,\n\t\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\t\tproduct_data : product,\n\t\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\tevent_source_url: window.location.href,\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.facebookContentIds = function () {\n\t\tlet prodIds = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))\n\t\t\t} else {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))\n\t\t\t}\n\t\t}\n\n\t\treturn prodIds\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Facebook loader\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// require(\"./event_listeners_premium\")\n// #endif\n\n","/**\n * Load Google Ads event listeners\n * */\n\n// view_item_list event\njQuery(document).on(\"wpmViewItemList\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\tif (\n\t\t\twpmDataLayer?.general?.variationsOutput &&\n\t\t\tproduct.isVariable &&\n\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t) return\n\n\t\t// try to prevent that WC sends cached hits to Google\n\t\tif (!product) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_item_list\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\titems : [{\n\t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t\t}],\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// add_to_cart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"add_to_cart\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\tvalue : product.quantity * product.price,\n\t\t\t\titems : [{\n\t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\tquantity : product.quantity,\n\t\t\t\t\tprice : product.price,\n\t\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t\t}],\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view_item event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_item\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\tvalue : (product.quantity ? product.quantity : 1) * product.price,\n\t\t\t\titems : [{\n\t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\tquantity : (product.quantity ? product.quantity : 1),\n\t\t\t\t\tprice : product.price,\n\t\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t\t}],\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\tlet products = []\n\n\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n\n\t\t\tif (\n\t\t\t\twpmDataLayer?.general?.variationsOutput &&\n\t\t\t\tproduct.isVariable &&\n\t\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t\t) return\n\n\t\t\tproducts.push({\n\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t})\n\t\t}\n\n\t\t// console.log(products);\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_search_results\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\t// value : 1 * product.price,\n\t\t\t\titems: products,\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view order received page event\n// TODO distinguish with or without cart data active\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"purchase\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\t\titems : wpm.getGoogleAdsDynamicRemarketingOrderItems(),\n\t\t\t})\n\t\t})\n\n\t\t// console.log(wpm.getGoogleAdsDynamicRemarketingOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// user log in event\njQuery(document).on(\"wpmLogin\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"login\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view order received page event\n// new_customer parameter: https://support.google.com/google-ads/answer/9917012\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\tlet data_basic = {}\n\t\tlet data_with_cart = {}\n\n\t\tdata_basic = {\n\t\t\tsend_to : wpm.getGoogleAdsConversionIdentifiersWithLabel(),\n\t\t\ttransaction_id: wpmDataLayer.order.number,\n\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\tnew_customer : wpmDataLayer.order.new_customer,\n\t\t}\n\n\t\tif (wpmDataLayer?.order?.aw_merchant_id) {\n\t\t\tdata_with_cart = {\n\t\t\t\tdiscount : wpmDataLayer.order.discount,\n\t\t\t\taw_merchant_id : wpmDataLayer.order.aw_merchant_id,\n\t\t\t\taw_feed_country : wpmDataLayer.order.aw_feed_country,\n\t\t\t\taw_feed_language: wpmDataLayer.order.aw_feed_language,\n\t\t\t\titems : wpm.getGoogleAdsRegularOrderItems(),\n\t\t\t}\n\t\t}\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"conversion\", {...data_basic, ...data_with_cart})\n\t\t})\n\n\t\t// console.log({...data_basic,...data_with_cart})\n\n\t\t// console.log(wpm.getGoogleAdsOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n\n\n\n","/**\n * Load Google Ads functions\n * */\n\n(function (wpm, $, undefined) {\n\n\tlet conversionIdentifiers = []\n\n\twpm.getGoogleAdsConversionIdentifiersWithLabel = function () {\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\tconversionIdentifiers.push(key + \"/\" + item)\n\t\t}\n\t\treturn conversionIdentifiers\n\t}\n\n\twpm.getGoogleAdsConversionIdentifiers = function () {\n\n\t\tlet conversionIdentifiers = []\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\tconversionIdentifiers.push(key)\n\t\t}\n\n\t\treturn conversionIdentifiers\n\t}\n\n\twpm.getGoogleAdsRegularOrderItems = function () {\n\t\t// \"id\" : \"gla_34\",\n\t\t// \"quantity\": 1,\n\t\t// \"price\" : 45\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity: item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n\twpm.getGoogleAdsDynamicRemarketingOrderItems = function () {\n\t\t// \"id\" : \"gla_34\",\n\t\t// \"quantity\" : 1,\n\t\t// \"price\" : 45,\n\t\t// \"google_business_vertical\": \"retail\"\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * Load Google Ads\n */\n\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n","/**\n * Load Google Universal Analytics (GA3) event listeners\n * */\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.mp_active) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"purchase\", {\n\t\t\t\tsend_to : [wpmDataLayer.pixels.google.analytics.universal.property_id],\n\t\t\t\ttransaction_id: wpmDataLayer.order.number,\n\t\t\t\taffiliation : wpmDataLayer.order.affiliation,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tvalue : wpmDataLayer.order.value_regular,\n\t\t\t\tdiscount : wpmDataLayer.order.discount,\n\t\t\t\ttax : wpmDataLayer.order.tax,\n\t\t\t\tshipping : wpmDataLayer.order.shipping,\n\t\t\t\tcoupon : wpmDataLayer.order.coupon,\n\t\t\t\titems : wpm.getGAUAOrderItems(),\n\t\t\t})\n\t\t})\n\n\t\t// console.log(wpm.getGAUAOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Add functions for Google Analytics Universal\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getGAUAOrderItems = function () {\n\n\t\t// \"id\" : \"34\",\n\t\t// \"name\" : \"Hoodie\",\n\t\t// \"brand\" : \"\",\n\t\t// \"category\" : \"Hoodies\",\n\t\t// \"list_position\": 1,\n\t\t// \"price\" : 45,\n\t\t// \"quantity\" : 1,\n\t\t// \"variant\" : \"Color: blue | Logo: yes\"\n\n\n\t\tlet orderItems = [],\n\t\t\tlist_position = 1\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\tname : item.name,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tcategory : wpmDataLayer.products[item.id].category.join(\"/\"),\n\t\t\t\tlist_position: list_position,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.variant = wpmDataLayer.products[item.variation_id].variant_name\n\t\t\t\torderItem.brand = wpmDataLayer.products[item.variation_id].brand\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.brand = wpmDataLayer.products[item.id].brand\n\t\t\t}\n\n\t\t\torderItems.push(orderItem)\n\t\t\tlist_position++\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * Google Universal Analytics (GA3) loader\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// require(\"./event_listeners_premium\")\n// #endif\n","/**\n * Load GA4 event listeners\n * */\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.ga4?.mp_active) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"purchase\", {\n\t\t\t\tsend_to : [wpmDataLayer.pixels.google.analytics.ga4.measurement_id],\n\t\t\t\ttransaction_id: wpmDataLayer.order.number,\n\t\t\t\taffiliation : wpmDataLayer.order.affiliation,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tvalue : wpmDataLayer.order.value_regular,\n\t\t\t\tdiscount : wpmDataLayer.order.discount,\n\t\t\t\ttax : wpmDataLayer.order.tax,\n\t\t\t\tshipping : wpmDataLayer.order.shipping,\n\t\t\t\tcoupon : wpmDataLayer.order.coupon,\n\t\t\t\titems : wpm.getGA4OrderItems(),\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Load GA4 functions\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getGA4OrderItems = function () {\n\n\t\t// \"item_id\" : \"34\",\n\t\t// \"item_name\" : \"Hoodie\",\n\t\t// \"quantity\" : 1,\n\t\t// \"item_brand\" : \"\",\n\t\t// \"item_variant\" : \"Color: blue | Logo: yes\",\n\t\t// \"price\" : 45,\n\t\t// \"currency\" : \"CHF\",\n\t\t// \"item_category\": \"Hoodies\"\n\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\titem_name : item.name,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\titem_category: wpmDataLayer.products[item.id].category.join(\"/\"),\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.item_id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_variant = wpmDataLayer.products[item.variation_id].variant_name\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.variation_id].brand\n\t\t\t} else {\n\n\t\t\t\torderItem.item_id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.id].brand\n\t\t\t}\n\n\t\t\torderItems.push(orderItem)\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * GA4 loader\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// require(\"./event_listeners_premium\")\n// #endif\n","/**\n * Google Analytics loader\n */\n\nrequire(\"./ga3/loader\")\nrequire(\"./ga4/loader\")\n","/**\n * Load Google base event listeners\n */\n\n// Pixel load event listener\njQuery(document).on(\"wpmLoadPixels\", function () {\n\n\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") {\n\t\tif (wpm.canGoogleLoad()) {\n\t\t\twpm.loadGoogle()\n\t\t} else {\n\t\t\twpm.logPreventedPixelLoading(\"google\", \"analytics / ads\")\n\t\t}\n\t}\n})\n","/**\n * Load Google base functions\n */\n\n(function (wpm, $, undefined) {\n\n\twpm.googleConfigConditionsMet = function (type) {\n\t\t// always returns true if Google Consent Mode is active\n\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\t\t\treturn true\n\t\t} else if (wpm.getConsentValues().mode === \"category\") {\n\t\t\treturn wpm.getConsentValues().categories[type] === true\n\t\t} else if (wpm.getConsentValues().mode === \"pixel\") {\n\t\t\treturn wpm.getConsentValues().pixels.includes(\"google-\" + type)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings = function (google_consent_settings) {\n\n\t\tif (wpm.getConsentValues().mode === \"category\") {\n\t\t\tif (wpm.getConsentValues().categories.analytics) google_consent_settings.analytics_storage = \"granted\"\n\t\t\tif (wpm.getConsentValues().categories.ads) google_consent_settings.ad_storage = \"granted\"\n\t\t} else if ((wpm.getConsentValues().mode === \"pixel\")) {\n\t\t\tgoogle_consent_settings.analytics_storage = wpm.getConsentValues().pixels.includes(\"google-analytics\") ? \"granted\" : \"denied\"\n\t\t\tgoogle_consent_settings.ad_storage = wpm.getConsentValues().pixels.includes(\"google-ads\") ? \"granted\" : \"denied\"\n\t\t}\n\n\t\treturn google_consent_settings\n\t}\n\n\twpm.updateGoogleConsentMode = function (analytics = true, ads = true) {\n\n\t\ttry {\n\t\t\tif (\n\t\t\t\t!window.gtag ||\n\t\t\t\t!wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent\n\t\t\t) return\n\n\t\t\tgtag(\"consent\", \"update\", {\n\t\t\t\tanalytics_storage: analytics ? \"granted\" : \"denied\",\n\t\t\t\tad_storage : ads ? \"granted\" : \"denied\",\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAds = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.ads.state = \"loading\"\n\n\t\t\tif (wpmDataLayer?.pixels?.google?.ads?.enhanced_conversions?.active) {\n\t\t\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\t\t\tgtag(\"config\", key, {\"allow_enhanced_conversions\": true})\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\t\t\tgtag(\"config\", key)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.pixels?.google?.ads?.conversionIds && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_label && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_number) {\n\t\t\t\tgtag(\"config\", Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0] + \"/\" + wpmDataLayer.pixels.google.ads.phone_conversion_label, {\n\t\t\t\t\tphone_conversion_number: wpmDataLayer.pixels.google.ads.phone_conversion_number,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// ! enhanced_conversion_data needs to be var\n\t\t\t// https://support.google.com/google-ads/answer/9888145#zippy=%2Cvalidate-your-implementation-using-chrome-developer-tools\n\t\t\tif (\"order_received_page\" === wpmDataLayer.shop.page_type && wpmDataLayer?.order?.google?.ads?.enhanced_conversion_data) {\n\t\t\t\twindow.enhanced_conversion_data = wpmDataLayer.order.google.ads.enhanced_conversion_data\n\t\t\t}\n\n\t\t\twpmDataLayer.pixels.google.ads.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAnalyticsUA = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.analytics.universal.state = \"loading\"\n\n\t\t\tgtag(\"config\", wpmDataLayer.pixels.google.analytics.universal.property_id, wpmDataLayer.pixels.google.analytics.universal.parameters)\n\t\t\twpmDataLayer.pixels.google.analytics.universal.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAnalyticsGA4 = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.analytics.ga4.state = \"loading\"\n\n\t\t\tgtag(\"config\", wpmDataLayer.pixels.google.analytics.ga4.measurement_id, wpmDataLayer.pixels.google.analytics.ga4.parameters)\n\t\t\twpmDataLayer.pixels.google.analytics.ga4.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.isGoogleActive = function () {\n\t\tif (\n\t\t\twpmDataLayer?.pixels?.google?.analytics?.universal?.property_id ||\n\t\t\twpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id ||\n\t\t\t!jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)\n\t\t) {\n\t\t\treturn true\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.getGoogleGtagId = function () {\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) {\n\t\t\treturn wpmDataLayer.pixels.google.analytics.universal.property_id\n\t\t} else if (wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) {\n\t\t\treturn wpmDataLayer.pixels.google.analytics.ga4.measurement_id\n\t\t} else {\n\t\t\treturn Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]\n\t\t}\n\t}\n\n\twpm.loadGoogle = function () {\n\n\t\tif (wpm.isGoogleActive()) {\n\n\t\t\twpmDataLayer.pixels.google.state = \"loading\"\n\n\t\t\twpm.loadScriptAndCacheIt(\"https://www.googletagmanager.com/gtag/js?id=\" + wpm.getGoogleGtagId())\n\t\t\t\t.done(function (script, textStatus) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// console.log('Google Optimize loaded')\n\t\t\t\t\t\t// alert('Google Optimize loaded')\n\n\t\t\t\t\t\t// Initiate Google dataLayer and gtag\n\t\t\t\t\t\twindow.dataLayer = window.dataLayer || []\n\t\t\t\t\t\twindow.gtag = function gtag() {\n\t\t\t\t\t\t\tdataLayer.push(arguments)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Google Consent Mode\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\n\t\t\t\t\t\t\tlet google_consent_settings = {\n\t\t\t\t\t\t\t\t\"ad_storage\" : wpmDataLayer.pixels.google.consent_mode.ad_storage,\n\t\t\t\t\t\t\t\t\"analytics_storage\": wpmDataLayer.pixels.google.consent_mode.analytics_storage,\n\t\t\t\t\t\t\t\t\"wait_for_update\" : wpmDataLayer.pixels.google.consent_mode.wait_for_update,\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.region) {\n\t\t\t\t\t\t\t\tgoogle_consent_settings.region = wpmDataLayer.pixels.google.consent_mode.region\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgoogle_consent_settings = wpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings)\n\n\t\t\t\t\t\t\tgtag(\"consent\", \"default\", google_consent_settings)\n\t\t\t\t\t\t\tgtag(\"set\", \"ads_data_redaction\", wpmDataLayer.pixels.google.consent_mode.ads_data_redaction)\n\t\t\t\t\t\t\tgtag(\"set\", \"url_passthrough\", wpmDataLayer.pixels.google.consent_mode.url_passthrough)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Google Linker\n\t\t\t\t\t\t// https://developers.google.com/gtagjs/devguide/linker\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.linker?.settings) {\n\t\t\t\t\t\t\tgtag(\"set\", \"linker\", wpmDataLayer.pixels.google.linker.settings)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgtag(\"js\", new Date())\n\n\t\t\t\t\t\t// Google Ads loader\n\t\t\t\t\t\tif (!jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) { // Only run if the pixel has set up\n\t\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"ads\")) { \t\t\t\t\t\t\t// Only run if cookie consent has been given\n\t\t\t\t\t\t\t\twpm.fireGtagGoogleAds()\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twpm.logPreventedPixelLoading(\"google-ads\", \"ads\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t// Google Universal Analytics loader\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) { \t\t// Only run if the pixel has set up\n\t\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"analytics\")) {\t\t\t\t\t\t// Only run if cookie consent has been given\n\t\t\t\t\t\t\t\twpm.fireGtagGoogleAnalyticsUA()\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twpm.logPreventedPixelLoading(\"google-universal-analytics\", \"analytics\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// GA4 loader\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) { \t\t\t// Only run if the pixel has set up\n\t\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"analytics\")) {\t\t\t\t\t\t// Only run if cookie consent has been given\n\t\t\t\t\t\t\t\twpm.fireGtagGoogleAnalyticsGA4()\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twpm.logPreventedPixelLoading(\"ga4\", \"analytics\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twpmDataLayer.pixels.google.state = \"ready\"\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\t}\n\n\twpm.canGoogleLoad = function () {\n\n\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\t\t\treturn true\n\t\t} else if (\"category\" === wpm.getConsentValues().mode) {\n\t\t\treturn !!(wpm.getConsentValues().categories[\"ads\"] || wpm.getConsentValues().categories[\"analytics\"])\n\t\t} else if (\"pixel\" === wpm.getConsentValues().mode) {\n\t\t\treturn wpm.getConsentValues().pixels.includes(\"google-ads\") || wpm.getConsentValues().pixels.includes(\"google-analytics\")\n\t\t} else {\n\t\t\tconsole.error(\"Couldn't find a valid load condition for Google mode in wpmConsentValues\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.gtagLoaded = function () {\n\t\treturn new Promise(function (resolve, reject) {\n\n\t\t\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") reject()\n\n\t\t\tlet startTime = 0\n\t\t\tlet timeout = 5000\n\t\t\tlet frequency = 200;\n\n\t\t\t(function wait() {\n\t\t\t\tif (wpmDataLayer?.pixels?.google?.state === \"ready\") return resolve()\n\t\t\t\tif (startTime >= timeout) return reject()\n\t\t\t\tstartTime += frequency\n\t\t\t\tsetTimeout(wait, frequency)\n\t\t\t})()\n\t\t})\n\t}\n\n\t// wpm.gtagLoadednew = function () {\n\t// \treturn Promise.race([\n\t// \t\t\tnew Promise(function (resolve, reject) {\n\t//\n\t// \t\t\t\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") reject();\n\t//\n\t//\n\t// \t\t\t\t(function wait() {\n\t// \t\t\t\t\tif (wpmDataLayer?.pixels?.google?.state === \"ready\") return resolve()\n\t// \t\t\t\t\tif (to >= 1000) return reject()\n\t// \t\t\t\t\tsetTimeout(wait, 100)\n\t// \t\t\t\t})()\n\t// \t\t\t}),\n\t// \t\t\tnew Promise(function (resolve, reject) {\n\t// \t\t\t\tsetTimeout(() => reject(), 1000)\n\t// \t\t\t}),\n\t// \t\t],\n\t// \t)\n\t// \t\t// .then((value) => {console.log(\"race then value: \" + value)})\n\t// \t\t.catch(\n\t// \t\t\t(value) => {\n\t// \t\t\t\tconsole.log(\"race catch value: \" + value)\n\t// \t\t\t\treturn Promise.reject()\n\t// \t\t\t})\n\t// }\n\n\n\t// const promise1 = new Promise((resolve, reject) => {\n\t// \tsetTimeout(resolve, 500, \"one\")\n\t// })\n\t//\n\t// const promise2 = new Promise((resolve, reject) => {\n\t// \tsetTimeout(reject, 100, \"two\")\n\t// })\n\t//\n\t// let onlyRunIfResolves = function () {\n\t// \treturn Promise.race([promise1, promise2])\n\t// \t\t.catch(() => {\n\t// \t\t})\n\t// }\n\t//\n\t// onlyRunIfResolves()\n\t// \t.then(() => {\n\t// \t\tconsole.log(\"running function\")\n\t// \t})\n\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Load Google base\n */\n\n// Load base\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// require(\"./event_listeners_premium\")\n// #endif\n","/**\n * Load Google\n */\n\n// Load base\nrequire(\"./base/loader\")\n\n//Load additional Google libraries\nrequire(\"./ads/loader\")\nrequire(\"./analytics/loader\")\nrequire(\"./optimize/loader\")\n\n\n","/**\n * Load Google Optimize event listeners\n */\n\njQuery(document).on(\"wpmLoadPixels\", function () {\n\n\tif (wpmDataLayer?.pixels?.google?.optimize?.container_id && !wpmDataLayer?.pixels?.google?.optimize?.loaded) {\n\t\tif (wpm.canIFire(\"analytics\", \"google-optimize\")) wpm.load_google_optimize_pixel()\n\t}\n})\n","/**\n * Load Google Optimize functions\n */\n\n\n(function (wpm, $, undefined) {\n\n\twpm.load_google_optimize_pixel = function () {\n\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.optimize.loaded = true\n\n\t\t\twpm.loadScriptAndCacheIt(\"https://www.googleoptimize.com/optimize.js?id=\" + wpmDataLayer.pixels.google.optimize.container_id)\n\t\t\t// .done(function (script, textStatus) {\n\t\t\t// \t\tconsole.log('Google Optimize loaded')\n\t\t\t// });\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Load Google Optimize\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n","/**\n * Load Hotjar event listeners\n */\n\n// Pixel load event listener\njQuery(document).on(\"wpmLoadPixels\", function () {\n\n\tif (wpmDataLayer?.pixels?.hotjar?.site_id && !wpmDataLayer?.pixels?.hotjar?.loaded) {\n\t\tif (wpm.canIFire(\"analytics\", \"hotjar\") && !wpmDataLayer?.pixels?.hotjar?.loaded) wpm.load_hotjar_pixel()\n\t}\n})\n","/**\n * Load Hotjar functions\n */\n\n(function (wpm, $, undefined) {\n\n\twpm.load_hotjar_pixel = function () {\n\n\t\ttry {\n\t\t\twpmDataLayer.pixels.hotjar.loaded = true;\n\n\t\t\t// @formatter:off\n\t\t\t(function(h,o,t,j,a,r){\n\t\t\t\th.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};\n\t\t\t\th._hjSettings={hjid:wpmDataLayer.pixels.hotjar.site_id,hjsv:6};\n\t\t\t\ta=o.getElementsByTagName('head')[0];\n\t\t\t\tr=o.createElement('script');r.async=1;\n\t\t\t\tr.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;\n\t\t\t\ta.appendChild(r);\n\t\t\t})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');\n\t\t\t// @formatter:on\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Hotjar loader\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n","/**\n * Register event listeners\n */\n\n// remove_from_cart event\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", function () {\n\t// jQuery('.remove_from_cart_button, .remove').on('click', function (e) {\n\n\ttry {\n\t\t// console.log('remove_from_cart: ' + jQuery(this).data('product_id'));\n\n\t\tlet url = new URL(jQuery(this).attr(\"href\"))\n\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url)\n\n\t\twpm.removeProductFromCart(productId)\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// add_to_cart event\njQuery(document).on(\"click\", \".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button\", function () {\n\t// jQuery('.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .js-ajax-add-to-cart, .single_add_to_cart_button, .btn_color-2').on('click', function (e) {\n\n\ttry {\n\t\t// console.log('add_to_cart');\n\n\t\tif (wpmDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// first process related and upsell products\n\t\t\tif (typeof jQuery(this).attr(\"href\") !== \"undefined\" && jQuery(this).attr(\"href\").includes(\"add-to-cart\")) {\n\t\t\t\t// console.log('add-to-cart on upsell and related products');\n\t\t\t\tlet quantity = 1\n\t\t\t\tlet productId = jQuery(this).data(\"product_id\")\n\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t} else {\n\n\t\t\t\tif (wpmDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\t\t// console.log('test');\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(this).val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"variable\") {\n\n\t\t\t\t\t// console.log('variable');\n\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(\"[name='variation_id']\").val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\t\t// console.log('grouped');\n\n\t\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each(function () {\n\n\t\t\t\t\t\tlet quantity = Number(jQuery(this).find(\".input-text.qty\").val())\n\n\t\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\t\tlet classes = jQuery(this).attr(\"class\")\n\t\t\t\t\t\tlet productId = wpm.getPostIdFromString(classes)\n\n\t\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t\t\t})\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\t\t// console.log('bundle');\n\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(\"input[name=add-to-cart]\").val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\n\t\t\t// console.log('non product page');\n\n\t\t\tlet quantity = 1\n\t\t\tlet productId = jQuery(this).data(\"product_id\")\n\t\t\t// console.log('productId: ' + productId);\n\t\t\twpm.addProductToCart(productId, quantity)\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// if someone clicks anywhere on a custom /?add-to-cart=123 link\n// trigger the add to cart event\n// body.one('click', function (e) {\n//\n// try {\n// if (jQuery(this)[0].URL) {\n//\n// let href = new URL(jQuery(this)[0].URL);\n// let searchParams = new URLSearchParams(href.search);\n//\n// if (searchParams.has('add-to-cart')) {\n// // console.log('non product page, /?add-to-cart=123 link');\n//\n// let productId = searchParams.get('add-to-cart');\n// wpm.addProductToCart(productId, 1);\n// }\n// }\n// } catch (e) {\n// console.error(e);\n// }\n// });\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\njQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", function (event) {\n\t// jQuery('a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)').one('click', function (event) {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet href = jQuery(event.target).closest(\"a\").attr(\"href\")\n\n\t\t\tif (href.includes(\"add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/)\n\t\t\t\t// console.log('pid: ' + matches[2])\n\t\t\t\tif (matches) wpm.addProductToCart(matches[2], 1)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// select_content GA UA event\n// select_item GA 4 event\n// jQuery(document).on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product-small.box', function (e) {\njQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", function () {\n\t// jQuery('.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product').on('click', function (e) {\n\n\ttry {\n\n\t\t/**\n\t\t *\n\t\t * On some pages the event fires multiple times, and on product pages\n\t\t * even on page load. Using e.stopPropagation helps to prevent this,\n\t\t * but I dont know why. We don't even have to use this, since only a real\n\t\t * product click yields a valid productId. So we filter the invalid click\n\t\t * events out later down the code. I'll keep it that way because this is\n\t\t * the most compatible way across shops.\n\t\t * e.stopPropagation();\n\t\t * */\n\n\t\t\t// console.log('select_content and select_item');\n\n\t\tlet productId = jQuery(this).nextAll(\".wpmProductId:first\").data(\"id\")\n\t\t// console.log('select_content and select_item: ' + productId);\n\n\n\t\t/**\n\t\t * On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t * In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t * related products, which are found below.\n\t\t */\n\n\t\tif (productId) {\n\n\t\t\t// console.log('select_content and select_item: ' + productId);\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\t// console.log('prodid: ' + productId);\n\n\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\t\tjQuery(document).trigger(\"wpmSelectContentGaUa\", product)\n\t\t\t\tjQuery(document).trigger(\"wpmSelectItem\", product)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// begin_checkout event\njQuery(document).one(\"click\", \".checkout-button, .cart-checkout-button, .button.checkout\", function () {\n\t// jQuery('.checkout-button, .cart-checkout-button, .button.checkout').one('click', function (e) {\n\t// console.log('begin_checkout');\n\n\tjQuery(document).trigger(\"wpmBeginCheckout\")\n})\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\njQuery(document).on(\"input\", \"#billing_email\", function () {\n\t// jQuery('#billing_email').on('input', function () {\n\n\tif (wpm.isEmail(jQuery(this).val())) {\n\t\t// wpm.fireCheckoutOption(2);\n\t\twpm.fireCheckoutProgress(2)\n\t\twpm.emailSelected = true\n\t}\n})\n\n// track checkout option event: purchase click\njQuery(document).on(\"click\", \".wc_payment_methods\", function () {\n\t// jQuery('.wc_payment_methods').on('click', function () {\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3)\n\t}\n\n\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val())\n\twpm.paymentMethodSelected = true\n})\n\n// track checkout option event: purchase click\njQuery(document).one(\"click\", \"#place_order\", function () {\n\t// jQuery('#place_order').one('click', function () {\n\n\tif (false === wpm.emailSelected) {\n\t\twpm.fireCheckoutProgress(2)\n\t}\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3)\n\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val())\n\t}\n\n\twpm.fireCheckoutProgress(4)\n})\n\n// update cart event\njQuery(document).on(\"click\", \"[name='update_cart']\", function () {\n\t// jQuery(\"[name='update_cart']\").on('click', function (e) {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each(function () {\n\n\t\t\t// let productId = jQuery(this).find('[data-product_id]').data('product_id');\n\n\t\t\tlet url = new URL(jQuery(this).find(\".product-remove\").find(\"a\").attr(\"href\"))\n\t\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url)\n\n\n\t\t\tlet quantity = jQuery(this).find(\".qty\").val()\n\n\t\t\tif (quantity === 0) {\n\t\t\t\twpm.removeProductFromCart(productId)\n\t\t\t} else if (quantity < wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.removeProductFromCart(productId, wpmDataLayer.cart[productId].quantity - quantity)\n\t\t\t} else if (quantity > wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.addProductToCart(productId, quantity - wpmDataLayer.cart[productId].quantity)\n\t\t\t}\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t\twpm.getCartItemsFromBackend()\n\t}\n})\n\n\n// add_to_wishlist\njQuery(document).on(\"click\", \".add_to_wishlist, .wl-add-to\", function () {\n\t// jQuery('.add_to_wishlist, .wl-add-to').on('click', function () {\n\n\ttry {\n\t\t// console.log('add_to_wishlist');\n\t\t// console.log('this:' + jQuery(this).data('product-id'));\n\n\t\tlet productId\n\n\t\tif (jQuery(this).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\t\t\tproductId = jQuery(this).data(\"productid\")\n\t\t} else if (jQuery(this).data(\"product-id\")) { // for the YITH wishlist plugin\n\t\t\tproductId = jQuery(this).data(\"product-id\")\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t// console.log('add_to_wishlist');\n\t\t// console.log(product);\n\n\t\tjQuery(document).trigger(\"wpmAddToWishlist\", product)\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\njQuery(document).on(\"updated_cart_totals\", function () {\n\tjQuery(document).trigger(\"wpmViewCart\")\n})\n\n\n/**\n * Called when the user selects all the required dropdowns / attributes\n *\n * Has to be hooked after document ready\n *\n * https://stackoverflow.com/a/27849208/4688612\n * https://stackoverflow.com/a/65065335/4688612\n */\njQuery(\".single_variation_wrap\").on(\"show_variation\", function (event, variation) {\n\n\ttry {\n\t\tlet productId = getIdBasedOndVariationsOutputSetting(variation.variation_id)\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t// console.log('productId: ' + productId);\n\n\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n/**\n * Called on variable products when no selection has been done yet\n * or when the visitor deselects his choice.\n *\n * Has to be hooked after document ready\n */\n\njQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n\n\ttry {\n\t\tlet classes = jQuery(\"body\").attr(\"class\")\n\t\tlet productId = classes.match(/(postid-)(\\d+)/)[2]\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t/**\n\t\t * If we have a variable product with no preset,\n\t\t * and variations output is enabled,\n\t\t * then we send a viewItem event with the first\n\t\t * variation we find for the parent.\n\t\t * If variations output is disabled,\n\t\t * we just send the parent ID.\n\t\t */\n\t\tif (\n\t\t\t\"variable\" === wpmDataLayer.shop.product_type &&\n\t\t\twpmDataLayer?.general?.variationsOutput\n\t\t) {\n\t\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n\t\t\t\tif (\"parentId\" in product) {\n\t\t\t\t\t// console.log('pid: ' + value.parentId)\n\t\t\t\t\tproductId = product.id\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t// console.log('productId: ' + productId);\n\n\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n/**\n * Set up wpm events\n */\n\n\n// populate the wpmDataLayer with the cart items\njQuery(window).on(\"wpmLoad\", function () {\n\n\ttry {\n\t\t// When a new session is initiated there are no items in the cart,\n\t\t// so we can save the call to get the cart items\n\t\tif (wpm.doesWooCommerceCartExist()) wpm.getCartItems()\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// get all add-to-cart= products from backend\njQuery(window).on(\"wpmLoad\", function () {\n\n\twpmDataLayer.products = wpmDataLayer.products || {}\n\n\t// scan page for add-to-cart= links\n\tlet productIds = wpm.getAddToCartLinkProductIds()\n\n\twpm.getProductsFromBackend(productIds)\n})\n\n/**\n * Save the referrer into a cookie\n */\n\njQuery(window).on(\"wpmLoad\", function () {\n\n\t// can't use session storage as we can't read it from the server\n\tif (!wpm.getCookie(\"wpmReferrer\")) {\n\n\t\tif (document.referrer) {\n\t\t\tlet referrerUrl = new URL(document.referrer)\n\t\t\tlet referrerHostname = referrerUrl.hostname\n\n\t\t\tif (referrerHostname !== window.location.host) {\n\t\t\t\twpm.setCookie(\"wpmReferrer\", referrerHostname)\n\t\t\t} else {\n\t\t\t\twpm.setCookie(\"wpmReferrer\", \"\")\n\t\t\t}\n\n\t\t} else {\n\t\t\twpm.setCookie(\"wpmReferrer\", \"\")\n\t\t}\n\t}\n})\n\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\n\njQuery(window).on(\"wpmLoad\", function () {\n\ttry {\n\t\tif (typeof wpmDataLayer != \"undefined\" && !wpmDataLayer?.wpmLoadFired) {\n\n\t\t\tjQuery(document).trigger(\"wpmLoadAlways\")\n\n\t\t\tif (\"product\" === wpmDataLayer.shop.page_type && wpmDataLayer.shop.product_type !== \"variable\" && wpm.getMainProductIdFromProductPage()) {\n\n\t\t\t\tlet product = wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage())\n\t\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\n\t\t\t} else if (\"product_category\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmCategory\")\n\n\t\t\t} else if (\"search\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmSearch\")\n\n\t\t\t} else if (\"cart\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmViewCart\")\n\n\t\t\t} else if (\"order_received_page\" === wpmDataLayer.shop.page_type && wpmDataLayer.order) {\n\n\t\t\t\tif (!wpm.isOrderIdStored(wpmDataLayer.order.id)) {\n\n\t\t\t\t\tjQuery(document).trigger(\"wpmOrderReceivedPage\")\n\t\t\t\t\twpm.writeOrderIdToStorage(wpmDataLayer.order.id)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"wpmEverywhereElse\")\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.user?.id && !wpm.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"wpmLogin\")\n\t\t\t\twpm.setLoginEventFired()\n\t\t\t}\n\n\t\t\t// /**\n\t\t\t// * Load mini cart fragments into a wpm session storage key,\n\t\t\t// * after the document load event.\n\t\t\t// */\n\t\t\t// jQuery(document).ajaxSend(function (event, jqxhr, settings) {\n\t\t\t// \t// console.log('settings.url: ' + settings.url);\n\t\t\t//\n\t\t\t// \tif (settings.url.includes(\"get_refreshed_fragments\") && sessionStorage) {\n\t\t\t// \t\tif (!sessionStorage.getItem(\"wpmMiniCartActive\")) {\n\t\t\t// \t\t\tsessionStorage.setItem(\"wpmMiniCartActive\", JSON.stringify(true))\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// })\n\n\t\t\twpmDataLayer.wpmLoadFired = true\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// jQuery(window).on(\"load\", function () {\n// \tjQuery(document).trigger(\"wpmLoad\", {})\n// })\n\njQuery(window).on(\"wpmPreLoadPixels\", function () {\n\n\tif (wpmDataLayer?.shop?.cookie_consent_mgmt?.explicit_consent) {\n\t\twpm.updateConsentCookieValues(true)\n\t}\n\tjQuery(document).trigger(\"wpmLoadPixels\", {})\n})\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n(function (wpm, $, undefined) {\n\n\tconst wpmDeduper = {\n\t\tkeyName : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t}\n\n\tconst wpmRestSettings = {\n\t\t// cookiesAvailable : '_wpm_cookies_are_available',\n\t\tcookieWpmRestEndpointAvailable: \"_wpm_endpoint_available\",\n\t\trestEndpoint : \"/wp-json/\",\n\t\trestFails : 0,\n\t\trestFailsThreshold : 10,\n\t}\n\n\twpm.emailSelected = false\n\twpm.paymentMethodSelected = false\n\n\t// wpm.checkIfCookiesAvailable = function () {\n\t//\n\t// // read the cookie if previously set, if it is return true, otherwise continue\n\t// if (wpm.getCookie(wpmRestSettings.cookiesAvailable)) {\n\t// return true;\n\t// }\n\t//\n\t// // set the cookie for the session\n\t// Cookies.set(wpmRestSettings.cookiesAvailable, true);\n\t//\n\t// // read cookie, true if ok, false if not ok\n\t// return !!wpm.getCookie(wpmRestSettings.cookiesAvailable);\n\t// }\n\n\twpm.useRestEndpoint = function () {\n\n\t\t// only if sessionStorage is available\n\n\t\t// only if REST API endpoint is generally accessible\n\t\t// check in sessionStorage if we checked before and return answer\n\t\t// otherwise check if the endpoint is available, save answer in sessionStorage and return answer\n\n\t\t// only if not too many REST API errors happened\n\n\t\treturn wpm.isSessionStorageAvailable() &&\n\t\t\twpm.isRestEndpointAvailable() &&\n\t\t\twpm.isBelowRestErrorThreshold()\n\t}\n\n\twpm.isBelowRestErrorThreshold = function () {\n\t\treturn window.sessionStorage.getItem(wpmRestSettings.restFails) <= wpmRestSettings.restFailsThreshold\n\t}\n\n\twpm.isRestEndpointAvailable = function () {\n\n\t\tif (window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable)) {\n\t\t\treturn JSON.parse(window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable))\n\t\t} else {\n\t\t\t// return wpm.testEndpoint();\n\t\t\t// just set the value whenever possible in order not to wait or block the main thread\n\t\t\twpm.testEndpoint()\n\t\t}\n\t}\n\n\twpm.isSessionStorageAvailable = function () {\n\n\t\treturn !!window.sessionStorage\n\t}\n\n\twpm.testEndpoint = function (\n\t\turl = location.protocol + \"//\" + location.host + wpmRestSettings.restEndpoint,\n\t\tcookieName = wpmRestSettings.cookieWpmRestEndpointAvailable,\n\t) {\n\t\t// console.log('testing endpoint');\n\n\t\tjQuery.ajax(url, {\n\t\t\ttype : \"HEAD\",\n\t\t\ttimeout: 1000,\n\t\t\t// async: false,\n\t\t\tstatusCode: {\n\t\t\t\t200: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, true);\n\t\t\t\t\t// console.log('endpoint works');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(true))\n\t\t\t\t},\n\t\t\t\t404: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false))\n\t\t\t\t},\n\t\t\t\t0 : function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false))\n\t\t\t\t},\n\t\t\t},\n\t\t}).then(response => {\n\t\t\t// console.log('test done')\n\t\t\t// console.log('result: ' + JSON.parse(window.sessionStorage.getItem(cookieName)));\n\t\t\t// return JSON.parse(window.sessionStorage.getItem(cookieName));\n\t\t})\n\t}\n\n\twpm.isWpmRestEndpointAvailable = function (cookieName = wpmRestSettings.cookieWpmRestEndpointAvailable) {\n\n\t\treturn !!wpm.getCookie(cookieName)\n\t}\n\n\twpm.writeOrderIdToStorage = function (orderId, expireDays = 365) {\n\n\t\t// save the order ID in the browser storage\n\n\t\tif (!window.Storage) {\n\t\t\tlet expiresDate = new Date()\n\t\t\texpiresDate.setDate(expiresDate.getDate() + wpmDeduper.cookieExpiresDays)\n\n\t\t\tlet ids = []\n\t\t\tif (checkCookie()) {\n\t\t\t\tids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))\n\t\t\t}\n\n\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\tids.push(orderId)\n\t\t\t\tdocument.cookie = wpmDeduper.keyName + \"=\" + JSON.stringify(ids) + \";expires=\" + expiresDate.toUTCString()\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (localStorage.getItem(wpmDeduper.keyName) === null) {\n\t\t\t\tlet ids = []\n\t\t\t\tids.push(orderId)\n\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))\n\n\t\t\t} else {\n\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))\n\t\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\t\tids.push(orderId)\n\t\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof wpm.storeOrderIdOnServer === \"function\" && wpmDataLayer.orderDeduplication) {\n\t\t\twpm.storeOrderIdOnServer(orderId)\n\t\t}\n\t}\n\n\tfunction checkCookie() {\n\t\tlet key = wpm.getCookie(wpmDeduper.keyName)\n\t\treturn key !== \"\"\n\t}\n\n\twpm.isOrderIdStored = function (orderId) {\n\n\t\t// console.log('deduper: ' + wpmDataLayer.orderDeduplication);\n\t\tif (wpmDataLayer.orderDeduplication) {\n\t\t\t// console.log('order deduplication: on');\n\t\t\tif (!window.Storage) {\n\n\t\t\t\tif (checkCookie()) {\n\t\t\t\t\tlet ids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))\n\t\t\t\t\treturn ids.includes(orderId)\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (localStorage.getItem(wpmDeduper.keyName) !== null) {\n\t\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))\n\t\t\t\t\treturn ids.includes(orderId)\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(\"order duplication prevention: off\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.isEmail = function (email) {\n\t\t// https://emailregex.com/\n\t\tlet regex = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\n\t\treturn regex.test(email)\n\t}\n\n\twpm.removeProductFromCart = function (productId, quantityToRemove = null) {\n\t\t// console.log('product_id: ' + productId + ' | quantityToRemove: ' + quantityToRemove);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tlet quantity\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = wpmDataLayer.cart[productId].quantity\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove\n\t\t\t}\n\n\t\t\t// console.log('product_id: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log(productId);\n\t\t\t// console.log(wpmDataLayer.cart);\n\t\t\t// console.log(wpmDataLayer.cart[productId]);\n\n\t\t\tif (wpmDataLayer.cart[productId]) {\n\n\t\t\t\t// let product = {\n\t\t\t\t// id : productId.toString(),\n\t\t\t\t// dyn_r_ids: wpmDataLayer.cart[productId].dyn_r_ids,\n\t\t\t\t// name : wpmDataLayer.cart[productId].name,\n\t\t\t\t// // list_name: wpmDataLayer.shop.list_name, // doesn't make sense on mini_cart\n\t\t\t\t// brand : wpmDataLayer.cart[productId].brand,\n\t\t\t\t// category: wpmDataLayer.cart[productId].category,\n\t\t\t\t// variant : wpmDataLayer.cart[productId].variant,\n\t\t\t\t// // list_position: wpmDataLayer.cart[productId].position, // doesn't make sense on mini_cart\n\t\t\t\t// quantity : quantity,\n\t\t\t\t// price : wpmDataLayer.cart[productId].price,\n\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t// };\n\t\t\t\t//\n\t\t\t\t// if (product.isVariation) product['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t// console.log('removing');\n\t\t\t\t// console.log(data);\n\n\t\t\t\tjQuery(document).trigger(\"wpmRemoveFromCart\", product)\n\n\t\t\t\tif (quantityToRemove == null || wpmDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\t\tdelete wpmDataLayer.cart[productId]\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t} else {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity - quantity\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t\t// console.log('getting cart from back end');\n\t\t\t// wpm.getCartItemsFromBackend();\n\t\t\t// console.log('getting cart from back end done');\n\n\t\t}\n\t}\n\n\tgetIdBasedOndVariationsOutputSetting = function (productId) {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.general?.variationsOutput) {\n\t\t\t\t// console.log('test');\n\t\t\t\treturn productId\n\t\t\t} else {\n\t\t\t\tif (wpmDataLayer.products[productId].isVariation) {\n\t\t\t\t\treturn wpmDataLayer.products[productId].parentId\n\t\t\t\t} else {\n\t\t\t\t\treturn productId\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// add_to_cart\n\twpm.addProductToCart = function (productId, quantity) {\n\n\t\ttry {\n\t\t\t// console.log('productId: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log('productId: ' + productId + ' | variationId: ' + variationId + ' | qty: ' + quantity);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tif (wpmDataLayer?.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t// console.log(productId)\n\t\t\t\t// console.log(wpmDataLayer.cart)\n\n\t\t\t\tjQuery(document).trigger(\"wpmAddToCart\", product)\n\n\t\t\t\t// add product to cart wpmDataLayer['cart']\n\n\t\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t\t// otherwise create that product object in the wpmDataLayer['cart']\n\t\t\t\tif (wpmDataLayer?.cart[productId]) {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity + quantity\n\t\t\t\t} else {\n\n\t\t\t\t\tif (!(\"cart\" in wpmDataLayer)) wpmDataLayer.cart = {}\n\t\t\t\t\twpmDataLayer.cart[productId] = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\t\t\t\t}\n\n\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\n\t\t\t// fallback if wpmDataLayer.cart and wpmDataLayer.products got out of sync in case cart caching has an issue\n\t\t\twpm.getCartItemsFromBackend()\n\t\t}\n\t}\n\n\twpm.getCartItems = function () {\n\n\t\t// console.log('get cart items');\n\n\t\tif (sessionStorage) {\n\t\t\tif (!sessionStorage.getItem(\"wpmDataLayerCart\") || wpmDataLayer.shop.page_type === \"order_received_page\") {\n\t\t\t\tsessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify({}))\n\t\t\t} else {\n\t\t\t\twpm.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem(\"wpmDataLayerCart\")))\n\t\t\t}\n\t\t} else {\n\t\t\twpm.getCartItemsFromBackend()\n\t\t}\n\t}\n\n\t// get all cart items from the backend\n\twpm.getCartItemsFromBackend = function () {\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction: \"wpm_get_cart_items\",\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"get\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (cartItems) {\n\n\t\t\t\t\t\t// save all cart items into wpmDataLayer\n\n\t\t\t\t\t\tif (!cartItems[\"cart\"]) cartItems[\"cart\"] = {}\n\n\t\t\t\t\t\twpm.saveCartObjectToDataLayer(cartItems[\"cart\"])\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(cartItems[\"cart\"]))\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getProductsFromBackend = function (productIds) {\n\t\t// console.log('getting pids from back-end: ' + productIds)\n\t\t// get productIds from the backend\n\n\t\t// reduce productIds by products already in the dataLayer\n\t\tproductIds = productIds.filter(item => !wpmDataLayer.products.hasOwnProperty(item))\n\n\t\t// if no products IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return\n\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction : \"wpm_get_product_ids\",\n\t\t\t\tproductIds: productIds,\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"get\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (products) {\n\n\t\t\t\t\t\t// merge products into wpmDataLayer.products\n\t\t\t\t\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, products)\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.saveCartObjectToDataLayer = function (cartObject) {\n\t\twpmDataLayer.cart = cartObject\n\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, cartObject)\n\t}\n\n\twpm.fireCheckoutOption = function (step, checkout_option = null, value = null) {\n\n\t\tlet data = {\n\t\t\tstep : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue : value,\n\t\t}\n\n\t\tjQuery(document).trigger(\"wpmFireCheckoutOption\", data)\n\t}\n\n\twpm.fireCheckoutProgress = function (step) {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t}\n\n\t\tjQuery(document).trigger(\"wpmFireCheckoutProgress\", data)\n\t}\n\n\twpm.getPostIdFromString = function (string) {\n\t\t// console.log(string);\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2]\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.triggerViewItemList = function (productId) {\n\n\t\t// productId = null;\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tjQuery(document).trigger(\"wpmViewItemList\", wpm.getProductDataForViewItemEvent(productId))\n\t}\n\n\twpm.getProductDataForViewItemEvent = function (productId) {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\ttry {\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\treturn wpm.getProductDetailsFormattedForEvent(productId)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\twpm.getMainProductIdFromProductPage = function () {\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(wpmDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".wpmProductId:first\").data(\"id\")\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.viewItemListTriggerTestMode = function (target) {\n\n\t\tjQuery(target).css({\"position\": \"relative\"})\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\")\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\" : \"10\",\n\t\t\t\"display\" : \"block\",\n\t\t\t\"position\" : \"absolute\",\n\t\t\t\"height\" : \"100%\",\n\t\t\t\"top\" : \"0\",\n\t\t\t\"left\" : \"0\",\n\t\t\t\"right\" : \"0\",\n\t\t\t\"opacity\" : wpmDataLayer.viewItemListTrigger.opacity,\n\t\t\t\"background-color\": wpmDataLayer.viewItemListTrigger.backgroundColor,\n\t\t})\n\t}\n\n\twpm.getSearchTermFromUrl = function () {\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search)\n\t\t\treturn urlParameters.get(\"s\")\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {}\n\n\twpm.observerCallback = function (entries, observer) {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\")\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".wpmProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".wpmProductId\").data(\"id\")\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".wpmProductId\").data(\"id\")\n\t\t\t\t}\n\n\t\t\t\t// productId = null;\n\n\t\t\t\tif (!productId) throw Error(\"wpmProductId element not found\")\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\t\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\t\twpm.triggerViewItemList(productId)\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) wpm.viewItemListTriggerTestMode(entry.target)\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.repeat === false) observer.unobserve(entry.target)\n\t\t\t\t\t}, wpmDataLayer.viewItemListTrigger.timeout)\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId])\n\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove()\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e)\n\t\t\t}\n\t\t})\n\t}\n\n\t// fire view_item_list only on products that have become visible\n\tlet io\n\tlet ioid = 0\n\tlet allIoElementsToWatch\n\n\tlet getAllElementsToWatch = function () {\n\n\t\tallIoElementsToWatch = jQuery(\".wpmProductId\")\n\t\t\t.map(function (i, elem) {\n\t\t\t\t// console.log(elem);\n\t\t\t\tif (\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"type-product\") ||\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"product\") ||\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"product-item-inner\")\n\t\t\t\t) {\n\t\t\t\t\t// console.log(elem);\n\t\t\t\t\treturn jQuery(elem).parent()\n\t\t\t\t} else if (\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"wc-block-grid__product\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"product\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"product-small\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"woocommerce-LoopProduct-link\")\n\t\t\t\t) {\n\t\t\t\t\treturn jQuery(this).prev()\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\")\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\twpm.startIntersectionObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tif (wpm.urlHasParameter(\"vildemomode\")) wpmDataLayer.viewItemListTrigger.testMode = true\n\n\t\t\t// set up intersection observer\n\t\t\tio = new IntersectionObserver(wpm.observerCallback, {\n\t\t\t\tthreshold: wpmDataLayer.viewItemListTrigger.threshold,\n\t\t\t})\n\n\t\t\tgetAllElementsToWatch()\n\n\t\t\t// console.log(allElementsToWatch);\n\n\t\t\tallIoElementsToWatch.each(function (i, elem) {\n\t\t\t\t// console.log(elem[0]);\n\t\t\t\t// jQuery(elem[0]).attr('data-ioid', ioid++);\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++)\n\n\t\t\t\tio.observe(elem[0])\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// watch DOM for new lazy loaded products and add them to the intersection observer\n\twpm.startProductsMutationObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".wpmProductId:eq(0)\").parents().has(jQuery(\".wpmProductId:eq(1)\").parents()).first()\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes : true,\n\t\t\t\t\tchildList : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// Create an observer instance\n\tlet productsMutationObserver = new MutationObserver(function (mutations) {\n\n\t\tmutations.forEach(function (mutation) {\n\t\t\tlet newNodes = mutation.addedNodes // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes) // jQuery set\n\t\t\t\tnodes.each(function () {\n\t\t\t\t\tif (\n\t\t\t\t\t\tjQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasWpmProductIdElement(this)) {\n\t\t\t\t\t\t\tjQuery(this).data(\"ioid\", ioid++)\n\t\t\t\t\t\t\tio.observe(this)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t})\n\n\tlet hasWpmProductIdElement = function (elem) {\n\t\treturn !!(jQuery(elem).find(\".wpmProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".wpmProductId\").length)\n\t}\n\n\twpm.setCookie = function (cookieName, cookieValue = \"\", expiryDays = null) {\n\t\tif (expiryDays) {\n\t\t\tlet d = new Date()\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000))\n\t\t\tlet expires = \"expires=\" + d.toUTCString()\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\"\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\"\n\t\t}\n\t}\n\n\twpm.getCookie = function (cookieName) {\n\t\tlet name = cookieName + \"=\"\n\t\tlet decodedCookie = decodeURIComponent(document.cookie)\n\t\tlet ca = decodedCookie.split(\";\")\n\t\tfor (let i = 0; i < ca.length; i++) {\n\t\t\tlet c = ca[i]\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1)\n\t\t\t}\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length)\n\t\t\t}\n\t\t}\n\t\treturn \"\"\n\t}\n\n\twpm.getWpmSessionData = function () {\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(\"_wpm\")\n\t\t\tif (data !== null) {\n\t\t\t\treturn JSON.parse(data)\n\t\t\t} else {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t} else {\n\t\t\treturn {}\n\t\t}\n\t}\n\n\twpm.setWpmSessionData = function (data) {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(\"_wpm\", JSON.stringify(data))\n\t\t}\n\t}\n\n\twpm.storeOrderIdOnServer = function (orderId) {\n\n\t\t// console.log('saving wpm_purchase_pixels_fired');\n\n\t\t// console.log('url: ' + wpm_premium_only_ajax_object.ajax_url);\n\t\t// console.log('nonce: ' + wpm_premium_only_ajax_object.nonce);\n\t\t// console.log('url: ' + wpm.ajax_url);\n\t\t// console.log('nonce: ' + wpm.nonce);\n\n\t\ttry {\n\t\t\t// save the state in the database\n\t\t\tlet data = {\n\t\t\t\taction : \"wpm_purchase_pixels_fired\",\n\t\t\t\torder_id: orderId,\n\t\t\t\t// nonce : ajax_object.nonce,\n\t\t\t\tnonce: wpm.nonce,\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"post\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (response) {\n\t\t\t\t\t\tif (response.success === false) {\n\t\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getProductIdByCartItemKeyUrl = function (url) {\n\t\tlet searchParams = new URLSearchParams(url.search)\n\t\tlet cartItemKey = searchParams.get(\"remove_item\")\n\n\t\tlet productId\n\n\t\tif (wpmDataLayer.cartItemKeys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey][\"product_id\"]\n\t\t} else {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey][\"variation_id\"]\n\t\t}\n\n\t\treturn productId\n\t}\n\n\twpm.getAddToCartLinkProductIds = function () {\n\t\treturn jQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\")\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/)\n\t\t\t\tif (matches) return matches[2]\n\t\t\t}\n\t\t}).get()\n\t}\n\n\twpm.getProductDetailsFormattedForEvent = function (productId, quantity = 1) {\n\n\t\t// console.log(wpmDataLayer.products[productId].dyn_r_ids)\n\n\t\tlet product = {\n\t\t\tid : productId.toString(),\n\t\t\tdyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\tname : wpmDataLayer.products[productId].name,\n\t\t\tlist_name : wpmDataLayer.shop.list_name,\n\t\t\tbrand : wpmDataLayer.products[productId].brand,\n\t\t\tcategory : wpmDataLayer.products[productId].category,\n\t\t\tvariant : wpmDataLayer.products[productId].variant,\n\t\t\tlist_position: wpmDataLayer.products[productId].position,\n\t\t\tquantity : quantity,\n\t\t\tprice : wpmDataLayer.products[productId].price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tisVariable : wpmDataLayer.products[productId].isVariable,\n\t\t\tisVariation : wpmDataLayer.products[productId].isVariation,\n\t\t\tparentId : wpmDataLayer.products[productId].parentId,\n\t\t}\n\n\t\tif (product.isVariation) product[\"parentId_dyn_r_ids\"] = wpmDataLayer.products[productId].parentId_dyn_r_ids\n\n\t\treturn product\n\t}\n\n\twpm.setReferrerToCookie = function () {\n\t\t// can't use session storage as we can't read it from the server\n\t\tif (!wpm.getCookie(\"wpmReferrer\")) {\n\t\t\twpm.setCookie(\"wpmReferrer\", document.referrer)\n\t\t}\n\t}\n\n\twpm.getReferrerFromCookie = function () {\n\t\tif (wpm.getCookie(\"wpmReferrer\")) {\n\t\t\treturn wpm.getCookie(\"wpmReferrer\")\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t}\n\n\twpm.getClidFromBrowser = function (clidId = \"gclid\") {\n\n\t\tlet clidCookieId\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t}\n\n\t\tif (wpm.getCookie(clidCookieId[clidId])) {\n\t\t\tlet clidCookie = wpm.getCookie(clidCookieId[clidId])\n\t\t\tlet matches = clidCookie.match(/(GCL.[\\d]*.)(.*)/)\n\t\t\treturn matches[2]\n\t\t} else {\n\t\t\treturn \"\"\n\t\t}\n\t}\n\n\twpm.getUserAgent = function () {\n\t\treturn navigator.userAgent\n\t}\n\n\twpm.getViewPort = function () {\n\t\treturn {\n\t\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t\t}\n\t}\n\n\t/*\n\t* Handle Cookie Management Platforms\n\t* */\n\n\tlet getComplianzCookies = function () {\n\n\t\tlet cmplz_statistics = wpm.getCookie(\"cmplz_statistics\")\n\t\tlet cmplz_marketing = wpm.getCookie(\"cmplz_marketing\")\n\t\tlet cmplz_consent_status = wpm.getCookie(\"cmplz_consent_status\") || wpm.getCookie(\"cmplz_banner-status\")\n\n\n\t\tif (cmplz_consent_status) {\n\t\t\treturn {\n\t\t\t\tanalytics : cmplz_statistics === \"allow\",\n\t\t\t\tads : cmplz_marketing === \"allow\",\n\t\t\t\tvisitorHasChosen: true,\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tlet getCookieLawInfoCookies = function () {\n\n\t\tlet analyticsCookie = wpm.getCookie(\"cookielawinfo-checkbox-analytics\") || wpm.getCookie(\"cookielawinfo-checkbox-analytiques\")\n\t\tlet adsCookie = wpm.getCookie(\"cookielawinfo-checkbox-advertisement\") || wpm.getCookie(\"cookielawinfo-checkbox-publicite\")\n\t\tlet visitorHasChosen = wpm.getCookie(\"CookieLawInfoConsent\")\n\n\t\tif (analyticsCookie || adsCookie) {\n\n\t\t\treturn {\n\t\t\t\tanalytics : analyticsCookie === \"yes\",\n\t\t\t\tads : adsCookie === \"yes\",\n\t\t\t\tvisitorHasChosen: !!visitorHasChosen,\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\n\tlet\n\t\twpmConsentValues = {}\n\twpmConsentValues.categories = {}\n\twpmConsentValues.pixels = []\n\twpmConsentValues.mode = \"category\"\n\twpmConsentValues.visitorHasChosen = false\n\n\twpm.getConsentValues = function () {\n\t\treturn wpmConsentValues\n\t}\n\n\twpm.setConsentValueCategories = function (analytics = false, ads = false) {\n\t\twpmConsentValues.categories.analytics = analytics\n\t\twpmConsentValues.categories.ads = ads\n\t}\n\n\twpm.updateConsentCookieValues = function (explicitConsent = false) {\n\n\t\t// ad_storage\n\t\t// analytics_storage\n\t\t// functionality_storage\n\t\t// personalization_storage\n\t\t// security_storage\n\n\t\t// console.log('exp cons: ' + explicitConsent)\n\n\t\tlet cookie\n\n\t\tif (cookie = wpm.getCookie(\"CookieConsent\")) {\n\t\t\t// Cookiebot\n\t\t\t// https://wordpress.org/plugins/cookiebot/\n\t\t\tcookie = decodeURI(cookie)\n\n\t\t\t// console.log(cookie.indexOf('statistics:true'))\n\t\t\t// console.log(cookie.indexOf('marketing:true'))\n\n\t\t\twpmConsentValues.categories.analytics = cookie.indexOf(\"statistics:true\") >= 0\n\t\t\twpmConsentValues.categories.ads = cookie.indexOf(\"marketing:true\") >= 0\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie(\"CookieScriptConsent\")) {\n\t\t\t// Cookie Script\n\t\t\t// https://wordpress.org/plugins/cookie-script-com/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\t// console.log(cookie)\n\t\t\t// console.log(cookie.action)\n\t\t\t// console.log('cat length: ' + cookie.categories.length)\n\t\t\t// console.log(cookie.categories.indexOf('performance'))\n\n\t\t\tif (cookie.action === \"reject\") {\n\t\t\t\twpmConsentValues.categories.analytics = false\n\t\t\t\twpmConsentValues.categories.ads = false\n\t\t\t} else if (cookie.categories.length === 2) {\n\t\t\t\twpmConsentValues.categories.analytics = true\n\t\t\t\twpmConsentValues.categories.ads = true\n\t\t\t} else {\n\t\t\t\twpmConsentValues.categories.analytics = cookie.categories.indexOf(\"performance\") >= 0\n\t\t\t\twpmConsentValues.categories.ads = cookie.categories.indexOf(\"targeting\") >= 0\n\t\t\t}\n\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie(\"borlabs-cookie\")) {\n\t\t\t// Borlabs Cookie\n\t\t\t// https://borlabs.io/borlabs-cookie/\n\n\t\t\tcookie = decodeURI(cookie)\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie?.consents?.statistics\n\t\t\twpmConsentValues.categories.ads = !!cookie?.consents?.marketing\n\t\t\twpmConsentValues.visitorHasChosen = true\n\t\t\twpmConsentValues.pixels = [...cookie?.consents?.statistics || [], ...cookie?.consents?.marketing || []]\n\t\t\twpmConsentValues.mode = \"pixel\"\n\n\t\t} else if (cookie = getComplianzCookies()) {\n\t\t\t// Complianz Cookie\n\t\t\t// https://wordpress.org/plugins/complianz-gdpr/\n\n\t\t\t// console.log(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie(\"cookie_notice_accepted\")) {\n\t\t\t// Cookie Compliance (free version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\twpmConsentValues.categories.analytics = true\n\t\t\twpmConsentValues.categories.ads = true\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie(\"hu-consent\")) {\n\t\t\t// Cookie Compliance (pro version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie.categories[\"3\"]\n\t\t\twpmConsentValues.categories.ads = !!cookie.categories[\"4\"]\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = getCookieLawInfoCookies()) {\n\t\t\t// CookieYes, GDPR Cookie Consent (Cookie Law Info)\n\t\t\t// https://wordpress.org/plugins/cookie-law-info/\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen === true\n\n\t\t} else if (cookie = wpm.getCookie(\"moove_gdpr_popup\")) {\n\t\t\t// GDPR Cookie Compliance Plugin by Moove Agency\n\t\t\t// https://wordpress.org/plugins/gdpr-cookie-compliance/\n\t\t\t// TODO write documentation on how to set up the plugin in order for this to work properly\n\n\t\t\tcookie = JSON.parse(cookie)\n\t\t\t// console.log('moove cookie thirdparty: ' + cookie.thirdparty)\n\t\t\t// console.log('moove cookie advanced: ' + cookie.advanced)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.thirdparty === \"1\"\n\t\t\twpmConsentValues.categories.ads = cookie.advanced === \"1\"\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else {\n\t\t\t// consentValues.categories.analytics = true\n\t\t\t// consentValues.categories.ads = true\n\n\t\t\twpmConsentValues.categories.analytics = !explicitConsent\n\t\t\twpmConsentValues.categories.ads = !explicitConsent\n\t\t}\n\t}\n\n\twpm.updateConsentCookieValues()\n\n\twpm.setConsentDefaultValuesToExplicit = function () {\n\t\twpmConsentValues.categories = {\n\t\t\tanalytics: false,\n\t\t\tads : false,\n\t\t}\n\t}\n\n\twpm.canIFire = function (category, pixelName) {\n\n\t\tlet canIFireMode\n\n\t\tif (\"category\" === wpmConsentValues.mode) {\n\t\t\tcanIFireMode = !!wpmConsentValues.categories[category]\n\t\t} else if (\"pixel\" === wpmConsentValues.mode) {\n\t\t\tcanIFireMode = wpmConsentValues.pixels.includes(pixelName)\n\t\t} else {\n\t\t\tconsole.error(\"Couldn't find a valid consent mode in wpmConsentValues\")\n\t\t\tcanIFireMode = false\n\t\t}\n\n\t\tif (canIFireMode) {\n\t\t\treturn true\n\t\t} else {\n\t\t\tif (true || wpm.urlHasParameter(\"debugConsentMode\")) {\n\t\t\t\twpm.logPreventedPixelLoading(pixelName, category)\n\t\t\t}\n\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.logPreventedPixelLoading = function (pixelName, category) {\n\t\tif (wpmDataLayer?.shop?.cookie_consent_mgmt?.explicit_consent) {\n\t\t\tconsole.log(\"WooCommerce Pixel Manager: The \\\"\" + pixelName + \" (category: \" + category + \")\\\" pixel has not fired because you have not given consent for it yet. (WPM is in explicit consent mode.)\")\n\t\t} else {\n\t\t\tconsole.log(\"WooCommerce Pixel Manager: The \\\"\" + pixelName + \" (category: \" + category + \")\\\" pixel has not fired because you have removed consent for this pixel. (WPM is in implicit consent mode.)\")\n\t\t}\n\t}\n\n\t/**\n\t * Runs through each script in <head> and blocks / unblocks it according to the plugin settings\n\t * and user consent.\n\t */\n\n\t// https://stackoverflow.com/q/65453565/4688612\n\twpm.scriptTagObserver = new MutationObserver((mutations) => {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif ($(node).data(\"wpm-cookie-category\")) {\n\n\t\t\t\t\t\t// console.log(node)\n\n\t\t\t\t\t\t// If the pixel category has been approved > unblock\n\t\t\t\t\t\t// If the pixel belongs to more than one category, then unblock if one of the categories has been approved\n\t\t\t\t\t\t// If no category has been approved, but the Google Consent Mode is active, then only unblock the Google scripts\n\n\t\t\t\t\t\tif (wpm.shouldScriptBeActive(node)) {\n\t\t\t\t\t\t\twpm.unblockScript(node)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twpm.blockScript(node)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t})\n\t})\n\n\twpm.scriptTagObserver.observe(document.head, {childList: true, subtree: true})\n\twindow.addEventListener(\"DOMContentLoaded\", () => wpm.scriptTagObserver.disconnect())\n\n\twpm.shouldScriptBeActive = function (node) {\n\n\t\tif (\n\t\t\twpmDataLayer.shop.cookie_consent_mgmt.explicit_consent ||\n\t\t\twpmConsentValues.visitorHasChosen\n\t\t) {\n\n\t\t\tif (wpmConsentValues.mode === \"category\" && $(node).data(\"wpm-cookie-category\").split(\",\").some(element => wpmConsentValues.categories[element])) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === \"pixel\" && wpmConsentValues.pixels.includes($(node).data(\"wpm-pixel-name\"))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === \"pixel\" && $(node).data(\"wpm-pixel-name\") === \"google\" && [\"google-analytics\", \"google-ads\"].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmDataLayer?.pixels?.google?.consent_mode?.active && $(node).data(\"wpm-pixel-name\") === \"google\") {\n\t\t\t\treturn true\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\treturn true\n\t\t}\n\t}\n\n\n\twpm.unblockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tlet wpmSrc = $(scriptNode).data(\"wpm-src\")\n\t\tif (wpmSrc) $(scriptNode).attr(\"src\", wpmSrc)\n\n\t\tscriptNode.type = \"text/javascript\"\n\n\t\tif (removeAttach) $(scriptNode).appendTo(\"head\")\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\twpm.blockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tif ($(scriptNode).attr(\"src\")) $(scriptNode).removeAttr(\"src\")\n\t\tscriptNode.type = \"blocked/javascript\"\n\n\t\tif (removeAttach) $(scriptNode).appendTo(\"head\")\n\t}\n\n\twpm.unblockAllScripts = function (analytics = true, ads = true) {\n\t\t// console.log('unblocking all scripts')\n\n\t\t$.each(\n\t\t\t$(\"script[type=\\\"blocked/javascript\\\"]\"), function (index, scriptNode) {\n\n\t\t\t\tif ($(scriptNode).data(\"wpm-cookie-category\").includes(\"analytics\") && analytics) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t} else if ($(scriptNode).data(\"wpm-cookie-category\").includes(\"ads\") && ads) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\twpm.unblockSelectedPixels = function () {\n\t\t$.each(\n\t\t\t$(\"script[type=\\\"blocked/javascript\\\"]\"), function (index, node) {\n\n\t\t\t\tif (wpmConsentValues.pixels.includes($(node).data(\"wpm-pixel-name\"))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t} else if ($(node).data(\"wpm-pixel-name\") === \"google\" && [\"google-analytics\", \"google-ads\"].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\n\t/**\n\t * Block or unblock scripts for each CMP immediately after cookie consent has been updated\n\t * by the visitor.\n\t */\n\n\t// Borlabs Cookie\n\t// If visitor accepts cookies in Borlabs Cookie unblock the scripts\n\twindow.addEventListener(\"borlabs-cookie-consent-saved\", function () {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\tif (wpmConsentValues.mode === \"pixel\") {\n\n\t\t\twpm.unblockSelectedPixels()\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.pixels.includes(\"google-analytics\"), wpmConsentValues.pixels.includes(\"google-ads\"))\n\t\t} else {\n\n\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t}\n\t})\n\n\t// Cookiebot\n\t// If visitor accepts cookies in Cookiebot unblock the scripts\n\t// https://www.cookiebot.com/en/developer/\n\twindow.addEventListener(\"CookiebotOnAccept\", function () {\n\t\tif (Cookiebot.consent.statistics) wpmConsentValues.categories.analytics = true\n\t\tif (Cookiebot.consent.marketing) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\n\t}, false)\n\n\t/**\n\t * Cookie Script\n\t * If visitor accepts cookies in Cookie Script unblock the scripts\n\t * https://support.cookie-script.com/article/20-custom-events\n\t */\n\twindow.addEventListener(\"CookieScriptAccept\", function (e) {\n\t\tif (e.detail.categories.includes(\"performance\")) wpmConsentValues.categories.analytics = true\n\t\tif (e.detail.categories.includes(\"targeting\")) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t/**\n\t * Cookie Script\n\t * If visitor accepts cookies in Cookie Script unblock the scripts\n\t * https://support.cookie-script.com/\n\t */\n\twindow.addEventListener(\"CookieScriptAcceptAll\", function () {\n\t\twpm.unblockAllScripts(true, true)\n\t\twpm.updateGoogleConsentMode(true, true)\n\t})\n\n\t// Complianz Cookie\n\t// If visitor accepts cookies in Complianz unblock the scripts\n\tdocument.addEventListener(\"cmplzStatusChange\", function () {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t// Cookie Compliance by hu-manity.co (free and pro)\n\t// If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (free version)\n\t// https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\tdocument.addEventListener(\"setCookieNotice\", function () {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t/**\n\t * Cookie Compliance by hu-manity.co (free and pro)\n\t * If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (pro version)\n\t * https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\t * Because Cookie Notice has no documented API or event that is being triggered on consent save or update\n\t * we have to solve this by using a mutation observer.\n\t *\n\t * @type {MutationObserver}\n\t */\n\n\twpm.huObserver = new MutationObserver(function (mutations) {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif (node.id === \"hu\") {\n\n\t\t\t\t\t\tjQuery(\".hu-cookies-save\").on(\"click\", function () {\n\t\t\t\t\t\t\twpm.updateConsentCookieValues()\n\t\t\t\t\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t})\n\t})\n\n\tif (window.hu) {\n\t\twpm.huObserver.observe(document.documentElement || document.body, {childList: true, subtree: true})\n\t}\n\n\twpm.version = function () {\n\t\tconsole.log(wpmDataLayer.version)\n\t}\n\n\t// https://api.jquery.com/jquery.getscript/\n\twpm.loadScriptAndCacheIt = function (url, options) {\n\n\t\t// Allow user to set any option except for dataType, cache, and url\n\t\toptions = jQuery.extend(options || {}, {\n\t\t\tdataType: \"script\",\n\t\t\tcache : true,\n\t\t\turl : url,\n\t\t})\n\n\t\t// Use $.ajax() since it is more flexible than $.getScript\n\t\t// Return the jqXHR object so we can chain callbacks\n\t\treturn jQuery.ajax(options)\n\t}\n\n\twpm.getOrderItemPrice = function (orderItem) {\n\t\treturn (orderItem.total + orderItem.total_tax) / orderItem.quantity\n\t}\n\n\twpm.hasLoginEventFired = function () {\n\t\tlet data = wpm.getWpmSessionData()\n\t\treturn data?.loginEventFired\n\t}\n\n\twpm.setLoginEventFired = function () {\n\t\tlet data = wpm.getWpmSessionData()\n\t\tdata[\"loginEventFired\"] = true\n\t\twpm.setWpmSessionData(data)\n\t}\n\n\twpm.wpmDataLayerExists = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (typeof wpmDataLayer !== \"undefined\") return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.jQueryExists = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForjQuery() {\n\t\t\t\tif (typeof jQuery !== \"undefined\") return resolve()\n\t\t\t\tsetTimeout(waitForjQuery, 100)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.pageLoaded = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"complete\" === document.readyState) return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.pageReady = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"interactive\" === document.readyState || \"complete\" === document.readyState) return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.isMiniCartActive = function () {\n\t\tif (window.sessionStorage) {\n\t\t\tfor (const [key, value] of Object.entries(window.sessionStorage)) {\n\t\t\t\tif (key.includes(\"wc_fragments\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.doesWooCommerceCartExist = function () {\n\t\treturn document.cookie.includes(\"woocommerce_items_in_cart\")\n\t}\n\n\twpm.urlHasParameter = function (parameter) {\n\t\tlet urlParams = new URLSearchParams(window.location.search)\n\t\treturn urlParams.has(parameter)\n\t}\n\n\t// wpm['load'] = {\n\t// base: true\n\t// };\n\n\twindow[\"wpmLoaded\"] = {}\n\n\t// return {\n\t// writeOrderIdToStorage : writeOrderIdToStorage,\n\t// isOrderIdStored : isOrderIdStored,\n\t// isEmail : isEmail,\n\t// removeProductFromCart : removeProductFromCart,\n\t// getViewItemProducts : getViewItemProducts,\n\t// addProductToCart : addProductToCart,\n\t// getCartItemsFromBackEnd: getCartItemsFromBackEnd,\n\t// fireCheckoutOption : fireCheckoutOption,\n\t// getCartItems : getCartItems\n\t// }\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * Load all WPM functions\n *\n * Ignore event listeners. They need to be loaded after\n * we made sure that jQuery has been loaded.\n */\n\nrequire(\"./functions\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// #endif\n","/**\n * After wpm is loaded\n * we first check if wpmDataLayer is loaded,\n * and as soon as it is, we load the pixels,\n * and as soon as the page load is complete,\n * we fire the wpmLoad event.\n *\n * @param {{pro:bool}} wpmDataLayer.version\n *\n * https://stackoverflow.com/a/25868457/4688612\n * https://stackoverflow.com/a/44093516/4688612\n */\n\nwpm.wpmDataLayerExists()\n\t.then(function () {\n\t\tconsole.log(\"WooCommerce Pixel Manager: \" + (wpmDataLayer.version.pro ? \"Pro\" : \"Free\") +\" Version \" + wpmDataLayer.version.number + \" loaded\")\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t})\n\t.then(function () {\n\t\twpm.pageLoaded().then(function () {\n\t\t\tjQuery(document).trigger(\"wpmLoad\", {})\n\t\t})\n\t})\n\n\n\n/**\n * Run when page is ready\n *\n */\n\nwpm.pageReady().then(function () {\n\n\t/**\n\t * Run as soon as wpm namespace is loaded\n\t */\n\n\twpm.wpmDataLayerExists()\n\t\t.then(function () {\n\t\t\t// watch for products visible in viewport\n\t\t\twpm.startIntersectionObserverToWatch()\n\n\t\t\t// watch for lazy loaded products\n\t\t\twpm.startProductsMutationObserverToWatch()\n\t\t})\n})\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Load all essential scripts first\n */\n\nrequire(\"./wpm/functions_loader\")\n\n// Only load the event listeners after jQuery has been loaded for sure\nwpm.jQueryExists().then(function () {\n\n\trequire(\"./wpm/event_listeners\")\n\n\trequire(\"./google/loader\")\n\trequire(\"./facebook/loader\")\n\trequire(\"./hotjar/loader\")\n\n\n\t/**\n\t * Load all premium scripts\n\t */\n\n\t// #if process.env.TIER === 'premium'\n// \trequire(\"./microsoft-ads/loader\")\n// \trequire(\"./pinterest/loader\")\n// \trequire(\"./snapchat/loader\")\n// \trequire(\"./tiktok/loader\")\n// \trequire(\"./twitter/loader\")\n\t// #endif\n\n\n\t/**\n\t * Initiate WPM.\n\t *\n\t * It makes sure that the script flow gets executed correctly,\n\t * no matter how JS \"optimizers\" shuffle the code.\n\t */\n\n\trequire(\"./wpm/init\")\n})\n\n"],"names":["jQuery","document","on","wpmDataLayer","pixels","facebook","pixel_id","loaded","wpm","canIFire","loadFacebookPixel","event","product","eventId","getRandomEventId","fbq","content_type","content_name","name","content_ids","dyn_r_ids","dynamic_remarketing","id_type","value","parseFloat","quantity","price","currency","eventID","shop","trigger","event_name","event_id","user_data","getFbUserData","product_data","product_id","event_source_url","window","location","href","e","console","error","fbViewContent","setFbUserData","order","value_filtered","facebookContentIds","id","$","undefined","fBUserData","f","b","n","callMethod","apply","arguments","queue","push","_fbq","version","t","createElement","async","src","s","getElementsByTagName","parentNode","insertBefore","Math","random","toString","substring","getFbUserDataFromBrowser","fbp","getCookie","fbc","client_user_agent","navigator","userAgent","prodIds","key","item","Object","entries","items","general","variationsOutput","variation_id","String","products","require","isEmptyObject","google","ads","conversionIds","status","googleConfigConditionsMet","isVariable","send_events_with_parent_ids","gtagLoaded","then","gtag","send_to","getGoogleAdsConversionIdentifiers","google_business_vertical","getGoogleAdsDynamicRemarketingOrderItems","data_basic","data_with_cart","getGoogleAdsConversionIdentifiersWithLabel","transaction_id","number","new_customer","aw_merchant_id","discount","aw_feed_country","aw_feed_language","getGoogleAdsRegularOrderItems","conversionIdentifiers","orderItems","orderItem","analytics","universal","property_id","mp_active","affiliation","value_regular","tax","shipping","coupon","getGAUAOrderItems","list_position","category","join","variant","variant_name","brand","ga4","measurement_id","getGA4OrderItems","item_name","item_category","item_id","item_variant","item_brand","state","canGoogleLoad","loadGoogle","logPreventedPixelLoading","type","consent_mode","active","getConsentValues","mode","categories","includes","getVisitorConsentStatusAndUpdateGoogleConsentSettings","google_consent_settings","analytics_storage","ad_storage","updateGoogleConsentMode","cookie_consent_mgmt","explicit_consent","fireGtagGoogleAds","enhanced_conversions","phone_conversion_label","phone_conversion_number","keys","page_type","enhanced_conversion_data","fireGtagGoogleAnalyticsUA","parameters","fireGtagGoogleAnalyticsGA4","isGoogleActive","getGoogleGtagId","loadScriptAndCacheIt","done","script","textStatus","dataLayer","wait_for_update","region","ads_data_redaction","url_passthrough","linker","settings","Date","Promise","resolve","reject","startTime","wait","setTimeout","optimize","container_id","load_google_optimize_pixel","hotjar","site_id","load_hotjar_pixel","h","o","hj","q","_hjSettings","hjid","hjsv","a","r","appendChild","url","URL","this","attr","productId","getProductIdByCartItemKeyUrl","removeProductFromCart","data","addProductToCart","product_type","Number","val","each","find","classes","getPostIdFromString","one","target","closest","matches","match","nextAll","getIdBasedOndVariationsOutputSetting","Error","getProductDetailsFormattedForEvent","isEmail","fireCheckoutProgress","emailSelected","paymentMethodSelected","fireCheckoutOption","cart","getCartItemsFromBackend","variation","doesWooCommerceCartExist","getCartItems","productIds","getAddToCartLinkProductIds","getProductsFromBackend","referrer","referrerHostname","hostname","host","setCookie","wpmLoadFired","getMainProductIdFromProductPage","getProductDataForViewItemEvent","isOrderIdStored","writeOrderIdToStorage","user","hasLoginEventFired","setLoginEventFired","updateConsentCookieValues","wpmDeduper","wpmRestSettings","checkCookie","useRestEndpoint","isSessionStorageAvailable","isRestEndpointAvailable","isBelowRestErrorThreshold","sessionStorage","getItem","JSON","parse","testEndpoint","protocol","cookieName","ajax","timeout","statusCode","response","setItem","stringify","isWpmRestEndpointAvailable","orderId","Storage","localStorage","ids","expiresDate","setDate","getDate","cookie","toUTCString","storeOrderIdOnServer","orderDeduplication","log","email","test","quantityToRemove","isVariation","parentId","saveCartObjectToDataLayer","action","dataType","ajax_url","success","cartItems","filter","hasOwnProperty","length","assign","cartObject","step","checkout_option","string","triggerViewItemList","indexOf","viewItemListTriggerTestMode","css","append","viewItemListTrigger","opacity","backgroundColor","getSearchTermFromUrl","URLSearchParams","search","get","io","ioTimeouts","observerCallback","observer","forEach","entry","elementId","next","isIntersecting","testMode","repeat","unobserve","clearTimeout","remove","allIoElementsToWatch","ioid","startIntersectionObserverToWatch","urlHasParameter","IntersectionObserver","threshold","map","i","elem","parent","hasClass","prev","observe","startProductsMutationObserverToWatch","productsNode","parents","has","first","productsMutationObserver","attributes","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasWpmProductIdElement","siblings","cookieValue","expiryDays","d","setTime","getTime","expires","ca","decodeURIComponent","split","c","charAt","getWpmSessionData","setWpmSessionData","order_id","nonce","cartItemKey","cartItemKeys","list_name","position","parentId_dyn_r_ids","setReferrerToCookie","getReferrerFromCookie","getClidFromBrowser","clidCookieId","clidId","gclid","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","getComplianzCookies","cmplz_statistics","cmplz_marketing","visitorHasChosen","getCookieLawInfoCookies","analyticsCookie","adsCookie","wpmConsentValues","setConsentValueCategories","explicitConsent","decodeURI","consents","statistics","marketing","thirdparty","advanced","setConsentDefaultValuesToExplicit","pixelName","canIFireMode","scriptTagObserver","node","shouldScriptBeActive","unblockScript","blockScript","head","subtree","addEventListener","disconnect","some","element","scriptNode","removeAttach","wpmSrc","appendTo","removeAttr","unblockAllScripts","index","unblockSelectedPixels","Cookiebot","consent","detail","huObserver","hu","body","options","extend","cache","getOrderItemPrice","total","total_tax","loginEventFired","wpmDataLayerExists","waitForVar","jQueryExists","waitForjQuery","pageLoaded","readyState","pageReady","isMiniCartActive","parameter","pro","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__"],"sourceRoot":""}
|
1 |
+
{"version":3,"file":"wpm-public.p1.min.js","mappings":"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","sources":["webpack://wgact/./src/js/public/facebook.jsx","webpack://wgact/./src/js/public/google-ads.jsx","webpack://wgact/./src/js/public/wpm.jsx","webpack://wgact/webpack/bootstrap","webpack://wgact/webpack/runtime/compat get default export","webpack://wgact/webpack/runtime/define property getters","webpack://wgact/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["(function (wpm, $, undefined) {\n\n\tlet fBUserData;\n\n\twpm.getRandomEventId = function () {\n\t\treturn (Math.random() + 1).toString(36).substring(2);\n\t}\n\n\twpm.getFbUserData = function () {\n\t\t// We need the first one for InitiateCheckout\n\t\t// where getting the user_data from the browser is too slow\n\t\t// using wpm.getCookie(), so we cache the user_data earlier.\n\t\t// And we need the second one because the ViewContent hit happens too fast\n\t\t// after adding a variation to the cart because the function to cache\n\t\t// the user_data is too slow. But we can get the user_data using wpm.getCookie()\n\t\t// because we don't move away from the page and can wait for the browser\n\t\t// to get it.\n\t\tif (fBUserData) {\n\t\t\treturn fBUserData;\n\t\t} else {\n\t\t\treturn wpm.getFbUserDataFromBrowser();\n\t\t}\n\t}\n\n\twpm.setFbUserData = function () {\n\t\tfBUserData = wpm.getFbUserDataFromBrowser();\n\t}\n\n\twpm.getFbUserDataFromBrowser = function () {\n\t\treturn {\n\t\t\t\"fbp\" : wpm.getCookie('_fbp'),\n\t\t\t\"fbc\" : wpm.getCookie('_fbc'),\n\t\t\t\"client_user_agent\": navigator.userAgent\n\t\t}\n\t}\n\n\twpm.fbViewContent = function (product) {\n\n\t\tif (!window.fbq) return;\n\n\t\tlet eventId = wpm.getRandomEventId();\n\n\t\tfbq(\"track\", \"ViewContent\", {\n\t\t\t\"content_type\": \"product\",\n\t\t\t\"content_name\": product.name,\n\t\t\t// \"content_category\": product.category,\n\t\t\t\"content_ids\": product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\"currency\" : wpmDataLayer.shop.currency,\n\t\t\t\"value\" : product.price,\n\t\t}, {\n\t\t\t\"eventID\": eventId,\n\t\t});\n\n\t\tproduct['currency'] = wpmDataLayer.shop.currency;\n\n\t\tjQuery(document).trigger('wpmFbCapiEvent', {\n\t\t\t\"event_name\" : \"ViewContent\",\n\t\t\t\"event_id\" : eventId,\n\t\t\t\"user_data\" : wpm.getFbUserData(),\n\t\t\t\"product_data\" : product,\n\t\t\t\"product_id\" : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\"event_source_url\": window.location.href\n\t\t});\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\njQuery(function () {\n\n\tif (wpmDataLayer?.pixels?.facebook) {\n\n\t\t// AddToCart event\n\t\tjQuery(document).on('wpmAddToCart', function (event, product) {\n\n\t\t\t// console.log('firing facebook ads AddToCart event');\n\t\t\t// console.log(product);\n\t\t\t// console.log('value: ' + product.quantity * product.price);\n\n\t\t\tif (!window.fbq) return;\n\n\t\t\tlet eventId = wpm.getRandomEventId();\n\n\t\t\t// console.log('eventId: ' + eventId);\n\n\t\t\tfbq(\"track\", \"AddToCart\", {\n\t\t\t\t\"content_type\": \"product\",\n\t\t\t\t\"content_name\": product.name,\n\t\t\t\t\"content_ids\" : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\t\"value\" : parseFloat(product.quantity * product.price),\n\t\t\t\t\"currency\" : product.currency,\n\t\t\t}, {\n\t\t\t\t\"eventID\": eventId,\n\t\t\t});\n\n\t\t\tproduct['currency'] = wpmDataLayer.shop.currency;\n\n\t\t\tjQuery(document).trigger('wpmFbCapiEvent', {\n\t\t\t\t\"event_name\" : \"AddToCart\",\n\t\t\t\t\"event_id\" : eventId,\n\t\t\t\t\"user_data\" : wpm.getFbUserData(),\n\t\t\t\t\"product_data\" : product,\n\t\t\t\t\"product_id\" : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\t\"event_source_url\": window.location.href\n\t\t\t});\n\t\t});\n\n\t\t// InitiateCheckout event\n\t\tjQuery(document).on('wpmBeginCheckout', function (event) {\n\n\t\t\t// console.log('firing facebook ads InitiateCheckout event');\n\n\t\t\tif (!window.fbq) return;\n\n\t\t\tlet eventId = wpm.getRandomEventId();\n\n\t\t\tfbq(\"track\", \"InitiateCheckout\", {}, {\n\t\t\t\t\"eventID\": eventId,\n\t\t\t});\n\n\n\t\t\tjQuery(document).trigger('wpmFbCapiEvent', {\n\t\t\t\t\"event_name\" : \"InitiateCheckout\",\n\t\t\t\t\"event_id\" : eventId,\n\t\t\t\t\"user_data\" : wpm.getFbUserData(),\n\t\t\t\t\"event_source_url\": window.location.href\n\t\t\t});\n\t\t});\n\n\t\t// AddToWishlist event\n\t\tjQuery(document).on('wpmAddToWishlist', function (event, product) {\n\n\t\t\t// console.log('firing facebook ads AddToWishlist event');\n\t\t\t// console.log(product);\n\n\t\t\tif (!window.fbq) return;\n\n\t\t\tlet eventId = wpm.getRandomEventId();\n\n\t\t\tfbq(\"track\", \"AddToWishlist\", {\n\t\t\t\t\"content_type\": \"product\",\n\t\t\t\t\"content_name\": product.name,\n\t\t\t\t\"content_ids\" : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\t\"value\" : parseFloat(product.quantity * product.price),\n\t\t\t\t\"currency\" : product.currency,\n\t\t\t}, {\n\t\t\t\t\"eventID\": eventId,\n\t\t\t});\n\n\t\t\tproduct['currency'] = wpmDataLayer.shop.currency;\n\n\t\t\tjQuery(document).trigger('wpmFbCapiEvent', {\n\t\t\t\t\"event_name\" : \"AddToWishlist\",\n\t\t\t\t\"event_id\" : eventId,\n\t\t\t\t\"user_data\" : wpm.getFbUserData(),\n\t\t\t\t\"product_data\" : product,\n\t\t\t\t\"product_id\" : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\t\"event_source_url\": window.location.href\n\t\t\t});\n\t\t});\n\n\t\t// ViewContent event\n\t\tjQuery(document).on('wpmViewItem', function (event, product) {\n\n\t\t\t// console.log('firing facebook ads ViewContent event');\n\t\t\t// console.log(product);\n\n\t\t\tif (!window.fbq) return;\n\n\t\t\twpm.fbViewContent(product);\n\t\t});\n\t}\n})\n\njQuery(window).on('load', function () {\n\n\tif (wpmDataLayer?.pixels?.facebook) {\n\n\t\twpm.setFbUserData();\n\n\t\twpmExists().then(function () {\n\n\t\t\ttry {\n\t\t\t\tif (wpmDataLayer.shop.page_type === 'product' && wpmDataLayer.shop.product_type !== 'variable' && wpm.getMainProductIdFromProductPage()) {\n\n\t\t\t\t\tlet product = wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());\n\n\t\t\t\t\t// console.log('fbq ViewContent');\n\t\t\t\t\t// console.log(product);\n\n\t\t\t\t\twpm.fbViewContent(product);\n\n\t\t\t\t} else if (wpmDataLayer.shop.page_type === 'search') {\n\n\t\t\t\t\tif (!window.fbq) return;\n\n\t\t\t\t\tlet eventId = wpm.getRandomEventId();\n\n\t\t\t\t\tfbq(\"track\", \"Search\", {}, {\n\t\t\t\t\t\t\"eventID\": eventId,\n\t\t\t\t\t});\n\n\t\t\t\t\tjQuery(document).trigger('wpmFbCapiEvent', {\n\t\t\t\t\t\t\"event_name\" : \"Search\",\n\t\t\t\t\t\t\"event_id\" : eventId,\n\t\t\t\t\t\t\"user_data\" : wpm.getFbUserData(),\n\t\t\t\t\t\t\"event_source_url\": window.location.href\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t})\n\t}\n})\n","jQuery(function () {\n\n\tif (wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) {\n\n\t\t// view_item_list event\n\t\tjQuery(document).on('wpmViewItemList', function (event, product) {\n\n\t\t\tif (\n\t\t\t\twpmDataLayer.general.variationsOutput &&\n\t\t\t\tproduct.isVariable &&\n\t\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t\t) return;\n\n\t\t\t// try to prevent that WC sends cached hits to Google\n\t\t\tif (!product) return;\n\n\t\t\t// console.log('firing google view_item_list event');\n\t\t\t// console.log(product);\n\n\t\t\t// console.log('send to: ' + wpmDataLayer.pixels.google.ads.conversionIds);\n\n\t\t\tif (googleConfigConditionsMet('ads')) gtag('event', 'view_item_list', {\n\t\t\t\tsend_to: wpmDataLayer.pixels.google.ads.conversionIds,\n\t\t\t\titems : [{\n\t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t\t}]\n\t\t\t});\n\t\t});\n\n\t\t// add_to_cart event\n\t\tjQuery(document).on('wpmAddToCart', function (event, product) {\n\n\t\t\t// console.log('firing google ads add_to_cart event');\n\t\t\t// console.log(product);\n\t\t\t// console.log(wpmDataLayer.pixels.google.ads.conversionIds);\n\t\t\t// console.log('dyn_r_id: ' + product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]);\n\t\t\t// console.log('dyn_r_id: ' + product.dyn_r_ids['gpf']);\n\n\t\t\tgtag(\"event\", \"add_to_cart\", {\n\t\t\t\t\"send_to\": wpmDataLayer.pixels.google.ads.conversionIds,\n\t\t\t\t\"value\" : product.quantity * product.price,\n\t\t\t\t\"items\" : [{\n\t\t\t\t\t\"id\" : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\t\"quantity\" : product.quantity,\n\t\t\t\t\t\"price\" : product.price,\n\t\t\t\t\t\"google_business_vertical\": wpmDataLayer.pixels.google.ads.google_business_vertical\n\t\t\t\t}]\n\t\t\t});\n\t\t});\n\n\t\t// view_item event\n\t\tjQuery(document).on('wpmViewItem', function (event, product) {\n\n\t\t\t// console.log('firing google ads view_item event');\n\t\t\t// console.log(product);\n\t\t\t// console.log(wpmDataLayer.pixels.google.ads.conversionIds);\n\t\t\t// console.log('dyn_r_id: ' + product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]);\n\t\t\t// console.log('dyn_r_id: ' + product.dyn_r_ids['gpf']);\n\n\t\t\tgtag(\"event\", \"view_item\", {\n\t\t\t\t\"send_to\": wpmDataLayer.pixels.google.ads.conversionIds,\n\t\t\t\t\"value\" : product.quantity * product.price,\n\t\t\t\t\"items\" : [{\n\t\t\t\t\t\"id\" : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\t\"quantity\" : 1,\n\t\t\t\t\t\"price\" : product.price,\n\t\t\t\t\t\"google_business_vertical\": wpmDataLayer.pixels.google.ads.google_business_vertical\n\t\t\t\t}]\n\t\t\t});\n\t\t});\n\t}\n})\n\njQuery(window).on('load', function () {\n\n\twpmExists().then(function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer.shop.page_type === 'product' && wpmDataLayer.shop.product_type !== 'variable' && wpm.getMainProductIdFromProductPage()) {\n\n\t\t\t\t// console.log('productId: ' + wpm.getMainProductIdFromProductPage());\n\n\t\t\t\tlet product = wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());\n\n\t\t\t\tgtag(\"event\", \"view_item\", {\n\t\t\t\t\t\"send_to\": wpmDataLayer.pixels.google.ads.conversionIds,\n\t\t\t\t\t\"value\" : 1 * product.price,\n\t\t\t\t\t\"items\" : [{\n\t\t\t\t\t\t\"id\" : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\t\t\"google_business_vertical\": wpmDataLayer.pixels.google.ads.google_business_vertical\n\t\t\t\t\t}]\n\t\t\t\t});\n\t\t\t} else if (wpmDataLayer.shop.page_type === 'search') {\n\n\t\t\t\tlet products = [];\n\n\t\t\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n\n\t\t\t\t\tif (\n\t\t\t\t\t\twpmDataLayer.general.variationsOutput &&\n\t\t\t\t\t\tproduct.isVariable &&\n\t\t\t\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t\t\t\t) return;\n\n\t\t\t\t\tproducts.push({\n\t\t\t\t\t\t\"id\" : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\t\t\"google_business_vertical\": wpmDataLayer.pixels.google.ads.google_business_vertical\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// console.log(products);\n\n\t\t\t\tgtag(\"event\", \"view_search_results\", {\n\t\t\t\t\t\"send_to\": wpmDataLayer.pixels.google.ads.conversionIds,\n\t\t\t\t\t// \"value\" : 1 * product.price,\n\t\t\t\t\t\"items\": products\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t})\n})\n","// if (typeof varExists !== 'function') {\n// window.varExists = function (varName) {\n// return new Promise(function (resolve, reject) {\n// (function waitForVar() {\n// if (typeof window[varName] !== 'undefined') return resolve();\n// setTimeout(waitForVar, 30);\n// })();\n// });\n// }\n// }\n\n// Promise.allSettled(\n// [\n// varExists('jQuery'),\n// varExists('wpm')\n// ]).then(function () {\n// // do something\n//\n// }).catch(function (e) {\n// console.log(e);\n// })\n\n\n(function (wpm, $, undefined) {\n\n\tconst wpmDeduper = {\n\t\tkeyName : '_wpm_order_ids',\n\t\tcookieExpiresDays: 365\n\t};\n\n\tconst wpmRestSettings = {\n\t\t// cookiesAvailable : '_wpm_cookies_are_available',\n\t\tcookieWpmRestEndpointAvailable: '_wpm_endpoint_available',\n\t\trestEndpoint : '/wp-json/',\n\t\trestFails : 0,\n\t\trestFailsThreshold : 10,\n\t}\n\n\n\t// wpm.checkIfCookiesAvailable = function () {\n\t//\n\t// // read the cookie if previously set, if it is return true, otherwise continue\n\t// if (wpm.getCookie(wpmRestSettings.cookiesAvailable)) {\n\t// return true;\n\t// }\n\t//\n\t// // set the cookie for the session\n\t// Cookies.set(wpmRestSettings.cookiesAvailable, true);\n\t//\n\t// // read cookie, true if ok, false if not ok\n\t// return !!wpm.getCookie(wpmRestSettings.cookiesAvailable);\n\t// }\n\n\twpm.useRestEndpoint = function () {\n\n\t\t// only if sessionStorage is available\n\n\t\t// only if REST API endpoint is generally accessible\n\t\t// check in sessionStorage if we checked before and return answer\n\t\t// otherwise check if the endpoint is available, save answer in sessionStorage and return answer\n\n\t\t// only if not too many REST API errors happened\n\n\t\treturn wpm.isSessionStorageAvailable() &&\n\t\t\twpm.isRestEndpointAvailable() &&\n\t\t\twpm.isBelowRestErrorThreshold();\n\t}\n\n\twpm.isBelowRestErrorThreshold = function () {\n\t\treturn window.sessionStorage.getItem(wpmRestSettings.restFails) <= wpmRestSettings.restFailsThreshold;\n\t}\n\n\twpm.isRestEndpointAvailable = function () {\n\n\t\tif (window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable)) {\n\t\t\treturn JSON.parse(window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable));\n\t\t} else {\n\t\t\t// return wpm.testEndpoint();\n\t\t\t// just set the value whenever possible in order not to wait or block the main thread\n\t\t\twpm.testEndpoint();\n\t\t}\n\t}\n\n\twpm.isSessionStorageAvailable = function () {\n\n\t\treturn !!window.sessionStorage;\n\t}\n\n\twpm.testEndpoint = function (\n\t\turl = location.protocol + '//' + location.host + wpmRestSettings.restEndpoint,\n\t\tcookieName = wpmRestSettings.cookieWpmRestEndpointAvailable\n\t) {\n\t\t// console.log('testing endpoint');\n\n\t\tjQuery.ajax(url, {\n\t\t\ttype : 'HEAD',\n\t\t\ttimeout: 1000,\n\t\t\t// async: false,\n\t\t\tstatusCode: {\n\t\t\t\t200: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, true);\n\t\t\t\t\t// console.log('endpoint works');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(true));\n\t\t\t\t},\n\t\t\t\t404: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false));\n\t\t\t\t},\n\t\t\t\t0 : function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false));\n\t\t\t\t}\n\t\t\t}\n\t\t}).then(r => {\n\t\t\t// console.log('test done')\n\t\t\t// console.log('result: ' + JSON.parse(window.sessionStorage.getItem(cookieName)));\n\t\t\t// return JSON.parse(window.sessionStorage.getItem(cookieName));\n\t\t});\n\t}\n\n\twpm.isWpmRestEndpointAvailable = function (cookieName = wpmRestSettings.cookieWpmRestEndpointAvailable) {\n\n\t\treturn !!wpm.getCookie(cookieName);\n\t}\n\n\twpm.writeOrderIdToStorage = function (orderId, expireDays = 365) {\n\n\t\t// save the order ID in the browser storage\n\n\t\tif (!window.Storage) {\n\t\t\tlet expiresDate = new Date();\n\t\t\texpiresDate.setDate(expiresDate.getDate() + wpmDeduper.cookieExpiresDays);\n\n\t\t\tlet ids = [];\n\t\t\tif (checkCookie()) {\n\t\t\t\tids = JSON.parse(wpm.getCookie(wpmDeduper.keyName));\n\t\t\t}\n\n\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\tids.push(orderId);\n\t\t\t\tdocument.cookie = wpmDeduper.keyName + '=' + JSON.stringify(ids) + ';expires=' + expiresDate.toUTCString();\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (localStorage.getItem(wpmDeduper.keyName) === null) {\n\t\t\t\tlet ids = [];\n\t\t\t\tids.push(orderId);\n\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids));\n\n\t\t\t} else {\n\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName));\n\t\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\t\tids.push(orderId);\n\t\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof wpm.storeOrderIdOnServer === 'function' && wpmDataLayer.orderDeduplication) {\n\t\t\twpm.storeOrderIdOnServer(orderId);\n\t\t}\n\t}\n\n\tfunction checkCookie() {\n\t\tlet key = wpm.getCookie(wpmDeduper.keyName);\n\t\treturn key !== '';\n\t}\n\n\twpm.isOrderIdStored = function (orderId) {\n\n\t\t// console.log('deduper: ' + wpmDataLayer.orderDeduplication);\n\t\tif (wpmDataLayer.orderDeduplication) {\n\t\t\t// console.log('order deduplication: on');\n\t\t\tif (!window.Storage) {\n\n\t\t\t\tif (checkCookie()) {\n\t\t\t\t\tlet ids = JSON.parse(wpm.getCookie(wpmDeduper.keyName));\n\t\t\t\t\treturn ids.includes(orderId);\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (localStorage.getItem(wpmDeduper.keyName) !== null) {\n\t\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName));\n\t\t\t\t\treturn ids.includes(orderId);\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log('order deduplication: off');\n\t\t\treturn false;\n\t\t}\n\t}\n\n\twpm.isEmail = function (email) {\n\t\t// https://emailregex.com/\n\t\tlet regex = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\t\treturn regex.test(email);\n\t}\n\n\twpm.removeProductFromCart = function (productId, quantityToRemove = null) {\n\t\t// console.log('product_id: ' + productId + ' | quantityToRemove: ' + quantityToRemove);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\t\tlet quantity;\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = wpmDataLayer.cart[productId].quantity;\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove;\n\t\t\t}\n\n\t\t\t// console.log('product_id: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log(productId);\n\t\t\t// console.log(wpmDataLayer.cart);\n\t\t\t// console.log(wpmDataLayer.cart[productId]);\n\n\t\t\tif (wpmDataLayer.cart[productId]) {\n\n\t\t\t\t// let product = {\n\t\t\t\t// id : productId.toString(),\n\t\t\t\t// dyn_r_ids: wpmDataLayer.cart[productId].dyn_r_ids,\n\t\t\t\t// name : wpmDataLayer.cart[productId].name,\n\t\t\t\t// // list_name: wpmDataLayer.shop.list_name, // doesn't make sense on mini_cart\n\t\t\t\t// brand : wpmDataLayer.cart[productId].brand,\n\t\t\t\t// category: wpmDataLayer.cart[productId].category,\n\t\t\t\t// variant : wpmDataLayer.cart[productId].variant,\n\t\t\t\t// // list_position: wpmDataLayer.cart[productId].position, // doesn't make sense on mini_cart\n\t\t\t\t// quantity : quantity,\n\t\t\t\t// price : wpmDataLayer.cart[productId].price,\n\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t// };\n\t\t\t\t//\n\t\t\t\t// if (product.isVariation) product['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\t\t// console.log('removing');\n\t\t\t\t// console.log(data);\n\n\t\t\t\tjQuery(document).trigger('wpmRemoveFromCart', product);\n\n\t\t\t\tif (quantityToRemove == null || wpmDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\t\tdelete wpmDataLayer.cart[productId];\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem('wpmDataLayerCart', JSON.stringify(wpmDataLayer.cart));\n\t\t\t\t} else {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity - quantity;\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem('wpmDataLayerCart', JSON.stringify(wpmDataLayer.cart));\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t\t// console.log('getting cart from back end');\n\t\t\t// wpm.getCartItemsFromBackend();\n\t\t\t// console.log('getting cart from back end done');\n\n\t\t}\n\t}\n\n\tgetIdBasedOndVariationsOutputSetting = function (productId) {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer.general.variationsOutput) {\n\t\t\t\t// console.log('test');\n\t\t\t\treturn productId;\n\t\t\t} else {\n\t\t\t\tif (wpmDataLayer.products[productId].isVariation) {\n\t\t\t\t\treturn wpmDataLayer.products[productId].parentId;\n\t\t\t\t} else {\n\t\t\t\t\treturn productId;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\t// add_to_cart\n\twpm.addProductToCart = function (productId, quantity) {\n\n\t\ttry {\n\t\t\t// console.log('productId: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log('productId: ' + productId + ' | variationId: ' + variationId + ' | qty: ' + quantity);\n\n\t\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\t\t// console.log(productId);\n\n\t\t\t\tjQuery(document).trigger('wpmAddToCart', product);\n\n\t\t\t\t// add product to cart wpmDataLayer['cart']\n\n\t\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t\t// otherwise create that product object in the wpmDataLayer['cart']\n\t\t\t\tif (wpmDataLayer.cart !== undefined && wpmDataLayer.cart[productId] !== undefined) {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity + quantity;\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem('wpmDataLayerCart', JSON.stringify(wpmDataLayer.cart));\n\t\t\t\t} else {\n\n\t\t\t\t\tif (!wpmDataLayer.cart) {\n\n\t\t\t\t\t\t// wpmDataLayer['cart'] = {\n\t\t\t\t\t\t// [productId]: {\n\t\t\t\t\t\t// id : productId,\n\t\t\t\t\t\t// dyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\t\t\t\t// name : wpmDataLayer.products[productId].name,\n\t\t\t\t\t\t// brand : wpmDataLayer.products[productId].brand,\n\t\t\t\t\t\t// category : wpmDataLayer.products[productId].category,\n\t\t\t\t\t\t// variant : wpmDataLayer.products[productId].variant,\n\t\t\t\t\t\t// quantity : quantity,\n\t\t\t\t\t\t// price : wpmDataLayer.products[productId].price,\n\t\t\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t\t\t// parentId : wpmDataLayer.products[productId].parentId,\n\t\t\t\t\t\t// }\n\t\t\t\t\t\t// };\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// if (wpmDataLayer['cart'][productId].isVariation) wpmDataLayer['cart'][productId]['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\t\t\twpmDataLayer['cart'] = {\n\t\t\t\t\t\t\t[productId]: wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem('wpmDataLayerCart', JSON.stringify(wpmDataLayer.cart));\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// wpmDataLayer.cart[productId] = {\n\t\t\t\t\t\t// id : productId,\n\t\t\t\t\t\t// dyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\t\t\t\t// name : wpmDataLayer.products[productId].name,\n\t\t\t\t\t\t// brand : wpmDataLayer.products[productId].brand,\n\t\t\t\t\t\t// category : wpmDataLayer.products[productId].category,\n\t\t\t\t\t\t// variant : wpmDataLayer.products[productId].variant,\n\t\t\t\t\t\t// quantity : quantity,\n\t\t\t\t\t\t// price : wpmDataLayer.products[productId].price,\n\t\t\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t\t\t// parentId : wpmDataLayer.products[productId].parentId,\n\t\t\t\t\t\t// };\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// if (wpmDataLayer.cart[productId].isVariation) wpmDataLayer.cart[productId]['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\t\t\twpmDataLayer.cart[productId] = wpm.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem('wpmDataLayerCart', JSON.stringify(wpmDataLayer.cart));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\n\t\t\t// fallback if wpmDataLayer.cart and wpmDataLayer.products got out of sync in case cart caching has an issue\n\t\t\twpm.getCartItemsFromBackend();\n\t\t}\n\t}\n\n\twpm.getCartItems = function () {\n\n\t\t// console.log('get cart items');\n\n\t\tif (sessionStorage) {\n\t\t\tif (!sessionStorage.getItem('wpmDataLayerCart') || wpmDataLayer.shop.page_type === 'order_received_page') {\n\t\t\t\tsessionStorage.setItem('wpmDataLayerCart', JSON.stringify({}));\n\t\t\t} else {\n\t\t\t\twpm.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem('wpmDataLayerCart')));\n\t\t\t}\n\t\t} else {\n\t\t\twpm.getCartItemsFromBackend();\n\t\t}\n\t}\n\n\twpm.getCartItemsFromBackend = function () {\n\t\t// get all cart items from the backend\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction: 'wpm_get_cart_items',\n\t\t\t};\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : 'get',\n\t\t\t\t\tdataType: 'json',\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (cartItems) {\n\n\t\t\t\t\t\t// save all cart items into wpmDataLayer\n\n\t\t\t\t\t\tif (!cartItems['cart']) cartItems['cart'] = {};\n\n\t\t\t\t\t\twpm.saveCartObjectToDataLayer(cartItems['cart']);\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem('wpmDataLayerCart', JSON.stringify(cartItems['cart']));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\twpm.getProductsFromBackend = function (productIds) {\n\t\t// console.log('getting pids from back-end: ' + productIds)\n\t\t// get productIds from the backend\n\n\t\t// reduce productIds by products already in the dataLayer\n\t\tproductIds = productIds.filter(item => !wpmDataLayer.products.hasOwnProperty(item));\n\n\t\t// if no products IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return;\n\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction : 'wpm_get_product_ids',\n\t\t\t\tproductIds: productIds,\n\t\t\t};\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : 'get',\n\t\t\t\t\tdataType: 'json',\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (products) {\n\n\t\t\t\t\t\t// merge products into wpmDataLayer.products\n\t\t\t\t\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, products);\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\twpm.saveCartObjectToDataLayer = function (cartObject) {\n\t\twpmDataLayer.cart = cartObject;\n\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, cartObject);\n\t}\n\n\twpm.fireCheckoutOption = function (step, checkout_option = null, value = null) {\n\n\t\tlet data = {\n\t\t\tstep : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue : value\n\t\t};\n\n\t\tjQuery(document).trigger('wpmFireCheckoutOption', data);\n\t}\n\n\twpm.fireCheckoutProgress = function (step) {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t};\n\n\t\tjQuery(document).trigger('wpmFireCheckoutProgress', data);\n\t}\n\n\twpm.getPostIdFromString = function (string) {\n\t\t// console.log(string);\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2];\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\twpm.triggerViewItemList = function (productId) {\n\n\t\t// productId = null;\n\n\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\tproductId = getIdBasedOndVariationsOutputSetting(productId);\n\n\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\tjQuery(document).trigger('wpmViewItemList', wpm.getProductDataForViewItemEvent(productId));\n\t}\n\n\twpm.getProductDataForViewItemEvent = function (productId) {\n\n\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\ttry {\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\treturn wpm.getProductDetailsFormattedForEvent(productId);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\twpm.getMainProductIdFromProductPage = function () {\n\t\ttry {\n\t\t\tif (['simple', 'variable', 'grouped', 'composite', 'bundle'].indexOf(wpmDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery('.wpmProductId:first').data('id');\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\twpm.viewItemListTriggerTestMode = function (target) {\n\n\t\tjQuery(target).css({\"position\": \"relative\"});\n\t\tjQuery(target).append('<div id=\"viewItemListTriggerOverlay\"></div>')\n\t\tjQuery(target).find('#viewItemListTriggerOverlay').css({\n\t\t\t\"z-index\" : \"10\",\n\t\t\t\"display\" : \"block\",\n\t\t\t\"position\" : \"absolute\",\n\t\t\t\"height\" : \"100%\",\n\t\t\t\"top\" : \"0\",\n\t\t\t\"left\" : \"0\",\n\t\t\t\"right\" : \"0\",\n\t\t\t\"opacity\" : wpmDataLayer.viewItemListTrigger.opacity,\n\t\t\t\"background-color\": wpmDataLayer.viewItemListTrigger.backgroundColor,\n\t\t})\n\t}\n\n\twpm.getSearchTermFromUrl = function () {\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search)\n\t\t\treturn urlParameters.get('s');\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {};\n\n\twpm.observerCallback = function (entries, observer) {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId;\n\n\t\t\t\tlet elementId = jQuery(entry.target).data('ioid');\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next('.wpmProductId').length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next('.wpmProductId').data('id');\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find('.wpmProductId').data('id');\n\t\t\t\t}\n\n\t\t\t\t// productId = null;\n\n\t\t\t\tif (!productId) throw Error('wpmProductId element not found');\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\t\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\t\twpm.triggerViewItemList(productId);\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) wpm.viewItemListTriggerTestMode(entry.target);\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.repeat === false) observer.unobserve(entry.target);\n\t\t\t\t\t}, wpmDataLayer.viewItemListTrigger.timeout)\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId])\n\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) jQuery(entry.target).find('#viewItemListTriggerOverlay').remove();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t});\n\t}\n\n\t// fire view_item_list only on products that have become visible\n\tlet io;\n\tlet ioid = 0;\n\tlet allIoElementsToWatch;\n\n\tlet getAllElementsToWatch = function () {\n\n\t\tallIoElementsToWatch = jQuery('.wpmProductId')\n\t\t\t.map(function (i, elem) {\n\t\t\t\t// console.log(elem);\n\t\t\t\tif (\n\t\t\t\t\tjQuery(elem).parent().hasClass('type-product') ||\n\t\t\t\t\tjQuery(elem).parent().hasClass('product') ||\n\t\t\t\t\tjQuery(elem).parent().hasClass('product-item-inner')\n\t\t\t\t) {\n\t\t\t\t\t// console.log(elem);\n\t\t\t\t\treturn jQuery(elem).parent();\n\t\t\t\t} else if (\n\t\t\t\t\tjQuery(elem).prev().hasClass('wc-block-grid__product') ||\n\t\t\t\t\tjQuery(elem).prev().hasClass('product') ||\n\t\t\t\t\tjQuery(elem).prev().hasClass('product-small') ||\n\t\t\t\t\tjQuery(elem).prev().hasClass('woocommerce-LoopProduct-link')\n\t\t\t\t) {\n\t\t\t\t\treturn jQuery(this).prev();\n\t\t\t\t} else if (jQuery(elem).closest('.product').length) {\n\t\t\t\t\treturn jQuery(elem).closest('.product');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\twpm.startIntersectionObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\t\tif (urlParams.has('vildemomode')) wpmDataLayer.viewItemListTrigger.testMode = true;\n\n\t\t\t// set up intersection observer\n\t\t\tio = new IntersectionObserver(wpm.observerCallback, {\n\t\t\t\tthreshold: wpmDataLayer.viewItemListTrigger.threshold,\n\t\t\t});\n\n\t\t\tgetAllElementsToWatch();\n\n\t\t\t// console.log(allElementsToWatch);\n\n\t\t\tallIoElementsToWatch.each(function (i, elem) {\n\t\t\t\t// console.log(elem[0]);\n\t\t\t\t// jQuery(elem[0]).attr('data-ioid', ioid++);\n\t\t\t\tjQuery(elem[0]).data('ioid', ioid++);\n\n\t\t\t\tio.observe(elem[0])\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\t// watch DOM for new lazy loaded products and add them to the intersection observer\n\twpm.startProductsMutationObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery('.wpmProductId:eq(0)').parents().has(jQuery('.wpmProductId:eq(1)').parents()).first()\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes : true,\n\t\t\t\t\tchildList : true,\n\t\t\t\t\tcharacterData: true\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\t// Create an observer instance\n\tlet productsMutationObserver = new MutationObserver(function (mutations) {\n\n\t\tmutations.forEach(function (mutation) {\n\t\t\tlet newNodes = mutation.addedNodes; // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes); // jQuery set\n\t\t\t\tnodes.each(function () {\n\t\t\t\t\tif (\n\t\t\t\t\t\tjQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasWpmProductIdElement(this)) {\n\t\t\t\t\t\t\tjQuery(this).data('ioid', ioid++);\n\t\t\t\t\t\t\tio.observe(this)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\n\tlet hasWpmProductIdElement = function (elem) {\n\t\treturn !!(jQuery(elem).find('.wpmProductId').length ||\n\t\t\tjQuery(elem).siblings('.wpmProductId').length);\n\t}\n\n\twpm.setCookie = function (cookieName, cookieValue = '', expiryDays = null) {\n\t\tif (expiryDays) {\n\t\t\tlet d = new Date();\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000));\n\t\t\tlet expires = \"expires=\" + d.toUTCString();\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\";\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\";\n\t\t}\n\t}\n\n\twpm.getCookie = function (cookieName) {\n\t\tlet name = cookieName + \"=\";\n\t\tlet decodedCookie = decodeURIComponent(document.cookie);\n\t\tlet ca = decodedCookie.split(';');\n\t\tfor (let i = 0; i < ca.length; i++) {\n\t\t\tlet c = ca[i];\n\t\t\twhile (c.charAt(0) == ' ') {\n\t\t\t\tc = c.substring(1);\n\t\t\t}\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length);\n\t\t\t}\n\t\t}\n\t\treturn \"\";\n\t}\n\n\twpm.storeOrderIdOnServer = function (orderId) {\n\n\t\t// console.log('saving wpm_purchase_pixels_fired');\n\n\t\t// console.log('url: ' + wpm_premium_only_ajax_object.ajax_url);\n\t\t// console.log('nonce: ' + wpm_premium_only_ajax_object.nonce);\n\t\t// console.log('url: ' + wpm.ajax_url);\n\t\t// console.log('nonce: ' + wpm.nonce);\n\n\t\ttry {\n\t\t\t// save the state in the database\n\t\t\tlet data = {\n\t\t\t\taction : 'wpm_purchase_pixels_fired',\n\t\t\t\torder_id: orderId,\n\t\t\t\t// nonce : ajax_object.nonce,\n\t\t\t\tnonce: wpm.nonce,\n\t\t\t};\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : 'post',\n\t\t\t\t\tdataType: 'json',\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (response) {\n\t\t\t\t\t\tif (response.success === false) {\n\t\t\t\t\t\t\tconsole.log(response);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\twpm.getProductIdByCartItemKeyUrl = function (url) {\n\t\tlet searchParams = new URLSearchParams(url.search);\n\t\tlet cartItemKey = searchParams.get('remove_item');\n\n\t\tlet productId = null;\n\n\t\tif (wpmDataLayer.cartItemKeys[cartItemKey]['variation_id'] === 0) {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey]['product_id'];\n\t\t} else {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey]['variation_id'];\n\t\t}\n\n\t\treturn productId;\n\t}\n\n\twpm.getAddToCartLinkProductIds = function () {\n\t\treturn jQuery('a').map(function () {\n\t\t\tlet href = jQuery(this).attr('href');\n\n\t\t\tif (href && href.includes('?add-to-cart=')) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/);\n\t\t\t\tif (matches) return matches[2];\n\t\t\t}\n\t\t}).get()\n\t}\n\n\twpm.getProductDetailsFormattedForEvent = function (productId, quantity = 1) {\n\n\t\tlet product = {\n\t\t\tid : productId.toString(),\n\t\t\tdyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\tname : wpmDataLayer.products[productId].name,\n\t\t\tlist_name : wpmDataLayer.shop.list_name,\n\t\t\tbrand : wpmDataLayer.products[productId].brand,\n\t\t\tcategory : wpmDataLayer.products[productId].category,\n\t\t\tvariant : wpmDataLayer.products[productId].variant,\n\t\t\tlist_position: wpmDataLayer.products[productId].position,\n\t\t\tquantity : quantity,\n\t\t\tprice : wpmDataLayer.products[productId].price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tisVariable : wpmDataLayer.products[productId].isVariable,\n\t\t\tisVariation : wpmDataLayer.products[productId].isVariation,\n\t\t\tparentId : wpmDataLayer.products[productId].parentId,\n\t\t};\n\n\t\tif (product.isVariation) product['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\treturn product;\n\t}\n\n\twpm.setReferrerToCookie = function () {\n\t\t// can't use session storage as we can't read it from the server\n\t\tif (!wpm.getCookie('wpmReferrer')) {\n\t\t\twpm.setCookie('wpmReferrer', document.referrer);\n\t\t}\n\t}\n\n\twpm.getReferrerFromCookie = function () {\n\t\tif (wpm.getCookie('wpmReferrer')) {\n\t\t\treturn wpm.getCookie('wpmReferrer');\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\twpm.getClidFromBrowser = function (clidId = 'gclid') {\n\n\t\tlet clidCookieId;\n\n\t\tclidCookieId = {\n\t\t\tgclid: '_gcl_aw',\n\t\t\tdclid: '_gcl_dc',\n\t\t};\n\n\t\tif (wpm.getCookie(clidCookieId[clidId])) {\n\t\t\tlet clidCookie = wpm.getCookie(clidCookieId[clidId]);\n\t\t\tlet matches = clidCookie.match(/(GCL.[\\d]*.)(.*)/);\n\t\t\treturn matches[2];\n\t\t} else {\n\t\t\treturn '';\n\t\t}\n\t}\n\n\twpm.getUserAgent = function () {\n\t\treturn navigator.userAgent;\n\t}\n\n\twpm.getViewPort = function () {\n\t\treturn {\n\t\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t\t};\n\t}\n\n\t/*\n\t* Handle Cookie Management Platforms\n\t* */\n\n\tlet getComplianzCookies = function () {\n\n\t\tlet cmplz_statistics = wpm.getCookie('cmplz_statistics')\n\t\tlet cmplz_marketing = wpm.getCookie('cmplz_marketing')\n\t\tlet cmplz_consent_status = wpm.getCookie('cmplz_consent_status') || wpm.getCookie('cmplz_banner-status')\n\n\n\t\tif (cmplz_consent_status) {\n\t\t\treturn {\n\t\t\t\tanalytics : cmplz_statistics === 'allow',\n\t\t\t\tads : cmplz_marketing === 'allow',\n\t\t\t\tvisitorHasChosen: true\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tlet getCookieLawInfoCookies = function () {\n\n\t\tlet analyticsCookie = wpm.getCookie('cookielawinfo-checkbox-analytics')\n\t\tlet adsCookie = wpm.getCookie('cookielawinfo-checkbox-advertisement')\n\t\tlet visitorHasChosen = wpm.getCookie('CookieLawInfoConsent')\n\n\t\tif (analyticsCookie || adsCookie) {\n\n\t\t\treturn {\n\t\t\t\tanalytics : analyticsCookie === 'yes',\n\t\t\t\tads : adsCookie === 'yes',\n\t\t\t\tvisitorHasChosen: !!visitorHasChosen,\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\n\tlet\n\t\twpmConsentValues = {}\n\twpmConsentValues.categories = {}\n\twpmConsentValues.pixels = []\n\twpmConsentValues.mode = 'category'\n\twpmConsentValues.visitorHasChosen = false\n\n\twpm.getConsentValues = function () {\n\t\treturn wpmConsentValues\n\t}\n\n\twpm.updateConsentCookieValues = function (explicitConsent = false) {\n\n\t\t// ad_storage\n\t\t// analytics_storage\n\t\t// functionality_storage\n\t\t// personalization_storage\n\t\t// security_storage\n\n\t\t// console.log('exp cons: ' + explicitConsent)\n\n\t\tlet cookie\n\n\t\tif (cookie = wpm.getCookie('CookieConsent')) {\n\t\t\t// Cookiebot\n\t\t\t// https://wordpress.org/plugins/cookiebot/\n\t\t\tcookie = decodeURI(cookie)\n\n\t\t\t// console.log(cookie.indexOf('statistics:true'))\n\t\t\t// console.log(cookie.indexOf('marketing:true'))\n\n\t\t\twpmConsentValues.categories.analytics = cookie.indexOf('statistics:true') >= 0\n\t\t\twpmConsentValues.categories.ads = cookie.indexOf('marketing:true') >= 0\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie('CookieScriptConsent')) {\n\t\t\t// Cookie Script\n\t\t\t// https://wordpress.org/plugins/cookie-script-com/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\t// console.log(cookie)\n\t\t\t// console.log(cookie.action)\n\t\t\t// console.log('cat length: ' + cookie.categories.length)\n\t\t\t// console.log(cookie.categories.indexOf('performance'))\n\n\t\t\tif (cookie.action === 'reject') {\n\t\t\t\twpmConsentValues.categories.analytics = false\n\t\t\t\twpmConsentValues.categories.ads = false\n\t\t\t} else if (cookie.categories.length === 2) {\n\t\t\t\twpmConsentValues.categories.analytics = true\n\t\t\t\twpmConsentValues.categories.ads = true\n\t\t\t} else {\n\t\t\t\twpmConsentValues.categories.analytics = cookie.categories.indexOf('performance') >= 0\n\t\t\t\twpmConsentValues.categories.ads = cookie.categories.indexOf('targeting') >= 0\n\t\t\t}\n\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie('borlabs-cookie')) {\n\t\t\t// Borlabs Cookie\n\t\t\t// https://borlabs.io/borlabs-cookie/\n\n\t\t\tcookie = decodeURI(cookie)\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie?.consents?.statistics\n\t\t\twpmConsentValues.categories.ads = !!cookie?.consents?.marketing\n\t\t\twpmConsentValues.visitorHasChosen = true\n\t\t\twpmConsentValues.pixels = [...cookie?.consents?.statistics || [], ...cookie?.consents?.marketing || []]\n\t\t\twpmConsentValues.mode = 'pixel'\n\n\t\t} else if (cookie = getComplianzCookies()) {\n\t\t\t// Complianz Cookie\n\t\t\t// https://wordpress.org/plugins/complianz-gdpr/\n\n\t\t\t// console.log(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie('cookie_notice_accepted')) {\n\t\t\t// Cookie Compliance (free version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\twpmConsentValues.categories.analytics = true\n\t\t\twpmConsentValues.categories.ads = true\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie('hu-consent')) {\n\t\t\t// Cookie Compliance (pro version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie.categories['3']\n\t\t\twpmConsentValues.categories.ads = !!cookie.categories['4']\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = getCookieLawInfoCookies()) {\n\t\t\t// CookieYes, GDPR Cookie Consent (Cookie Law Info)\n\t\t\t// https://wordpress.org/plugins/cookie-law-info/\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen === true\n\n\t\t} else if (cookie = wpm.getCookie('moove_gdpr_popup')) {\n\t\t\t// GDPR Cookie Compliance Plugin by Moove Agency\n\t\t\t// https://wordpress.org/plugins/gdpr-cookie-compliance/\n\t\t\t// TODO write documentation on how to set up the plugin in order for this to work properly\n\n\t\t\tcookie = JSON.parse(cookie)\n\t\t\t// console.log('moove cookie thirdparty: ' + cookie.thirdparty)\n\t\t\t// console.log('moove cookie advanced: ' + cookie.advanced)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.thirdparty === '1'\n\t\t\twpmConsentValues.categories.ads = cookie.advanced === '1'\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else {\n\t\t\t// consentValues.categories.analytics = true\n\t\t\t// consentValues.categories.ads = true\n\n\t\t\twpmConsentValues.categories.analytics = !explicitConsent\n\t\t\twpmConsentValues.categories.ads = !explicitConsent\n\t\t}\n\t}\n\n\twpm.updateConsentCookieValues();\n\n\twpm.setConsentDefaultValuesToExplicit = function () {\n\t\twpmConsentValues.categories = {\n\t\t\tanalytics: false,\n\t\t\tads : false,\n\t\t}\n\t}\n\n\t/*\n\t* Runs through each script in <head> and blocks / unblocks it according to the plugin settings\n\t* and user consent.\n\t*/\n\n\t// https://stackoverflow.com/q/65453565/4688612\n\twpm.scriptTagObserver = new MutationObserver((mutations) => {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif ($(node).data('wpm-cookie-category')) {\n\n\t\t\t\t\t\t// console.log(node)\n\n\t\t\t\t\t\t// If the pixel category has been approved > unblock\n\t\t\t\t\t\t// If the pixel belongs to more than one category, then unblock if one of the categories has been approved\n\t\t\t\t\t\t// If no category has been approved, but the Google Consent Mode is active, then only unblock the Google scripts\n\n\t\t\t\t\t\tif (wpm.shouldScriptBeActive(node)) {\n\t\t\t\t\t\t\twpm.unblockScript(node)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twpm.blockScript(node)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t})\n\n\twpm.scriptTagObserver.observe(document.head, {childList: true, subtree: true});\n\twindow.addEventListener('DOMContentLoaded', () => wpm.scriptTagObserver.disconnect());\n\n\twpm.shouldScriptBeActive = function (node) {\n\n\t\tif (\n\t\t\twpmDataLayer.shop.cookie_consent_mgmt.explicit_consent ||\n\t\t\twpmConsentValues.visitorHasChosen\n\t\t) {\n\n\t\t\tif (wpmConsentValues.mode === 'category' && $(node).data('wpm-cookie-category').split(',').some(element => wpmConsentValues.categories[element])) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === 'pixel' && wpmConsentValues.pixels.includes($(node).data('wpm-pixel-name'))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === 'pixel' && $(node).data('wpm-pixel-name') === 'google' && ['google-analytics', 'google-ads'].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmDataLayer?.pixels?.google?.consent_mode?.active && $(node).data('wpm-pixel-name') === 'google') {\n\t\t\t\treturn true\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\treturn true\n\t\t}\n\t}\n\n\n\twpm.unblockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tlet wpmSrc = $(scriptNode).data('wpm-src')\n\t\tif (wpmSrc) $(scriptNode).attr('src', wpmSrc)\n\n\t\tscriptNode.type = 'text/javascript'\n\n\t\tif (removeAttach) $(scriptNode).appendTo('head')\n\t}\n\n\twpm.blockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tif ($(scriptNode).attr('src')) $(scriptNode).removeAttr('src')\n\t\tscriptNode.type = 'blocked/javascript'\n\n\t\tif (removeAttach) $(scriptNode).appendTo('head')\n\t}\n\n\twpm.unblockAllScripts = function (analytics = true, ads = true) {\n\t\t// console.log('unblocking all scripts')\n\n\t\t$.each(\n\t\t\t$('script[type=\"blocked/javascript\"]'), function (index, scriptNode) {\n\n\t\t\t\tif ($(scriptNode).data('wpm-cookie-category').includes('analytics') && analytics) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t} else if ($(scriptNode).data('wpm-cookie-category').includes('ads') && ads) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\twpm.unblockSelectedPixels = function () {\n\t\t$.each(\n\t\t\t$('script[type=\"blocked/javascript\"]'), function (index, node) {\n\n\t\t\t\tif (wpmConsentValues.pixels.includes($(node).data('wpm-pixel-name'))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t} else if ($(node).data('wpm-pixel-name') === 'google' && ['google-analytics', 'google-ads'].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\twpm.googleConfigConditionsMet = function (type) {\n\t\t// always returns true if Google Consent Mode is active\n\t\tif (wpmDataLayer.pixels.google.consent_mode.active) {\n\t\t\treturn true\n\t\t} else if (wpmConsentValues.mode === 'category') {\n\t\t\treturn wpmConsentValues.categories[type] === true\n\t\t} else if (wpmConsentValues.mode === 'pixel') {\n\t\t\treturn wpmConsentValues.pixels.includes('google-' + type)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings = function (google_consent_settings) {\n\n\t\tif (wpmConsentValues.mode === 'category') {\n\t\t\tif (wpmConsentValues.categories.analytics) google_consent_settings.analytics_storage = 'granted'\n\t\t\tif (wpmConsentValues.categories.ads) google_consent_settings.ad_storage = 'granted'\n\t\t} else if ((wpmConsentValues.mode === 'pixel')) {\n\t\t\tgoogle_consent_settings.analytics_storage = wpmConsentValues.pixels.includes('google-analytics') ? 'granted' : 'denied'\n\t\t\tgoogle_consent_settings.ad_storage = wpmConsentValues.pixels.includes('google-ads') ? 'granted' : 'denied'\n\t\t}\n\n\t\treturn google_consent_settings\n\t}\n\n\twpm.updateGoogleConsentMode = function (analytics = true, ads = true) {\n\n\t\tif (\n\t\t\t!window.gtag ||\n\t\t\t!wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent\n\t\t) return\n\n\t\tgtag('consent', 'update', {\n\t\t\t'analytics_storage': analytics ? 'granted' : 'denied',\n\t\t\t'ad_storage' : ads ? 'granted' : 'denied'\n\t\t});\n\t}\n\n\n\t/*\n\t* Block or unblock scripts for each CMP immediately after cookie consent has been updated\n\t* by the visitor.\n\t */\n\n\t// Borlabs Cookie\n\t// If visitor accepts cookies in Borlabs Cookie unblock the scripts\n\twindow.addEventListener('borlabs-cookie-consent-saved', function (e) {\n\n\t\twpm.updateConsentCookieValues();\n\n\t\tif (wpmConsentValues.mode === 'pixel') {\n\n\t\t\twpm.unblockSelectedPixels()\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.pixels.includes('google-analytics'), wpmConsentValues.pixels.includes('google-ads'))\n\t\t} else {\n\n\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t}\n\t});\n\n\t// Cookiebot\n\t// If visitor accepts cookies in Cookiebot unblock the scripts\n\t// https://www.cookiebot.com/en/developer/\n\twindow.addEventListener('CookiebotOnAccept', function (e) {\n\t\tif (Cookiebot.consent.statistics) wpmConsentValues.categories.analytics = true\n\t\tif (Cookiebot.consent.marketing) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\n\t}, false);\n\n\t// Cookie Script\n\t// If visitor accepts cookies in Cookie Script unblock the scripts\n\t// https://support.cookie-script.com/article/20-custom-events\n\twindow.addEventListener('CookieScriptAccept', function (e) {\n\t\tif (e.detail.categories.includes('performance')) wpmConsentValues.categories.analytics = true\n\t\tif (e.detail.categories.includes('targeting')) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t// Cookie Script\n\t// If visitor accepts cookies in Cookie Script unblock the scripts\n\t// https://support.cookie-script.com/\n\twindow.addEventListener('CookieScriptAcceptAll', function (e) {\n\t\twpm.unblockAllScripts(true, true)\n\t\twpm.updateGoogleConsentMode(true, true)\n\t})\n\n\t// Complianz Cookie\n\t// If visitor accepts cookies in Complianz unblock the scripts\n\tdocument.addEventListener(\"cmplzStatusChange\", function (e) {\n\n\t\twpm.updateConsentCookieValues();\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t});\n\n\t// Cookie Compliance by hu-manity.co (free and pro)\n\t// If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (free version)\n\t// https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\tdocument.addEventListener(\"setCookieNotice\", function (e) {\n\n\t\twpm.updateConsentCookieValues();\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t});\n\n\t// Cookie Compliance by hu-manity.co (free and pro)\n\t// If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (pro version)\n\t// https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\t// Because Cookie Notice has no documented API or event that is being triggered on consent save or update\n\t// we have to solve this by using a mutation observer.\n\twpm.huObserver = new MutationObserver(function (mutations) {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif (node.id === 'hu') {\n\n\t\t\t\t\t\tjQuery('.hu-cookies-save').on('click', function (e) {\n\t\t\t\t\t\t\twpm.updateConsentCookieValues();\n\t\t\t\t\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t});\n\n\tif (window.hu) {\n\t\twpm.huObserver.observe(document.documentElement || document.body, {childList: true, subtree: true});\n\t}\n\n\twpm.version = function () {\n\t\tconsole.log(wpmDataLayer.version)\n\t}\n\n\t// wpm['load'] = {\n\t// base: true\n\t// };\n\n\twindow['wpmLoaded'] = {};\n\n\t// return {\n\t// writeOrderIdToStorage : writeOrderIdToStorage,\n\t// isOrderIdStored : isOrderIdStored,\n\t// isEmail : isEmail,\n\t// removeProductFromCart : removeProductFromCart,\n\t// getViewItemProducts : getViewItemProducts,\n\t// addProductToCart : addProductToCart,\n\t// getCartItemsFromBackEnd: getCartItemsFromBackEnd,\n\t// fireCheckoutOption : fireCheckoutOption,\n\t// getCartItems : getCartItems\n\t// }\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n// run when window ready\njQuery(function () {\n// jQuery(window).on('load', function () {\n\n\t// watch for products visible in viewport\n\twpm.startIntersectionObserverToWatch();\n\n\t// watch for lazy loaded products\n\twpm.startProductsMutationObserverToWatch();\n\n\tlet body = jQuery('body');\n\tlet products = jQuery('.products, .product');\n\n\t// remove_from_cart event\n\t// body.on('click', '.remove_from_cart_button, .remove', function (e) {\n\tjQuery(document).on('click', '.remove_from_cart_button, .remove', function (e) {\n\t\t// jQuery('.remove_from_cart_button, .remove').on('click', function (e) {\n\n\t\ttry {\n\t\t\t// console.log('remove_from_cart: ' + jQuery(this).data('product_id'));\n\n\t\t\tlet url = new URL(jQuery(this).attr('href'));\n\t\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url);\n\n\t\t\twpm.removeProductFromCart(productId);\n\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t});\n\n\n\t// add_to_cart event\n\t// body.on('click', '.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button', function (e) {\n\tjQuery(document).on('click', '.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button', function (e) {\n\t\t// jQuery('.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .js-ajax-add-to-cart, .single_add_to_cart_button, .btn_color-2').on('click', function (e) {\n\n\t\ttry {\n\t\t\t// console.log('add_to_cart');\n\n\t\t\tif (wpmDataLayer.shop.page_type === 'product') {\n\n\t\t\t\t// first process related and upsell products\n\t\t\t\tif (typeof jQuery(this).attr('href') !== 'undefined' && jQuery(this).attr('href').includes('add-to-cart')) {\n\t\t\t\t\t// console.log('add-to-cart on upsell and related products');\n\t\t\t\t\tlet quantity = 1;\n\t\t\t\t\tlet productId = jQuery(this).data('product_id');\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\t} else {\n\n\t\t\t\t\tif (wpmDataLayer.shop.product_type === 'simple') {\n\n\t\t\t\t\t\t// console.log('test');\n\t\t\t\t\t\tlet quantity = Number(jQuery('.input-text.qty').val());\n\n\t\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1;\n\n\t\t\t\t\t\tlet productId = jQuery(this).val();\n\n\t\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\t\twpm.addProductToCart(productId, quantity);\n\n\t\t\t\t\t} else if (wpmDataLayer.shop.product_type === 'variable') {\n\n\t\t\t\t\t\t// console.log('variable');\n\n\t\t\t\t\t\tlet quantity = Number(jQuery('.input-text.qty').val());\n\n\t\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1;\n\n\t\t\t\t\t\tlet productId = jQuery(\"[name='variation_id']\").val();\n\n\t\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\t\twpm.addProductToCart(productId, quantity);\n\n\t\t\t\t\t} else if (wpmDataLayer.shop.product_type === 'grouped') {\n\n\t\t\t\t\t\t// console.log('grouped');\n\n\t\t\t\t\t\tjQuery('.woocommerce-grouped-product-list-item').each(function () {\n\n\t\t\t\t\t\t\tlet quantity = Number(jQuery(this).find('.input-text.qty').val());\n\n\t\t\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1;\n\n\t\t\t\t\t\t\tlet classes = jQuery(this).attr('class');\n\t\t\t\t\t\t\tlet productId = wpm.getPostIdFromString(classes);\n\n\t\t\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (wpmDataLayer.shop.product_type === 'bundle') {\n\n\t\t\t\t\t\t// console.log('bundle');\n\n\t\t\t\t\t\tlet quantity = Number(jQuery('.input-text.qty').val());\n\n\t\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1;\n\n\t\t\t\t\t\tlet productId = jQuery('input[name=add-to-cart]').val();\n\n\t\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// console.log('non product page');\n\n\t\t\t\tlet quantity = 1;\n\t\t\t\tlet productId = jQuery(this).data('product_id');\n\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t});\n\n\t// if someone clicks anywhere on a custom /?add-to-cart=123 link\n\t// trigger the add to cart event\n\t// body.one('click', function (e) {\n\t//\n\t// try {\n\t// if (jQuery(this)[0].URL) {\n\t//\n\t// let href = new URL(jQuery(this)[0].URL);\n\t// let searchParams = new URLSearchParams(href.search);\n\t//\n\t// if (searchParams.has('add-to-cart')) {\n\t// // console.log('non product page, /?add-to-cart=123 link');\n\t//\n\t// let productId = searchParams.get('add-to-cart');\n\t// wpm.addProductToCart(productId, 1);\n\t// }\n\t// }\n\t// } catch (e) {\n\t// console.log(e);\n\t// }\n\t// });\n\n\t// if someone clicks anywhere on a custom /?add-to-cart=123 link\n\t// trigger the add to cart event\n\t// body.one('click', 'a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)', function (event) {\n\tjQuery(document).one('click', 'a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)', function (event) {\n\t\t// jQuery('a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)').one('click', function (event) {\n\n\t\ttry {\n\t\t\tif (jQuery(event.target).closest('a').attr('href')) {\n\n\t\t\t\tlet href = jQuery(event.target).closest('a').attr('href');\n\n\t\t\t\tif (href.includes('add-to-cart=')) {\n\t\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/);\n\t\t\t\t\t// console.log('pid: ' + matches[2])\n\t\t\t\t\tif (matches) wpm.addProductToCart(matches[2], 1);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t});\n\n\t// select_content GA UA event\n\t// select_item GA 4 event\n\t// jQuery(document).on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product-small.box', function (e) {\n\t// body.on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product', function (e) {\n\tjQuery(document).on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product', function (e) {\n\t\t// jQuery('.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product').on('click', function (e) {\n\n\t\ttry {\n\n\t\t\t// On some pages the event fires multiple times, and on product pages\n\t\t\t// even on page load. Using e.stopPropagation helps to prevent this,\n\t\t\t// but I dont know why. We don't even have to use this, since only a real\n\t\t\t// product click yields a valid productId. So we filter the invalid click\n\t\t\t// events out later down the code. I'll keep it that way because this is\n\t\t\t// the most compatible way across shops.\n\t\t\t// e.stopPropagation();\n\n\t\t\t// console.log('select_content and select_item');\n\n\t\t\tlet productId = jQuery(this).nextAll('.wpmProductId:first').data('id');\n\t\t\t// console.log('select_content and select_item: ' + productId);\n\n\n\t\t\t// On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t\t// In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t\t// related products, which are found below.\n\t\t\tif (productId) {\n\n\t\t\t\t// console.log('select_content and select_item: ' + productId);\n\n\t\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\t\t\t// console.log('prodid: ' + productId);\n\n\t\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId);\n\n\t\t\t\t\tjQuery(document).trigger('wpmSelectContentGaUa', product);\n\t\t\t\t\tjQuery(document).trigger('wpmSelectItem', product);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t});\n\n\t// begin_checkout event\n\t// body.one('click', '.checkout-button, .cart-checkout-button, .button.checkout', function (e) {\n\tjQuery(document).one('click', '.checkout-button, .cart-checkout-button, .button.checkout', function (e) {\n\t\t// jQuery('.checkout-button, .cart-checkout-button, .button.checkout').one('click', function (e) {\n\t\t// console.log('begin_checkout');\n\n\t\tjQuery(document).trigger('wpmBeginCheckout');\n\t});\n\n\tlet emailSelected = false;\n\n\t// checkout_progress event\n\t// track checkout option event: entered valid billing email\n\t// body.on('input', '#billing_email', function () {\n\tjQuery(document).on('input', '#billing_email', function () {\n\t\t// jQuery('#billing_email').on('input', function () {\n\n\t\tif (wpm.isEmail(jQuery(this).val())) {\n\t\t\t// wpm.fireCheckoutOption(2);\n\t\t\twpm.fireCheckoutProgress(2);\n\t\t\temailSelected = true;\n\t\t}\n\t});\n\n\t// track checkout option event: purchase click\n\tlet paymentMethodSelected = false;\n\n\t// body.on('click', '.wc_payment_methods', function () {\n\tjQuery(document).on('click', '.wc_payment_methods', function () {\n\t\t// jQuery('.wc_payment_methods').on('click', function () {\n\n\t\tif (paymentMethodSelected === false) {\n\t\t\twpm.fireCheckoutProgress(3);\n\t\t}\n\n\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t\tpaymentMethodSelected = true;\n\t});\n\n\t// track checkout option event: purchase click\n\t// body.one('click', '#place_order', function () {\n\tjQuery(document).one('click', '#place_order', function () {\n\t\t// jQuery('#place_order').one('click', function () {\n\n\t\tif (emailSelected === false) {\n\t\t\twpm.fireCheckoutProgress(2);\n\t\t}\n\n\t\tif (paymentMethodSelected === false) {\n\t\t\twpm.fireCheckoutProgress(3);\n\t\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t\t}\n\n\t\twpm.fireCheckoutProgress(4);\n\t});\n\n\t// update cart event\n\t// body.on('click', \"[name='update_cart']\", function (e) {\n\tjQuery(document).on('click', \"[name='update_cart']\", function (e) {\n\t\t// jQuery(\"[name='update_cart']\").on('click', function (e) {\n\n\t\ttry {\n\t\t\tjQuery('.cart_item').each(function () {\n\n\t\t\t\t// let productId = jQuery(this).find('[data-product_id]').data('product_id');\n\n\t\t\t\tlet url = new URL(jQuery(this).find('.product-remove').find('a').attr('href'));\n\t\t\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url);\n\n\t\t\t\t// console.log(productId)\n\n\t\t\t\tlet quantity = jQuery(this).find('.qty').val();\n\n\t\t\t\tif (quantity === 0) {\n\t\t\t\t\twpm.removeProductFromCart(productId);\n\t\t\t\t} else if (quantity < wpmDataLayer.cart[productId].quantity) {\n\t\t\t\t\twpm.removeProductFromCart(productId, wpmDataLayer.cart[productId].quantity - quantity);\n\t\t\t\t} else if (quantity > wpmDataLayer.cart[productId].quantity) {\n\t\t\t\t\twpm.addProductToCart(productId, quantity - wpmDataLayer.cart[productId].quantity);\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t\twpm.getCartItemsFromBackend();\n\t\t}\n\t});\n\n\t// Fired when the user selects all the required dropdowns / attributes\n\t// https://stackoverflow.com/a/27849208/4688612\n\tjQuery(\".single_variation_wrap\").on('show_variation', function (event, variation) {\n\n\t\ttry {\n\t\t\t// Fired when the user selects all the required dropdowns / attributes\n\t\t\t// console.log('product selected');\n\t\t\t// console.log(variation);\n\n\t\t\tlet productId = getIdBasedOndVariationsOutputSetting(variation.variation_id);\n\n\t\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\t// console.log('productId: ' + productId);\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId);\n\n\t\t\t\tjQuery(document).trigger('wpmViewItem', product);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t});\n\n\t// add_to_wishlist\n\t// body.on('click', '.add_to_wishlist, .wl-add-to', function () {\n\tjQuery(document).on('click', '.add_to_wishlist, .wl-add-to', function () {\n\t\t// jQuery('.add_to_wishlist, .wl-add-to').on('click', function () {\n\n\t\ttry {\n\t\t\t// console.log('add_to_wishlist');\n\t\t\t// console.log('this:' + jQuery(this).data('product-id'));\n\n\t\t\tlet productId;\n\n\t\t\tif (jQuery(this).data('productid')) { // for the WooCommerce wishlist plugin\n\t\t\t\tproductId = jQuery(this).data('productid');\n\t\t\t} else if (jQuery(this).data('product-id')) { // for the YITH wishlist plugin\n\t\t\t\tproductId = jQuery(this).data('product-id');\n\t\t\t}\n\n\t\t\tif (!productId) throw Error('Wasn\\'t able to retrieve a productId');\n\n\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId);\n\n\t\t\t// console.log('add_to_wishlist');\n\t\t\t// console.log(product);\n\n\t\t\tjQuery(document).trigger('wpmAddToWishlist', product);\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t})\n\n\t// body.on('updated_cart_totals', function () {\n\tjQuery(document).on('updated_cart_totals', function () {\n\n\t\tjQuery(document).trigger('wpmViewCart');\n\t});\n});\n\njQuery(document).ajaxSend(function (event, jqxhr, settings) {\n\t// console.log('settings.url: ' + settings.url);\n\n\tif (settings.url.includes('get_refreshed_fragments') && sessionStorage) {\n\t\tif (!sessionStorage.getItem('wpmMiniCartActive')) {\n\t\t\tsessionStorage.setItem('wpmMiniCartActive', JSON.stringify(true));\n\t\t}\n\t}\n});\n\n// populate the wpmDataLayer with the cart items\njQuery(window).on('load', function () {\n\t// console.log('getting cart');\n\n\ttry {\n\t\t// console.log('wpmMiniCartActive: ' + JSON.parse(sessionStorage.getItem('wpmMiniCartActive')));\n\t\t// if ( wpmDataLayer.shop.page_type === 'cart' || wpmDataLayer.shop.mini_cart.track === true) {\n\n\t\tif (\n\t\t\tJSON.parse(sessionStorage.getItem('wpmMiniCartActive')) && // if we detected calls to get_refreshed_fragments\n\t\t\tJSON.parse(sessionStorage.getItem('wpmFirstPageLoad')) && // when a new session is initiated there are no items in the cart, so we can save that call\n\t\t\twpmDataLayer.shop.mini_cart.track === true // if shop owner generally allows the plugin to track the mini cart\n\t\t) {\n\t\t\t// console.log('getting cart');\n\t\t\twpm.getCartItems();\n\n\t\t} else {\n\t\t\tsessionStorage.setItem('wpmFirstPageLoad', JSON.stringify(true));\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n});\n\n// get all add-to-cart= products from backend\njQuery(window).on('load', function () {\n\n\twpmDataLayer.products = wpmDataLayer.products || {};\n\t// wpmDataLayer.products = {14: 'x', 31: 'x', 16: 'x', 22: 'x', 40: 'x'};\n\n\t// scan page for add-to-cart= links\n\tlet productIds = wpm.getAddToCartLinkProductIds();\n\n\twpm.getProductsFromBackend(productIds);\n})\n\njQuery(window).on('load', function () {\n\n\t// can't use session storage as we can't read it from the server\n\tif (!wpm.getCookie('wpmReferrer')) {\n\n\t\tif (document.referrer) {\n\t\t\tlet referrerUrl = new URL(document.referrer);\n\t\t\tlet referrerHostname = referrerUrl.hostname;\n\n\t\t\tif (referrerHostname !== window.location.host) {\n\t\t\t\twpm.setCookie('wpmReferrer', referrerHostname);\n\t\t\t} else {\n\t\t\t\twpm.setCookie('wpmReferrer', '');\n\t\t\t}\n\n\t\t} else {\n\t\t\twpm.setCookie('wpmReferrer', '');\n\t\t}\n\t}\n})\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))"],"names":["wpm","$","undefined","fBUserData","getRandomEventId","Math","random","toString","substring","getFbUserData","getFbUserDataFromBrowser","setFbUserData","getCookie","navigator","userAgent","fbViewContent","product","window","fbq","eventId","name","dyn_r_ids","wpmDataLayer","pixels","facebook","dynamic_remarketing","id_type","shop","currency","price","jQuery","document","trigger","location","href","on","event","parseFloat","quantity","wpmExists","then","page_type","product_type","getMainProductIdFromProductPage","getProductDataForViewItemEvent","e","console","log","google","ads","status","general","variationsOutput","isVariable","send_events_with_parent_ids","googleConfigConditionsMet","gtag","send_to","conversionIds","items","id","google_business_vertical","products","key","Object","entries","push","wpmDeduper","wpmRestSettings","checkCookie","useRestEndpoint","isSessionStorageAvailable","isRestEndpointAvailable","isBelowRestErrorThreshold","sessionStorage","getItem","JSON","parse","testEndpoint","url","protocol","host","cookieName","ajax","type","timeout","statusCode","response","setItem","stringify","r","isWpmRestEndpointAvailable","writeOrderIdToStorage","orderId","Storage","localStorage","ids","includes","expiresDate","Date","setDate","getDate","cookie","toUTCString","storeOrderIdOnServer","orderDeduplication","isOrderIdStored","isEmail","email","test","removeProductFromCart","productId","quantityToRemove","Error","getIdBasedOndVariationsOutputSetting","cart","getProductDetailsFormattedForEvent","isVariation","parentId","addProductToCart","getCartItemsFromBackend","getCartItems","saveCartObjectToDataLayer","data","action","dataType","ajax_url","success","cartItems","getProductsFromBackend","productIds","filter","item","hasOwnProperty","length","assign","error","cartObject","fireCheckoutOption","step","checkout_option","value","fireCheckoutProgress","getPostIdFromString","string","match","triggerViewItemList","indexOf","viewItemListTriggerTestMode","target","css","append","find","viewItemListTrigger","opacity","backgroundColor","getSearchTermFromUrl","URLSearchParams","search","get","io","ioTimeouts","observerCallback","observer","forEach","entry","elementId","next","isIntersecting","setTimeout","testMode","repeat","unobserve","clearTimeout","remove","allIoElementsToWatch","ioid","startIntersectionObserverToWatch","has","IntersectionObserver","threshold","map","i","elem","parent","hasClass","prev","this","closest","each","observe","startProductsMutationObserverToWatch","productsNode","parents","first","productsMutationObserver","attributes","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasWpmProductIdElement","siblings","setCookie","cookieValue","expiryDays","d","setTime","getTime","expires","ca","decodeURIComponent","split","c","charAt","order_id","nonce","getProductIdByCartItemKeyUrl","cartItemKey","cartItemKeys","getAddToCartLinkProductIds","attr","matches","list_name","brand","category","variant","list_position","position","parentId_dyn_r_ids","setReferrerToCookie","referrer","getReferrerFromCookie","getClidFromBrowser","clidCookieId","clidId","gclid","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","getComplianzCookies","cmplz_statistics","cmplz_marketing","analytics","visitorHasChosen","getCookieLawInfoCookies","analyticsCookie","adsCookie","wpmConsentValues","getConsentValues","updateConsentCookieValues","explicitConsent","decodeURI","categories","consents","statistics","marketing","mode","thirdparty","advanced","setConsentDefaultValuesToExplicit","scriptTagObserver","node","shouldScriptBeActive","unblockScript","blockScript","head","subtree","addEventListener","disconnect","cookie_consent_mgmt","explicit_consent","some","element","consent_mode","active","scriptNode","removeAttach","wpmSrc","appendTo","removeAttr","unblockAllScripts","index","unblockSelectedPixels","getVisitorConsentStatusAndUpdateGoogleConsentSettings","google_consent_settings","analytics_storage","ad_storage","updateGoogleConsentMode","Cookiebot","consent","detail","huObserver","hu","body","version","URL","Number","val","classes","one","nextAll","emailSelected","paymentMethodSelected","variation","variation_id","ajaxSend","jqxhr","settings","mini_cart","track","referrerHostname","hostname","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","n","getter","__esModule","a","definition","o","defineProperty","enumerable","obj","prop","prototype","call"],"sourceRoot":""}
|
languages/woocommerce-google-adwords-conversion-tracking-tag.pot
CHANGED
@@ -2,21 +2,21 @@
|
|
2 |
# This file is distributed under the GNU General Public License v3.0.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
-
"Project-Id-Version: WooCommerce Pixel Manager 1.
|
6 |
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
|
7 |
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
8 |
"Language-Team: LANGUAGE <LL@li.org>\n"
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"POT-Creation-Date: 2022-
|
13 |
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
14 |
"X-Generator: WP-CLI 2.6.0\n"
|
15 |
"X-Domain: woocommerce-google-adwords-conversion-tracking-tag\n"
|
16 |
|
17 |
#. Plugin Name of the plugin
|
18 |
-
#: wgact.php:
|
19 |
-
#: wgact.php:
|
20 |
msgid "WooCommerce Pixel Manager"
|
21 |
msgstr ""
|
22 |
|
@@ -33,225 +33,226 @@ msgid "SweetCode"
|
|
33 |
msgstr ""
|
34 |
|
35 |
#. Author URI of the plugin
|
36 |
-
msgid "https://sweetcode.
|
37 |
msgstr ""
|
38 |
|
39 |
-
#: classes/admin/class-admin.php:
|
40 |
-
#: classes/admin/class-admin.php:
|
41 |
msgid "Pixel Manager"
|
42 |
msgstr ""
|
43 |
|
44 |
-
#: classes/admin/class-admin.php:
|
45 |
msgid "Main"
|
46 |
msgstr ""
|
47 |
|
48 |
-
#: classes/admin/class-admin.php:
|
49 |
msgid "Google"
|
50 |
msgstr ""
|
51 |
|
52 |
-
#: classes/admin/class-admin.php:
|
53 |
msgid "Google Ads Conversion ID"
|
54 |
msgstr ""
|
55 |
|
56 |
-
#: classes/admin/class-admin.php:
|
57 |
-
msgid "Google Ads
|
58 |
msgstr ""
|
59 |
|
60 |
-
#: classes/admin/class-admin.php:
|
61 |
msgid "Google Analytics UA"
|
62 |
msgstr ""
|
63 |
|
64 |
-
#: classes/admin/class-admin.php:
|
65 |
msgid "Google Analytics 4"
|
66 |
msgstr ""
|
67 |
|
68 |
-
#: classes/admin/class-admin.php:
|
69 |
msgid "Google Optimize"
|
70 |
msgstr ""
|
71 |
|
72 |
-
#: classes/admin/class-admin.php:
|
73 |
-
msgid "
|
74 |
msgstr ""
|
75 |
|
76 |
-
#: classes/admin/class-admin.php:
|
77 |
-
msgid "
|
78 |
msgstr ""
|
79 |
|
80 |
-
#: classes/admin/class-admin.php:
|
81 |
msgid "more pixels"
|
82 |
msgstr ""
|
83 |
|
84 |
-
#: classes/admin/class-admin.php:
|
85 |
msgid "Microsoft Advertising UET tag ID"
|
86 |
msgstr ""
|
87 |
|
88 |
-
#: classes/admin/class-admin.php:
|
89 |
msgid "Twitter pixel ID"
|
90 |
msgstr ""
|
91 |
|
92 |
-
#: classes/admin/class-admin.php:
|
93 |
msgid "Pinterest pixel ID"
|
94 |
msgstr ""
|
95 |
|
96 |
-
#: classes/admin/class-admin.php:
|
97 |
msgid "Snapchat pixel ID"
|
98 |
msgstr ""
|
99 |
|
100 |
-
#: classes/admin/class-admin.php:
|
101 |
msgid "TikTok pixel ID"
|
102 |
msgstr ""
|
103 |
|
104 |
-
#: classes/admin/class-admin.php:
|
105 |
msgid "Hotjar site ID"
|
106 |
msgstr ""
|
107 |
|
108 |
-
#: classes/admin/class-admin.php:
|
109 |
msgid "Advanced"
|
110 |
msgstr ""
|
111 |
|
112 |
-
#: classes/admin/class-admin.php:
|
113 |
msgid "Order Total Logic"
|
114 |
msgstr ""
|
115 |
|
116 |
-
#: classes/admin/class-admin.php:
|
117 |
msgid "Order Duplication Prevention"
|
118 |
msgstr ""
|
119 |
|
120 |
-
#: classes/admin/class-admin.php:
|
121 |
msgid "Maximum Compatibility Mode"
|
122 |
msgstr ""
|
123 |
|
124 |
-
#: classes/admin/class-admin.php:
|
125 |
-
msgid "
|
126 |
msgstr ""
|
127 |
|
128 |
-
#: classes/admin/class-admin.php:
|
129 |
msgid "Conversion Cart Data"
|
130 |
msgstr ""
|
131 |
|
132 |
-
#: classes/admin/class-admin.php:
|
133 |
msgid "Enhanced E-Commerce"
|
134 |
msgstr ""
|
135 |
|
136 |
-
#: classes/admin/class-admin.php:
|
137 |
msgid "GA 4 API secret"
|
138 |
msgstr ""
|
139 |
|
140 |
-
#: classes/admin/class-admin.php:
|
141 |
msgid "Enhanced Link Attribution"
|
142 |
msgstr ""
|
143 |
|
144 |
-
#: classes/admin/class-admin.php:
|
145 |
msgid "Google User ID"
|
146 |
msgstr ""
|
147 |
|
148 |
-
#: classes/admin/class-admin.php:
|
149 |
msgid "Google Ads Enhanced Conversions"
|
150 |
msgstr ""
|
151 |
|
152 |
-
#: classes/admin/class-admin.php:
|
153 |
msgid "Google Ads Phone Conversion Number"
|
154 |
msgstr ""
|
155 |
|
156 |
-
#: classes/admin/class-admin.php:
|
157 |
msgid "Google Ads Phone Conversion Label"
|
158 |
msgstr ""
|
159 |
|
160 |
-
#: classes/admin/class-admin.php:
|
161 |
msgid "Cookie Consent Management"
|
162 |
msgstr ""
|
163 |
|
164 |
-
#: classes/admin/class-admin.php:
|
165 |
msgid "Google Consent Mode"
|
166 |
msgstr ""
|
167 |
|
168 |
-
#: classes/admin/class-admin.php:
|
169 |
msgid "Google Consent Regions"
|
170 |
msgstr ""
|
171 |
|
172 |
-
#: classes/admin/class-admin.php:
|
173 |
msgid "Explicit Consent Mode"
|
174 |
msgstr ""
|
175 |
|
176 |
-
#: classes/admin/class-admin.php:
|
177 |
msgid "Borlabs Cookie support"
|
178 |
msgstr ""
|
179 |
|
180 |
-
#: classes/admin/class-admin.php:
|
|
|
181 |
msgid "Cookiebot support"
|
182 |
msgstr ""
|
183 |
|
184 |
-
#: classes/admin/class-admin.php:
|
185 |
msgid "Complianz GDPR support"
|
186 |
msgstr ""
|
187 |
|
188 |
-
#: classes/admin/class-admin.php:
|
189 |
msgid "Cookie Notice support"
|
190 |
msgstr ""
|
191 |
|
192 |
-
#: classes/admin/class-admin.php:
|
193 |
msgid "Cookie Script support"
|
194 |
msgstr ""
|
195 |
|
196 |
-
#: classes/admin/class-admin.php:
|
197 |
msgid "GDPR Cookie Compliance support"
|
198 |
msgstr ""
|
199 |
|
200 |
-
#: classes/admin/class-admin.php:
|
201 |
msgid "GDPR Cookie Consent support"
|
202 |
msgstr ""
|
203 |
|
204 |
-
#: classes/admin/class-admin.php:
|
205 |
-
msgid "
|
206 |
msgstr ""
|
207 |
|
208 |
-
#: classes/admin/class-admin.php:
|
209 |
-
msgid "
|
210 |
msgstr ""
|
211 |
|
212 |
-
#: classes/admin/class-admin.php:
|
213 |
-
msgid "
|
214 |
msgstr ""
|
215 |
|
216 |
-
#: classes/admin/class-admin.php:
|
217 |
-
msgid "
|
218 |
msgstr ""
|
219 |
|
220 |
-
#: classes/admin/class-admin.php:
|
221 |
-
#: classes/admin/class-admin.php:
|
222 |
-
#: classes/admin/class-admin.php:
|
223 |
msgid "Dynamic Remarketing"
|
224 |
msgstr ""
|
225 |
|
226 |
-
#: classes/admin/class-admin.php:
|
227 |
msgid "Product Identifier"
|
228 |
msgstr ""
|
229 |
|
230 |
-
#: classes/admin/class-admin.php:
|
231 |
msgid "Variations output"
|
232 |
msgstr ""
|
233 |
|
234 |
-
#: classes/admin/class-admin.php:
|
235 |
msgid "Google Business Vertical"
|
236 |
msgstr ""
|
237 |
|
238 |
-
#: classes/admin/class-admin.php:
|
239 |
-
#: classes/admin/class-admin.php:
|
240 |
msgid "Support"
|
241 |
msgstr ""
|
242 |
|
243 |
-
#: classes/admin/class-admin.php:
|
244 |
-
#: classes/admin/class-admin.php:
|
245 |
msgid "Author"
|
246 |
msgstr ""
|
247 |
|
248 |
-
#: classes/admin/class-admin.php:
|
249 |
msgid ""
|
250 |
"It looks like you are using some sort of ad or script blocker which is blocking the script and CSS files of this plugin.\n"
|
251 |
" In order for the plugin to work properly you need to disable the script blocker."
|
252 |
msgstr ""
|
253 |
|
254 |
-
#: classes/admin/class-admin.php:
|
255 |
#: classes/admin/class-notifications.php:31
|
256 |
#: classes/admin/class-notifications.php:73
|
257 |
#: classes/admin/class-notifications.php:114
|
@@ -259,413 +260,449 @@ msgstr ""
|
|
259 |
msgid "Learn more"
|
260 |
msgstr ""
|
261 |
|
262 |
-
#: classes/admin/class-admin.php:
|
263 |
msgid "Profit Driven Marketing by SweetCode"
|
264 |
msgstr ""
|
265 |
|
266 |
-
#: classes/admin/class-admin.php:
|
267 |
msgid "Visit us here:"
|
268 |
msgstr ""
|
269 |
|
270 |
-
#: classes/admin/class-admin.php:
|
271 |
msgid "Contacting Support"
|
272 |
msgstr ""
|
273 |
|
274 |
-
#: classes/admin/class-admin.php:
|
275 |
msgid "Debug Information"
|
276 |
msgstr ""
|
277 |
|
278 |
-
#: classes/admin/class-admin.php:
|
279 |
msgid "copy to clipboard"
|
280 |
msgstr ""
|
281 |
|
282 |
-
#: classes/admin/class-admin.php:
|
283 |
msgid "Translations"
|
284 |
msgstr ""
|
285 |
|
286 |
-
#: classes/admin/class-admin.php:
|
287 |
msgid "If you want to participate improving the translations of this plugin into your language, please follow this link:"
|
288 |
msgstr ""
|
289 |
|
290 |
-
#: classes/admin/class-admin.php:
|
291 |
msgid "Post a support request in the WordPress support forum here: "
|
292 |
msgstr ""
|
293 |
|
294 |
-
#: classes/admin/class-admin.php:
|
295 |
msgid "Support forum"
|
296 |
msgstr ""
|
297 |
|
298 |
-
#: classes/admin/class-admin.php:
|
299 |
msgid "(Never post the debug or other sensitive information to the support forum. Instead send us the information by email.)"
|
300 |
msgstr ""
|
301 |
|
302 |
-
#: classes/admin/class-admin.php:
|
303 |
msgid "Or send us an email to the following address: "
|
304 |
msgstr ""
|
305 |
|
306 |
-
#: classes/admin/class-admin.php:
|
307 |
msgid "Send us your support request through the WooCommerce.com dashboard: "
|
308 |
msgstr ""
|
309 |
|
310 |
-
#: classes/admin/class-admin.php:
|
311 |
msgid "More details about the developer of this plugin: "
|
312 |
msgstr ""
|
313 |
|
314 |
-
#: classes/admin/class-admin.php:
|
315 |
msgid "Developer: SweetCode"
|
316 |
msgstr ""
|
317 |
|
318 |
-
#: classes/admin/class-admin.php:
|
319 |
msgid "Website: "
|
320 |
msgstr ""
|
321 |
|
322 |
-
#: classes/admin/class-admin.php:
|
323 |
msgid "The Google Analytics Universal property ID looks like this:"
|
324 |
msgstr ""
|
325 |
|
326 |
-
#: classes/admin/class-admin.php:
|
327 |
msgid "The Google Analytics 4 measurement ID looks like this:"
|
328 |
msgstr ""
|
329 |
|
330 |
-
#: classes/admin/class-admin.php:
|
331 |
msgid "The conversion ID looks similar to this:"
|
332 |
msgstr ""
|
333 |
|
334 |
-
#: classes/admin/class-admin.php:
|
335 |
-
msgid "The
|
336 |
msgstr ""
|
337 |
|
338 |
-
#: classes/admin/class-admin.php:
|
339 |
-
#: classes/admin/class-admin.php:
|
340 |
msgid "Requires an active Google Ads Conversion ID"
|
341 |
msgstr ""
|
342 |
|
343 |
-
#: classes/admin/class-admin.php:
|
344 |
msgid "The Google Optimize container ID looks like this:"
|
345 |
msgstr ""
|
346 |
|
347 |
-
#: classes/admin/class-admin.php:
|
348 |
-
msgid "The
|
349 |
msgstr ""
|
350 |
|
351 |
-
#: classes/admin/class-admin.php:
|
352 |
msgid "The Microsoft Advertising UET tag ID looks similar to this:"
|
353 |
msgstr ""
|
354 |
|
355 |
-
#: classes/admin/class-admin.php:
|
356 |
msgid "The Twitter pixel ID looks similar to this:"
|
357 |
msgstr ""
|
358 |
|
359 |
-
#: classes/admin/class-admin.php:
|
360 |
msgid "The Pinterest pixel ID looks similar to this:"
|
361 |
msgstr ""
|
362 |
|
363 |
-
#: classes/admin/class-admin.php:
|
364 |
msgid "The Snapchat pixel ID looks similar to this:"
|
365 |
msgstr ""
|
366 |
|
367 |
-
#: classes/admin/class-admin.php:
|
368 |
msgid "The TikTok pixel ID looks similar to this:"
|
369 |
msgstr ""
|
370 |
|
371 |
-
#: classes/admin/class-admin.php:
|
372 |
msgid "The Hotjar site ID looks similar to this:"
|
373 |
msgstr ""
|
374 |
|
375 |
-
#: classes/admin/class-admin.php:
|
376 |
msgid "Use order_subtotal: Doesn't include tax and shipping (default)"
|
377 |
msgstr ""
|
378 |
|
379 |
-
#: classes/admin/class-admin.php:
|
380 |
msgid "Use order_total: Includes tax and shipping"
|
381 |
msgstr ""
|
382 |
|
383 |
-
#: classes/admin/class-admin.php:
|
384 |
msgid "This is the order total amount reported back to Google Ads"
|
385 |
msgstr ""
|
386 |
|
387 |
-
#: classes/admin/class-admin.php:
|
388 |
msgid "open the documentation"
|
389 |
msgstr ""
|
390 |
|
391 |
-
#: classes/admin/class-admin.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
392 |
msgid "Enable Google consent mode with standard settings"
|
393 |
msgstr ""
|
394 |
|
395 |
-
#: classes/admin/class-admin.php:
|
396 |
msgid "If no region is set, then the restrictions are enabled for all regions. If you specify one or more regions, then the restrictions only apply for the specified regions."
|
397 |
msgstr ""
|
398 |
|
399 |
-
#: classes/admin/class-admin.php:
|
400 |
msgid "Enable Google Analytics enhanced e-commerce"
|
401 |
msgstr ""
|
402 |
|
403 |
-
#: classes/admin/class-admin.php:
|
404 |
-
#: classes/admin/class-admin.php:
|
405 |
-
#: classes/admin/class-admin.php:
|
406 |
msgid "You need to activate at least Google Analytics UA or Google Analytics 4"
|
407 |
msgstr ""
|
408 |
|
409 |
-
#: classes/admin/class-admin.php:
|
410 |
msgid "Google Analytics 4 activation required"
|
411 |
msgstr ""
|
412 |
|
413 |
-
#: classes/admin/class-admin.php:
|
414 |
msgid "Enhanced E-Commerce activation required"
|
415 |
msgstr ""
|
416 |
|
417 |
-
#: classes/admin/class-admin.php:
|
418 |
msgid "If enabled, purchase and refund events will be sent to Google through the measurement protocol for increased accuracy."
|
419 |
msgstr ""
|
420 |
|
421 |
-
#: classes/admin/class-admin.php:
|
422 |
msgid "Enable Google Analytics enhanced link attribution"
|
423 |
msgstr ""
|
424 |
|
425 |
-
#: classes/admin/class-admin.php:
|
426 |
msgid "Enable Google user ID"
|
427 |
msgstr ""
|
428 |
|
429 |
-
#: classes/admin/class-admin.php:
|
430 |
msgid "Enable Google Ads Enhanced Conversions"
|
431 |
msgstr ""
|
432 |
|
433 |
-
#: classes/admin/class-admin.php:
|
434 |
msgid "You need to activate Google Ads"
|
435 |
msgstr ""
|
436 |
|
437 |
-
#: classes/admin/class-admin.php:
|
438 |
msgid "The Google Ads phone conversion number must be in the same format as on the website."
|
439 |
msgstr ""
|
440 |
|
441 |
-
#: classes/admin/class-admin.php:
|
442 |
msgid "Borlabs Cookie detected. Automatic support is:"
|
443 |
msgstr ""
|
444 |
|
445 |
-
#: classes/admin/class-admin.php:
|
446 |
msgid "Cookiebot detected. Automatic support is:"
|
447 |
msgstr ""
|
448 |
|
449 |
-
#: classes/admin/class-admin.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
450 |
msgid "Complianz GDPR detected. Automatic support is:"
|
451 |
msgstr ""
|
452 |
|
453 |
-
#: classes/admin/class-admin.php:
|
454 |
msgid "Cookie Notice (by hu-manity.co) detected. Automatic support is:"
|
455 |
msgstr ""
|
456 |
|
457 |
-
#: classes/admin/class-admin.php:
|
458 |
msgid "Cookie Script (by cookie-script.com) detected. Automatic support is:"
|
459 |
msgstr ""
|
460 |
|
461 |
-
#: classes/admin/class-admin.php:
|
462 |
msgid "GDPR Cookie Compliance (by Moove Agency) detected. Automatic support is:"
|
463 |
msgstr ""
|
464 |
|
465 |
-
#: classes/admin/class-admin.php:
|
466 |
msgid "GDPR Cookie Consent (by WebToffee) detected. Automatic support is:"
|
467 |
msgstr ""
|
468 |
|
469 |
-
#: classes/admin/class-admin.php:
|
470 |
msgid "Enable Explicit Consent Mode"
|
471 |
msgstr ""
|
472 |
|
473 |
-
#: classes/admin/class-admin.php:
|
474 |
msgid "Only activate the Explicit Consent Mode if you are also using a Cookie Management Platform (a cookie banner) that is compatible with this plugin. Find a list of compatible plugins in the documentation."
|
475 |
msgstr ""
|
476 |
|
477 |
-
#: classes/admin/class-admin.php:
|
478 |
-
#: classes/admin/class-admin.php:
|
479 |
-
#: classes/admin/class-admin.php:
|
480 |
-
#: classes/admin/class-admin.php:
|
481 |
-
msgid "You need to activate the
|
482 |
msgstr ""
|
483 |
|
484 |
-
#: classes/admin/class-admin.php:
|
485 |
-
msgid "Send CAPI hits for anonymous visitors who likely have blocked the
|
486 |
msgstr ""
|
487 |
|
488 |
-
#: classes/admin/class-admin.php:
|
489 |
msgid "Include additional visitor's identifiers, such as IP address, email and shop ID in the CAPI hit."
|
490 |
msgstr ""
|
491 |
|
492 |
-
#: classes/admin/class-admin.php:
|
493 |
-
msgid "Enable
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
494 |
msgstr ""
|
495 |
|
496 |
-
#: classes/admin/class-admin.php:
|
497 |
msgid "Only disable order duplication prevention for testing. Remember to re-enable the setting once done."
|
498 |
msgstr ""
|
499 |
|
500 |
-
#: classes/admin/class-admin.php:
|
501 |
msgid "Enable the maximum compatibility mode"
|
502 |
msgstr ""
|
503 |
|
504 |
-
#: classes/admin/class-admin.php:
|
505 |
msgid "Advanced order duplication prevention is "
|
506 |
msgstr ""
|
507 |
|
508 |
-
#: classes/admin/class-admin.php:
|
509 |
msgid "Basic order duplication prevention is "
|
510 |
msgstr ""
|
511 |
|
512 |
-
#: classes/admin/class-admin.php:
|
513 |
msgid "Enable dynamic remarketing audience collection"
|
514 |
msgstr ""
|
515 |
|
516 |
-
#: classes/admin/class-admin.php:
|
517 |
msgid "You need to choose the correct product identifier setting in order to match the product identifiers in the product feeds."
|
518 |
msgstr ""
|
519 |
|
520 |
-
#: classes/admin/class-admin.php:
|
521 |
msgid "Enable variations output"
|
522 |
msgstr ""
|
523 |
|
524 |
-
#: classes/admin/class-admin.php:
|
525 |
msgid "In order for this to work you need to upload your product feed including product variations and the item_group_id. Disable it, if you choose only to upload the parent product for variable products."
|
526 |
msgstr ""
|
527 |
|
528 |
-
#: classes/admin/class-admin.php:
|
529 |
msgid "Retail"
|
530 |
msgstr ""
|
531 |
|
532 |
-
#: classes/admin/class-admin.php:
|
533 |
msgid "Education"
|
534 |
msgstr ""
|
535 |
|
536 |
-
#: classes/admin/class-admin.php:
|
537 |
msgid "Hotels and rentals"
|
538 |
msgstr ""
|
539 |
|
540 |
-
#: classes/admin/class-admin.php:
|
541 |
msgid "Jobs"
|
542 |
msgstr ""
|
543 |
|
544 |
-
#: classes/admin/class-admin.php:
|
545 |
msgid "Local deals"
|
546 |
msgstr ""
|
547 |
|
548 |
-
#: classes/admin/class-admin.php:
|
549 |
msgid "Real estate"
|
550 |
msgstr ""
|
551 |
|
552 |
-
#: classes/admin/class-admin.php:
|
553 |
msgid "Custom"
|
554 |
msgstr ""
|
555 |
|
556 |
-
#: classes/admin/class-admin.php:
|
557 |
msgid "ID of your Google Merchant Center account. It looks like this: 12345678"
|
558 |
msgstr ""
|
559 |
|
560 |
-
#: classes/admin/class-admin.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
561 |
msgid "post ID (default)"
|
562 |
msgstr ""
|
563 |
|
564 |
-
#: classes/admin/class-admin.php:
|
565 |
msgid "SKU"
|
566 |
msgstr ""
|
567 |
|
568 |
-
#: classes/admin/class-admin.php:
|
569 |
msgid "ID for the WooCommerce Google Product Feed. Outputs the post ID with woocommerce_gpf_ prefix *"
|
570 |
msgstr ""
|
571 |
|
572 |
-
#: classes/admin/class-admin.php:
|
573 |
msgid "ID for the WooCommerce Google Listings & Ads Plugin. Outputs the post ID with gla_ prefix **"
|
574 |
msgstr ""
|
575 |
|
576 |
-
#: classes/admin/class-admin.php:
|
577 |
msgid "Choose a product identifier."
|
578 |
msgstr ""
|
579 |
|
580 |
-
#: classes/admin/class-admin.php:
|
581 |
msgid "* This is for users of the WooCommerce Google Product Feed Plugin"
|
582 |
msgstr ""
|
583 |
|
584 |
-
#: classes/admin/class-admin.php:
|
585 |
msgid "** This is for users of the WooCommerce Google Listings & Ads Plugin"
|
586 |
msgstr ""
|
587 |
|
588 |
-
#: classes/admin/class-admin.php:
|
589 |
msgid "beta"
|
590 |
msgstr ""
|
591 |
|
592 |
-
#: classes/admin/class-admin.php:
|
593 |
-
#: classes/admin/class-admin.php:
|
594 |
msgid "active"
|
595 |
msgstr ""
|
596 |
|
597 |
-
#: classes/admin/class-admin.php:
|
598 |
-
#: classes/admin/class-admin.php:
|
599 |
msgid "inactive"
|
600 |
msgstr ""
|
601 |
|
602 |
-
#: classes/admin/class-admin.php:
|
603 |
-
#: classes/admin/class-admin.php:
|
604 |
msgid "partially active"
|
605 |
msgstr ""
|
606 |
|
607 |
-
#: classes/admin/class-admin.php:
|
608 |
msgid "Pro Feature"
|
609 |
msgstr ""
|
610 |
|
611 |
-
#: classes/admin/class-admin.php:
|
612 |
msgid "You have entered an invalid Google Analytics Universal property ID."
|
613 |
msgstr ""
|
614 |
|
615 |
-
#: classes/admin/class-admin.php:
|
616 |
msgid "You have entered an invalid Google Analytics 4 measurement ID."
|
617 |
msgstr ""
|
618 |
|
619 |
-
#: classes/admin/class-admin.php:
|
620 |
msgid "You have entered an invalid Google Analytics 4 API key."
|
621 |
msgstr ""
|
622 |
|
623 |
-
#: classes/admin/class-admin.php:
|
624 |
msgid "You have entered an invalid conversion ID. It only contains 8 to 10 digits."
|
625 |
msgstr ""
|
626 |
|
627 |
-
#: classes/admin/class-admin.php:
|
628 |
-
#: classes/admin/class-admin.php:
|
629 |
msgid "You have entered an invalid conversion label."
|
630 |
msgstr ""
|
631 |
|
632 |
-
#: classes/admin/class-admin.php:
|
633 |
msgid "You have entered an invalid merchant ID. It only contains 7 to 10 digits."
|
634 |
msgstr ""
|
635 |
|
636 |
-
#: classes/admin/class-admin.php:
|
637 |
msgid "You have entered an invalid Google Optimize container ID."
|
638 |
msgstr ""
|
639 |
|
640 |
-
#: classes/admin/class-admin.php:
|
641 |
-
msgid "You have entered an invalid
|
642 |
msgstr ""
|
643 |
|
644 |
-
#: classes/admin/class-admin.php:
|
645 |
-
msgid "You have entered an invalid
|
646 |
msgstr ""
|
647 |
|
648 |
-
#: classes/admin/class-admin.php:
|
649 |
msgid "You have entered an invalid Bing Ads UET tag ID. It only contains 7 to 9 digits."
|
650 |
msgstr ""
|
651 |
|
652 |
-
#: classes/admin/class-admin.php:
|
653 |
msgid "You have entered an invalid Twitter pixel ID. It only contains 5 to 7 lowercase letters and numbers."
|
654 |
msgstr ""
|
655 |
|
656 |
-
#: classes/admin/class-admin.php:
|
657 |
msgid "You have entered an invalid Pinterest pixel ID. It only contains 13 digits."
|
658 |
msgstr ""
|
659 |
|
660 |
-
#: classes/admin/class-admin.php:
|
661 |
msgid "You have entered an invalid Snapchat pixel ID."
|
662 |
msgstr ""
|
663 |
|
664 |
-
#: classes/admin/class-admin.php:
|
665 |
msgid "You have entered an invalid TikTok pixel ID."
|
666 |
msgstr ""
|
667 |
|
668 |
-
#: classes/admin/class-admin.php:
|
669 |
msgid "You have entered an invalid Hotjar site ID. It only contains 6 to 9 digits."
|
670 |
msgstr ""
|
671 |
|
@@ -762,14 +799,14 @@ msgstr ""
|
|
762 |
msgid "Find more information about the the reason in our documentation: "
|
763 |
msgstr ""
|
764 |
|
765 |
-
#: wgact.php:
|
766 |
msgid "WooCommerce Pixel Manager error"
|
767 |
msgstr ""
|
768 |
|
769 |
-
#: wgact.php:
|
770 |
msgid "Your environment doesn't meet all the system requirements listed below."
|
771 |
msgstr ""
|
772 |
|
773 |
-
#: wgact.php:
|
774 |
msgid "The WooCommerce plugin needs to be activated"
|
775 |
msgstr ""
|
2 |
# This file is distributed under the GNU General Public License v3.0.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
+
"Project-Id-Version: WooCommerce Pixel Manager 1.13.2-beta.2\n"
|
6 |
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
|
7 |
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
8 |
"Language-Team: LANGUAGE <LL@li.org>\n"
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"POT-Creation-Date: 2022-02-09T10:32:00+00:00\n"
|
13 |
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
14 |
"X-Generator: WP-CLI 2.6.0\n"
|
15 |
"X-Domain: woocommerce-google-adwords-conversion-tracking-tag\n"
|
16 |
|
17 |
#. Plugin Name of the plugin
|
18 |
+
#: wgact.php:197
|
19 |
+
#: wgact.php:198
|
20 |
msgid "WooCommerce Pixel Manager"
|
21 |
msgstr ""
|
22 |
|
33 |
msgstr ""
|
34 |
|
35 |
#. Author URI of the plugin
|
36 |
+
msgid "https://sweetcode.co"
|
37 |
msgstr ""
|
38 |
|
39 |
+
#: classes/admin/class-admin.php:189
|
40 |
+
#: classes/admin/class-admin.php:190
|
41 |
msgid "Pixel Manager"
|
42 |
msgstr ""
|
43 |
|
44 |
+
#: classes/admin/class-admin.php:214
|
45 |
msgid "Main"
|
46 |
msgstr ""
|
47 |
|
48 |
+
#: classes/admin/class-admin.php:235
|
49 |
msgid "Google"
|
50 |
msgstr ""
|
51 |
|
52 |
+
#: classes/admin/class-admin.php:258
|
53 |
msgid "Google Ads Conversion ID"
|
54 |
msgstr ""
|
55 |
|
56 |
+
#: classes/admin/class-admin.php:270
|
57 |
+
msgid "Google Ads Conversion Label"
|
58 |
msgstr ""
|
59 |
|
60 |
+
#: classes/admin/class-admin.php:281
|
61 |
msgid "Google Analytics UA"
|
62 |
msgstr ""
|
63 |
|
64 |
+
#: classes/admin/class-admin.php:292
|
65 |
msgid "Google Analytics 4"
|
66 |
msgstr ""
|
67 |
|
68 |
+
#: classes/admin/class-admin.php:303
|
69 |
msgid "Google Optimize"
|
70 |
msgstr ""
|
71 |
|
72 |
+
#: classes/admin/class-admin.php:315
|
73 |
+
msgid "Facebook"
|
74 |
msgstr ""
|
75 |
|
76 |
+
#: classes/admin/class-admin.php:338
|
77 |
+
msgid "Facebook pixel ID"
|
78 |
msgstr ""
|
79 |
|
80 |
+
#: classes/admin/class-admin.php:350
|
81 |
msgid "more pixels"
|
82 |
msgstr ""
|
83 |
|
84 |
+
#: classes/admin/class-admin.php:375
|
85 |
msgid "Microsoft Advertising UET tag ID"
|
86 |
msgstr ""
|
87 |
|
88 |
+
#: classes/admin/class-admin.php:387
|
89 |
msgid "Twitter pixel ID"
|
90 |
msgstr ""
|
91 |
|
92 |
+
#: classes/admin/class-admin.php:399
|
93 |
msgid "Pinterest pixel ID"
|
94 |
msgstr ""
|
95 |
|
96 |
+
#: classes/admin/class-admin.php:411
|
97 |
msgid "Snapchat pixel ID"
|
98 |
msgstr ""
|
99 |
|
100 |
+
#: classes/admin/class-admin.php:423
|
101 |
msgid "TikTok pixel ID"
|
102 |
msgstr ""
|
103 |
|
104 |
+
#: classes/admin/class-admin.php:436
|
105 |
msgid "Hotjar site ID"
|
106 |
msgstr ""
|
107 |
|
108 |
+
#: classes/admin/class-admin.php:448
|
109 |
msgid "Advanced"
|
110 |
msgstr ""
|
111 |
|
112 |
+
#: classes/admin/class-admin.php:499
|
113 |
msgid "Order Total Logic"
|
114 |
msgstr ""
|
115 |
|
116 |
+
#: classes/admin/class-admin.php:511
|
117 |
msgid "Order Duplication Prevention"
|
118 |
msgstr ""
|
119 |
|
120 |
+
#: classes/admin/class-admin.php:523
|
121 |
msgid "Maximum Compatibility Mode"
|
122 |
msgstr ""
|
123 |
|
124 |
+
#: classes/admin/class-admin.php:556
|
125 |
+
msgid "gtag Deactivation"
|
126 |
msgstr ""
|
127 |
|
128 |
+
#: classes/admin/class-admin.php:569
|
129 |
msgid "Conversion Cart Data"
|
130 |
msgstr ""
|
131 |
|
132 |
+
#: classes/admin/class-admin.php:582
|
133 |
msgid "Enhanced E-Commerce"
|
134 |
msgstr ""
|
135 |
|
136 |
+
#: classes/admin/class-admin.php:594
|
137 |
msgid "GA 4 API secret"
|
138 |
msgstr ""
|
139 |
|
140 |
+
#: classes/admin/class-admin.php:607
|
141 |
msgid "Enhanced Link Attribution"
|
142 |
msgstr ""
|
143 |
|
144 |
+
#: classes/admin/class-admin.php:620
|
145 |
msgid "Google User ID"
|
146 |
msgstr ""
|
147 |
|
148 |
+
#: classes/admin/class-admin.php:632
|
149 |
msgid "Google Ads Enhanced Conversions"
|
150 |
msgstr ""
|
151 |
|
152 |
+
#: classes/admin/class-admin.php:646
|
153 |
msgid "Google Ads Phone Conversion Number"
|
154 |
msgstr ""
|
155 |
|
156 |
+
#: classes/admin/class-admin.php:658
|
157 |
msgid "Google Ads Phone Conversion Label"
|
158 |
msgstr ""
|
159 |
|
160 |
+
#: classes/admin/class-admin.php:671
|
161 |
msgid "Cookie Consent Management"
|
162 |
msgstr ""
|
163 |
|
164 |
+
#: classes/admin/class-admin.php:694
|
165 |
msgid "Google Consent Mode"
|
166 |
msgstr ""
|
167 |
|
168 |
+
#: classes/admin/class-admin.php:706
|
169 |
msgid "Google Consent Regions"
|
170 |
msgstr ""
|
171 |
|
172 |
+
#: classes/admin/class-admin.php:718
|
173 |
msgid "Explicit Consent Mode"
|
174 |
msgstr ""
|
175 |
|
176 |
+
#: classes/admin/class-admin.php:731
|
177 |
msgid "Borlabs Cookie support"
|
178 |
msgstr ""
|
179 |
|
180 |
+
#: classes/admin/class-admin.php:745
|
181 |
+
#: classes/admin/class-admin.php:759
|
182 |
msgid "Cookiebot support"
|
183 |
msgstr ""
|
184 |
|
185 |
+
#: classes/admin/class-admin.php:773
|
186 |
msgid "Complianz GDPR support"
|
187 |
msgstr ""
|
188 |
|
189 |
+
#: classes/admin/class-admin.php:787
|
190 |
msgid "Cookie Notice support"
|
191 |
msgstr ""
|
192 |
|
193 |
+
#: classes/admin/class-admin.php:801
|
194 |
msgid "Cookie Script support"
|
195 |
msgstr ""
|
196 |
|
197 |
+
#: classes/admin/class-admin.php:815
|
198 |
msgid "GDPR Cookie Compliance support"
|
199 |
msgstr ""
|
200 |
|
201 |
+
#: classes/admin/class-admin.php:829
|
202 |
msgid "GDPR Cookie Consent support"
|
203 |
msgstr ""
|
204 |
|
205 |
+
#: classes/admin/class-admin.php:862
|
206 |
+
msgid "Facebook CAPI: token"
|
207 |
msgstr ""
|
208 |
|
209 |
+
#: classes/admin/class-admin.php:874
|
210 |
+
msgid "Facebook CAPI: process anonymous hits"
|
211 |
msgstr ""
|
212 |
|
213 |
+
#: classes/admin/class-admin.php:886
|
214 |
+
msgid "Facebook CAPI: send additional visitor identifiers"
|
215 |
msgstr ""
|
216 |
|
217 |
+
#: classes/admin/class-admin.php:898
|
218 |
+
msgid "Facebook Microdata Tags for Catalogues"
|
219 |
msgstr ""
|
220 |
|
221 |
+
#: classes/admin/class-admin.php:910
|
222 |
+
#: classes/admin/class-admin.php:923
|
223 |
+
#: classes/admin/class-admin.php:970
|
224 |
msgid "Dynamic Remarketing"
|
225 |
msgstr ""
|
226 |
|
227 |
+
#: classes/admin/class-admin.php:982
|
228 |
msgid "Product Identifier"
|
229 |
msgstr ""
|
230 |
|
231 |
+
#: classes/admin/class-admin.php:994
|
232 |
msgid "Variations output"
|
233 |
msgstr ""
|
234 |
|
235 |
+
#: classes/admin/class-admin.php:1007
|
236 |
msgid "Google Business Vertical"
|
237 |
msgstr ""
|
238 |
|
239 |
+
#: classes/admin/class-admin.php:1020
|
240 |
+
#: classes/admin/class-admin.php:1029
|
241 |
msgid "Support"
|
242 |
msgstr ""
|
243 |
|
244 |
+
#: classes/admin/class-admin.php:1037
|
245 |
+
#: classes/admin/class-admin.php:1047
|
246 |
msgid "Author"
|
247 |
msgstr ""
|
248 |
|
249 |
+
#: classes/admin/class-admin.php:1083
|
250 |
msgid ""
|
251 |
"It looks like you are using some sort of ad or script blocker which is blocking the script and CSS files of this plugin.\n"
|
252 |
" In order for the plugin to work properly you need to disable the script blocker."
|
253 |
msgstr ""
|
254 |
|
255 |
+
#: classes/admin/class-admin.php:1090
|
256 |
#: classes/admin/class-notifications.php:31
|
257 |
#: classes/admin/class-notifications.php:73
|
258 |
#: classes/admin/class-notifications.php:114
|
260 |
msgid "Learn more"
|
261 |
msgstr ""
|
262 |
|
263 |
+
#: classes/admin/class-admin.php:1135
|
264 |
msgid "Profit Driven Marketing by SweetCode"
|
265 |
msgstr ""
|
266 |
|
267 |
+
#: classes/admin/class-admin.php:1160
|
268 |
msgid "Visit us here:"
|
269 |
msgstr ""
|
270 |
|
271 |
+
#: classes/admin/class-admin.php:1205
|
272 |
msgid "Contacting Support"
|
273 |
msgstr ""
|
274 |
|
275 |
+
#: classes/admin/class-admin.php:1219
|
276 |
msgid "Debug Information"
|
277 |
msgstr ""
|
278 |
|
279 |
+
#: classes/admin/class-admin.php:1228
|
280 |
msgid "copy to clipboard"
|
281 |
msgstr ""
|
282 |
|
283 |
+
#: classes/admin/class-admin.php:1242
|
284 |
msgid "Translations"
|
285 |
msgstr ""
|
286 |
|
287 |
+
#: classes/admin/class-admin.php:1243
|
288 |
msgid "If you want to participate improving the translations of this plugin into your language, please follow this link:"
|
289 |
msgstr ""
|
290 |
|
291 |
+
#: classes/admin/class-admin.php:1261
|
292 |
msgid "Post a support request in the WordPress support forum here: "
|
293 |
msgstr ""
|
294 |
|
295 |
+
#: classes/admin/class-admin.php:1264
|
296 |
msgid "Support forum"
|
297 |
msgstr ""
|
298 |
|
299 |
+
#: classes/admin/class-admin.php:1268
|
300 |
msgid "(Never post the debug or other sensitive information to the support forum. Instead send us the information by email.)"
|
301 |
msgstr ""
|
302 |
|
303 |
+
#: classes/admin/class-admin.php:1271
|
304 |
msgid "Or send us an email to the following address: "
|
305 |
msgstr ""
|
306 |
|
307 |
+
#: classes/admin/class-admin.php:1287
|
308 |
msgid "Send us your support request through the WooCommerce.com dashboard: "
|
309 |
msgstr ""
|
310 |
|
311 |
+
#: classes/admin/class-admin.php:1301
|
312 |
msgid "More details about the developer of this plugin: "
|
313 |
msgstr ""
|
314 |
|
315 |
+
#: classes/admin/class-admin.php:1304
|
316 |
msgid "Developer: SweetCode"
|
317 |
msgstr ""
|
318 |
|
319 |
+
#: classes/admin/class-admin.php:1306
|
320 |
msgid "Website: "
|
321 |
msgstr ""
|
322 |
|
323 |
+
#: classes/admin/class-admin.php:1329
|
324 |
msgid "The Google Analytics Universal property ID looks like this:"
|
325 |
msgstr ""
|
326 |
|
327 |
+
#: classes/admin/class-admin.php:1345
|
328 |
msgid "The Google Analytics 4 measurement ID looks like this:"
|
329 |
msgstr ""
|
330 |
|
331 |
+
#: classes/admin/class-admin.php:1361
|
332 |
msgid "The conversion ID looks similar to this:"
|
333 |
msgstr ""
|
334 |
|
335 |
+
#: classes/admin/class-admin.php:1377
|
336 |
+
msgid "The conversion Label looks similar to this:"
|
337 |
msgstr ""
|
338 |
|
339 |
+
#: classes/admin/class-admin.php:1381
|
340 |
+
#: classes/admin/class-admin.php:2161
|
341 |
msgid "Requires an active Google Ads Conversion ID"
|
342 |
msgstr ""
|
343 |
|
344 |
+
#: classes/admin/class-admin.php:1399
|
345 |
msgid "The Google Optimize container ID looks like this:"
|
346 |
msgstr ""
|
347 |
|
348 |
+
#: classes/admin/class-admin.php:1415
|
349 |
+
msgid "The Facebook pixel ID looks similar to this:"
|
350 |
msgstr ""
|
351 |
|
352 |
+
#: classes/admin/class-admin.php:1433
|
353 |
msgid "The Microsoft Advertising UET tag ID looks similar to this:"
|
354 |
msgstr ""
|
355 |
|
356 |
+
#: classes/admin/class-admin.php:1452
|
357 |
msgid "The Twitter pixel ID looks similar to this:"
|
358 |
msgstr ""
|
359 |
|
360 |
+
#: classes/admin/class-admin.php:1471
|
361 |
msgid "The Pinterest pixel ID looks similar to this:"
|
362 |
msgstr ""
|
363 |
|
364 |
+
#: classes/admin/class-admin.php:1490
|
365 |
msgid "The Snapchat pixel ID looks similar to this:"
|
366 |
msgstr ""
|
367 |
|
368 |
+
#: classes/admin/class-admin.php:1509
|
369 |
msgid "The TikTok pixel ID looks similar to this:"
|
370 |
msgstr ""
|
371 |
|
372 |
+
#: classes/admin/class-admin.php:1521
|
373 |
msgid "The Hotjar site ID looks similar to this:"
|
374 |
msgstr ""
|
375 |
|
376 |
+
#: classes/admin/class-admin.php:1531
|
377 |
msgid "Use order_subtotal: Doesn't include tax and shipping (default)"
|
378 |
msgstr ""
|
379 |
|
380 |
+
#: classes/admin/class-admin.php:1538
|
381 |
msgid "Use order_total: Includes tax and shipping"
|
382 |
msgstr ""
|
383 |
|
384 |
+
#: classes/admin/class-admin.php:1541
|
385 |
msgid "This is the order total amount reported back to Google Ads"
|
386 |
msgstr ""
|
387 |
|
388 |
+
#: classes/admin/class-admin.php:1561
|
389 |
msgid "open the documentation"
|
390 |
msgstr ""
|
391 |
|
392 |
+
#: classes/admin/class-admin.php:1577
|
393 |
+
msgid "Disable gtag.js insertion, if another plugin is inserting it already"
|
394 |
+
msgstr ""
|
395 |
+
|
396 |
+
#: classes/admin/class-admin.php:1583
|
397 |
+
msgid "Only do this, if the other plugin does insert the gtag above this pixel. If not, keep the gtag active."
|
398 |
+
msgstr ""
|
399 |
+
|
400 |
+
#: classes/admin/class-admin.php:1587
|
401 |
+
msgid "This setting is deprecated. It will be removed in future versions of the plugin. Read more about it in the documentation."
|
402 |
+
msgstr ""
|
403 |
+
|
404 |
+
#: classes/admin/class-admin.php:1605
|
405 |
msgid "Enable Google consent mode with standard settings"
|
406 |
msgstr ""
|
407 |
|
408 |
+
#: classes/admin/class-admin.php:1643
|
409 |
msgid "If no region is set, then the restrictions are enabled for all regions. If you specify one or more regions, then the restrictions only apply for the specified regions."
|
410 |
msgstr ""
|
411 |
|
412 |
+
#: classes/admin/class-admin.php:1664
|
413 |
msgid "Enable Google Analytics enhanced e-commerce"
|
414 |
msgstr ""
|
415 |
|
416 |
+
#: classes/admin/class-admin.php:1675
|
417 |
+
#: classes/admin/class-admin.php:1736
|
418 |
+
#: classes/admin/class-admin.php:1766
|
419 |
msgid "You need to activate at least Google Analytics UA or Google Analytics 4"
|
420 |
msgstr ""
|
421 |
|
422 |
+
#: classes/admin/class-admin.php:1697
|
423 |
msgid "Google Analytics 4 activation required"
|
424 |
msgstr ""
|
425 |
|
426 |
+
#: classes/admin/class-admin.php:1702
|
427 |
msgid "Enhanced E-Commerce activation required"
|
428 |
msgstr ""
|
429 |
|
430 |
+
#: classes/admin/class-admin.php:1705
|
431 |
msgid "If enabled, purchase and refund events will be sent to Google through the measurement protocol for increased accuracy."
|
432 |
msgstr ""
|
433 |
|
434 |
+
#: classes/admin/class-admin.php:1720
|
435 |
msgid "Enable Google Analytics enhanced link attribution"
|
436 |
msgstr ""
|
437 |
|
438 |
+
#: classes/admin/class-admin.php:1755
|
439 |
msgid "Enable Google user ID"
|
440 |
msgstr ""
|
441 |
|
442 |
+
#: classes/admin/class-admin.php:1785
|
443 |
msgid "Enable Google Ads Enhanced Conversions"
|
444 |
msgstr ""
|
445 |
|
446 |
+
#: classes/admin/class-admin.php:1796
|
447 |
msgid "You need to activate Google Ads"
|
448 |
msgstr ""
|
449 |
|
450 |
+
#: classes/admin/class-admin.php:1816
|
451 |
msgid "The Google Ads phone conversion number must be in the same format as on the website."
|
452 |
msgstr ""
|
453 |
|
454 |
+
#: classes/admin/class-admin.php:1838
|
455 |
msgid "Borlabs Cookie detected. Automatic support is:"
|
456 |
msgstr ""
|
457 |
|
458 |
+
#: classes/admin/class-admin.php:1844
|
459 |
msgid "Cookiebot detected. Automatic support is:"
|
460 |
msgstr ""
|
461 |
|
462 |
+
#: classes/admin/class-admin.php:1863
|
463 |
+
msgid "Enable Cookiebot settings"
|
464 |
+
msgstr ""
|
465 |
+
|
466 |
+
#: classes/admin/class-admin.php:1871
|
467 |
+
msgid "You need to activate the Google consent mode"
|
468 |
+
msgstr ""
|
469 |
+
|
470 |
+
#: classes/admin/class-admin.php:1877
|
471 |
msgid "Complianz GDPR detected. Automatic support is:"
|
472 |
msgstr ""
|
473 |
|
474 |
+
#: classes/admin/class-admin.php:1883
|
475 |
msgid "Cookie Notice (by hu-manity.co) detected. Automatic support is:"
|
476 |
msgstr ""
|
477 |
|
478 |
+
#: classes/admin/class-admin.php:1889
|
479 |
msgid "Cookie Script (by cookie-script.com) detected. Automatic support is:"
|
480 |
msgstr ""
|
481 |
|
482 |
+
#: classes/admin/class-admin.php:1895
|
483 |
msgid "GDPR Cookie Compliance (by Moove Agency) detected. Automatic support is:"
|
484 |
msgstr ""
|
485 |
|
486 |
+
#: classes/admin/class-admin.php:1901
|
487 |
msgid "GDPR Cookie Consent (by WebToffee) detected. Automatic support is:"
|
488 |
msgstr ""
|
489 |
|
490 |
+
#: classes/admin/class-admin.php:1920
|
491 |
msgid "Enable Explicit Consent Mode"
|
492 |
msgstr ""
|
493 |
|
494 |
+
#: classes/admin/class-admin.php:1929
|
495 |
msgid "Only activate the Explicit Consent Mode if you are also using a Cookie Management Platform (a cookie banner) that is compatible with this plugin. Find a list of compatible plugins in the documentation."
|
496 |
msgstr ""
|
497 |
|
498 |
+
#: classes/admin/class-admin.php:1948
|
499 |
+
#: classes/admin/class-admin.php:1981
|
500 |
+
#: classes/admin/class-admin.php:2010
|
501 |
+
#: classes/admin/class-admin.php:2038
|
502 |
+
msgid "You need to activate the Facebook pixel"
|
503 |
msgstr ""
|
504 |
|
505 |
+
#: classes/admin/class-admin.php:1972
|
506 |
+
msgid "Send CAPI hits for anonymous visitors who likely have blocked the Facebook pixel."
|
507 |
msgstr ""
|
508 |
|
509 |
+
#: classes/admin/class-admin.php:2001
|
510 |
msgid "Include additional visitor's identifiers, such as IP address, email and shop ID in the CAPI hit."
|
511 |
msgstr ""
|
512 |
|
513 |
+
#: classes/admin/class-admin.php:2029
|
514 |
+
msgid "Enable Facebook product microdata output"
|
515 |
+
msgstr ""
|
516 |
+
|
517 |
+
#: classes/admin/class-admin.php:2054
|
518 |
+
msgid "Add the cart data to the conversion event"
|
519 |
+
msgstr ""
|
520 |
+
|
521 |
+
#: classes/admin/class-admin.php:2063
|
522 |
+
msgid "Requires an active Google Ads Conversion ID, an active Conversion Label and an active Google Merchant Center ID (aw_merchant_id)"
|
523 |
msgstr ""
|
524 |
|
525 |
+
#: classes/admin/class-admin.php:2092
|
526 |
msgid "Only disable order duplication prevention for testing. Remember to re-enable the setting once done."
|
527 |
msgstr ""
|
528 |
|
529 |
+
#: classes/admin/class-admin.php:2109
|
530 |
msgid "Enable the maximum compatibility mode"
|
531 |
msgstr ""
|
532 |
|
533 |
+
#: classes/admin/class-admin.php:2120
|
534 |
msgid "Advanced order duplication prevention is "
|
535 |
msgstr ""
|
536 |
|
537 |
+
#: classes/admin/class-admin.php:2122
|
538 |
msgid "Basic order duplication prevention is "
|
539 |
msgstr ""
|
540 |
|
541 |
+
#: classes/admin/class-admin.php:2146
|
542 |
msgid "Enable dynamic remarketing audience collection"
|
543 |
msgstr ""
|
544 |
|
545 |
+
#: classes/admin/class-admin.php:2167
|
546 |
msgid "You need to choose the correct product identifier setting in order to match the product identifiers in the product feeds."
|
547 |
msgstr ""
|
548 |
|
549 |
+
#: classes/admin/class-admin.php:2185
|
550 |
msgid "Enable variations output"
|
551 |
msgstr ""
|
552 |
|
553 |
+
#: classes/admin/class-admin.php:2196
|
554 |
msgid "In order for this to work you need to upload your product feed including product variations and the item_group_id. Disable it, if you choose only to upload the parent product for variable products."
|
555 |
msgstr ""
|
556 |
|
557 |
+
#: classes/admin/class-admin.php:2211
|
558 |
msgid "Retail"
|
559 |
msgstr ""
|
560 |
|
561 |
+
#: classes/admin/class-admin.php:2221
|
562 |
msgid "Education"
|
563 |
msgstr ""
|
564 |
|
565 |
+
#: classes/admin/class-admin.php:2231
|
566 |
msgid "Hotels and rentals"
|
567 |
msgstr ""
|
568 |
|
569 |
+
#: classes/admin/class-admin.php:2241
|
570 |
msgid "Jobs"
|
571 |
msgstr ""
|
572 |
|
573 |
+
#: classes/admin/class-admin.php:2251
|
574 |
msgid "Local deals"
|
575 |
msgstr ""
|
576 |
|
577 |
+
#: classes/admin/class-admin.php:2261
|
578 |
msgid "Real estate"
|
579 |
msgstr ""
|
580 |
|
581 |
+
#: classes/admin/class-admin.php:2271
|
582 |
msgid "Custom"
|
583 |
msgstr ""
|
584 |
|
585 |
+
#: classes/admin/class-admin.php:2290
|
586 |
msgid "ID of your Google Merchant Center account. It looks like this: 12345678"
|
587 |
msgstr ""
|
588 |
|
589 |
+
#: classes/admin/class-admin.php:2298
|
590 |
+
msgid "Currently the plugin automatically detects the location of the visitor for this setting. In most, if not all, cases this will work fine. Please let us know if you have a use case where you need another output:"
|
591 |
+
msgstr ""
|
592 |
+
|
593 |
+
#: classes/admin/class-admin.php:2336
|
594 |
+
msgid "The plugin will use the WordPress default language for this setting. If the shop uses translations, in theory we could also use the visitors locale. But, if that language is not set up in the Google Merchant Center we might run into issues. If you need more options here let us know:"
|
595 |
+
msgstr ""
|
596 |
+
|
597 |
+
#: classes/admin/class-admin.php:2354
|
598 |
msgid "post ID (default)"
|
599 |
msgstr ""
|
600 |
|
601 |
+
#: classes/admin/class-admin.php:2360
|
602 |
msgid "SKU"
|
603 |
msgstr ""
|
604 |
|
605 |
+
#: classes/admin/class-admin.php:2367
|
606 |
msgid "ID for the WooCommerce Google Product Feed. Outputs the post ID with woocommerce_gpf_ prefix *"
|
607 |
msgstr ""
|
608 |
|
609 |
+
#: classes/admin/class-admin.php:2374
|
610 |
msgid "ID for the WooCommerce Google Listings & Ads Plugin. Outputs the post ID with gla_ prefix **"
|
611 |
msgstr ""
|
612 |
|
613 |
+
#: classes/admin/class-admin.php:2378
|
614 |
msgid "Choose a product identifier."
|
615 |
msgstr ""
|
616 |
|
617 |
+
#: classes/admin/class-admin.php:2381
|
618 |
msgid "* This is for users of the WooCommerce Google Product Feed Plugin"
|
619 |
msgstr ""
|
620 |
|
621 |
+
#: classes/admin/class-admin.php:2385
|
622 |
msgid "** This is for users of the WooCommerce Google Listings & Ads Plugin"
|
623 |
msgstr ""
|
624 |
|
625 |
+
#: classes/admin/class-admin.php:2394
|
626 |
msgid "beta"
|
627 |
msgstr ""
|
628 |
|
629 |
+
#: classes/admin/class-admin.php:2398
|
630 |
+
#: classes/admin/class-admin.php:2403
|
631 |
msgid "active"
|
632 |
msgstr ""
|
633 |
|
634 |
+
#: classes/admin/class-admin.php:2408
|
635 |
+
#: classes/admin/class-admin.php:2413
|
636 |
msgid "inactive"
|
637 |
msgstr ""
|
638 |
|
639 |
+
#: classes/admin/class-admin.php:2418
|
640 |
+
#: classes/admin/class-admin.php:2423
|
641 |
msgid "partially active"
|
642 |
msgstr ""
|
643 |
|
644 |
+
#: classes/admin/class-admin.php:2434
|
645 |
msgid "Pro Feature"
|
646 |
msgstr ""
|
647 |
|
648 |
+
#: classes/admin/class-admin.php:2478
|
649 |
msgid "You have entered an invalid Google Analytics Universal property ID."
|
650 |
msgstr ""
|
651 |
|
652 |
+
#: classes/admin/class-admin.php:2486
|
653 |
msgid "You have entered an invalid Google Analytics 4 measurement ID."
|
654 |
msgstr ""
|
655 |
|
656 |
+
#: classes/admin/class-admin.php:2494
|
657 |
msgid "You have entered an invalid Google Analytics 4 API key."
|
658 |
msgstr ""
|
659 |
|
660 |
+
#: classes/admin/class-admin.php:2502
|
661 |
msgid "You have entered an invalid conversion ID. It only contains 8 to 10 digits."
|
662 |
msgstr ""
|
663 |
|
664 |
+
#: classes/admin/class-admin.php:2510
|
665 |
+
#: classes/admin/class-admin.php:2518
|
666 |
msgid "You have entered an invalid conversion label."
|
667 |
msgstr ""
|
668 |
|
669 |
+
#: classes/admin/class-admin.php:2526
|
670 |
msgid "You have entered an invalid merchant ID. It only contains 7 to 10 digits."
|
671 |
msgstr ""
|
672 |
|
673 |
+
#: classes/admin/class-admin.php:2534
|
674 |
msgid "You have entered an invalid Google Optimize container ID."
|
675 |
msgstr ""
|
676 |
|
677 |
+
#: classes/admin/class-admin.php:2542
|
678 |
+
msgid "You have entered an invalid Facebook pixel ID. It only contains 14 to 16 digits."
|
679 |
msgstr ""
|
680 |
|
681 |
+
#: classes/admin/class-admin.php:2550
|
682 |
+
msgid "You have entered an invalid Facebook CAPI token."
|
683 |
msgstr ""
|
684 |
|
685 |
+
#: classes/admin/class-admin.php:2558
|
686 |
msgid "You have entered an invalid Bing Ads UET tag ID. It only contains 7 to 9 digits."
|
687 |
msgstr ""
|
688 |
|
689 |
+
#: classes/admin/class-admin.php:2566
|
690 |
msgid "You have entered an invalid Twitter pixel ID. It only contains 5 to 7 lowercase letters and numbers."
|
691 |
msgstr ""
|
692 |
|
693 |
+
#: classes/admin/class-admin.php:2574
|
694 |
msgid "You have entered an invalid Pinterest pixel ID. It only contains 13 digits."
|
695 |
msgstr ""
|
696 |
|
697 |
+
#: classes/admin/class-admin.php:2582
|
698 |
msgid "You have entered an invalid Snapchat pixel ID."
|
699 |
msgstr ""
|
700 |
|
701 |
+
#: classes/admin/class-admin.php:2590
|
702 |
msgid "You have entered an invalid TikTok pixel ID."
|
703 |
msgstr ""
|
704 |
|
705 |
+
#: classes/admin/class-admin.php:2598
|
706 |
msgid "You have entered an invalid Hotjar site ID. It only contains 6 to 9 digits."
|
707 |
msgstr ""
|
708 |
|
799 |
msgid "Find more information about the the reason in our documentation: "
|
800 |
msgstr ""
|
801 |
|
802 |
+
#: wgact.php:213
|
803 |
msgid "WooCommerce Pixel Manager error"
|
804 |
msgstr ""
|
805 |
|
806 |
+
#: wgact.php:215
|
807 |
msgid "Your environment doesn't meet all the system requirements listed below."
|
808 |
msgstr ""
|
809 |
|
810 |
+
#: wgact.php:219
|
811 |
msgid "The WooCommerce plugin needs to be activated"
|
812 |
msgstr ""
|
readme.txt
CHANGED
@@ -1,48 +1,48 @@
|
|
1 |
=== WooCommerce Pixel Manager ===
|
2 |
Contributors: alekv, wolfbaer
|
3 |
-
Tags: woocommerce, google ads, google analytics, facebook pixel, conversion tracking, dynamic retargeting, remarketing,
|
4 |
Requires at least: 3.7
|
5 |
Tested up to: 5.9
|
6 |
Requires PHP: 7.3
|
7 |
-
Stable tag: 1.
|
8 |
License: GPLv3 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
11 |
-
Track visitors and conversions in Google Ads, Google Analytics,
|
12 |
|
13 |
== Description ==
|
14 |
|
15 |
This plugin <strong>tracks WooCommerce shop visitors and collects valuable data for conversion optimization, dynamic remarketing and reporting</strong>.
|
16 |
|
17 |
-
While the setup is as simple as it can get, the pixel engine under the hood is very powerful. It tracks all e-commerce events and implements all advanced pixel features like
|
18 |
<strong>What sets us apart from other, similar plugins?</strong>
|
19 |
|
20 |
Out of many things, probably high tracking accuracy and a simple user interface are the most important properties that set our plugin apart from others.
|
21 |
|
22 |
Additionally, to the standard features offered by the tracking pixels we've developed more functional layers into the plugin which help increase measurement accuracy. For instance, if the plugin detects problems in the shop setup that might lower or prevent accurate tracking, it either fixes them seamlessly, or shows warnings with guidance on how to fix the problems.
|
23 |
|
24 |
-
Read more about the importance of tracking accuracy over [here](https://sweetcode.com/
|
25 |
|
26 |
<strong>The plugin comes with integrations for:</strong>
|
27 |
|
28 |
-
* Google Ads
|
29 |
-
* Google Analytics
|
30 |
-
*
|
31 |
-
* Google Optimize
|
32 |
-
* HotJar
|
33 |
-
* Microsoft Ads
|
34 |
-
* Twitter Ads
|
35 |
-
* Pinterest Ads
|
36 |
-
* Snapchat Ads
|
37 |
-
* TikTok Ads
|
38 |
|
39 |
<strong>Highlights</strong>
|
40 |
|
41 |
* Google Ads Enhanced Conversions (Pro version)
|
42 |
-
*
|
43 |
* Google Analytics Enhanced E-Commerce (Pro version)
|
44 |
* Precise measurement by preventing duplicate reporting effectively, excluding admins and shop managers from tracking, and not counting failed payments.
|
45 |
-
* Collects dynamic remarketing audiences for dynamic retargeting (Google Ads,
|
46 |
* Google Add Cart Data feature. [Google support page](https://support.google.com/google-ads/answer/9028254)
|
47 |
* Support for various cookie consent management systems
|
48 |
|
@@ -52,22 +52,22 @@ Read more about the importance of tracking accuracy over [here](https://sweetcod
|
|
52 |
* Google Ads Dynamic Remarketing
|
53 |
* Google Ads Cart Item Tracking
|
54 |
* Google Shopping New Customer Parameter
|
55 |
-
* Google Analytics Universal
|
56 |
-
* Google Analytics 4
|
57 |
-
* Google Optimize
|
58 |
-
*
|
59 |
-
*
|
60 |
* Hotjar Pixel
|
61 |
* Basic Order Duplication Prevention
|
62 |
* Many useful filters that help tweak the plugin output
|
63 |
* Works with lazy loaded product lists
|
64 |
|
65 |
-
Have a look at the full feature list over [here](https://sweetcode.com/
|
66 |
|
67 |
<strong>Premium Features</strong>
|
68 |
|
69 |
-
*
|
70 |
-
*
|
71 |
* Google Analytics Universal and Google Analytics 4 Enhanced E-Commerce
|
72 |
* Google Consent Mode
|
73 |
* Google Dynamic Remarketing Choice for all Business Verticals
|
@@ -79,7 +79,7 @@ Have a look at the full feature list over [here](https://sweetcode.com/docs/wpm/
|
|
79 |
* TikTok Ads Pixel with Purchase and all Remarketing Events
|
80 |
* Advanced Order Duplication Prevention
|
81 |
|
82 |
-
Have a look at the full feature list over [here](https://sweetcode.com/
|
83 |
|
84 |
Are you interested in buying the [Pro version](https://sweetcode.com)? Come and visit us [here](https://sweetcode.com).
|
85 |
|
@@ -98,7 +98,7 @@ The plugin supports and works with following third party plugins.
|
|
98 |
|
99 |
<strong>Documentation</strong>
|
100 |
|
101 |
-
Link to the full documentation of the plugin: [Open the documentation](https://sweetcode.com/
|
102 |
|
103 |
<strong>Roadmap</strong>
|
104 |
|
@@ -110,25 +110,19 @@ The plugin uses data from several Cookie Consent Management plugins to manage ap
|
|
110 |
|
111 |
It works with the following Cookie Consent Management plugins out of the box:
|
112 |
|
113 |
-
* [Cookiebot](https://wordpress.org/plugins/cookiebot/)
|
114 |
-
* [Cookie Script](https://wordpress.org/plugins/cookie-script-com/)
|
115 |
-
* [Complianz GDPR/CCPA Cookie Consent](https://wordpress.org/plugins/complianz-gdpr/)
|
116 |
* [Cookie Notice](https://wordpress.org/plugins/cookie-notice/)
|
117 |
-
* [Cookie Notice & Compliance for GDPR / CCPA](https://wordpress.org/plugins/cookie-notice/)
|
118 |
* [Cookie Law Info](https://wordpress.org/plugins/cookie-law-info/)
|
119 |
* [GDPR Cookie Compliance](https://wordpress.org/plugins/gdpr-cookie-compliance/)
|
120 |
* [Borlabs Cookie](https://borlabs.io/borlabs-cookie/) (from version 2.1.0)
|
121 |
-
[Borlabs Cookie Setup](https://sweetcode.com/
|
122 |
-
|
123 |
-
Please read the following for additional [setup information](https://sweetcode.com/docs/wpm/consent-management/platforms?utm_source=wordpress.org&utm_medium=wpm-plugin-page&utm_campaign=woocommerce-pixel-manager-docs&utm_content=cookie-consent-plugins)
|
124 |
|
125 |
<strong>Requirements</strong>
|
126 |
|
127 |
-
[List of requirements](https://sweetcode.com/
|
128 |
|
129 |
== Installation ==
|
130 |
|
131 |
-
1. Upload the plugin directory into your
|
132 |
2. Activate the plugin through the 'Plugins' menu in WordPress
|
133 |
3. Get the Google Ads conversion ID and the conversion label. You will find both values in the Google Ads conversion tracking code. [Get the conversion ID and the conversion label](https://www.youtube.com/watch?v=p9gY3JSrNHU)
|
134 |
4. In the WordPress admin panel go to WooCommerce and then into the 'Google Ads Conversion Tracking' menu. Please enter the conversion ID and the conversion label into their respective fields.
|
@@ -137,7 +131,7 @@ Please read the following for additional [setup information](https://sweetcode.c
|
|
137 |
|
138 |
= Is there detailed documentation for the plugin? =
|
139 |
|
140 |
-
Yes. Head over to this link: [Documentation](https://sweetcode.com/
|
141 |
|
142 |
= How do I check if the plugin is working properly? =
|
143 |
|
@@ -177,7 +171,7 @@ Therefore, we recommend admins of the shop to exclude their own shop from the bl
|
|
177 |
|
178 |
= Where can I report a bug or suggest improvements? =
|
179 |
|
180 |
-
Please post your problem in the
|
181 |
You can send the link to the front page of your shop too if you think it would be of help.
|
182 |
|
183 |
== Screenshots ==
|
@@ -186,109 +180,6 @@ You can send the link to the front page of your shop too if you think it would b
|
|
186 |
|
187 |
== Changelog ==
|
188 |
|
189 |
-
= 1.16.6 = 11.04.2022
|
190 |
-
|
191 |
-
* Tweak: Safeguard for JavaScript optimizers that ignore the jQuery dependency of WPM and load jQuery after WPM
|
192 |
-
* Tweak: Refactored the WPM JavaScript library (split code logically and into folders)
|
193 |
-
|
194 |
-
= 1.16.5 = 08.04.2022
|
195 |
-
|
196 |
-
* Tweak: More verbose logging of WPM load and pixel consent status into the dev console
|
197 |
-
* Tweak: Added new logic to retrieve categories for variations
|
198 |
-
|
199 |
-
= 1.16.4 = 07.04.2022
|
200 |
-
|
201 |
-
* Fix: Fixed a bug that prevented disabling user role tracking
|
202 |
-
|
203 |
-
= 1.16.3 = 07.04.2022
|
204 |
-
|
205 |
-
* Tweak: Remove the IPv6 to IPv4 mapping in case the the external user IP contains one
|
206 |
-
* Tweak: Improved local IP detection
|
207 |
-
* Tweak: Replaced deprecated FILTER_SANITIZE_STRING filter with FILTER_SANITIZE_FULL_SPECIAL_CHARS
|
208 |
-
|
209 |
-
= 1.16.2 = 05.04.2022
|
210 |
-
|
211 |
-
|
212 |
-
* Fix: Improved detection of users that are deactivated for tracking
|
213 |
-
|
214 |
-
= 1.16.1 = 05.04.2022
|
215 |
-
|
216 |
-
* Tweak: Removed data-cfasync=”false” to allow Cloudflare Rocket Loader to optimize scripts
|
217 |
-
* Tweak: Removed unused functions
|
218 |
-
* Tweak: Refactored some code and removed cruft
|
219 |
-
* Tweak: Improved logic of when to load cart items into the wpm dataLayer
|
220 |
-
* Tweak: For users, who have been disabled for tracking, prevent tracking entirely, not just for purchase events
|
221 |
-
* Tweak: Renamed Facebook to Meta
|
222 |
-
* Tweak: Add log entry when a purchase hit has been prevented because of a user role that has been opted out from tracking
|
223 |
-
|
224 |
-
= 1.16.0 = 01.04.2022
|
225 |
-
|
226 |
-
|
227 |
-
* Tweak: Removed a few deprecated and inactive settings
|
228 |
-
* Tweak: Updated Enhanced Conversions output as per updated specs by Google
|
229 |
-
* Tweak: Improved formatting for Facebook CAPI event parameters
|
230 |
-
|
231 |
-
= 1.15.5 = 30.03.2022
|
232 |
-
|
233 |
-
* Tweak: Removed an obsolete db cleanup function
|
234 |
-
* Tweak: On variable products, with no preselection send the valid variation ID if variations output is enabled
|
235 |
-
* Tweak: Added safeguard for debug info when URL redirect test fails to open the URL
|
236 |
-
* Tweak: Syntax improvements in wpm.addProductToCart()
|
237 |
-
* Tweak: Simplified logic when the wpm.getCartItems() function is called
|
238 |
-
* Tweak: Deprecated the wpm_track_mini_cart filter
|
239 |
-
* Tweak: Added cookie detection for Cookie Law CMP with French named cookies
|
240 |
-
* Tweak: Added one more safeguard in case the main wpmDataLayer init is being blocked by some third party plugin and products need being loaded into the wpmDataLayer further down below
|
241 |
-
* Tweak: Added console log output when pixels don't fire because of user consent choice
|
242 |
-
* Tweak: Added a payload logger for Facebook CAPI events
|
243 |
-
* Tweak: Initiate WC session later in the checkout funnel (if necessary at all) to improve caching conditions
|
244 |
-
* Tweak: Added URL parameter debugConsentMode for verbose debug output in the browser console in relation to user cookie consent
|
245 |
-
|
246 |
-
= 1.15.4 = 23.03.2022
|
247 |
-
|
248 |
-
* Fix: Product name transmission for Google Analytics Universal purchases
|
249 |
-
|
250 |
-
= 1.15.3 = 22.03.2022
|
251 |
-
|
252 |
-
* Tweak: Attach click handlers later during loading in order to better deal with some side cases
|
253 |
-
* Tweak: Fire viewItem event on variable product pages when no variation is selected yet, sending the ID of the parent product
|
254 |
-
|
255 |
-
= 1.15.2 = 21.03.2022
|
256 |
-
|
257 |
-
* Tweak: Silenced status icon on compatibility mode setting when disabled
|
258 |
-
* Tweak: Made Autoptimize, FlyingPress, Async JavaScript, Optimocha and WP Optimize JavaScript optimization disabler optional through compatibility mode
|
259 |
-
* Tweak: Made Litespeed Cache and SG Optimizer JavaScript optimization disabler mostly optional through compatibility mode. Some exclusion have been left permanent without which the tracking scripts would break.
|
260 |
-
* Fix: Added safeguard if old version of FlyingPress is being used and compatibility mode is enabled
|
261 |
-
* Fix: Added safeguard if old version of WP Rocket is being used and compatibility mode is enabled
|
262 |
-
* Fix: Added safeguard if Yoast SEO is being used and compatibility mode is enabled
|
263 |
-
|
264 |
-
= 1.15.1 = 18.03.2022
|
265 |
-
|
266 |
-
* Tweak: Made WP Rocket JavaScript optimization disabler optional through compatibility mode
|
267 |
-
* Tweak: Adjusted sourcemaps output to make them work with Firefox
|
268 |
-
* Fix: Proper check for user id when logged in
|
269 |
-
|
270 |
-
= 1.15.0 = 15.03.2022
|
271 |
-
|
272 |
-
* Experiment: Added experimental filter which defers the WPM script. The filter may be removed without prior notice. If you like the filter vote it up over here: https://app.loopedin.io/woocommerce-pixel-manager?card=622f4ba9d0b938002e8378c0
|
273 |
-
* Experiment: Added experimental filter which moves the WPM script to the footer. The filter may be removed without prior notice. If you like the filter vote it up over here: https://app.loopedin.io/woocommerce-pixel-manager?card=622f4bc2d0b938002e8378e2
|
274 |
-
* Tweak: Moved sourcemaps into correct folder
|
275 |
-
* Tweak: Moved parts of the back-end logic to the front-end in order to gain much more flexibility and better handle front-end script flow
|
276 |
-
* Tweak: Bumped up WC version
|
277 |
-
|
278 |
-
|
279 |
-
= 1.14.3 = 24.02.2022
|
280 |
-
|
281 |
-
* Tweak: Adjusted all documentation links to point to new domain and sub-folder
|
282 |
-
* Tweak: Improved handling with SG Optimizer
|
283 |
-
|
284 |
-
|
285 |
-
= 1.14.2 = 17.02.2022
|
286 |
-
|
287 |
-
* Tweak: Added items to Microsoft Ads purchase event
|
288 |
-
* Tweak: Added 'wpm-js' to optimization exclusion list
|
289 |
-
* Fix: Added a safeguard when checking for order purchase redirects in the UX
|
290 |
-
* Fix: Fixed a double json encoded string for the GA4 browser purchase event
|
291 |
-
|
292 |
= 1.14.1 = 12.02.2022
|
293 |
|
294 |
* Tweak: Avoid loading the entire admin UX in case an admin is not viewing the plugin admin page itself
|
@@ -675,7 +566,7 @@ Fix: Deliver proper updated wpm.jsx
|
|
675 |
|
676 |
= 1.8.14 =
|
677 |
|
678 |
-
* Tweak: Make the noptimize tag only appear if Autoptimize is active
|
679 |
* Tweak: Removed a duplicate filter
|
680 |
* Fix: Moved get_cart() query into is_cart() condition
|
681 |
|
@@ -1015,7 +906,7 @@ Fix: Deliver proper updated wpm.jsx
|
|
1015 |
|
1016 |
* Tweak: Switched on JavaScript tracking with a fix for the CDATA bug http://core.trac.wordpress.org/ticket/3670
|
1017 |
* Tweak: The correct function is being used to get the currency depending on the WooCommerce version
|
1018 |
-
* Fix: Added missing noscript tag
|
1019 |
|
1020 |
= 1.4.3 =
|
1021 |
|
1 |
=== WooCommerce Pixel Manager ===
|
2 |
Contributors: alekv, wolfbaer
|
3 |
+
Tags: woocommerce, google ads, google analytics, facebook pixel, conversion tracking, dynamic retargeting, remarketing, pixel, facebook conversion api, woocommerce google, woocommerce facebook
|
4 |
Requires at least: 3.7
|
5 |
Tested up to: 5.9
|
6 |
Requires PHP: 7.3
|
7 |
+
Stable tag: 1.14.1
|
8 |
License: GPLv3 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
11 |
+
Track visitors and conversions in Google Ads, Google Analytics, Facebook Pixel (Conversion API) and more !
|
12 |
|
13 |
== Description ==
|
14 |
|
15 |
This plugin <strong>tracks WooCommerce shop visitors and collects valuable data for conversion optimization, dynamic remarketing and reporting</strong>.
|
16 |
|
17 |
+
While the setup is as simple as it can get, the pixel engine under the hood is very powerful. It tracks all e-commerce events and implements all advanced pixel features like Facebook CAPI (Pro version), Google Enhanced E-Commerce, Google Shopping Cart Item Tracking and much more. For advanced users the plugin offers filters which allow to tweak the output flexibly and fine tune the behavior to each shop.
|
18 |
<strong>What sets us apart from other, similar plugins?</strong>
|
19 |
|
20 |
Out of many things, probably high tracking accuracy and a simple user interface are the most important properties that set our plugin apart from others.
|
21 |
|
22 |
Additionally, to the standard features offered by the tracking pixels we've developed more functional layers into the plugin which help increase measurement accuracy. For instance, if the plugin detects problems in the shop setup that might lower or prevent accurate tracking, it either fixes them seamlessly, or shows warnings with guidance on how to fix the problems.
|
23 |
|
24 |
+
Read more about the importance of tracking accuracy over [here](https://docs.sweetcode.com/wgact/?utm_source=wordpress.org&utm_medium=wpm-plugin-page&utm_campaign=woocommerce-pixel-manager-docs&utm_content=tracking-accuracy#/faq?id=why-is-tracking-accuracy-so-important).
|
25 |
|
26 |
<strong>The plugin comes with integrations for:</strong>
|
27 |
|
28 |
+
* Google Ads
|
29 |
+
* Google Analytics (Universal and Google Analytics 4)
|
30 |
+
* Facebook Ads Pixel
|
31 |
+
* Google Optimize
|
32 |
+
* HotJar
|
33 |
+
* Microsoft Ads (Pro version)
|
34 |
+
* Twitter Ads (Pro version)
|
35 |
+
* Pinterest Ads (Pro version)
|
36 |
+
* Snapchat Ads (Pro version)
|
37 |
+
* TikTok Ads (Pro version)
|
38 |
|
39 |
<strong>Highlights</strong>
|
40 |
|
41 |
* Google Ads Enhanced Conversions (Pro version)
|
42 |
+
* Facebook Conversion API (CAPI) (Pro version)
|
43 |
* Google Analytics Enhanced E-Commerce (Pro version)
|
44 |
* Precise measurement by preventing duplicate reporting effectively, excluding admins and shop managers from tracking, and not counting failed payments.
|
45 |
+
* Collects dynamic remarketing audiences for dynamic retargeting (Google Ads, Facebook, etc.)
|
46 |
* Google Add Cart Data feature. [Google support page](https://support.google.com/google-ads/answer/9028254)
|
47 |
* Support for various cookie consent management systems
|
48 |
|
52 |
* Google Ads Dynamic Remarketing
|
53 |
* Google Ads Cart Item Tracking
|
54 |
* Google Shopping New Customer Parameter
|
55 |
+
* Google Analytics Universal (includes purchase tracking)
|
56 |
+
* Google Analytics 4 (includes purchase tracking)
|
57 |
+
* Google Optimize
|
58 |
+
* Facebook Pixel
|
59 |
+
* Facebook Remarketing Events
|
60 |
* Hotjar Pixel
|
61 |
* Basic Order Duplication Prevention
|
62 |
* Many useful filters that help tweak the plugin output
|
63 |
* Works with lazy loaded product lists
|
64 |
|
65 |
+
Have a look at the full feature list over [here](https://docs.sweetcode.com/wgact/#/features?id=available-features).
|
66 |
|
67 |
<strong>Premium Features</strong>
|
68 |
|
69 |
+
* Facebook CAPI
|
70 |
+
* Facebook Microdata Output
|
71 |
* Google Analytics Universal and Google Analytics 4 Enhanced E-Commerce
|
72 |
* Google Consent Mode
|
73 |
* Google Dynamic Remarketing Choice for all Business Verticals
|
79 |
* TikTok Ads Pixel with Purchase and all Remarketing Events
|
80 |
* Advanced Order Duplication Prevention
|
81 |
|
82 |
+
Have a look at the full feature list over [here](https://docs.sweetcode.com/wgact/#/features?id=available-features).
|
83 |
|
84 |
Are you interested in buying the [Pro version](https://sweetcode.com)? Come and visit us [here](https://sweetcode.com).
|
85 |
|
98 |
|
99 |
<strong>Documentation</strong>
|
100 |
|
101 |
+
Link to the full documentation of the plugin: [Open the documentation](https://docs.sweetcode.com/wgact/?utm_source=wp-org&utm_medium=documentation-link&utm_campaign=wp-org-documentation-link#/)
|
102 |
|
103 |
<strong>Roadmap</strong>
|
104 |
|
110 |
|
111 |
It works with the following Cookie Consent Management plugins out of the box:
|
112 |
|
|
|
|
|
|
|
113 |
* [Cookie Notice](https://wordpress.org/plugins/cookie-notice/)
|
|
|
114 |
* [Cookie Law Info](https://wordpress.org/plugins/cookie-law-info/)
|
115 |
* [GDPR Cookie Compliance](https://wordpress.org/plugins/gdpr-cookie-compliance/)
|
116 |
* [Borlabs Cookie](https://borlabs.io/borlabs-cookie/) (from version 2.1.0)
|
117 |
+
[Borlabs Cookie Setup](https://docs.sweetcode.com/wgact/?utm_source=wp-org&utm_medium=documentation-link&utm_campaign=wp-org-documentation-link&utm_content=borlabs-cookie#/consent-mgmt/borlabs-cookie)
|
|
|
|
|
118 |
|
119 |
<strong>Requirements</strong>
|
120 |
|
121 |
+
[List of requirements](https://docs.sweetcode.com/wgact/?utm_source=wp-org&utm_medium=documentation-link&utm_campaign=wp-org-documentation-link&utm_content=requirements#/requirements)
|
122 |
|
123 |
== Installation ==
|
124 |
|
125 |
+
1. Upload the plugin directory into your plugins directory `/wp-content/plugins/`
|
126 |
2. Activate the plugin through the 'Plugins' menu in WordPress
|
127 |
3. Get the Google Ads conversion ID and the conversion label. You will find both values in the Google Ads conversion tracking code. [Get the conversion ID and the conversion label](https://www.youtube.com/watch?v=p9gY3JSrNHU)
|
128 |
4. In the WordPress admin panel go to WooCommerce and then into the 'Google Ads Conversion Tracking' menu. Please enter the conversion ID and the conversion label into their respective fields.
|
131 |
|
132 |
= Is there detailed documentation for the plugin? =
|
133 |
|
134 |
+
Yes. Head over to this link: [Documentation](https://docs.sweetcode.com/wgact/?utm_source=wp-org&utm_medium=documentation-link&utm_campaign=wp-org-documentation-link#/)
|
135 |
|
136 |
= How do I check if the plugin is working properly? =
|
137 |
|
171 |
|
172 |
= Where can I report a bug or suggest improvements? =
|
173 |
|
174 |
+
Please post your problem in the WGACT Support forum: http://wordpress.org/support/plugin/woocommerce-google-adwords-conversion-tracking-tag
|
175 |
You can send the link to the front page of your shop too if you think it would be of help.
|
176 |
|
177 |
== Screenshots ==
|
180 |
|
181 |
== Changelog ==
|
182 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
183 |
= 1.14.1 = 12.02.2022
|
184 |
|
185 |
* Tweak: Avoid loading the entire admin UX in case an admin is not viewing the plugin admin page itself
|
566 |
|
567 |
= 1.8.14 =
|
568 |
|
569 |
+
* Tweak: Make the <noptimize> tag only appear if Autoptimize is active
|
570 |
* Tweak: Removed a duplicate filter
|
571 |
* Fix: Moved get_cart() query into is_cart() condition
|
572 |
|
906 |
|
907 |
* Tweak: Switched on JavaScript tracking with a fix for the CDATA bug http://core.trac.wordpress.org/ticket/3670
|
908 |
* Tweak: The correct function is being used to get the currency depending on the WooCommerce version
|
909 |
+
* Fix: Added missing </noscript> tag
|
910 |
|
911 |
= 1.4.3 =
|
912 |
|
vendor/composer/autoload_psr4.php
CHANGED
@@ -9,6 +9,5 @@ return array(
|
|
9 |
'libphonenumber\\' => array($vendorDir . '/giggsey/libphonenumber-for-php/src'),
|
10 |
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
|
11 |
'Swpm\\WoocommercePixelManager\\' => array($baseDir . '/src'),
|
12 |
-
'SweetcodeCom\\WpFlush\\' => array($vendorDir . '/sweetcode-com/wp-flush/src'),
|
13 |
'Giggsey\\Locale\\' => array($vendorDir . '/giggsey/locale/src'),
|
14 |
);
|
9 |
'libphonenumber\\' => array($vendorDir . '/giggsey/libphonenumber-for-php/src'),
|
10 |
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
|
11 |
'Swpm\\WoocommercePixelManager\\' => array($baseDir . '/src'),
|
|
|
12 |
'Giggsey\\Locale\\' => array($vendorDir . '/giggsey/locale/src'),
|
13 |
);
|
vendor/composer/autoload_static.php
CHANGED
@@ -19,7 +19,6 @@ class ComposerStaticInitab770dc3559fd87d5167f1d33f2baf09
|
|
19 |
array (
|
20 |
'Symfony\\Polyfill\\Mbstring\\' => 26,
|
21 |
'Swpm\\WoocommercePixelManager\\' => 29,
|
22 |
-
'SweetcodeCom\\WpFlush\\' => 21,
|
23 |
),
|
24 |
'G' =>
|
25 |
array (
|
@@ -40,10 +39,6 @@ class ComposerStaticInitab770dc3559fd87d5167f1d33f2baf09
|
|
40 |
array (
|
41 |
0 => __DIR__ . '/../..' . '/src',
|
42 |
),
|
43 |
-
'SweetcodeCom\\WpFlush\\' =>
|
44 |
-
array (
|
45 |
-
0 => __DIR__ . '/..' . '/sweetcode-com/wp-flush/src',
|
46 |
-
),
|
47 |
'Giggsey\\Locale\\' =>
|
48 |
array (
|
49 |
0 => __DIR__ . '/..' . '/giggsey/locale/src',
|
19 |
array (
|
20 |
'Symfony\\Polyfill\\Mbstring\\' => 26,
|
21 |
'Swpm\\WoocommercePixelManager\\' => 29,
|
|
|
22 |
),
|
23 |
'G' =>
|
24 |
array (
|
39 |
array (
|
40 |
0 => __DIR__ . '/../..' . '/src',
|
41 |
),
|
|
|
|
|
|
|
|
|
42 |
'Giggsey\\Locale\\' =>
|
43 |
array (
|
44 |
0 => __DIR__ . '/..' . '/giggsey/locale/src',
|
vendor/composer/installed.json
CHANGED
@@ -44,17 +44,17 @@
|
|
44 |
},
|
45 |
{
|
46 |
"name": "giggsey/libphonenumber-for-php",
|
47 |
-
"version": "8.12.
|
48 |
-
"version_normalized": "8.12.
|
49 |
"source": {
|
50 |
"type": "git",
|
51 |
"url": "https://github.com/giggsey/libphonenumber-for-php.git",
|
52 |
-
"reference": "
|
53 |
},
|
54 |
"dist": {
|
55 |
"type": "zip",
|
56 |
-
"url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/
|
57 |
-
"reference": "
|
58 |
"shasum": ""
|
59 |
},
|
60 |
"require": {
|
@@ -71,7 +71,7 @@
|
|
71 |
"symfony/console": "^2.8|^3.0|^v4.4|^v5.2",
|
72 |
"symfony/phpunit-bridge": "^4.2 || ^5"
|
73 |
},
|
74 |
-
"time": "2022-
|
75 |
"type": "library",
|
76 |
"extra": {
|
77 |
"branch-alias": {
|
@@ -175,38 +175,6 @@
|
|
175 |
},
|
176 |
"install-path": "../giggsey/locale"
|
177 |
},
|
178 |
-
{
|
179 |
-
"name": "sweetcode-com/wp-flush",
|
180 |
-
"version": "dev-main",
|
181 |
-
"version_normalized": "dev-main",
|
182 |
-
"dist": {
|
183 |
-
"type": "path",
|
184 |
-
"url": "/Users/aleksandarvucenovic/dev/PhpStormProjects/wp-flush",
|
185 |
-
"reference": "7ad47db369772a59685403ab4a80a0eeccc9e362"
|
186 |
-
},
|
187 |
-
"type": "library",
|
188 |
-
"installation-source": "dist",
|
189 |
-
"autoload": {
|
190 |
-
"psr-4": {
|
191 |
-
"SweetcodeCom\\WpFlush\\": "src/"
|
192 |
-
}
|
193 |
-
},
|
194 |
-
"license": [
|
195 |
-
"GPL3"
|
196 |
-
],
|
197 |
-
"authors": [
|
198 |
-
{
|
199 |
-
"name": "Aleksandar Vucenovic",
|
200 |
-
"email": "aleksandar@sweetcode.com"
|
201 |
-
}
|
202 |
-
],
|
203 |
-
"description": "Flush the cache of various cache systems from within WordPress plugins",
|
204 |
-
"transport-options": {
|
205 |
-
"symlink": true,
|
206 |
-
"relative": false
|
207 |
-
},
|
208 |
-
"install-path": "../sweetcode-com/wp-flush"
|
209 |
-
},
|
210 |
{
|
211 |
"name": "symfony/polyfill-mbstring",
|
212 |
"version": "v1.20.0",
|
44 |
},
|
45 |
{
|
46 |
"name": "giggsey/libphonenumber-for-php",
|
47 |
+
"version": "8.12.42",
|
48 |
+
"version_normalized": "8.12.42.0",
|
49 |
"source": {
|
50 |
"type": "git",
|
51 |
"url": "https://github.com/giggsey/libphonenumber-for-php.git",
|
52 |
+
"reference": "33c8dc586ab0d430193dc721d597a3aa79803d06"
|
53 |
},
|
54 |
"dist": {
|
55 |
"type": "zip",
|
56 |
+
"url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/33c8dc586ab0d430193dc721d597a3aa79803d06",
|
57 |
+
"reference": "33c8dc586ab0d430193dc721d597a3aa79803d06",
|
58 |
"shasum": ""
|
59 |
},
|
60 |
"require": {
|
71 |
"symfony/console": "^2.8|^3.0|^v4.4|^v5.2",
|
72 |
"symfony/phpunit-bridge": "^4.2 || ^5"
|
73 |
},
|
74 |
+
"time": "2022-01-28T08:38:37+00:00",
|
75 |
"type": "library",
|
76 |
"extra": {
|
77 |
"branch-alias": {
|
175 |
},
|
176 |
"install-path": "../giggsey/locale"
|
177 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
178 |
{
|
179 |
"name": "symfony/polyfill-mbstring",
|
180 |
"version": "v1.20.0",
|
vendor/composer/installed.php
CHANGED
@@ -5,7 +5,7 @@
|
|
5 |
'type' => 'wordpress-plugin',
|
6 |
'install_path' => __DIR__ . '/../../',
|
7 |
'aliases' => array(),
|
8 |
-
'reference' => '
|
9 |
'name' => 'sweetcode/woocommerce-pixel-manager',
|
10 |
'dev' => true,
|
11 |
),
|
@@ -20,12 +20,12 @@
|
|
20 |
'dev_requirement' => false,
|
21 |
),
|
22 |
'giggsey/libphonenumber-for-php' => array(
|
23 |
-
'pretty_version' => '8.12.
|
24 |
-
'version' => '8.12.
|
25 |
'type' => 'library',
|
26 |
'install_path' => __DIR__ . '/../giggsey/libphonenumber-for-php',
|
27 |
'aliases' => array(),
|
28 |
-
'reference' => '
|
29 |
'dev_requirement' => false,
|
30 |
),
|
31 |
'giggsey/locale' => array(
|
@@ -37,22 +37,13 @@
|
|
37 |
'reference' => '8d324583b5899e6280a875c43bf1fc9658bc6962',
|
38 |
'dev_requirement' => false,
|
39 |
),
|
40 |
-
'sweetcode-com/wp-flush' => array(
|
41 |
-
'pretty_version' => 'dev-main',
|
42 |
-
'version' => 'dev-main',
|
43 |
-
'type' => 'library',
|
44 |
-
'install_path' => __DIR__ . '/../sweetcode-com/wp-flush',
|
45 |
-
'aliases' => array(),
|
46 |
-
'reference' => '7ad47db369772a59685403ab4a80a0eeccc9e362',
|
47 |
-
'dev_requirement' => false,
|
48 |
-
),
|
49 |
'sweetcode/woocommerce-pixel-manager' => array(
|
50 |
'pretty_version' => 'dev-master',
|
51 |
'version' => 'dev-master',
|
52 |
'type' => 'wordpress-plugin',
|
53 |
'install_path' => __DIR__ . '/../../',
|
54 |
'aliases' => array(),
|
55 |
-
'reference' => '
|
56 |
'dev_requirement' => false,
|
57 |
),
|
58 |
'symfony/polyfill-mbstring' => array(
|
5 |
'type' => 'wordpress-plugin',
|
6 |
'install_path' => __DIR__ . '/../../',
|
7 |
'aliases' => array(),
|
8 |
+
'reference' => '15a6ab27c1e31fe00c458a0045a26466b6d33973',
|
9 |
'name' => 'sweetcode/woocommerce-pixel-manager',
|
10 |
'dev' => true,
|
11 |
),
|
20 |
'dev_requirement' => false,
|
21 |
),
|
22 |
'giggsey/libphonenumber-for-php' => array(
|
23 |
+
'pretty_version' => '8.12.42',
|
24 |
+
'version' => '8.12.42.0',
|
25 |
'type' => 'library',
|
26 |
'install_path' => __DIR__ . '/../giggsey/libphonenumber-for-php',
|
27 |
'aliases' => array(),
|
28 |
+
'reference' => '33c8dc586ab0d430193dc721d597a3aa79803d06',
|
29 |
'dev_requirement' => false,
|
30 |
),
|
31 |
'giggsey/locale' => array(
|
37 |
'reference' => '8d324583b5899e6280a875c43bf1fc9658bc6962',
|
38 |
'dev_requirement' => false,
|
39 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
'sweetcode/woocommerce-pixel-manager' => array(
|
41 |
'pretty_version' => 'dev-master',
|
42 |
'version' => 'dev-master',
|
43 |
'type' => 'wordpress-plugin',
|
44 |
'install_path' => __DIR__ . '/../../',
|
45 |
'aliases' => array(),
|
46 |
+
'reference' => '15a6ab27c1e31fe00c458a0045a26466b6d33973',
|
47 |
'dev_requirement' => false,
|
48 |
),
|
49 |
'symfony/polyfill-mbstring' => array(
|
vendor/freemius/wordpress-sdk/assets/img/plugin-icon.png
CHANGED
Binary file
|
vendor/freemius/wordpress-sdk/assets/img/theme-icon.png
CHANGED
Binary file
|
vendor/freemius/wordpress-sdk/assets/img/woocommerce-google-adwords-conversion-tracking-tag.png
CHANGED
Binary file
|
vendor/freemius/wordpress-sdk/includes/class-freemius.php
CHANGED
@@ -3550,8 +3550,6 @@
|
|
3550 |
* @since 1.1.7.3
|
3551 |
*/
|
3552 |
static function _toggle_debug_mode() {
|
3553 |
-
check_admin_referer( 'fs_toggle_debug_mode' );
|
3554 |
-
|
3555 |
if ( ! is_super_admin() ) {
|
3556 |
return;
|
3557 |
}
|
@@ -3573,19 +3571,10 @@
|
|
3573 |
* @since 1.2.1.6
|
3574 |
*/
|
3575 |
static function _get_debug_log() {
|
3576 |
-
check_admin_referer( 'fs_get_debug_log' );
|
3577 |
-
|
3578 |
-
if ( ! is_super_admin() ) {
|
3579 |
-
return;
|
3580 |
-
}
|
3581 |
-
|
3582 |
-
$limit = min( ! empty( $_POST['limit'] ) ? absint( $_POST['limit'] ) : 200, 200 );
|
3583 |
-
$offset = min( ! empty( $_POST['offset'] ) ? absint( $_POST['offset'] ) : 200, 200 );
|
3584 |
-
|
3585 |
$logs = FS_Logger::load_db_logs(
|
3586 |
fs_request_get( 'filters', false, 'post' ),
|
3587 |
-
$limit,
|
3588 |
-
$offset
|
3589 |
);
|
3590 |
|
3591 |
self::shoot_ajax_success( $logs );
|
@@ -4458,12 +4447,6 @@
|
|
4458 |
* @since 1.0.9
|
4459 |
*/
|
4460 |
function _email_about_firewall_issue() {
|
4461 |
-
check_admin_referer( 'fs_resolve_firewall_issues' );
|
4462 |
-
|
4463 |
-
if ( ! current_user_can( is_multisite() ? 'manage_options' : 'activate_plugins' ) ) {
|
4464 |
-
return;
|
4465 |
-
}
|
4466 |
-
|
4467 |
$this->_admin_notices->remove_sticky( 'failed_connect_api' );
|
4468 |
|
4469 |
$pong = $this->ping();
|
@@ -4538,12 +4521,6 @@
|
|
4538 |
* @since 1.1.7.4
|
4539 |
*/
|
4540 |
function _retry_connectivity_test() {
|
4541 |
-
check_admin_referer( 'fs_retry_connectivity_test' );
|
4542 |
-
|
4543 |
-
if ( ! current_user_can( is_multisite() ? 'manage_options' : 'activate_plugins' ) ) {
|
4544 |
-
return;
|
4545 |
-
}
|
4546 |
-
|
4547 |
$this->_admin_notices->remove_sticky( 'failed_connect_api_first' );
|
4548 |
|
4549 |
$pong = $this->ping();
|
3550 |
* @since 1.1.7.3
|
3551 |
*/
|
3552 |
static function _toggle_debug_mode() {
|
|
|
|
|
3553 |
if ( ! is_super_admin() ) {
|
3554 |
return;
|
3555 |
}
|
3571 |
* @since 1.2.1.6
|
3572 |
*/
|
3573 |
static function _get_debug_log() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3574 |
$logs = FS_Logger::load_db_logs(
|
3575 |
fs_request_get( 'filters', false, 'post' ),
|
3576 |
+
! empty( $_POST['limit'] ) && is_numeric( $_POST['limit'] ) ? $_POST['limit'] : 200,
|
3577 |
+
! empty( $_POST['offset'] ) && is_numeric( $_POST['offset'] ) ? $_POST['offset'] : 0
|
3578 |
);
|
3579 |
|
3580 |
self::shoot_ajax_success( $logs );
|
4447 |
* @since 1.0.9
|
4448 |
*/
|
4449 |
function _email_about_firewall_issue() {
|
|
|
|
|
|
|
|
|
|
|
|
|
4450 |
$this->_admin_notices->remove_sticky( 'failed_connect_api' );
|
4451 |
|
4452 |
$pong = $this->ping();
|
4521 |
* @since 1.1.7.4
|
4522 |
*/
|
4523 |
function _retry_connectivity_test() {
|
|
|
|
|
|
|
|
|
|
|
|
|
4524 |
$this->_admin_notices->remove_sticky( 'failed_connect_api_first' );
|
4525 |
|
4526 |
$pong = $this->ping();
|
vendor/freemius/wordpress-sdk/includes/managers/class-fs-admin-notice-manager.php
CHANGED
@@ -175,12 +175,7 @@
|
|
175 |
*
|
176 |
*/
|
177 |
function dismiss_notice_ajax_callback() {
|
178 |
-
|
179 |
-
|
180 |
-
if ( ! is_numeric( $_POST['message_id'] ) ) {
|
181 |
-
$this->_sticky_storage->remove( $_POST['message_id'] );
|
182 |
-
}
|
183 |
-
|
184 |
wp_die();
|
185 |
}
|
186 |
|
@@ -474,4 +469,4 @@
|
|
474 |
}
|
475 |
|
476 |
#endregion
|
477 |
-
}
|
175 |
*
|
176 |
*/
|
177 |
function dismiss_notice_ajax_callback() {
|
178 |
+
$this->_sticky_storage->remove( $_POST['message_id'] );
|
|
|
|
|
|
|
|
|
|
|
179 |
wp_die();
|
180 |
}
|
181 |
|
469 |
}
|
470 |
|
471 |
#endregion
|
472 |
+
}
|
vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/ArgumentNotExistException.php
CHANGED
@@ -1,8 +1,4 @@
|
|
1 |
<?php
|
2 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
-
exit;
|
4 |
-
}
|
5 |
-
|
6 |
if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
|
7 |
exit;
|
8 |
}
|
@@ -10,4 +6,4 @@
|
|
10 |
if ( ! class_exists( 'Freemius_ArgumentNotExistException' ) ) {
|
11 |
class Freemius_ArgumentNotExistException extends Freemius_InvalidArgumentException {
|
12 |
}
|
13 |
-
}
|
1 |
<?php
|
|
|
|
|
|
|
|
|
2 |
if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
|
3 |
exit;
|
4 |
}
|
6 |
if ( ! class_exists( 'Freemius_ArgumentNotExistException' ) ) {
|
7 |
class Freemius_ArgumentNotExistException extends Freemius_InvalidArgumentException {
|
8 |
}
|
9 |
+
}
|
vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/EmptyArgumentException.php
CHANGED
@@ -1,8 +1,4 @@
|
|
1 |
<?php
|
2 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
-
exit;
|
4 |
-
}
|
5 |
-
|
6 |
if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
|
7 |
exit;
|
8 |
}
|
@@ -10,4 +6,4 @@
|
|
10 |
if ( ! class_exists( 'Freemius_EmptyArgumentException' ) ) {
|
11 |
class Freemius_EmptyArgumentException extends Freemius_InvalidArgumentException {
|
12 |
}
|
13 |
-
}
|
1 |
<?php
|
|
|
|
|
|
|
|
|
2 |
if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
|
3 |
exit;
|
4 |
}
|
6 |
if ( ! class_exists( 'Freemius_EmptyArgumentException' ) ) {
|
7 |
class Freemius_EmptyArgumentException extends Freemius_InvalidArgumentException {
|
8 |
}
|
9 |
+
}
|
vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/Exception.php
CHANGED
@@ -1,8 +1,4 @@
|
|
1 |
<?php
|
2 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
-
exit;
|
4 |
-
}
|
5 |
-
|
6 |
if ( ! class_exists( 'Freemius_Exception' ) ) {
|
7 |
/**
|
8 |
* Thrown when an API call returns an exception.
|
@@ -75,4 +71,4 @@
|
|
75 |
return $str . $this->getMessage();
|
76 |
}
|
77 |
}
|
78 |
-
}
|
1 |
<?php
|
|
|
|
|
|
|
|
|
2 |
if ( ! class_exists( 'Freemius_Exception' ) ) {
|
3 |
/**
|
4 |
* Thrown when an API call returns an exception.
|
71 |
return $str . $this->getMessage();
|
72 |
}
|
73 |
}
|
74 |
+
}
|
vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/InvalidArgumentException.php
CHANGED
@@ -1,12 +1,8 @@
|
|
1 |
<?php
|
2 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
-
exit;
|
4 |
-
}
|
5 |
-
|
6 |
if ( ! class_exists( 'Freemius_Exception' ) ) {
|
7 |
exit;
|
8 |
}
|
9 |
|
10 |
if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
|
11 |
class Freemius_InvalidArgumentException extends Freemius_Exception { }
|
12 |
-
}
|
1 |
<?php
|
|
|
|
|
|
|
|
|
2 |
if ( ! class_exists( 'Freemius_Exception' ) ) {
|
3 |
exit;
|
4 |
}
|
5 |
|
6 |
if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
|
7 |
class Freemius_InvalidArgumentException extends Freemius_Exception { }
|
8 |
+
}
|
vendor/freemius/wordpress-sdk/includes/sdk/Exceptions/OAuthException.php
CHANGED
@@ -1,8 +1,4 @@
|
|
1 |
<?php
|
2 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
-
exit;
|
4 |
-
}
|
5 |
-
|
6 |
if ( ! class_exists( 'Freemius_Exception' ) ) {
|
7 |
exit;
|
8 |
}
|
@@ -13,4 +9,4 @@
|
|
13 |
parent::__construct( $pResult );
|
14 |
}
|
15 |
}
|
16 |
-
}
|
1 |
<?php
|
|
|
|
|
|
|
|
|
2 |
if ( ! class_exists( 'Freemius_Exception' ) ) {
|
3 |
exit;
|
4 |
}
|
9 |
parent::__construct( $pResult );
|
10 |
}
|
11 |
}
|
12 |
+
}
|
vendor/freemius/wordpress-sdk/includes/sdk/FreemiusBase.php
CHANGED
@@ -15,10 +15,6 @@
|
|
15 |
* under the License.
|
16 |
*/
|
17 |
|
18 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
19 |
-
exit;
|
20 |
-
}
|
21 |
-
|
22 |
if ( ! defined( 'FS_API__VERSION' ) ) {
|
23 |
define( 'FS_API__VERSION', '1' );
|
24 |
}
|
15 |
* under the License.
|
16 |
*/
|
17 |
|
|
|
|
|
|
|
|
|
18 |
if ( ! defined( 'FS_API__VERSION' ) ) {
|
19 |
define( 'FS_API__VERSION', '1' );
|
20 |
}
|
vendor/freemius/wordpress-sdk/includes/sdk/FreemiusWordPress.php
CHANGED
@@ -14,9 +14,6 @@
|
|
14 |
* License for the specific language governing permissions and limitations
|
15 |
* under the License.
|
16 |
*/
|
17 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
18 |
-
exit;
|
19 |
-
}
|
20 |
|
21 |
require_once dirname( __FILE__ ) . '/FreemiusBase.php';
|
22 |
|
@@ -712,4 +709,4 @@
|
|
712 |
}
|
713 |
|
714 |
#endregion
|
715 |
-
}
|
14 |
* License for the specific language governing permissions and limitations
|
15 |
* under the License.
|
16 |
*/
|
|
|
|
|
|
|
17 |
|
18 |
require_once dirname( __FILE__ ) . '/FreemiusBase.php';
|
19 |
|
709 |
}
|
710 |
|
711 |
#endregion
|
712 |
+
}
|
vendor/freemius/wordpress-sdk/require.php
CHANGED
@@ -6,10 +6,6 @@
|
|
6 |
* @since 1.1.9
|
7 |
*/
|
8 |
|
9 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
-
exit;
|
11 |
-
}
|
12 |
-
|
13 |
// Configuration should be loaded first.
|
14 |
require_once dirname( __FILE__ ) . '/config.php';
|
15 |
require_once WP_FS__DIR_INCLUDES . '/fs-core-functions.php';
|
@@ -50,4 +46,4 @@
|
|
50 |
require_once WP_FS__DIR_INCLUDES . '/class-fs-admin-notices.php';
|
51 |
require_once WP_FS__DIR_INCLUDES . '/class-freemius-abstract.php';
|
52 |
require_once WP_FS__DIR_INCLUDES . '/sdk/Exceptions/Exception.php';
|
53 |
-
require_once WP_FS__DIR_INCLUDES . '/class-freemius.php';
|
6 |
* @since 1.1.9
|
7 |
*/
|
8 |
|
|
|
|
|
|
|
|
|
9 |
// Configuration should be loaded first.
|
10 |
require_once dirname( __FILE__ ) . '/config.php';
|
11 |
require_once WP_FS__DIR_INCLUDES . '/fs-core-functions.php';
|
46 |
require_once WP_FS__DIR_INCLUDES . '/class-fs-admin-notices.php';
|
47 |
require_once WP_FS__DIR_INCLUDES . '/class-freemius-abstract.php';
|
48 |
require_once WP_FS__DIR_INCLUDES . '/sdk/Exceptions/Exception.php';
|
49 |
+
require_once WP_FS__DIR_INCLUDES . '/class-freemius.php';
|
vendor/freemius/wordpress-sdk/start.php
CHANGED
@@ -15,7 +15,7 @@
|
|
15 |
*
|
16 |
* @var string
|
17 |
*/
|
18 |
-
$this_sdk_version = '2.4.
|
19 |
|
20 |
#region SDK Selection Logic --------------------------------------------------------------------
|
21 |
|
15 |
*
|
16 |
* @var string
|
17 |
*/
|
18 |
+
$this_sdk_version = '2.4.2';
|
19 |
|
20 |
#region SDK Selection Logic --------------------------------------------------------------------
|
21 |
|
vendor/freemius/wordpress-sdk/templates/account/partials/addon.php
CHANGED
@@ -1,9 +1,4 @@
|
|
1 |
<?php
|
2 |
-
|
3 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
-
exit;
|
5 |
-
}
|
6 |
-
|
7 |
/**
|
8 |
* @var array $VARS
|
9 |
* @var Freemius $fs
|
@@ -448,4 +443,4 @@
|
|
448 |
</td>
|
449 |
<!--/ Optional Delete Action -->
|
450 |
<?php endif ?>
|
451 |
-
</tr>
|
1 |
<?php
|
|
|
|
|
|
|
|
|
|
|
2 |
/**
|
3 |
* @var array $VARS
|
4 |
* @var Freemius $fs
|
443 |
</td>
|
444 |
<!--/ Optional Delete Action -->
|
445 |
<?php endif ?>
|
446 |
+
</tr>
|
vendor/freemius/wordpress-sdk/templates/ajax-loader.php
CHANGED
@@ -1,6 +1 @@
|
|
1 |
-
|
2 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
-
exit;
|
4 |
-
}
|
5 |
-
?>
|
6 |
-
<div class="fs-ajax-loader" style="display: none"><?php for ( $i = 1; $i <= 8; $i ++ ) : ?><div class="fs-ajax-loader-bar fs-ajax-loader-bar-<?php echo $i ?>"></div><?php endfor ?></div>
|
1 |
+
<div class="fs-ajax-loader" style="display: none"><?php for ( $i = 1; $i <= 8; $i ++ ) : ?><div class="fs-ajax-loader-bar fs-ajax-loader-bar-<?php echo $i ?>"></div><?php endfor ?></div>
|
|
|
|
|
|
|
|
|
|
vendor/freemius/wordpress-sdk/templates/debug.php
CHANGED
@@ -37,8 +37,6 @@
|
|
37 |
|
38 |
$.post( ajaxurl, {
|
39 |
action: 'fs_toggle_debug_mode',
|
40 |
-
// As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
|
41 |
-
_wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_toggle_debug_mode' ) ); ?>,
|
42 |
is_on : ($(this).hasClass( 'fs-on' ) ? 1 : 0)
|
43 |
}, function ( response ) {
|
44 |
if ( 1 == response ) {
|
@@ -113,8 +111,7 @@
|
|
113 |
if (optionName) {
|
114 |
$.post(ajaxurl, {
|
115 |
action : 'fs_get_db_option',
|
116 |
-
|
117 |
-
_wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_get_db_option' ) ); ?>,
|
118 |
option_name: optionName
|
119 |
}, function (response) {
|
120 |
if (response.data.value)
|
@@ -134,8 +131,7 @@
|
|
134 |
if (optionValue) {
|
135 |
$.post(ajaxurl, {
|
136 |
action : 'fs_set_db_option',
|
137 |
-
|
138 |
-
_wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_set_db_option' ) ); ?>,
|
139 |
option_name : optionName,
|
140 |
option_value: optionValue
|
141 |
}, function () {
|
@@ -728,8 +724,6 @@
|
|
728 |
|
729 |
$.post(ajaxurl, {
|
730 |
action : 'fs_get_debug_log',
|
731 |
-
// As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
|
732 |
-
_wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_get_debug_log' ) ); ?>,
|
733 |
filters: filters,
|
734 |
offset : offset,
|
735 |
limit : limit
|
37 |
|
38 |
$.post( ajaxurl, {
|
39 |
action: 'fs_toggle_debug_mode',
|
|
|
|
|
40 |
is_on : ($(this).hasClass( 'fs-on' ) ? 1 : 0)
|
41 |
}, function ( response ) {
|
42 |
if ( 1 == response ) {
|
111 |
if (optionName) {
|
112 |
$.post(ajaxurl, {
|
113 |
action : 'fs_get_db_option',
|
114 |
+
_wpnonce : '<?php echo wp_create_nonce( 'fs_get_db_option' ) ?>',
|
|
|
115 |
option_name: optionName
|
116 |
}, function (response) {
|
117 |
if (response.data.value)
|
131 |
if (optionValue) {
|
132 |
$.post(ajaxurl, {
|
133 |
action : 'fs_set_db_option',
|
134 |
+
_wpnonce : '<?php echo wp_create_nonce( 'fs_set_db_option' ) ?>',
|
|
|
135 |
option_name : optionName,
|
136 |
option_value: optionValue
|
137 |
}, function () {
|
724 |
|
725 |
$.post(ajaxurl, {
|
726 |
action : 'fs_get_debug_log',
|
|
|
|
|
727 |
filters: filters,
|
728 |
offset : offset,
|
729 |
limit : limit
|
vendor/freemius/wordpress-sdk/templates/firewall-issues-js.php
CHANGED
@@ -22,12 +22,10 @@
|
|
22 |
notice = $( this ).parents( '.fs-notice' ),
|
23 |
ajaxActionSuffix = notice.attr( 'data-manager-id' ).replace( ':', '-' );
|
24 |
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
error_type: error_type
|
30 |
-
};
|
31 |
|
32 |
if ( 'squid' === error_type ) {
|
33 |
data.hosting_company = prompt( 'What is the name or URL of your hosting company?' );
|
@@ -41,9 +39,7 @@
|
|
41 |
}
|
42 |
|
43 |
if ( 'retry_ping' === error_type ) {
|
44 |
-
|
45 |
-
// As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
|
46 |
-
data._wpnonce = <?php echo wp_json_encode( wp_create_nonce( 'fs_retry_connectivity_test' ) ); ?>;
|
47 |
}
|
48 |
|
49 |
$( this ).css({'cursor': 'wait'});
|
@@ -60,4 +56,4 @@
|
|
60 |
});
|
61 |
});
|
62 |
});
|
63 |
-
</script>
|
22 |
notice = $( this ).parents( '.fs-notice' ),
|
23 |
ajaxActionSuffix = notice.attr( 'data-manager-id' ).replace( ':', '-' );
|
24 |
|
25 |
+
var data = {
|
26 |
+
action : 'fs_resolve_firewall_issues_' + ajaxActionSuffix,
|
27 |
+
error_type: error_type
|
28 |
+
};
|
|
|
|
|
29 |
|
30 |
if ( 'squid' === error_type ) {
|
31 |
data.hosting_company = prompt( 'What is the name or URL of your hosting company?' );
|
39 |
}
|
40 |
|
41 |
if ( 'retry_ping' === error_type ) {
|
42 |
+
data.action = 'fs_retry_connectivity_test_' + ajaxActionSuffix;
|
|
|
|
|
43 |
}
|
44 |
|
45 |
$( this ).css({'cursor': 'wait'});
|
56 |
});
|
57 |
});
|
58 |
});
|
59 |
+
</script>
|
vendor/freemius/wordpress-sdk/templates/partials/network-activation.php
CHANGED
@@ -1,9 +1,4 @@
|
|
1 |
<?php
|
2 |
-
|
3 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
-
exit;
|
5 |
-
}
|
6 |
-
|
7 |
/**
|
8 |
* @var array $VARS
|
9 |
* @var Freemius $fs
|
@@ -91,4 +86,4 @@
|
|
91 |
</tbody>
|
92 |
</table>
|
93 |
</div>
|
94 |
-
</div>
|
1 |
<?php
|
|
|
|
|
|
|
|
|
|
|
2 |
/**
|
3 |
* @var array $VARS
|
4 |
* @var Freemius $fs
|
86 |
</tbody>
|
87 |
</table>
|
88 |
</div>
|
89 |
+
</div>
|
vendor/freemius/wordpress-sdk/templates/sticky-admin-notice-js.php
CHANGED
@@ -23,9 +23,7 @@
|
|
23 |
|
24 |
notice.fadeOut( 'fast', function() {
|
25 |
var data = {
|
26 |
-
action
|
27 |
-
// As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
|
28 |
-
_wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_dismiss_notice_action' ) ); ?>,
|
29 |
message_id: id
|
30 |
};
|
31 |
|
@@ -38,4 +36,4 @@
|
|
38 |
});
|
39 |
});
|
40 |
});
|
41 |
-
</script>
|
23 |
|
24 |
notice.fadeOut( 'fast', function() {
|
25 |
var data = {
|
26 |
+
action : 'fs_dismiss_notice_action_' + ajaxActionSuffix,
|
|
|
|
|
27 |
message_id: id
|
28 |
};
|
29 |
|
36 |
});
|
37 |
});
|
38 |
});
|
39 |
+
</script>
|
vendor/giggsey/libphonenumber-for-php/METADATA-VERSION.txt
CHANGED
@@ -2,4 +2,4 @@
|
|
2 |
# It can be a commit, branch or tag of the https://github.com/google/libphonenumber project
|
3 |
#
|
4 |
# For more information, look at the phing tasks in build.xml
|
5 |
-
v8.12.
|
2 |
# It can be a commit, branch or tag of the https://github.com/google/libphonenumber project
|
3 |
#
|
4 |
# For more information, look at the phing tasks in build.xml
|
5 |
+
v8.12.42
|
vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/229.php
CHANGED
@@ -11,9 +11,13 @@
|
|
11 |
*/
|
12 |
|
13 |
return array (
|
14 |
-
|
|
|
|
|
15 |
22955 => 'Moov',
|
16 |
22956 => 'Moov',
|
|
|
|
|
17 |
22960 => 'Moov',
|
18 |
22961 => 'MTN',
|
19 |
22962 => 'MTN',
|
11 |
*/
|
12 |
|
13 |
return array (
|
14 |
+
22951 => 'MTN',
|
15 |
+
22952 => 'MTN',
|
16 |
+
22953 => 'MTN',
|
17 |
22955 => 'Moov',
|
18 |
22956 => 'Moov',
|
19 |
+
22957 => 'MTN',
|
20 |
+
22958 => 'MTN',
|
21 |
22960 => 'Moov',
|
22 |
22961 => 'MTN',
|
23 |
22962 => 'MTN',
|
vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/238.php
CHANGED
@@ -11,7 +11,10 @@
|
|
11 |
*/
|
12 |
|
13 |
return array (
|
|
|
14 |
23836 => 'CVMOVEL',
|
|
|
|
|
15 |
23851 => 'T+',
|
16 |
23852 => 'T+',
|
17 |
23853 => 'T+',
|
11 |
*/
|
12 |
|
13 |
return array (
|
14 |
+
23833 => 'T+',
|
15 |
23836 => 'CVMOVEL',
|
16 |
+
23843 => 'T+',
|
17 |
+
23846 => 'CVMOVEL',
|
18 |
23851 => 'T+',
|
19 |
23852 => 'T+',
|
20 |
23853 => 'T+',
|
vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/248.php
CHANGED
@@ -11,8 +11,6 @@
|
|
11 |
*/
|
12 |
|
13 |
return array (
|
14 |
-
24821 => 'Intelvision',
|
15 |
-
24822 => 'Intelvision',
|
16 |
24825 => 'CWS',
|
17 |
24826 => 'CWS',
|
18 |
24827 => 'Airtel',
|
11 |
*/
|
12 |
|
13 |
return array (
|
|
|
|
|
14 |
24825 => 'CWS',
|
15 |
24826 => 'CWS',
|
16 |
24827 => 'Airtel',
|
vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/32.php
CHANGED
@@ -51,7 +51,6 @@ return array (
|
|
51 |
324689 => 'Febo Telecom',
|
52 |
32469 => 'Telenet',
|
53 |
3247 => 'Proximus',
|
54 |
-
324802 => 'TISMI BV',
|
55 |
324805 => 'Voyacom SPRL',
|
56 |
324807 => 'MessageBird BV',
|
57 |
324809 => 'Ericsson NV',
|
51 |
324689 => 'Febo Telecom',
|
52 |
32469 => 'Telenet',
|
53 |
3247 => 'Proximus',
|
|
|
54 |
324805 => 'Voyacom SPRL',
|
55 |
324807 => 'MessageBird BV',
|
56 |
324809 => 'Ericsson NV',
|
vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/354.php
CHANGED
@@ -18,7 +18,6 @@ return array (
|
|
18 |
35462 => 'Vodafone',
|
19 |
354630 => 'IMC',
|
20 |
354632 => 'Tismi',
|
21 |
-
354636 => 'Öryggisfjarskipti',
|
22 |
354637 => 'Öryggisfjarskipti',
|
23 |
354638 => 'Öryggisfjarskipti',
|
24 |
354639 => 'Öryggisfjarskipti',
|
18 |
35462 => 'Vodafone',
|
19 |
354630 => 'IMC',
|
20 |
354632 => 'Tismi',
|
|
|
21 |
354637 => 'Öryggisfjarskipti',
|
22 |
354638 => 'Öryggisfjarskipti',
|
23 |
354639 => 'Öryggisfjarskipti',
|
vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/502.php
CHANGED
@@ -29,7 +29,6 @@ return array (
|
|
29 |
502372 => 'Tigo',
|
30 |
502373 => 'Tigo',
|
31 |
502374 => 'Tigo',
|
32 |
-
502375 => 'Tigo',
|
33 |
50239 => 'Telgua',
|
34 |
502390 => 'Tigo',
|
35 |
502391 => 'Tigo',
|
29 |
502372 => 'Tigo',
|
30 |
502373 => 'Tigo',
|
31 |
502374 => 'Tigo',
|
|
|
32 |
50239 => 'Telgua',
|
33 |
502390 => 'Tigo',
|
34 |
502391 => 'Tigo',
|
vendor/giggsey/libphonenumber-for-php/src/carrier/data/en/507.php
CHANGED
@@ -20,7 +20,6 @@ return array (
|
|
20 |
507616 => 'Telefónica Móviles',
|
21 |
507617 => 'Claro',
|
22 |
507618 => 'Claro',
|
23 |
-
507619 => 'Telefónica Móviles',
|
24 |
50762 => 'Claro',
|
25 |
507630 => 'Claro',
|
26 |
507631 => 'Claro',
|
20 |
507616 => 'Telefónica Móviles',
|
21 |
507617 => 'Claro',
|
22 |
507618 => 'Claro',
|
|
|
23 |
50762 => 'Claro',
|
24 |
507630 => 'Claro',
|
25 |
507631 => 'Claro',
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_AG.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_AI.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_AS.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_BB.php
CHANGED
@@ -83,7 +83,7 @@ return array (
|
|
83 |
),
|
84 |
'personalNumber' =>
|
85 |
array (
|
86 |
-
'NationalNumberPattern' => '52(?:
|
87 |
'ExampleNumber' => '5002345678',
|
88 |
'PossibleLength' =>
|
89 |
array (
|
83 |
),
|
84 |
'personalNumber' =>
|
85 |
array (
|
86 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
87 |
'ExampleNumber' => '5002345678',
|
88 |
'PossibleLength' =>
|
89 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_BJ.php
CHANGED
@@ -36,7 +36,7 @@ return array (
|
|
36 |
),
|
37 |
'mobile' =>
|
38 |
array (
|
39 |
-
'NationalNumberPattern' => '(?:5[1-8]|6\\d|9[013-9])\\d{6}',
|
40 |
'ExampleNumber' => '90011234',
|
41 |
'PossibleLength' =>
|
42 |
array (
|
36 |
),
|
37 |
'mobile' =>
|
38 |
array (
|
39 |
+
'NationalNumberPattern' => '(?:5[1-35-8]|6\\d|9[013-9])\\d{6}',
|
40 |
'ExampleNumber' => '90011234',
|
41 |
'PossibleLength' =>
|
42 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_BM.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_BS.php
CHANGED
@@ -83,7 +83,7 @@ return array (
|
|
83 |
),
|
84 |
'personalNumber' =>
|
85 |
array (
|
86 |
-
'NationalNumberPattern' => '52(?:
|
87 |
'ExampleNumber' => '5002345678',
|
88 |
'PossibleLength' =>
|
89 |
array (
|
83 |
),
|
84 |
'personalNumber' =>
|
85 |
array (
|
86 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
87 |
'ExampleNumber' => '5002345678',
|
88 |
'PossibleLength' =>
|
89 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_CA.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|(?:5(?:00|2[12]|33|44|66|77|88)|622)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_CL.php
CHANGED
@@ -27,7 +27,7 @@ return array (
|
|
27 |
),
|
28 |
'fixedLine' =>
|
29 |
array (
|
30 |
-
'NationalNumberPattern' => '2(?:1982[0-6]|3314[05-9])\\d{3}|(?:2(?:1(?:160|962)|3(?:2\\d\\d|3(?:[034]\\d|1[0-35-9]|2[1-9]|5[0-2])|600)
|
31 |
'ExampleNumber' => '221234567',
|
32 |
'PossibleLength' =>
|
33 |
array (
|
@@ -39,7 +39,7 @@ return array (
|
|
39 |
),
|
40 |
'mobile' =>
|
41 |
array (
|
42 |
-
'NationalNumberPattern' => '2(?:1982[0-6]|3314[05-9])\\d{3}|(?:2(?:1(?:160|962)|3(?:2\\d\\d|3(?:[034]\\d|1[0-35-9]|2[1-9]|5[0-2])|600)
|
43 |
'ExampleNumber' => '221234567',
|
44 |
'PossibleLength' =>
|
45 |
array (
|
@@ -198,7 +198,7 @@ return array (
|
|
198 |
'format' => '$1 $2 $3',
|
199 |
'leadingDigitsPatterns' =>
|
200 |
array (
|
201 |
-
0 => '2[1-
|
202 |
),
|
203 |
'nationalPrefixFormattingRule' => '($1)',
|
204 |
'domesticCarrierCodeFormattingRule' => '',
|
@@ -298,7 +298,7 @@ return array (
|
|
298 |
'format' => '$1 $2 $3',
|
299 |
'leadingDigitsPatterns' =>
|
300 |
array (
|
301 |
-
0 => '2[1-
|
302 |
),
|
303 |
'nationalPrefixFormattingRule' => '($1)',
|
304 |
'domesticCarrierCodeFormattingRule' => '',
|
27 |
),
|
28 |
'fixedLine' =>
|
29 |
array (
|
30 |
+
'NationalNumberPattern' => '2(?:1982[0-6]|3314[05-9])\\d{3}|(?:2(?:1(?:160|962)|3(?:2\\d\\d|3(?:[034]\\d|1[0-35-9]|2[1-9]|5[0-2])|600))|80[1-9]\\d\\d|9(?:3(?:[0-57-9]\\d\\d|6(?:0[02-9]|[1-9]\\d))|6(?:[0-8]\\d\\d|9(?:[02-79]\\d|1[05-9]))|7[1-9]\\d\\d|9(?:[03-9]\\d\\d|1(?:[0235-9]\\d|4[0-24-9])|2(?:[0-79]\\d|8[0-46-9]))))\\d{4}|(?:22|3[2-5]|[47][1-35]|5[1-3578]|6[13-57]|8[1-9]|9[2458])\\d{7}',
|
31 |
'ExampleNumber' => '221234567',
|
32 |
'PossibleLength' =>
|
33 |
array (
|
39 |
),
|
40 |
'mobile' =>
|
41 |
array (
|
42 |
+
'NationalNumberPattern' => '2(?:1982[0-6]|3314[05-9])\\d{3}|(?:2(?:1(?:160|962)|3(?:2\\d\\d|3(?:[034]\\d|1[0-35-9]|2[1-9]|5[0-2])|600))|80[1-9]\\d\\d|9(?:3(?:[0-57-9]\\d\\d|6(?:0[02-9]|[1-9]\\d))|6(?:[0-8]\\d\\d|9(?:[02-79]\\d|1[05-9]))|7[1-9]\\d\\d|9(?:[03-9]\\d\\d|1(?:[0235-9]\\d|4[0-24-9])|2(?:[0-79]\\d|8[0-46-9]))))\\d{4}|(?:22|3[2-5]|[47][1-35]|5[1-3578]|6[13-57]|8[1-9]|9[2458])\\d{7}',
|
43 |
'ExampleNumber' => '221234567',
|
44 |
'PossibleLength' =>
|
45 |
array (
|
198 |
'format' => '$1 $2 $3',
|
199 |
'leadingDigitsPatterns' =>
|
200 |
array (
|
201 |
+
0 => '2[1-3]',
|
202 |
),
|
203 |
'nationalPrefixFormattingRule' => '($1)',
|
204 |
'domesticCarrierCodeFormattingRule' => '',
|
298 |
'format' => '$1 $2 $3',
|
299 |
'leadingDigitsPatterns' =>
|
300 |
array (
|
301 |
+
0 => '2[1-3]',
|
302 |
),
|
303 |
'nationalPrefixFormattingRule' => '($1)',
|
304 |
'domesticCarrierCodeFormattingRule' => '',
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_CV.php
CHANGED
@@ -36,7 +36,7 @@ return array (
|
|
36 |
),
|
37 |
'mobile' =>
|
38 |
array (
|
39 |
-
'NationalNumberPattern' => '(?:36|5[1-389]|9\\d)\\d{5}',
|
40 |
'ExampleNumber' => '9911234',
|
41 |
'PossibleLength' =>
|
42 |
array (
|
@@ -88,10 +88,9 @@ return array (
|
|
88 |
),
|
89 |
'voip' =>
|
90 |
array (
|
91 |
-
'NationalNumberPattern' => '(?:3[3-5]|4[356])\\d{5}',
|
92 |
-
'ExampleNumber' => '3401234',
|
93 |
'PossibleLength' =>
|
94 |
array (
|
|
|
95 |
),
|
96 |
'PossibleLengthLocalOnly' =>
|
97 |
array (
|
36 |
),
|
37 |
'mobile' =>
|
38 |
array (
|
39 |
+
'NationalNumberPattern' => '(?:[34][36]|5[1-389]|9\\d)\\d{5}',
|
40 |
'ExampleNumber' => '9911234',
|
41 |
'PossibleLength' =>
|
42 |
array (
|
88 |
),
|
89 |
'voip' =>
|
90 |
array (
|
|
|
|
|
91 |
'PossibleLength' =>
|
92 |
array (
|
93 |
+
0 => -1,
|
94 |
),
|
95 |
'PossibleLengthLocalOnly' =>
|
96 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_DM.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_DO.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_GA.php
CHANGED
@@ -38,7 +38,7 @@ return array (
|
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
-
'NationalNumberPattern' => '(?:(?:0[2-7]
|
42 |
'ExampleNumber' => '06031234',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
@@ -140,7 +140,7 @@ return array (
|
|
140 |
'id' => 'GA',
|
141 |
'countryCode' => 241,
|
142 |
'internationalPrefix' => '00',
|
143 |
-
'nationalPrefixForParsing' => '0(11\\d{6}|60\\d{6}|61\\d{6}|6[256]\\d{6}|7[
|
144 |
'nationalPrefixTransformRule' => '$1',
|
145 |
'sameMobileAndFixedLinePattern' => false,
|
146 |
'numberFormat' =>
|
@@ -163,9 +163,9 @@ return array (
|
|
163 |
'format' => '$1 $2 $3 $4',
|
164 |
'leadingDigitsPatterns' =>
|
165 |
array (
|
166 |
-
0 => '
|
167 |
),
|
168 |
-
'nationalPrefixFormattingRule' => '',
|
169 |
'domesticCarrierCodeFormattingRule' => '',
|
170 |
'nationalPrefixOptionalWhenFormatting' => false,
|
171 |
),
|
@@ -175,9 +175,9 @@ return array (
|
|
175 |
'format' => '$1 $2 $3 $4',
|
176 |
'leadingDigitsPatterns' =>
|
177 |
array (
|
178 |
-
0 => '
|
179 |
),
|
180 |
-
'nationalPrefixFormattingRule' => '
|
181 |
'domesticCarrierCodeFormattingRule' => '',
|
182 |
'nationalPrefixOptionalWhenFormatting' => false,
|
183 |
),
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
+
'NationalNumberPattern' => '(?:(?:0[2-7]\\d|6(?:0[0-4]|10|[256]\\d))\\d|7(?:[47]\\d\\d|658))\\d{4}|[2-7]\\d{6}',
|
42 |
'ExampleNumber' => '06031234',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
140 |
'id' => 'GA',
|
141 |
'countryCode' => 241,
|
142 |
'internationalPrefix' => '00',
|
143 |
+
'nationalPrefixForParsing' => '0(11\\d{6}|60\\d{6}|61\\d{6}|6[256]\\d{6}|7[47]\\d{6}|76\\d{6})',
|
144 |
'nationalPrefixTransformRule' => '$1',
|
145 |
'sameMobileAndFixedLinePattern' => false,
|
146 |
'numberFormat' =>
|
163 |
'format' => '$1 $2 $3 $4',
|
164 |
'leadingDigitsPatterns' =>
|
165 |
array (
|
166 |
+
0 => '11|[67]',
|
167 |
),
|
168 |
+
'nationalPrefixFormattingRule' => '0$1',
|
169 |
'domesticCarrierCodeFormattingRule' => '',
|
170 |
'nationalPrefixOptionalWhenFormatting' => false,
|
171 |
),
|
175 |
'format' => '$1 $2 $3 $4',
|
176 |
'leadingDigitsPatterns' =>
|
177 |
array (
|
178 |
+
0 => '0',
|
179 |
),
|
180 |
+
'nationalPrefixFormattingRule' => '',
|
181 |
'domesticCarrierCodeFormattingRule' => '',
|
182 |
'nationalPrefixOptionalWhenFormatting' => false,
|
183 |
),
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_GD.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_GU.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_IS.php
CHANGED
@@ -26,7 +26,7 @@ return array (
|
|
26 |
),
|
27 |
'fixedLine' =>
|
28 |
array (
|
29 |
-
'NationalNumberPattern' => '(?:4(?:1[0-24-69]|2[0-7]|[37][0-8]|4[0-
|
30 |
'ExampleNumber' => '4101234',
|
31 |
'PossibleLength' =>
|
32 |
array (
|
@@ -38,7 +38,7 @@ return array (
|
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
-
'NationalNumberPattern' => '(?:38[589]\\d\\d|6(?:1[1-8]|2[0-6]|3[
|
42 |
'ExampleNumber' => '6111234',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
@@ -49,7 +49,7 @@ return array (
|
|
49 |
),
|
50 |
'tollFree' =>
|
51 |
array (
|
52 |
-
'NationalNumberPattern' => '80[
|
53 |
'ExampleNumber' => '8001234',
|
54 |
'PossibleLength' =>
|
55 |
array (
|
26 |
),
|
27 |
'fixedLine' =>
|
28 |
array (
|
29 |
+
'NationalNumberPattern' => '(?:4(?:1[0-24-69]|2[0-7]|[37][0-8]|4[0-245]|5[0-68]|6\\d|8[0-36-8])|5(?:05|[156]\\d|2[02578]|3[0-579]|4[03-7]|7[0-2578]|8[0-35-9]|9[013-689])|872)\\d{4}',
|
30 |
'ExampleNumber' => '4101234',
|
31 |
'PossibleLength' =>
|
32 |
array (
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
+
'NationalNumberPattern' => '(?:38[589]\\d\\d|6(?:1[1-8]|2[0-6]|3[027-9]|4[014679]|5[0159]|6[0-69]|70|8[06-8]|9\\d)|7(?:5[057]|[6-9]\\d)|8(?:2[0-59]|[3-69]\\d|8[28]))\\d{4}',
|
42 |
'ExampleNumber' => '6111234',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
49 |
),
|
50 |
'tollFree' =>
|
51 |
array (
|
52 |
+
'NationalNumberPattern' => '80[08]\\d{4}',
|
53 |
'ExampleNumber' => '8001234',
|
54 |
'PossibleLength' =>
|
55 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_JM.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_KN.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_KR.php
CHANGED
@@ -144,7 +144,7 @@ return array (
|
|
144 |
),
|
145 |
'uan' =>
|
146 |
array (
|
147 |
-
'NationalNumberPattern' => '1(?:5(?:22|33|44|66|77|88|99)|6(?:[07]0|44|6[
|
148 |
'ExampleNumber' => '15441234',
|
149 |
'PossibleLength' =>
|
150 |
array (
|
144 |
),
|
145 |
'uan' =>
|
146 |
array (
|
147 |
+
'NationalNumberPattern' => '1(?:5(?:22|33|44|66|77|88|99)|6(?:[07]0|44|6[16]|88)|8(?:00|33|55|77|99))\\d{4}',
|
148 |
'ExampleNumber' => '15441234',
|
149 |
'PossibleLength' =>
|
150 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_KW.php
CHANGED
@@ -38,7 +38,7 @@ return array (
|
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
-
'NationalNumberPattern' => '(?:41\\d\\d|5(?:(?:[05]\\d|1[0-7]|6[56])\\d|2(?:22|5[25])|7(?:55|77)|88[58])|6(?:(?:0[034679]|5[015-9]|6\\d)\\d|
|
42 |
'ExampleNumber' => '50012345',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
+
'NationalNumberPattern' => '(?:41\\d\\d|5(?:(?:[05]\\d|1[0-7]|6[56])\\d|2(?:22|5[25])|7(?:55|77)|88[58])|6(?:(?:0[034679]|5[015-9]|6\\d)\\d|222|333|444|7(?:0[013-9]|[67]\\d)|888|9(?:[069]\\d|3[039]))|9(?:(?:0[09]|22|[4679]\\d|8[057-9])\\d|1(?:1[01]|99)|3(?:00|33)|5(?:00|5\\d)))\\d{4}',
|
42 |
'ExampleNumber' => '50012345',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_KY.php
CHANGED
@@ -26,7 +26,7 @@ return array (
|
|
26 |
),
|
27 |
'fixedLine' =>
|
28 |
array (
|
29 |
-
'NationalNumberPattern' => '345(?:2(?:22|3[23]|44|66)|333|444|6(?:23|38|40)|7(?:30|4[35-79]|6[6-9]|77)|8(?:00|1[45]|[48]8)|9(?:14|4[035-9]))\\d{4}',
|
30 |
'ExampleNumber' => '3452221234',
|
31 |
'PossibleLength' =>
|
32 |
array (
|
@@ -38,7 +38,7 @@ return array (
|
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
-
'NationalNumberPattern' => '345(?:32[1-9]|42[0-4]|5(?:1[67]|2[5-79]|4[6-9]|50|76)|649|
|
42 |
'ExampleNumber' => '3453231234',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
26 |
),
|
27 |
'fixedLine' =>
|
28 |
array (
|
29 |
+
'NationalNumberPattern' => '345(?:2(?:22|3[23]|44|66)|333|444|6(?:23|38|40)|7(?:30|4[35-79]|6[6-9]|77)|8(?:00|1[45]|25|[48]8)|9(?:14|4[035-9]))\\d{4}',
|
30 |
'ExampleNumber' => '3452221234',
|
31 |
'PossibleLength' =>
|
32 |
array (
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
+
'NationalNumberPattern' => '345(?:32[1-9]|42[0-4]|5(?:1[67]|2[5-79]|4[6-9]|50|76)|649|9(?:1[679]|2[2-9]|3[06-9]|90))\\d{4}',
|
42 |
'ExampleNumber' => '3453231234',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_LC.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_LI.php
CHANGED
@@ -38,7 +38,7 @@ return array (
|
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
-
'NationalNumberPattern' => '(?:6(?:(?:4[
|
42 |
'ExampleNumber' => '660234567',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
+
'NationalNumberPattern' => '(?:6(?:4(?:5[4-9]|[6-9]\\d)|5[0-4]\\d|6(?:[0245]\\d|[17]0|3[7-9]))\\d|7(?:[37-9]\\d|42|56))\\d{4}',
|
42 |
'ExampleNumber' => '660234567',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_MP.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_MS.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_PA.php
CHANGED
@@ -40,7 +40,7 @@ return array (
|
|
40 |
),
|
41 |
'mobile' =>
|
42 |
array (
|
43 |
-
'NationalNumberPattern' => '(?:1[16]1|21[89]|6\\d
|
44 |
'ExampleNumber' => '61234567',
|
45 |
'PossibleLength' =>
|
46 |
array (
|
40 |
),
|
41 |
'mobile' =>
|
42 |
array (
|
43 |
+
'NationalNumberPattern' => '(?:1[16]1|21[89]|6(?:[02-9]\\d|1[0-8])\\d|8(?:1[01]|7[23]))\\d{4}',
|
44 |
'ExampleNumber' => '61234567',
|
45 |
'PossibleLength' =>
|
46 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_PR.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_SC.php
CHANGED
@@ -14,7 +14,7 @@
|
|
14 |
return array (
|
15 |
'generalDesc' =>
|
16 |
array (
|
17 |
-
'NationalNumberPattern' => '
|
18 |
'PossibleLength' =>
|
19 |
array (
|
20 |
0 => 7,
|
@@ -36,7 +36,7 @@ return array (
|
|
36 |
),
|
37 |
'mobile' =>
|
38 |
array (
|
39 |
-
'NationalNumberPattern' => '2[
|
40 |
'ExampleNumber' => '2510123',
|
41 |
'PossibleLength' =>
|
42 |
array (
|
@@ -47,7 +47,7 @@ return array (
|
|
47 |
),
|
48 |
'tollFree' =>
|
49 |
array (
|
50 |
-
'NationalNumberPattern' => '
|
51 |
'ExampleNumber' => '8000000',
|
52 |
'PossibleLength' =>
|
53 |
array (
|
14 |
return array (
|
15 |
'generalDesc' =>
|
16 |
array (
|
17 |
+
'NationalNumberPattern' => '8000\\d{3}|(?:[249]\\d|64)\\d{5}',
|
18 |
'PossibleLength' =>
|
19 |
array (
|
20 |
0 => 7,
|
36 |
),
|
37 |
'mobile' =>
|
38 |
array (
|
39 |
+
'NationalNumberPattern' => '2[5-8]\\d{5}',
|
40 |
'ExampleNumber' => '2510123',
|
41 |
'PossibleLength' =>
|
42 |
array (
|
47 |
),
|
48 |
'tollFree' =>
|
49 |
array (
|
50 |
+
'NationalNumberPattern' => '8000\\d{3}',
|
51 |
'ExampleNumber' => '8000000',
|
52 |
'PossibleLength' =>
|
53 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_SG.php
CHANGED
@@ -27,7 +27,7 @@ return array (
|
|
27 |
),
|
28 |
'fixedLine' =>
|
29 |
array (
|
30 |
-
'NationalNumberPattern' => '662[0-24-9]\\d{4}|6(?:[
|
31 |
'ExampleNumber' => '61234567',
|
32 |
'PossibleLength' =>
|
33 |
array (
|
27 |
),
|
28 |
'fixedLine' =>
|
29 |
array (
|
30 |
+
'NationalNumberPattern' => '662[0-24-9]\\d{4}|6(?:[1-578]\\d|6[013-57-9]|9[0-35-9])\\d{5}',
|
31 |
'ExampleNumber' => '61234567',
|
32 |
'PossibleLength' =>
|
33 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_SL.php
CHANGED
@@ -38,7 +38,7 @@ return array (
|
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
-
'NationalNumberPattern' => '(?:25|3[0-5]|66|7[
|
42 |
'ExampleNumber' => '25123456',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
+
'NationalNumberPattern' => '(?:25|3[0-5]|66|7[3-9]|8[08]|9[09])\\d{6}',
|
42 |
'ExampleNumber' => '25123456',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_SX.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_TC.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_TT.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_US.php
CHANGED
@@ -26,7 +26,7 @@ return array (
|
|
26 |
),
|
27 |
'fixedLine' =>
|
28 |
array (
|
29 |
-
'NationalNumberPattern' => '5(?:05(?:[2-57-9]\\d\\d|6(?:[0-35-9]\\d|44))|82(?:2(?:0[0-3]|[268]2)|3(?:0[02]|
|
30 |
'ExampleNumber' => '2015550123',
|
31 |
'PossibleLength' =>
|
32 |
array (
|
@@ -38,7 +38,7 @@ return array (
|
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
-
'NationalNumberPattern' => '5(?:05(?:[2-57-9]\\d\\d|6(?:[0-35-9]\\d|44))|82(?:2(?:0[0-3]|[268]2)|3(?:0[02]|
|
42 |
'ExampleNumber' => '2015550123',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
26 |
),
|
27 |
'fixedLine' =>
|
28 |
array (
|
29 |
+
'NationalNumberPattern' => '5(?:05(?:[2-57-9]\\d\\d|6(?:[0-35-9]\\d|44))|82(?:2(?:0[0-3]|[268]2)|3(?:0[02]|33)|4(?:00|4[24]|65|82)|5(?:00|29|83)|6(?:00|66|82)|777|8(?:00|88)|9(?:00|9[89])))\\d{4}|(?:2(?:0[1-35-9]|1[02-9]|2[03-589]|3[149]|4[08]|5[1-46]|6[0279]|7[0269]|8[13])|3(?:0[1-57-9]|1[02-9]|2[01356]|3[0-24679]|4[167]|5[12]|6[014]|8[056])|4(?:0[124-9]|1[02-579]|2[3-5]|3[0245]|4[023578]|58|6[39]|7[0589]|8[04])|5(?:0[1-47-9]|1[0235-8]|20|3[0149]|4[01]|5[19]|6[1-47]|7[0-5]|8[056])|6(?:0[1-35-9]|1[024-9]|2[03689]|[34][016]|5[0179]|6[0-279]|78|8[0-29])|7(?:0[1-46-8]|1[2-9]|2[04-7]|3[1247]|4[037]|5[47]|6[02359]|7[0-59]|8[156])|8(?:0[1-68]|1[02-8]|2[08]|3[0-289]|4[03578]|5[046-9]|6[02-5]|7[028])|9(?:0[1346-9]|1[02-9]|2[0589]|3[0146-8]|4[01579]|5[12469]|7[0-389]|8[04-69]))[2-9]\\d{6}',
|
30 |
'ExampleNumber' => '2015550123',
|
31 |
'PossibleLength' =>
|
32 |
array (
|
38 |
),
|
39 |
'mobile' =>
|
40 |
array (
|
41 |
+
'NationalNumberPattern' => '5(?:05(?:[2-57-9]\\d\\d|6(?:[0-35-9]\\d|44))|82(?:2(?:0[0-3]|[268]2)|3(?:0[02]|33)|4(?:00|4[24]|65|82)|5(?:00|29|83)|6(?:00|66|82)|777|8(?:00|88)|9(?:00|9[89])))\\d{4}|(?:2(?:0[1-35-9]|1[02-9]|2[03-589]|3[149]|4[08]|5[1-46]|6[0279]|7[0269]|8[13])|3(?:0[1-57-9]|1[02-9]|2[01356]|3[0-24679]|4[167]|5[12]|6[014]|8[056])|4(?:0[124-9]|1[02-579]|2[3-5]|3[0245]|4[023578]|58|6[39]|7[0589]|8[04])|5(?:0[1-47-9]|1[0235-8]|20|3[0149]|4[01]|5[19]|6[1-47]|7[0-5]|8[056])|6(?:0[1-35-9]|1[024-9]|2[03689]|[34][016]|5[0179]|6[0-279]|78|8[0-29])|7(?:0[1-46-8]|1[2-9]|2[04-7]|3[1247]|4[037]|5[47]|6[02359]|7[0-59]|8[156])|8(?:0[1-68]|1[02-8]|2[08]|3[0-289]|4[03578]|5[046-9]|6[02-5]|7[028])|9(?:0[1346-9]|1[02-9]|2[0589]|3[0146-8]|4[01579]|5[12469]|7[0-389]|8[04-69]))[2-9]\\d{6}',
|
42 |
'ExampleNumber' => '2015550123',
|
43 |
'PossibleLength' =>
|
44 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_VC.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_VG.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/PhoneNumberMetadata_VI.php
CHANGED
@@ -82,7 +82,7 @@ return array (
|
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
-
'NationalNumberPattern' => '52(?:
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
82 |
),
|
83 |
'personalNumber' =>
|
84 |
array (
|
85 |
+
'NationalNumberPattern' => '52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[12]|33|44|66|77|88)[2-9]\\d{6}',
|
86 |
'ExampleNumber' => '5002345678',
|
87 |
'PossibleLength' =>
|
88 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_BE.php
CHANGED
@@ -27,7 +27,7 @@ return array (
|
|
27 |
),
|
28 |
'tollFree' =>
|
29 |
array (
|
30 |
-
'NationalNumberPattern' => '1(?:0[0-
|
31 |
'ExampleNumber' => '100',
|
32 |
'PossibleLength' =>
|
33 |
array (
|
27 |
),
|
28 |
'tollFree' =>
|
29 |
array (
|
30 |
+
'NationalNumberPattern' => '1(?:0[0-25-8]|1[02]|7(?:12|77)|813)|(?:116|8)\\d{3}',
|
31 |
'ExampleNumber' => '100',
|
32 |
'PossibleLength' =>
|
33 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_MS.php
CHANGED
@@ -14,7 +14,7 @@
|
|
14 |
return array (
|
15 |
'generalDesc' =>
|
16 |
array (
|
17 |
-
'NationalNumberPattern' => '
|
18 |
'PossibleLength' =>
|
19 |
array (
|
20 |
0 => 3,
|
@@ -57,8 +57,8 @@ return array (
|
|
57 |
),
|
58 |
'shortCode' =>
|
59 |
array (
|
60 |
-
'NationalNumberPattern' => '
|
61 |
-
'ExampleNumber' => '
|
62 |
'PossibleLength' =>
|
63 |
array (
|
64 |
),
|
14 |
return array (
|
15 |
'generalDesc' =>
|
16 |
array (
|
17 |
+
'NationalNumberPattern' => '9\\d\\d',
|
18 |
'PossibleLength' =>
|
19 |
array (
|
20 |
0 => 3,
|
57 |
),
|
58 |
'shortCode' =>
|
59 |
array (
|
60 |
+
'NationalNumberPattern' => '9(?:11|88|99)',
|
61 |
+
'ExampleNumber' => '911',
|
62 |
'PossibleLength' =>
|
63 |
array (
|
64 |
),
|
vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_PT.php
CHANGED
@@ -27,7 +27,7 @@ return array (
|
|
27 |
),
|
28 |
'tollFree' =>
|
29 |
array (
|
30 |
-
'NationalNumberPattern' => '11[
|
31 |
'ExampleNumber' => '112',
|
32 |
'PossibleLength' =>
|
33 |
array (
|
27 |
),
|
28 |
'tollFree' =>
|
29 |
array (
|
30 |
+
'NationalNumberPattern' => '11[25]|1(?:16\\d\\d|5[1589]|8[279])\\d',
|
31 |
'ExampleNumber' => '112',
|
32 |
'PossibleLength' =>
|
33 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_SC.php
CHANGED
@@ -26,8 +26,8 @@ return array (
|
|
26 |
),
|
27 |
'tollFree' =>
|
28 |
array (
|
29 |
-
'NationalNumberPattern' => '
|
30 |
-
'ExampleNumber' => '
|
31 |
'PossibleLength' =>
|
32 |
array (
|
33 |
0 => 3,
|
@@ -60,7 +60,7 @@ return array (
|
|
60 |
),
|
61 |
'shortCode' =>
|
62 |
array (
|
63 |
-
'NationalNumberPattern' => '1(?:
|
64 |
'ExampleNumber' => '100',
|
65 |
'PossibleLength' =>
|
66 |
array (
|
26 |
),
|
27 |
'tollFree' =>
|
28 |
array (
|
29 |
+
'NationalNumberPattern' => '999',
|
30 |
+
'ExampleNumber' => '999',
|
31 |
'PossibleLength' =>
|
32 |
array (
|
33 |
0 => 3,
|
60 |
),
|
61 |
'shortCode' =>
|
62 |
array (
|
63 |
+
'NationalNumberPattern' => '1(?:0\\d|1[027]|2[0-8]|3[13]|4[0-2]|[59][15]|6[1-9]|7[124-6]|8[158])|9(?:6\\d\\d|99)',
|
64 |
'ExampleNumber' => '100',
|
65 |
'PossibleLength' =>
|
66 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_SE.php
CHANGED
@@ -28,10 +28,13 @@ return array (
|
|
28 |
),
|
29 |
'tollFree' =>
|
30 |
array (
|
31 |
-
'NationalNumberPattern' => '
|
32 |
'ExampleNumber' => '112',
|
33 |
'PossibleLength' =>
|
34 |
array (
|
|
|
|
|
|
|
35 |
),
|
36 |
'PossibleLengthLocalOnly' =>
|
37 |
array (
|
28 |
),
|
29 |
'tollFree' =>
|
30 |
array (
|
31 |
+
'NationalNumberPattern' => '112|(?:116\\d|900)\\d\\d',
|
32 |
'ExampleNumber' => '112',
|
33 |
'PossibleLength' =>
|
34 |
array (
|
35 |
+
0 => 3,
|
36 |
+
1 => 5,
|
37 |
+
2 => 6,
|
38 |
),
|
39 |
'PossibleLengthLocalOnly' =>
|
40 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/data/ShortNumberMetadata_US.php
CHANGED
@@ -28,7 +28,7 @@ return array (
|
|
28 |
),
|
29 |
'tollFree' =>
|
30 |
array (
|
31 |
-
'NationalNumberPattern' => '112|
|
32 |
'ExampleNumber' => '112',
|
33 |
'PossibleLength' =>
|
34 |
array (
|
@@ -64,7 +64,7 @@ return array (
|
|
64 |
),
|
65 |
'shortCode' =>
|
66 |
array (
|
67 |
-
'NationalNumberPattern' => '11(?:2|5[1-47]|[68]\\d|7[0-57]|98)|[2-9]\\d{3,5}|[2-8]11|9(?:11|
|
68 |
'ExampleNumber' => '112',
|
69 |
'PossibleLength' =>
|
70 |
array (
|
28 |
),
|
29 |
'tollFree' =>
|
30 |
array (
|
31 |
+
'NationalNumberPattern' => '112|988|[69]11',
|
32 |
'ExampleNumber' => '112',
|
33 |
'PossibleLength' =>
|
34 |
array (
|
64 |
),
|
65 |
'shortCode' =>
|
66 |
array (
|
67 |
+
'NationalNumberPattern' => '11(?:2|5[1-47]|[68]\\d|7[0-57]|98)|[2-9]\\d{3,5}|[2-8]11|9(?:11|88)',
|
68 |
'ExampleNumber' => '112',
|
69 |
'PossibleLength' =>
|
70 |
array (
|
vendor/giggsey/libphonenumber-for-php/src/geocoding/data/en/13.php
CHANGED
@@ -3117,6 +3117,7 @@ return array (
|
|
3117 |
13457 => 'Cayman Islands',
|
3118 |
134580 => 'Cayman Islands',
|
3119 |
134581 => 'Cayman Islands',
|
|
|
3120 |
1345848 => 'Cayman Islands',
|
3121 |
134588 => 'Cayman Islands',
|
3122 |
1345914 => 'Cayman Islands',
|
3117 |
13457 => 'Cayman Islands',
|
3118 |
134580 => 'Cayman Islands',
|
3119 |
134581 => 'Cayman Islands',
|
3120 |
+
134582 => 'Cayman Islands',
|
3121 |
1345848 => 'Cayman Islands',
|
3122 |
134588 => 'Cayman Islands',
|
3123 |
1345914 => 'Cayman Islands',
|
vendor/giggsey/libphonenumber-for-php/src/geocoding/data/en/238.php
CHANGED
@@ -16,8 +16,8 @@ return array (
|
|
16 |
238223 => 'Paúl, Santo Antão',
|
17 |
238224 => 'Cocoli, Santo Antão',
|
18 |
238225 => 'Ponta do Sol, Santo Antão',
|
19 |
-
238226 => '
|
20 |
-
238227 => '
|
21 |
238230 => 'Mindelo, São Vicente',
|
22 |
238231 => 'Mindelo, São Vicente',
|
23 |
238232 => 'Mindelo, São Vicente',
|
@@ -41,7 +41,7 @@ return array (
|
|
41 |
238267 => 'Cidade Velha, Santiago',
|
42 |
238268 => 'São Domingos, Santiago',
|
43 |
238269 => 'Pedra Badejo, Santiago',
|
44 |
-
238271 => '
|
45 |
238272 => 'Picos, Santiago',
|
46 |
238273 => 'Calheta de São Miguel, Santiago',
|
47 |
238281 => 'São Filipe, Fogo',
|
16 |
238223 => 'Paúl, Santo Antão',
|
17 |
238224 => 'Cocoli, Santo Antão',
|
18 |
238225 => 'Ponta do Sol, Santo Antão',
|
19 |
+
238226 => 'Chã da Igreja, Santo Antão',
|
20 |
+
238227 => 'Ribeira das Patas, Santo Antão',
|
21 |
238230 => 'Mindelo, São Vicente',
|
22 |
238231 => 'Mindelo, São Vicente',
|
23 |
238232 => 'Mindelo, São Vicente',
|
41 |
238267 => 'Cidade Velha, Santiago',
|
42 |
238268 => 'São Domingos, Santiago',
|
43 |
238269 => 'Pedra Badejo, Santiago',
|
44 |
+
238271 => 'São Lourenço dos Órgãos/São Jorge, Santiago',
|
45 |
238272 => 'Picos, Santiago',
|
46 |
238273 => 'Calheta de São Miguel, Santiago',
|
47 |
238281 => 'São Filipe, Fogo',
|
vendor/giggsey/libphonenumber-for-php/src/geocoding/data/en/56.php
CHANGED
@@ -15,7 +15,6 @@ return array (
|
|
15 |
562198 => 'Santiago, Metropolitan Region',
|
16 |
5622 => 'Santiago, Metropolitan Region',
|
17 |
5623 => 'Santiago, Metropolitan Region',
|
18 |
-
5626 => 'Santiago, Metropolitan Region',
|
19 |
5632 => 'Valparaíso',
|
20 |
5633 => 'Quillota, Valparaíso',
|
21 |
5634 => 'San Felipe, Valparaíso',
|
15 |
562198 => 'Santiago, Metropolitan Region',
|
16 |
5622 => 'Santiago, Metropolitan Region',
|
17 |
5623 => 'Santiago, Metropolitan Region',
|
|
|
18 |
5632 => 'Valparaíso',
|
19 |
5633 => 'Quillota, Valparaíso',
|
20 |
5634 => 'San Felipe, Valparaíso',
|
vendor/giggsey/libphonenumber-for-php/src/geocoding/data/en/61.php
CHANGED
@@ -4480,7 +4480,7 @@ return array (
|
|
4480 |
61255616 => 'Telegraph Point',
|
4481 |
61255617 => 'Toorooka',
|
4482 |
61255618 => 'Widden Valley',
|
4483 |
-
61255619 => '
|
4484 |
61255620 => 'Bowraville',
|
4485 |
61255621 => 'Broke',
|
4486 |
61255622 => 'Bunnan',
|
@@ -31586,7 +31586,7 @@ return array (
|
|
31586 |
61740636 => 'Euramo',
|
31587 |
61740637 => 'Euramo',
|
31588 |
61740638 => 'Georgetown',
|
31589 |
-
61740639 => '
|
31590 |
6174064 => 'South Johnstone',
|
31591 |
61740649 => 'Herberton',
|
31592 |
6174065 => 'Silkwood',
|
@@ -31648,7 +31648,7 @@ return array (
|
|
31648 |
61740741 => 'Mutchilba',
|
31649 |
61740742 => 'Peninsula',
|
31650 |
61740743 => 'Ravenshoe',
|
31651 |
-
61740744 => '
|
31652 |
61740745 => 'South Johnstone',
|
31653 |
61740746 => 'Thursday Island',
|
31654 |
61740747 => 'Torres',
|
@@ -33779,7 +33779,7 @@ return array (
|
|
33779 |
61743480 => 'Boondooma',
|
33780 |
61743481 => 'Booyal',
|
33781 |
61743482 => 'Brooklands',
|
33782 |
-
61743483 => '
|
33783 |
61743484 => 'Bundaberg',
|
33784 |
61743485 => 'Bunker',
|
33785 |
61743486 => 'Burnett',
|
@@ -40461,7 +40461,7 @@ return array (
|
|
40461 |
61752290 => 'Imbil',
|
40462 |
61752291 => 'Jimna',
|
40463 |
61752292 => 'Kalbar',
|
40464 |
-
61752293 => '
|
40465 |
61752294 => 'Kia Ora',
|
40466 |
61752295 => 'Kilcoy',
|
40467 |
61752296 => 'Kilkivan',
|
4480 |
61255616 => 'Telegraph Point',
|
4481 |
61255617 => 'Toorooka',
|
4482 |
61255618 => 'Widden Valley',
|
4483 |
+
61255619 => 'Baerami',
|
4484 |
61255620 => 'Bowraville',
|
4485 |
61255621 => 'Broke',
|
4486 |
61255622 => 'Bunnan',
|
31586 |
61740636 => 'Euramo',
|
31587 |
61740637 => 'Euramo',
|
31588 |
61740638 => 'Georgetown',
|
31589 |
+
61740639 => 'Gordonvale',
|
31590 |
6174064 => 'South Johnstone',
|
31591 |
61740649 => 'Herberton',
|
31592 |
6174065 => 'Silkwood',
|
31648 |
61740741 => 'Mutchilba',
|
31649 |
61740742 => 'Peninsula',
|
31650 |
61740743 => 'Ravenshoe',
|
31651 |
+
61740744 => 'Silkwood',
|
31652 |
61740745 => 'South Johnstone',
|
31653 |
61740746 => 'Thursday Island',
|
31654 |
61740747 => 'Torres',
|
33779 |
61743480 => 'Boondooma',
|
33780 |
61743481 => 'Booyal',
|
33781 |
61743482 => 'Brooklands',
|
33782 |
+
61743483 => 'Brooweena',
|
33783 |
61743484 => 'Bundaberg',
|
33784 |
61743485 => 'Bunker',
|
33785 |
61743486 => 'Burnett',
|
40461 |
61752290 => 'Imbil',
|
40462 |
61752291 => 'Jimna',
|
40463 |
61752292 => 'Kalbar',
|
40464 |
+
61752293 => 'Kenilworth',
|
40465 |
61752294 => 'Kia Ora',
|
40466 |
61752295 => 'Kilcoy',
|
40467 |
61752296 => 'Kilkivan',
|
vendor/giggsey/libphonenumber-for-php/src/geocoding/data/es/56.php
CHANGED
@@ -15,7 +15,6 @@ return array (
|
|
15 |
562198 => 'Santiago, Región Metropolitana',
|
16 |
5622 => 'Santiago, Región Metropolitana',
|
17 |
5623 => 'Santiago, Región Metropolitana',
|
18 |
-
5626 => 'Santiago, Región Metropolitana',
|
19 |
5658 => 'Arica, Arica y Parinacota',
|
20 |
5661 => 'Punta Arenas, Magallanes',
|
21 |
5667 => 'Coihaique, Aysén',
|
15 |
562198 => 'Santiago, Región Metropolitana',
|
16 |
5622 => 'Santiago, Región Metropolitana',
|
17 |
5623 => 'Santiago, Región Metropolitana',
|
|
|
18 |
5658 => 'Arica, Arica y Parinacota',
|
19 |
5661 => 'Punta Arenas, Magallanes',
|
20 |
5667 => 'Coihaique, Aysén',
|
vendor/giggsey/libphonenumber-for-php/src/geocoding/data/pt/238.php
CHANGED
@@ -16,8 +16,8 @@ return array (
|
|
16 |
238223 => 'Paúl, Santo Antão',
|
17 |
238224 => 'Cocoli, Santo Antão',
|
18 |
238225 => 'Ponta do Sol, Santo Antão',
|
19 |
-
238226 => '
|
20 |
-
238227 => '
|
21 |
238230 => 'Mindelo, São Vicente',
|
22 |
238231 => 'Mindelo, São Vicente',
|
23 |
238232 => 'Mindelo, São Vicente',
|
@@ -41,7 +41,7 @@ return array (
|
|
41 |
238267 => 'Cidade Velha, Santiago',
|
42 |
238268 => 'São Domingos, Santiago',
|
43 |
238269 => 'Pedra Badejo, Santiago',
|
44 |
-
238271 => '
|
45 |
238272 => 'Picos, Santiago',
|
46 |
238273 => 'Calheta de São Miguel, Santiago',
|
47 |
238281 => 'São Filipe, Fogo',
|
16 |
238223 => 'Paúl, Santo Antão',
|
17 |
238224 => 'Cocoli, Santo Antão',
|
18 |
238225 => 'Ponta do Sol, Santo Antão',
|
19 |
+
238226 => 'Chã da Igreja, Santo Antão',
|
20 |
+
238227 => 'Ribeira das Patas, Santo Antão',
|
21 |
238230 => 'Mindelo, São Vicente',
|
22 |
238231 => 'Mindelo, São Vicente',
|
23 |
238232 => 'Mindelo, São Vicente',
|
41 |
238267 => 'Cidade Velha, Santiago',
|
42 |
238268 => 'São Domingos, Santiago',
|
43 |
238269 => 'Pedra Badejo, Santiago',
|
44 |
+
238271 => 'São Lourenço dos Órgãos/São Jorge, Santiago',
|
45 |
238272 => 'Picos, Santiago',
|
46 |
238273 => 'Calheta de São Miguel, Santiago',
|
47 |
238281 => 'São Filipe, Fogo',
|
wgact.php
CHANGED
@@ -10,19 +10,21 @@
|
|
10 |
* Developer URI: https://sweetcode.com
|
11 |
* Text Domain: woocommerce-google-adwords-conversion-tracking-tag
|
12 |
* Domain path: /languages
|
13 |
-
*
|
14 |
*
|
15 |
* WC requires at least: 3.7
|
16 |
-
* WC tested up to: 6.
|
17 |
*
|
18 |
* License: GNU General Public License v3.0
|
19 |
* License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
20 |
*
|
21 |
*
|
22 |
**/
|
23 |
-
const WPM_CURRENT_VERSION = '1.
|
24 |
// TODO export settings function
|
25 |
// TODO add option checkbox on uninstall and ask if user wants to delete options from db
|
|
|
|
|
26 |
|
27 |
if ( !defined( 'ABSPATH' ) ) {
|
28 |
exit;
|
@@ -125,13 +127,13 @@ if ( function_exists( 'wpm_fs' ) ) {
|
|
125 |
require __DIR__ . '/vendor/autoload.php';
|
126 |
}
|
127 |
$this->setup_freemius_environment();
|
|
|
128 |
// running the DB updater
|
129 |
if ( get_option( WPM_DB_OPTIONS_NAME ) ) {
|
130 |
( new Db_Upgrade() )->run_options_db_upgrade();
|
131 |
}
|
132 |
// load the options
|
133 |
$this->wpm_options_init();
|
134 |
-
$this->environment_check = new Environment_Check( $this->options );
|
135 |
if ( isset( $this->options['google']['gads']['dynamic_remarketing'] ) && $this->options['google']['gads']['dynamic_remarketing'] ) {
|
136 |
// make sure to disable the WGDR plugin in case we use dynamic remarketing in this plugin
|
137 |
add_filter( 'wgdr_third_party_cookie_prevention', '__return_true' );
|
@@ -142,19 +144,16 @@ if ( function_exists( 'wpm_fs' ) ) {
|
|
142 |
add_action( 'admin_notices', function () {
|
143 |
$this->environment_check->run_incompatible_plugins_checks();
|
144 |
} );
|
145 |
-
$this->environment_check->
|
146 |
-
|
147 |
-
$this->environment_check->enable_compatibility_mode();
|
148 |
-
}
|
149 |
$this->environment_check->flush_cache_on_plugin_changes();
|
150 |
register_activation_hook( __FILE__, [ $this, 'plugin_activated' ] );
|
151 |
register_deactivation_hook( __FILE__, [ $this, 'plugin_deactivated' ] );
|
152 |
-
|
153 |
-
add_action( 'woocommerce_init', [ $this, 'init' ] );
|
154 |
} else {
|
155 |
add_action( 'admin_menu', [ $this, 'add_empty_admin_page' ], 99 );
|
156 |
add_action( 'admin_notices', [ $this, 'requirements_error' ] );
|
157 |
-
|
158 |
}
|
159 |
|
160 |
}
|
@@ -227,6 +226,10 @@ if ( function_exists( 'wpm_fs' ) ) {
|
|
227 |
|
228 |
public function environment_check_admin_notices()
|
229 |
{
|
|
|
|
|
|
|
|
|
230 |
if ( apply_filters( 'wpm_show_admin_alerts', apply_filters_deprecated(
|
231 |
'wooptpm_show_admin_alerts',
|
232 |
[ true ],
|
@@ -237,6 +240,19 @@ if ( function_exists( 'wpm_fs' ) ) {
|
|
237 |
}
|
238 |
}
|
239 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
240 |
// startup all functions
|
241 |
public function init()
|
242 |
{
|
@@ -251,8 +267,7 @@ if ( function_exists( 'wpm_fs' ) ) {
|
|
251 |
}
|
252 |
|
253 |
// inject pixels into front end
|
254 |
-
|
255 |
-
$this->inject_pixels();
|
256 |
}
|
257 |
|
258 |
public function inject_pixels()
|
@@ -298,6 +313,11 @@ if ( function_exists( 'wpm_fs' ) ) {
|
|
298 |
$this->options = ( new Default_Options() )->get_default_options();
|
299 |
} else {
|
300 |
// Check if each single option has been set. If not, set them. That is necessary when new options are introduced.
|
|
|
|
|
|
|
|
|
|
|
301 |
// add new default options to the options db array
|
302 |
$this->options = ( new Default_Options() )->update_with_defaults( $this->options, ( new Default_Options() )->get_default_options() );
|
303 |
}
|
10 |
* Developer URI: https://sweetcode.com
|
11 |
* Text Domain: woocommerce-google-adwords-conversion-tracking-tag
|
12 |
* Domain path: /languages
|
13 |
+
* Version: 1.14.1
|
14 |
*
|
15 |
* WC requires at least: 3.7
|
16 |
+
* WC tested up to: 6.1
|
17 |
*
|
18 |
* License: GNU General Public License v3.0
|
19 |
* License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
20 |
*
|
21 |
*
|
22 |
**/
|
23 |
+
const WPM_CURRENT_VERSION = '1.14.1' ;
|
24 |
// TODO export settings function
|
25 |
// TODO add option checkbox on uninstall and ask if user wants to delete options from db
|
26 |
+
// TODO ask inverse cookie approval. Only of cookies have been allowed, fire the pixels.
|
27 |
+
// TODO remove google_business_vertical cleanup
|
28 |
|
29 |
if ( !defined( 'ABSPATH' ) ) {
|
30 |
exit;
|
127 |
require __DIR__ . '/vendor/autoload.php';
|
128 |
}
|
129 |
$this->setup_freemius_environment();
|
130 |
+
$this->environment_check = new Environment_Check();
|
131 |
// running the DB updater
|
132 |
if ( get_option( WPM_DB_OPTIONS_NAME ) ) {
|
133 |
( new Db_Upgrade() )->run_options_db_upgrade();
|
134 |
}
|
135 |
// load the options
|
136 |
$this->wpm_options_init();
|
|
|
137 |
if ( isset( $this->options['google']['gads']['dynamic_remarketing'] ) && $this->options['google']['gads']['dynamic_remarketing'] ) {
|
138 |
// make sure to disable the WGDR plugin in case we use dynamic remarketing in this plugin
|
139 |
add_filter( 'wgdr_third_party_cookie_prevention', '__return_true' );
|
144 |
add_action( 'admin_notices', function () {
|
145 |
$this->environment_check->run_incompatible_plugins_checks();
|
146 |
} );
|
147 |
+
$this->environment_check->permanent_compatibility_mode();
|
148 |
+
$this->run_compatibility_modes();
|
|
|
|
|
149 |
$this->environment_check->flush_cache_on_plugin_changes();
|
150 |
register_activation_hook( __FILE__, [ $this, 'plugin_activated' ] );
|
151 |
register_deactivation_hook( __FILE__, [ $this, 'plugin_deactivated' ] );
|
152 |
+
$this->init();
|
|
|
153 |
} else {
|
154 |
add_action( 'admin_menu', [ $this, 'add_empty_admin_page' ], 99 );
|
155 |
add_action( 'admin_notices', [ $this, 'requirements_error' ] );
|
156 |
+
error_log( 'The WooCommerce Pixel Manager requires the WooCommerce plugin to be active.' );
|
157 |
}
|
158 |
|
159 |
}
|
226 |
|
227 |
public function environment_check_admin_notices()
|
228 |
{
|
229 |
+
// if (apply_filters('wpm_show_admin_notifications', true))
|
230 |
+
// {
|
231 |
+
//
|
232 |
+
// }
|
233 |
if ( apply_filters( 'wpm_show_admin_alerts', apply_filters_deprecated(
|
234 |
'wooptpm_show_admin_alerts',
|
235 |
[ true ],
|
240 |
}
|
241 |
}
|
242 |
|
243 |
+
private function run_compatibility_modes()
|
244 |
+
{
|
245 |
+
/*
|
246 |
+
* Compatibility modes
|
247 |
+
*/
|
248 |
+
if ( $this->options['general']['maximum_compatibility_mode'] ) {
|
249 |
+
$this->environment_check->enable_maximum_compatibility_mode();
|
250 |
+
}
|
251 |
+
if ( $this->options['general']['maximum_compatibility_mode'] && $this->options['facebook']['microdata'] ) {
|
252 |
+
$this->environment_check->enable_maximum_compatibility_mode_yoast_seo();
|
253 |
+
}
|
254 |
+
}
|
255 |
+
|
256 |
// startup all functions
|
257 |
public function init()
|
258 |
{
|
267 |
}
|
268 |
|
269 |
// inject pixels into front end
|
270 |
+
add_action( 'after_setup_theme', [ $this, 'inject_pixels' ] );
|
|
|
271 |
}
|
272 |
|
273 |
public function inject_pixels()
|
313 |
$this->options = ( new Default_Options() )->get_default_options();
|
314 |
} else {
|
315 |
// Check if each single option has been set. If not, set them. That is necessary when new options are introduced.
|
316 |
+
// cleanup the db of this setting
|
317 |
+
// remove by end of 2021 latest
|
318 |
+
if ( array_key_exists( 'google_business_vertical', $this->options ) ) {
|
319 |
+
unset( $this->options['google_business_vertical'] );
|
320 |
+
}
|
321 |
// add new default options to the options db array
|
322 |
$this->options = ( new Default_Options() )->update_with_defaults( $this->options, ( new Default_Options() )->get_default_options() );
|
323 |
}
|