From 3a7f791fa9258ce79ade921ec0decdd57b2317e3 Mon Sep 17 00:00:00 2001 From: Karl Breuer Date: Wed, 16 Apr 2025 16:13:31 +0200 Subject: [PATCH] fixed wp plugin --- .gitignore | 3 +- README.md | 10 + wordpress/block.js | 133 ----- .../assets/css/admin.css | 40 ++ .../assets/css/index.php | 2 + .../assets/css}/tracking-block.css | 13 +- .../assets/index.php | 2 + .../assets/js/block.js | 87 +++ .../assets/js/class-tracking.js | 87 +++ .../assets/js/index.php | 2 + .../assets/js/tracking-script.js | 95 +++ .../includes/class-admin.php | 149 +++++ .../includes/class-loader.php | 92 +++ .../includes/class-tracking.php | 261 ++++++++ .../includes/index.php | 1 + wordpress/palantics-tracking-plugin/index.php | 1 + .../palantics-tracking-plugin.php | 81 +++ wordpress/simple-tracking.php | 555 ------------------ 18 files changed, 921 insertions(+), 693 deletions(-) delete mode 100644 wordpress/block.js create mode 100644 wordpress/palantics-tracking-plugin/assets/css/admin.css create mode 100644 wordpress/palantics-tracking-plugin/assets/css/index.php rename wordpress/{ => palantics-tracking-plugin/assets/css}/tracking-block.css (63%) create mode 100644 wordpress/palantics-tracking-plugin/assets/index.php create mode 100644 wordpress/palantics-tracking-plugin/assets/js/block.js create mode 100644 wordpress/palantics-tracking-plugin/assets/js/class-tracking.js create mode 100644 wordpress/palantics-tracking-plugin/assets/js/index.php create mode 100644 wordpress/palantics-tracking-plugin/assets/js/tracking-script.js create mode 100644 wordpress/palantics-tracking-plugin/includes/class-admin.php create mode 100644 wordpress/palantics-tracking-plugin/includes/class-loader.php create mode 100644 wordpress/palantics-tracking-plugin/includes/class-tracking.php create mode 100644 wordpress/palantics-tracking-plugin/includes/index.php create mode 100644 wordpress/palantics-tracking-plugin/index.php create mode 100644 wordpress/palantics-tracking-plugin/palantics-tracking-plugin.php delete mode 100644 wordpress/simple-tracking.php diff --git a/.gitignore b/.gitignore index 6e2ee72..95d0c10 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .env deploy.sh -/palanticshelper \ No newline at end of file +/palanticshelper +*.zip \ No newline at end of file diff --git a/README.md b/README.md index 6edfe4e..a357f95 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,16 @@ While direct integration between the frontend script and tracker server is possi The WordPress plugin includes the helper functionality integrated into the PHP backend for seamless operation. 1. Copy the contents of the WordPress folder to your WordPress plugins directory + + +OR zip it and upload + +```bash +cd wordpress +zip -r palantics-tracking-plugin.zip palantics-tracking-plugin/ +``` + + 2. Configure the tracker endpoint with your domain in the plugin settings 3. Track click events by either: - Wrapping elements in the Analysis block diff --git a/wordpress/block.js b/wordpress/block.js deleted file mode 100644 index 6e52287..0000000 --- a/wordpress/block.js +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Tracking Block for Gutenberg with Popup Editor - */ -(function(blocks, element, blockEditor) { - var el = element.createElement; - var InnerBlocks = blockEditor.InnerBlocks; - var useBlockProps = blockEditor.useBlockProps; - var __ = wp.i18n.__; - var Button = wp.components.Button; - var Popover = wp.components.Popover; - var TextControl = wp.components.TextControl; - var useState = wp.element.useState; - - blocks.registerBlockType('simplified-tracking/track-element', { - title: 'Tracking Wrapper', - icon: 'chart-bar', - category: 'design', - attributes: { - eventName: { - type: 'string', - default: 'tracked_element' - } - }, - - edit: function(props) { - var blockProps = useBlockProps(); - var eventName = props.attributes.eventName; - var [isPopoverVisible, setPopoverVisible] = useState(false); - - function onChangeEventName(newEventName) { - props.setAttributes({ eventName: newEventName }); - } - - return el( - 'div', - blockProps, - el( - 'div', - { className: 'tracking-block-wrapper' }, - el( - 'div', - { className: 'tracking-block-notice' }, - 'Event: ' + eventName, - el( - Button, - { - isSmall: true, - onClick: function() { - setPopoverVisible(!isPopoverVisible); - }, - style: { - marginLeft: '8px', - background: 'white', - color: '#007cba' - } - }, - 'Edit' - ), - isPopoverVisible && el( - Popover, - { - onClose: function() { - setPopoverVisible(false); - }, - position: 'bottom', - focusOnMount: 'firstElement' - }, - el( - 'div', - { - style: { - padding: '16px', - width: '300px' - } - }, - el( - 'h3', - { - style: { - margin: '0 0 8px 0' - } - }, - 'Tracking Event Settings' - ), - el( - TextControl, - { - label: 'Event Name', - value: eventName, - onChange: onChangeEventName, - help: 'Enter the event name to track when this element is clicked' - } - ), - el( - Button, - { - isPrimary: true, - onClick: function() { - setPopoverVisible(false); - } - }, - 'Done' - ) - ) - ) - ), - el( - 'div', - { style: { marginTop: '5px' } }, - el(InnerBlocks) - ) - ) - ); - }, - - save: function(props) { - var blockProps = useBlockProps.save({ - className: 'tracking-block-wrapper', - onClick: "tE('" + props.attributes.eventName + "')" - }); - - return el( - 'div', - blockProps, - el(InnerBlocks.Content) - ); - } - }); -}( - window.wp.blocks, - window.wp.element, - window.wp.blockEditor -)); \ No newline at end of file diff --git a/wordpress/palantics-tracking-plugin/assets/css/admin.css b/wordpress/palantics-tracking-plugin/assets/css/admin.css new file mode 100644 index 0000000..1f9ec5d --- /dev/null +++ b/wordpress/palantics-tracking-plugin/assets/css/admin.css @@ -0,0 +1,40 @@ +/** + * Palantics Admin Styles + */ + + .palantics-heading { + color: #007cba; + font-weight: bold; +} + +.palantics-methods-container { + background-color: #fff; + padding: 20px; + margin-top: 20px; + border: 1px solid #ccc; + border-radius: 4px; +} + +.palantics-method { + margin-bottom: 20px; +} + +.palantics-method-title { + font-size: 16px; + font-weight: bold; + margin-bottom: 10px; +} + +.palantics-code-sample { + background-color: #f5f5f5; + padding: 10px; + border-radius: 4px; + font-family: monospace; + margin-top: 5px; +} + +.palantics-description { + margin-top: 5px; + font-size: 13px; + color: #666; +} \ No newline at end of file diff --git a/wordpress/palantics-tracking-plugin/assets/css/index.php b/wordpress/palantics-tracking-plugin/assets/css/index.php new file mode 100644 index 0000000..7dcf24e --- /dev/null +++ b/wordpress/palantics-tracking-plugin/assets/css/index.php @@ -0,0 +1,2 @@ + + + + setAttributes({ eventName: value })} + help={__('Enter the event name that will be used for tracking this element', 'palantics-tracking-plugin')} + /> + + + +
+
+ {__('Palantics Tracking Element', 'palantics-tracking-plugin')} +
+
+ {__('Event:', 'palantics-tracking-plugin')} {eventName} +
+
+ {__('This element will be tracked when clicked', 'palantics-tracking-plugin')} +
+
+ + ); + }, + + save: function(props) { + const { attributes } = props; + const { eventName } = attributes; + + return ( +
+
+ {props.children} +
+
+ ); + }, +}); \ No newline at end of file diff --git a/wordpress/palantics-tracking-plugin/assets/js/class-tracking.js b/wordpress/palantics-tracking-plugin/assets/js/class-tracking.js new file mode 100644 index 0000000..6eca62f --- /dev/null +++ b/wordpress/palantics-tracking-plugin/assets/js/class-tracking.js @@ -0,0 +1,87 @@ +/** + * Palantics class-based tracking script + */ + +document.addEventListener('DOMContentLoaded', function() { + // Helper function to get element details for tracking + function getElementDetails(element) { + const details = {}; + + // Get element text or alternative + if (element.textContent && element.textContent.trim()) { + details.text = element.textContent.trim(); + } else if (element.placeholder) { + details.text = element.placeholder; + } else if (element.value) { + details.text = element.value; + } else if (element.alt) { + details.text = element.alt; + } else if (element.getAttribute('aria-label')) { + details.text = element.getAttribute('aria-label'); + } + + // Limit text length + if (details.text && details.text.length > 50) { + details.text = details.text.substring(0, 47) + '...'; + } + + // Get element ID, class and href if available + if (element.id) { + details.id = element.id; + } + + if (element.className) { + details.class = element.className; + } + + if (element.href) { + const href = element.href; + // Only include if it's not too long + if (href.length < 100) { + details.href = href; + } + } + + return details; + } + + // Function to initialize tracking for a specific class + function initializeClassTracking(className) { + const elements = document.querySelectorAll('.' + className); + elements.forEach(function(element) { + element.addEventListener('click', function(e) { + const details = getElementDetails(element); + tE('custom_element_click', { + element: 'custom', + class: className, + ...details + }); + }); + }); + } + + // Track elements with data-track attribute + function initializeDataAttributeTracking() { + const trackedElements = document.querySelectorAll('[data-track]'); + trackedElements.forEach(function(element) { + element.addEventListener('click', function(e) { + const eventName = element.getAttribute('data-track') || 'tracked_element'; + const details = getElementDetails(element); + tE(eventName, { + element: 'data-track', + ...details + }); + }); + }); + } + + // Initialize data attribute tracking + initializeDataAttributeTracking(); + + // If trackClasses is defined (will be injected by WordPress), initialize class tracking + if (typeof trackClasses !== 'undefined' && Array.isArray(trackClasses)) { + trackClasses.forEach(function(className) { + initializeClassTracking(className); + }); + } +}); \ No newline at end of file diff --git a/wordpress/palantics-tracking-plugin/assets/js/index.php b/wordpress/palantics-tracking-plugin/assets/js/index.php new file mode 100644 index 0000000..7dcf24e --- /dev/null +++ b/wordpress/palantics-tracking-plugin/assets/js/index.php @@ -0,0 +1,2 @@ + { + console.error("Tracking error:", e); + + // If POST fails, try GET as fallback + fetch(restApiEndpoint + '?' + serializeObject(data), { + method: "GET", + mode: "no-cors", + cache: "no-cache", + credentials: "omit", + headers: { + "X-Final-Destination": server + }, + keepalive: true, + }).catch(e2 => { + console.error("Fallback tracking error:", e2); + }); + }); + + return true; + } catch (e) { + console.error("Tracking error:", e); + } + } + + return sendInfo(); +} + +// Page load tracking function +function pL() { + tE("pageLoad_" + window.location.pathname); +} + +// Set up page load tracking +document.addEventListener("DOMContentLoaded", function() { + try { + pL(); + } catch (error) { + console.error("Error in page load tracking:", error); + } +}); \ No newline at end of file diff --git a/wordpress/palantics-tracking-plugin/includes/class-admin.php b/wordpress/palantics-tracking-plugin/includes/class-admin.php new file mode 100644 index 0000000..eb9cb70 --- /dev/null +++ b/wordpress/palantics-tracking-plugin/includes/class-admin.php @@ -0,0 +1,149 @@ +Configure your Palantics tracking server settings.

'; + } + + /** + * Auto tracking settings section callback + */ + public function auto_settings_section_callback() { + echo '

Configure which elements to track based on CSS classes.

'; + } + + /** + * Server URL field callback + */ + public function server_url_callback() { + $value = get_option('palantics_tracking_server_url', $this->tracking_server_url); + echo ''; + echo '

Enter the tracking server URL without https:// (e.g., tracking1.karlbreuer.com)

'; + echo '

You will find this in your domain screen in the Palantics app

'; + } + + /** + * Track classes callback + */ + public function track_classes_callback() { + $value = get_option('palantics_tracking_track_classes', ''); + echo ''; + echo '

Enter comma-separated class names to automatically track clicks on elements with these classes (e.g., cta-button, featured-product)

'; + } + + /** + * Render settings page + */ + public function render_settings_page() { + ?> +
+

Palantics Tracking Settings

+
+ +
+ +
+

Manual Tracking Methods

+ +
+

Method 1: Using Data Attributes

+

Add the data-track attribute to any HTML element to track clicks:

+
<button data-track="signup_button_click">Sign Up</button>
+
+ +
+

Method 2: Using Shortcode

+

Wrap any content with the shortcode to track clicks:

+
[track_element event="download_click" class="your-class" style="your-style"]
+    Your content here (can include other shortcodes)
+[/track_element]
+
+ +
+

Method 3: Using Direct JavaScript

+

You can also manually add onclick="tE('your_event_name')" to any HTML element.

+
+
+
+ + + + 'POST', + 'callback' => array($this, 'handle_rest_request'), + 'permission_callback' => '__return_true', // Allow unauthenticated access + )); + + // Also register GET method for easier testing and compatibility + register_rest_route('palantics/v1', '/sun', array( + 'methods' => 'GET', + 'callback' => array($this, 'handle_rest_request'), + 'permission_callback' => '__return_true', // Allow unauthenticated access + )); + } + + /** + * Handle REST API request for tracking + */ + public function handle_rest_request($request) { + // Get all parameters from the request + $params = $request->get_params(); + + // Add IP address to the parameters + $params['ip'] = $this->get_real_ip(); + + // Forward tracking data to the tracking server + $this->forward_to_tracker($params, $request); + + // Return an empty success response + return new WP_REST_Response(array('status' => 'success'), 200); + } + + /** + * Shortcode for tracking elements + */ + public function tracking_shortcode($atts, $content = null) { + $atts = shortcode_atts(array( + 'event' => 'tracked_element', + 'class' => '', + 'style' => '', + ), $atts, 'track_element'); + + // Sanitize attributes + $event = esc_attr($atts['event']); + $class = esc_attr($atts['class']); + $style = esc_attr($atts['style']); + + // Return the div with content and onclick attribute + return sprintf( + '
%s
', + $class, + $style, + $event, + do_shortcode($content) + ); + } + + /** + * Register Gutenberg tracking block + */ + public function register_tracking_block() { + // Only register block if Gutenberg is available + if (!function_exists('register_block_type')) { + return; + } + + // Register block script + wp_register_script( + 'palantics-tracking-block-editor', + PALANTICS_PLUGIN_URL . 'assets/js/block.js', + array( + 'wp-blocks', + 'wp-element', + 'wp-block-editor', + 'wp-components', + 'wp-i18n' + ), + PALANTICS_PLUGIN_VERSION + ); + + // Register block styles + wp_register_style( + 'palantics-tracking-block-editor-style', + PALANTICS_PLUGIN_URL . 'assets/css/tracking-block.css', + array(), + PALANTICS_PLUGIN_VERSION + ); + + // Register the block + register_block_type('palantics-tracking/track-element', array( + 'editor_script' => 'palantics-tracking-block-editor', + 'editor_style' => 'palantics-tracking-block-editor-style', + 'attributes' => array( + 'eventName' => array( + 'type' => 'string', + 'default' => 'tracked_element', + ), + ), + )); + + // Add inline script to ensure tE function is available in editor + wp_add_inline_script('palantics-tracking-block-editor', " + // Mock tE function for the editor if it doesn't exist + if (typeof window.tE === 'undefined') { + window.tE = function(eventName) { + console.log('Tracking event: ' + eventName); + }; + } + "); + } + + /** + * Forward the request to the tracking server + */ + public function forward_to_tracker($params, $request) { + // Get tracking server URL from settings + $tracking_server_url = get_option('palantics_tracking_server_url', $this->tracking_server_url); + $forward_url = 'https://' . $tracking_server_url . '/spur'; + + // Create a new cURL resource + $ch = curl_init(); + + // Set URL and other appropriate options + curl_setopt($ch, CURLOPT_URL, $forward_url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request->get_method()); + + // Build query string from parameters + $query_string = http_build_query($params); + curl_setopt($ch, CURLOPT_URL, $forward_url . '?' . $query_string); + + // Prepare headers + $headers = array(); + + // Get all request headers + $request_headers = $request->get_headers(); + + // Check for final destination header + if (isset($request_headers['x_final_destination']) && !empty($request_headers['x_final_destination'][0])) { + // If a custom destination is provided in the header, use it + $final_destination = $request_headers['x_final_destination'][0]; + $forward_url = 'https://' . $final_destination . '/spur'; + curl_setopt($ch, CURLOPT_URL, $forward_url . '?' . $query_string); + + // Add the header to the forwarded request + $headers[] = "X-Final-Destination: " . $final_destination; + } + + // Forward all other headers + foreach ($request_headers as $name => $values) { + if ($name !== 'x_final_destination') { + foreach ($values as $value) { + $headers[] = sprintf("%s: %s", str_replace('_', '-', ucwords($name, '_')), $value); + } + } + } + + // Set headers for cURL request + if (!empty($headers)) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + } + + // Execute request + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + if (curl_errno($ch)) { + error_log('Palantics tracking error: ' . curl_error($ch)); + $http_code = 500; + } + + // Close cURL resource + curl_close($ch); + + return $http_code; + } + + /** + * Get the real IP address + */ + private function get_real_ip() { + if (!empty($_SERVER['HTTP_CLIENT_IP'])) { + $ip = $_SERVER['HTTP_CLIENT_IP']; + } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; + } else { + $ip = $_SERVER['REMOTE_ADDR']; + } + return $ip; + } +} \ No newline at end of file diff --git a/wordpress/palantics-tracking-plugin/includes/index.php b/wordpress/palantics-tracking-plugin/includes/index.php new file mode 100644 index 0000000..f0f663c --- /dev/null +++ b/wordpress/palantics-tracking-plugin/includes/index.php @@ -0,0 +1 @@ +tracking = new Palantics_Tracking(); + + // Initialize admin + $this->admin = new Palantics_Admin(); + + // Initialize loader + $this->loader = new Palantics_Loader(); + + // Add settings link on plugin page + add_filter('plugin_action_links_' . plugin_basename(__FILE__), array($this, 'add_settings_link')); + } + + /** + * Get plugin instance + */ + public static function get_instance() { + if (null === self::$instance) { + self::$instance = new self(); + } + return self::$instance; + } + + /** + * Add settings link to plugin page + */ + public function add_settings_link($links) { + $settings_link = 'Settings'; + array_unshift($links, $settings_link); + return $links; + } +} + +// Initialize the plugin +function palantics_tracking_init() { + Palantics_Tracking_Plugin::get_instance(); +} +add_action('plugins_loaded', 'palantics_tracking_init'); \ No newline at end of file diff --git a/wordpress/simple-tracking.php b/wordpress/simple-tracking.php deleted file mode 100644 index f269f87..0000000 --- a/wordpress/simple-tracking.php +++ /dev/null @@ -1,555 +0,0 @@ -tracking_server_url)); - ?> - - - - - - - - - - 'tracked_element', - 'class' => '', - 'style' => '', - ), $atts, 'track_element'); - - // Sanitize attributes - $event = esc_attr($atts['event']); - $class = esc_attr($atts['class']); - $style = esc_attr($atts['style']); - - // Return the div with content and onclick attribute - return sprintf( - '
%s
', - $class, - $style, - $event, - do_shortcode($content) - ); - } - - /** - * Register Gutenberg tracking block - */ - public function register_tracking_block() { - // Only register block if Gutenberg is available - if (!function_exists('register_block_type')) { - return; - } - - // Register block script - wp_register_script( - 'tracking-block-editor', - plugins_url('block.js', __FILE__), - array( - 'wp-blocks', - 'wp-element', - 'wp-block-editor', - 'wp-components', - 'wp-i18n' - ), - filemtime(plugin_dir_path(__FILE__) . 'block.js') - ); - - // Register block styles - wp_register_style( - 'tracking-block-editor-style', - plugins_url('block.css', __FILE__), - array(), - filemtime(plugin_dir_path(__FILE__) . 'tracking-block.css') - ); - - // Register the block - register_block_type('simplified-tracking/track-element', array( - 'editor_script' => 'tracking-block-editor', - 'editor_style' => 'tracking-block-editor-style', - 'attributes' => array( - 'eventName' => array( - 'type' => 'string', - 'default' => 'tracked_element', - ), - ), - )); - - // Add inline script to ensure tE function is available in editor - wp_add_inline_script('tracking-block-editor', " - // Mock tE function for the editor if it doesn't exist - if (typeof window.tE === 'undefined') { - window.tE = function(eventName) { - console.log('Tracking event: ' + eventName); - }; - } - "); - } - - /** - * Register tracking endpoint - */ - public function register_tracking_endpoint() { - add_rewrite_rule('^track/?$', 'index.php?tracking_endpoint=1', 'top'); - add_rewrite_tag('%tracking_endpoint%', '1'); - add_action('parse_request', array($this, 'handle_tracking_request')); - - // Flush rewrite rules only on plugin activation - if (get_option('simple_tracking_flush_rules', false)) { - flush_rewrite_rules(); - update_option('simple_tracking_flush_rules', false); - } - } - - /** - * Handle tracking request - */ - public function handle_tracking_request($wp) { - if (isset($wp->query_vars['tracking_endpoint'])) { - $this->forward_to_tracker(); - exit; - } - } - - /** - * Forward the request to the tracking server - */ - public function forward_to_tracker() { - // Get tracking server URL from settings - $tracking_server_url = get_option('simple_tracking_server_url', $this->tracking_server_url); - $forward_url = 'https://' . $tracking_server_url . '/spur'; - - // Create a new cURL resource - $ch = curl_init(); - - // Set URL and other appropriate options - curl_setopt($ch, CURLOPT_URL, $forward_url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $_SERVER['REQUEST_METHOD']); - - // Get query parameters and add IP - $query = $_GET; - $query['ip'] = $this->get_real_ip(); - - // Build query string - $query_string = http_build_query($query); - curl_setopt($ch, CURLOPT_URL, $forward_url . '?' . $query_string); - - // Prepare headers - $headers = array(); - $all_headers = function_exists('getallheaders') ? getallheaders() : $this->get_all_headers(); - - // Forward all headers, checking for the final destination - foreach ($all_headers as $name => $value) { - if ($name == 'X-Final-Destination' && !empty($value)) { - // If a custom destination is provided in the header, use it - $forward_url = 'https://' . $value . '/spur'; - curl_setopt($ch, CURLOPT_URL, $forward_url . '?' . $query_string); - } - $headers[] = "$name: $value"; - } - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - - // Execute request - $response = curl_exec($ch); - $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); - - if (curl_errno($ch)) { - $http_code = 500; - } - - // Close cURL resource - curl_close($ch); - - // Send response - http_response_code($http_code); - header('Content-Type: application/json'); - echo '{}'; - exit; - } - - /** - * Fallback implementation of getallheaders() for servers that don't have it - */ - private function get_all_headers() { - $headers = []; - foreach ($_SERVER as $name => $value) { - if (substr($name, 0, 5) == 'HTTP_') { - $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; - } - } - return $headers; - } - - /** - * Get the real IP address - */ - private function get_real_ip() { - if (!empty($_SERVER['HTTP_CLIENT_IP'])) { - $ip = $_SERVER['HTTP_CLIENT_IP']; - } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { - $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; - } else { - $ip = $_SERVER['REMOTE_ADDR']; - } - return $ip; - } - - /** - * Add settings page - */ - public function add_settings_page() { - add_options_page( - 'Tracking Settings', - 'Tracking Settings', - 'manage_options', - 'simple-tracking-settings', - array($this, 'render_settings_page') - ); - } - - /** - * Register settings - */ - public function register_settings() { - register_setting('simple_tracking_settings', 'simple_tracking_server_url'); - register_setting('simple_tracking_settings', 'simple_tracking_track_classes'); - - add_settings_section( - 'simple_tracking_section', - 'Tracking Settings', - array($this, 'settings_section_callback'), - 'simple-tracking-settings' - ); - - add_settings_field( - 'simple_tracking_server_url', - 'Tracking Server URL', - array($this, 'server_url_callback'), - 'simple-tracking-settings', - 'simple_tracking_section' - ); - - add_settings_section( - 'simple_tracking_auto_section', - 'Element Tracking Settings', - array($this, 'auto_settings_section_callback'), - 'simple-tracking-settings' - ); - - add_settings_field( - 'simple_tracking_track_classes', - 'Track Elements with Classes', - array($this, 'track_classes_callback'), - 'simple-tracking-settings', - 'simple_tracking_auto_section' - ); - } - - /** - * Settings section callback - */ - public function settings_section_callback() { - echo '

Configure your tracking server settings.

'; - } - - /** - * Auto tracking settings section callback - */ - public function auto_settings_section_callback() { - echo '

Configure which elements to track based on CSS classes.

'; - } - - /** - * Server URL field callback - */ - public function server_url_callback() { - $value = get_option('simple_tracking_server_url', $this->tracking_server_url); - echo ''; - echo '

Enter the tracking server URL without https:// (e.g., tracking1.karlbreuer.com)

'; - echo '

You will find this in your domain screen in the Palantics app

'; - } - - /** - * Track classes callback - */ - public function track_classes_callback() { - $value = get_option('simple_tracking_track_classes', ''); - echo ''; - echo '

Enter comma-separated class names to automatically track clicks on elements with these classes (e.g., cta-button, featured-product)

'; - } - - /** - * Render settings page - */ - public function render_settings_page() { - ?> -
-

-
- -
- -
-

Manual Tracking Methods

- -
-

Method 1: Using Data Attributes

-

Add the data-track attribute to any HTML element to track clicks:

-
<button data-track="signup_button_click">Sign Up</button>
-
- -
-

Method 2: Using Shortcode

-

Wrap any content with the shortcode to track clicks:

-
[track_element event="download_click" class="your-class" style="your-style"]
-    Your content here (can include other shortcodes)
-[/track_element]
-
- -
-

Method 3: Using Direct JavaScript

-

You can also manually add onclick="tE('your_event_name')" to any HTML element.

-
-
-
-