Changeset 3076289
- Timestamp:
- 04/24/2024 09:31:43 AM (2 years ago)
- Location:
- uptain-connect/trunk
- Files:
-
- 9 edited
-
README.txt (modified) (2 diffs)
-
src/Plugin.php (modified) (9 diffs)
-
src/WooCommerceTracker.php (modified) (6 diffs)
-
vendor/autoload.php (modified) (1 diff)
-
vendor/composer/InstalledVersions.php (modified) (2 diffs)
-
vendor/composer/autoload_real.php (modified) (5 diffs)
-
vendor/composer/autoload_static.php (modified) (2 diffs)
-
vendor/composer/installed.php (modified) (2 diffs)
-
wf-uptain-tracking.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
uptain-connect/trunk/README.txt
r3076284 r3076289 2 2 Contributors: webfoersterei 3 3 Donate link: www.uptain.de 4 Tags: 4 Tags: E-Commerce, Conversion-Optimierung, Exit-Intent, Warenkorb, Conversion, E-Mail, Big Data, DSGVO, Kundengewinnung, Marketing, Shop, Optimierung 5 5 Requires at least: 5.8 6 6 Tested up to: 6.4 7 Stable tag: 2. 07 Stable tag: 2.2 8 8 Requires PHP: 7.4 9 9 License: GPLv2 10 10 License URI: http://www.gnu.org/licenses/gpl-2.0.html 11 Author: webfoersterei12 Author URI: https://profiles.wordpress.org/webfoersterei/13 11 14 12 We develop automated state-of-the-art solutions for regaining lost customers coupled with absolute customer orientation. … … 92 90 == Changelog == 93 91 92 = 2.2.0 = 93 * Implement fallback-recognition of order completed in cases of custom checkouts 94 95 = 2.1.3 = 96 * Add support for plugins that concatenate JavaScript-Files 97 * Add explicit support for Cookiebot 98 94 99 = 2.0.1 = 95 100 * Improved tracking and functionalities 96 97 101 98 102 = 1.1.3 = -
uptain-connect/trunk/src/Plugin.php
r2973033 r3076289 19 19 private ?TrackerInterface $tracker = null; 20 20 public const REST_ROUTE_TRACKING_VALUES = 'values'; 21 private const HOTDEV_HTTP_HEADER_NAME = 'HTTP_X_WEBFOERSTEREI_HOTDEV'; 21 22 22 23 public function __construct($slug, $version) … … 91 92 { 92 93 register_rest_route(self::getSlug().'/v1', '/'.self::REST_ROUTE_TRACKING_VALUES, [ 93 'methods' => 'GET',94 'callback' => function () {94 'methods' => 'GET', 95 'callback' => function () { 95 96 return rest_ensure_response( 96 97 $this->formatAsJsonArray($this->getTrackingData(), true) 97 98 ); 98 99 }, 100 'permission_callback' => '__return_true', 99 101 ]); 100 102 } … … 109 111 Plugin::debug('enabled', true); 110 112 113 if (function_exists('\cybot\cookiebot\lib\cookiebot_active')) { 114 Plugin::debug('-cookiebot-exists', 'namespaced'); 115 $cookieBotEnabled = \cybot\cookiebot\lib\cookiebot_active(); 116 } else { 117 Plugin::debug('cookiebot-exists', 'legacy'); 118 $cookieBotEnabled = function_exists('cookiebot_active') && cookiebot_active(); 119 } 120 121 Plugin::debug('cookiebot-enabled', $cookieBotEnabled); 122 123 if ($cookieBotEnabled) { 124 $scriptType = (function_exists('\cybot\cookiebot\lib\cookiebot_assist') ? 125 \cybot\cookiebot\lib\cookiebot_assist('marketing') 126 : cookiebot_assist('marketing')); 127 } else { 128 $scriptType = 'type="application/javascript"'; 129 } 130 111 131 try { 112 132 printf( 113 '<script type="application/javascript" id="%1$s">133 '<script data-no-minify="1" id="%1$s" %7$s> 114 134 function uptainEnable(retry = 0) { 115 135 var maxRetry = 10; … … 141 161 if(%4$s) { window._upEventBus.publish("uptain.readData"); } 142 162 if(%5$s) { setInterval(uptainRefresh, %6$d); } 143 if( %4$s || %5$s) { document.getElementById("%1$s").remove(); }163 if((%4$s || %5$s) && document.getElementById("%1$s")) { document.getElementById("%1$s").remove(); } 144 164 } 145 165 </script>', … … 155 175 (int)get_option(Admin::OPTION_NAME_INCLUDE_REFRESH_INTERVAL, Admin::DEFAULT_REFRESH_MS), 156 176 Admin::MIN_REFRESH_MS 157 ) 177 ), 178 $scriptType 158 179 ); 159 180 printf( 160 '<script type="application/javascript" id="%1$s">181 '<script data-no-minify="1" id="%1$s" %3$s> 161 182 var lastSetKeys = []; 162 183 async function uptainRefresh() { … … 189 210 </script>', 190 211 self::getSlug().'-refresh', 191 get_rest_url(null, self::getSlug().'/v1/'.self::REST_ROUTE_TRACKING_VALUES) 212 get_rest_url(null, self::getSlug().'/v1/'.self::REST_ROUTE_TRACKING_VALUES), 213 $scriptType 192 214 ); 193 215 } catch (\Throwable $ex) { … … 200 222 Plugin::debug('immediate-include', true); 201 223 printf( 202 '<script type="application/javascript" id="%1$s">uptainEnable();document.getElementById("%1$s").remove();</script>', 203 self::getSlug().'-direct-execute' 224 '<script data-no-minify="1" id="%1$s" %2$s>uptainEnable(); 225 var wf_own = document.getElementById("%1$s") 226 if(wf_own) { wf_own.remove(); }</script>', 227 self::getSlug().'-direct-execute', 228 $scriptType 204 229 ); 205 230 } … … 262 287 public static function debug($header, $value) 263 288 { 264 if (!get_option(Admin::OPTION_NAME_DEBUG, false)) { 289 $isHotDev = isset($_SERVER[self::HOTDEV_HTTP_HEADER_NAME]) && ((int)$_SERVER[self::HOTDEV_HTTP_HEADER_NAME] >= 1024 && (int)$_SERVER[self::HOTDEV_HTTP_HEADER_NAME] <= 65534); 290 291 if (!$isHotDev && !get_option(Admin::OPTION_NAME_DEBUG, false)) { 265 292 return; 266 293 } … … 275 302 return; 276 303 } 277 // printf("DEBUG %s: %s", $header, $value); 304 305 if($isHotDev) { 306 printf("DEBUG %s: %s", $header, $value); 307 } 278 308 } 279 309 } -
uptain-connect/trunk/src/WooCommerceTracker.php
r2973033 r3076289 13 13 { 14 14 private $WC; 15 16 public function __construct() 15 private static $overrideOrderId = null; 16 17 private function getWooCommerce() 17 18 { 18 19 global $woocommerce; 19 20 20 $this->WC = $woocommerce; 21 if (function_exists('WC')) { 22 $this->WC = WC(); 23 Plugin::debug('get-woo', 'wc-function'); 24 } else { 25 $this->WC = $woocommerce; 26 Plugin::debug('get-woo', 'global-var'); 27 } 28 29 if (!$this->WC) { 30 Plugin::debug('get-woo-EMER', 'No WooCommerce'); 31 32 return null; 33 } 34 35 Plugin::debug('get-woo-version', $this->WC->version); 36 37 if (null === $this->WC->cart) { 38 $this->WC->frontend_includes(); 39 Plugin::debug('get-woo-cart', 'load'); 40 wc_load_cart(); 41 } 42 43 return $this->WC; 21 44 } 22 45 … … 24 47 { 25 48 add_action('woocommerce_checkout_order_created', function ($order) { 49 Plugin::debug('wc-hook-order-created', true); 50 Plugin::debug('wc-hook-order-created-id', $order->ID); 26 51 if (!headers_sent() && session_status() !== PHP_SESSION_ACTIVE) { 27 52 session_start(); 28 53 } 29 54 $_SESSION['freshOrder'] = $order->ID; 55 self::$overrideOrderId = $order->ID; 30 56 }); 57 58 add_action('woocommerce_thankyou', function ($orderID) { 59 Plugin::debug('wc-hook-thankyou-orderid', $orderID); 60 if (!headers_sent() && session_status() !== PHP_SESSION_ACTIVE) { 61 session_start(); 62 } 63 $order = wc_get_order($orderID); 64 Plugin::debug( 65 'wc-hook-thankyou-created-ts', 66 $order->get_date_created() ? $order->get_date_created()->getTimestamp() : null 67 ); 68 Plugin::debug( 69 'wc-hook-thankyou-now-ts', 70 (new \DateTimeImmutable('now -20 seconds'))->getTimestamp() 71 ); 72 if ($order->get_date_created() && $order->get_date_created()->getTimestamp() > (new \DateTimeImmutable( 73 'now -20 seconds' 74 ))->getTimestamp()) { 75 self::$overrideOrderId = $orderID; 76 $_SESSION['freshOrder'] = $orderID; 77 } 78 }); 31 79 } 32 80 … … 35 83 $result = array_merge($this->getCartTrackingData(), $this->getPersonalData()); 36 84 37 return array_filter($result); 85 return array_filter($result, static function ($element) { 86 return $element !== null && $element !== ''; 87 }); 38 88 } 39 89 … … 45 95 $result = []; 46 96 47 if ($this->WC) { 97 Plugin::debug('override-orderid', self::$overrideOrderId); 98 Plugin::debug('session-orderid', $_SESSION['freshOrder'] ?? null); 99 100 if (null === self::$overrideOrderId && isset($_SESSION['freshOrder']) && (int)$_SESSION['freshOrder']) { 101 self::$overrideOrderId = $_SESSION['freshOrder']; 102 $_SESSION['freshOrder'] = null; 103 } 104 105 if ($this->getWooCommerce()) { 106 Plugin::debug('ctd-wc', true); 107 Plugin::debug('ctd-wc-cart', (bool)$this->getWooCommerce()->cart); 108 Plugin::debug( 109 'ctd-wc-cart-total', 110 $this->getWooCommerce()->cart ? $this->getWooCommerce()->cart->cart_contents_total : null 111 ); 48 112 $result['currency'] = get_woocommerce_currency(); 49 $result['scv'] = $this->WC->cart ? $this->WC->cart->cart_contents_total : null; 50 $coupons = $this->WC->cart ? $this->WC->cart->get_applied_coupons() : []; 51 $result['usedvoucher'] = ($this->WC->cart && count($coupons) >= 1) ? array_pop($coupons) : ''; 52 $result['voucher-amount'] = $this->WC->cart ? number_format( 53 $this->WC->cart->get_cart_discount_total(), 113 $result['scv'] = $this->getWooCommerce()->cart ? ($this->getWooCommerce( 114 )->cart->cart_contents_total ?? 0) : 0; 115 $coupons = $this->getWooCommerce()->cart ? $this->getWooCommerce()->cart->get_applied_coupons() : []; 116 $result['usedvoucher'] = ($this->getWooCommerce()->cart && count($coupons) >= 1) ? array_pop($coupons) : ''; 117 $result['voucher-amount'] = $this->getWooCommerce()->cart ? number_format( 118 $this->getWooCommerce()->cart->get_cart_discount_total(), 54 119 2 55 120 ) : null; … … 57 122 $result['success'] = null; 58 123 59 if ( isset($_SESSION['freshOrder']) && (int)$_SESSION['freshOrder']) {60 $order = wc_get_order((int) $_SESSION['freshOrder']);124 if ((int)self::$overrideOrderId) { 125 $order = wc_get_order((int)self::$overrideOrderId); 61 126 if ($order) { 127 $discountExcludingTax = $order->get_total_discount(true); 62 128 $result['success'] = '1'; 63 $result['scv'] = $order->get_subtotal(); 129 $result['scv'] = $order->get_subtotal( 130 ) - $discountExcludingTax; // subtotal is excluding Tax, but also excluding vouchers 64 131 $coupons = $order->get_coupon_codes(); 65 132 $result['usedvoucher'] = count($coupons) >= 1 ? array_pop($coupons) : ''; 66 $result['voucher-amount'] = number_format($ order->get_total_discount(false)?: 0, 2) ?: null;133 $result['voucher-amount'] = number_format($discountExcludingTax ?: 0, 2) ?: null; 67 134 $result['ordernumber'] = $order->ID; 68 135 } 69 $_SESSION['freshOrder'] = null;70 136 } 71 137 } … … 112 178 } 113 179 180 if (!$this->getWooCommerce()) { 181 return false; 182 } 183 114 184 $completedOrders = wc_get_orders(['customer' => $currentUser->ID, 'limit' => 1]); 115 185 -
uptain-connect/trunk/vendor/autoload.php
r2973033 r3076289 5 5 require_once __DIR__ . '/composer/autoload_real.php'; 6 6 7 return ComposerAutoloaderInitc a26ed1d89b860abc05bbe65c0c59d17::getLoader();7 return ComposerAutoloaderInitc1ab318e8a4c235637578202f7361c94::getLoader(); -
uptain-connect/trunk/vendor/composer/InstalledVersions.php
r2973033 r3076289 15 15 'root' => 16 16 array ( 17 'pretty_version' => 'dev- 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',18 'version' => 'dev- 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',17 'pretty_version' => 'dev-3a52c7edecceed25e750db4db651ae53276e0543', 18 'version' => 'dev-3a52c7edecceed25e750db4db651ae53276e0543', 19 19 'aliases' => 20 20 array ( 21 21 ), 22 'reference' => ' 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',22 'reference' => '3a52c7edecceed25e750db4db651ae53276e0543', 23 23 'name' => 'webfoersterei/wp-plugin', 24 24 ), … … 253 253 'webfoersterei/wp-plugin' => 254 254 array ( 255 'pretty_version' => 'dev- 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',256 'version' => 'dev- 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',257 'aliases' => 258 array ( 259 ), 260 'reference' => ' 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',255 'pretty_version' => 'dev-3a52c7edecceed25e750db4db651ae53276e0543', 256 'version' => 'dev-3a52c7edecceed25e750db4db651ae53276e0543', 257 'aliases' => 258 array ( 259 ), 260 'reference' => '3a52c7edecceed25e750db4db651ae53276e0543', 261 261 ), 262 262 ), -
uptain-connect/trunk/vendor/composer/autoload_real.php
r2973033 r3076289 3 3 // autoload_real.php @generated by Composer 4 4 5 class ComposerAutoloaderInitc a26ed1d89b860abc05bbe65c0c59d175 class ComposerAutoloaderInitc1ab318e8a4c235637578202f7361c94 6 6 { 7 7 private static $loader; … … 25 25 require __DIR__ . '/platform_check.php'; 26 26 27 spl_autoload_register(array('ComposerAutoloaderInitc a26ed1d89b860abc05bbe65c0c59d17', 'loadClassLoader'), true, true);27 spl_autoload_register(array('ComposerAutoloaderInitc1ab318e8a4c235637578202f7361c94', 'loadClassLoader'), true, true); 28 28 self::$loader = $loader = new \Composer\Autoload\ClassLoader(); 29 spl_autoload_unregister(array('ComposerAutoloaderInitc a26ed1d89b860abc05bbe65c0c59d17', 'loadClassLoader'));29 spl_autoload_unregister(array('ComposerAutoloaderInitc1ab318e8a4c235637578202f7361c94', 'loadClassLoader')); 30 30 31 31 $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); … … 33 33 require __DIR__ . '/autoload_static.php'; 34 34 35 call_user_func(\Composer\Autoload\ComposerStaticInitc a26ed1d89b860abc05bbe65c0c59d17::getInitializer($loader));35 call_user_func(\Composer\Autoload\ComposerStaticInitc1ab318e8a4c235637578202f7361c94::getInitializer($loader)); 36 36 } else { 37 37 $map = require __DIR__ . '/autoload_namespaces.php'; … … 54 54 55 55 if ($useStaticLoader) { 56 $includeFiles = Composer\Autoload\ComposerStaticInitc a26ed1d89b860abc05bbe65c0c59d17::$files;56 $includeFiles = Composer\Autoload\ComposerStaticInitc1ab318e8a4c235637578202f7361c94::$files; 57 57 } else { 58 58 $includeFiles = require __DIR__ . '/autoload_files.php'; 59 59 } 60 60 foreach ($includeFiles as $fileIdentifier => $file) { 61 composerRequirec a26ed1d89b860abc05bbe65c0c59d17($fileIdentifier, $file);61 composerRequirec1ab318e8a4c235637578202f7361c94($fileIdentifier, $file); 62 62 } 63 63 … … 66 66 } 67 67 68 function composerRequirec a26ed1d89b860abc05bbe65c0c59d17($fileIdentifier, $file)68 function composerRequirec1ab318e8a4c235637578202f7361c94($fileIdentifier, $file) 69 69 { 70 70 if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { -
uptain-connect/trunk/vendor/composer/autoload_static.php
r2973033 r3076289 5 5 namespace Composer\Autoload; 6 6 7 class ComposerStaticInitc a26ed1d89b860abc05bbe65c0c59d177 class ComposerStaticInitc1ab318e8a4c235637578202f7361c94 8 8 { 9 9 public static $files = array ( … … 134 134 { 135 135 return \Closure::bind(function () use ($loader) { 136 $loader->prefixLengthsPsr4 = ComposerStaticInitc a26ed1d89b860abc05bbe65c0c59d17::$prefixLengthsPsr4;137 $loader->prefixDirsPsr4 = ComposerStaticInitc a26ed1d89b860abc05bbe65c0c59d17::$prefixDirsPsr4;138 $loader->classMap = ComposerStaticInitc a26ed1d89b860abc05bbe65c0c59d17::$classMap;136 $loader->prefixLengthsPsr4 = ComposerStaticInitc1ab318e8a4c235637578202f7361c94::$prefixLengthsPsr4; 137 $loader->prefixDirsPsr4 = ComposerStaticInitc1ab318e8a4c235637578202f7361c94::$prefixDirsPsr4; 138 $loader->classMap = ComposerStaticInitc1ab318e8a4c235637578202f7361c94::$classMap; 139 139 140 140 }, null, ClassLoader::class); -
uptain-connect/trunk/vendor/composer/installed.php
r2973033 r3076289 2 2 'root' => 3 3 array ( 4 'pretty_version' => 'dev- 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',5 'version' => 'dev- 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',4 'pretty_version' => 'dev-3a52c7edecceed25e750db4db651ae53276e0543', 5 'version' => 'dev-3a52c7edecceed25e750db4db651ae53276e0543', 6 6 'aliases' => 7 7 array ( 8 8 ), 9 'reference' => ' 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',9 'reference' => '3a52c7edecceed25e750db4db651ae53276e0543', 10 10 'name' => 'webfoersterei/wp-plugin', 11 11 ), … … 240 240 'webfoersterei/wp-plugin' => 241 241 array ( 242 'pretty_version' => 'dev- 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',243 'version' => 'dev- 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',244 'aliases' => 245 array ( 246 ), 247 'reference' => ' 4e378fa4c82578cb9bf516bddd9fefbb87aff3ac',242 'pretty_version' => 'dev-3a52c7edecceed25e750db4db651ae53276e0543', 243 'version' => 'dev-3a52c7edecceed25e750db4db651ae53276e0543', 244 'aliases' => 245 array ( 246 ), 247 'reference' => '3a52c7edecceed25e750db4db651ae53276e0543', 248 248 ), 249 249 ), -
uptain-connect/trunk/wf-uptain-tracking.php
r2973033 r3076289 13 13 * Description: Wir entwickeln automatisierte Lösungen zur Rückgewinnung von Kaufabbrechern nach dem neuesten Stand der Technik – gepaart mit absoluter Kundenorientierung. 14 14 * Requires at least: 5.8 15 * Version: 2. 0.115 * Version: 2.2.0 16 16 * Requires PHP: 7.4 17 * Tested up to: 6.4 18 * Tags: E-Commerce, Conversion-Optimierung, Exit-Intent, Warenkorb, Conversion, E-Mail, Big Data, DSGVO, Kundengewinnung, Marketing, Shop, Optimierung 17 19 * Author: uptain GmbH 18 20 * Author URI: https://www.uptain.de/ 19 * Update URI: https://updates.webfoersterei.de/wordpress21 * Contributors: webfoersterei 20 22 */ 21 23 22 24 $slug = 'wf-uptain-tracking'; 23 $plugin = new Plugin(strpos($slug, '$') !== false ? 'plugin' : $slug, '2. 0.1');25 $plugin = new Plugin(strpos($slug, '$') !== false ? 'plugin' : $slug, '2.2.0'); 24 26 $plugin->registerInWordpress(); 25 27
Note: See TracChangeset
for help on using the changeset viewer.