| @@ -223,12 +223,12 @@ | ||
| 223 | 223 | <main class="mxch-content"> |
| 224 | 224 | <?php if (!$is_activated): ?> |
| 225 | 225 | <div class="mxch-pro-banner"> |
| 226 | 226 | <div class="mxch-pro-banner-content"> |
| 227 | - <h3 class="mxch-pro-banner-title"><?php esc_html_e('Stop paying $50–200/month for AI chatbot tools.', 'mxchat'); ?></h3> | |
| 228 | - <p class="mxch-pro-banner-text"><?php esc_html_e('One payment unlocks every MxChat Pro add-on for life — MCP server access for Claude / ChatGPT / Claude Code, WooCommerce sales, Google Search Console insights, AI-generated chatbot themes, lead-capture forms, unlimited bots, image analysis, and more. No renewals. No surprise bills.', 'mxchat'); ?></p> | |
| 227 | + <h3 class="mxch-pro-banner-title"><?php esc_html_e('MxChat Pro — Lifetime Access', 'mxchat'); ?></h3> | |
| 228 | + <p class="mxch-pro-banner-text"><?php esc_html_e('One-time purchase. Unlock 14+ premium add-ons: Chat with GSC, WooCommerce, Chatbot Themes, Forms Builder, and more.', 'mxchat'); ?></p> | |
| 229 | 229 | </div> |
| 230 | - <a href="https://mxchat.ai/" target="_blank" class="mxch-pro-banner-btn"><span><?php esc_html_e('Get Lifetime Access →', 'mxchat'); ?></span></a> | |
| 230 | + <a href="https://mxchat.ai/" target="_blank" class="mxch-pro-banner-btn"><span><?php esc_html_e('Learn More', 'mxchat'); ?></span></a> | |
| 231 | 231 | </div> |
| 232 | 232 | <?php endif; ?> |
| 233 | 233 | |
| 234 | 234 | <?php |
| @@ -313,16 +313,8 @@ | ||
| 313 | 313 | mxchat_render_field_wrapper('citation_links', __('Citation Links', 'mxchat'), function() use ($admin_instance) { |
| 314 | 314 | $admin_instance->mxchat_citation_links_toggle_callback(); |
| 315 | 315 | }, __('Allow the AI to include citation links from your knowledge database in responses. If disabled, ensure your AI Behavior settings do not mention links or the AI may fabricate URLs.', 'mxchat')); |
| 316 | 316 | |
| 317 | - // Satisfaction Rating Prompt | |
| 318 | - // The toggle callback inline-renders the 5 customization | |
| 319 | - // fields inside a single sub-options wrapper (plan-29caac). | |
| 320 | - // No separate customization group needed — the wrapper handles | |
| 321 | - // its own server-side display state based on the toggle value. | |
| 322 | - mxchat_render_field_wrapper('satisfaction_rating', __('Satisfaction Rating Prompt', 'mxchat'), function() use ($admin_instance) { | |
| 323 | - $admin_instance->mxchat_satisfaction_rating_toggle_callback(); | |
| 324 | - }, __('Show a 👍 / 👎 prompt after a conversation has had a couple of bot replies and the visitor has been idle for a moment. Disable to hide the prompt site-wide.', 'mxchat')); | |
| 325 | 317 | ?> |
| 326 | 318 | </div> |
| 327 | 319 | </div> |
| 328 | 320 | </div> |
| @@ -610,99 +602,8 @@ | ||
| 610 | 602 | </div> |
| 611 | 603 | </div> |
| 612 | 604 | </div> |
| 613 | 605 | |
| 614 | - <!-- Page Cache Compatibility Card --> | |
| 615 | - <div class="mxch-card"> | |
| 616 | - <div class="mxch-card-header"> | |
| 617 | - <h3 class="mxch-card-title"> | |
| 618 | - <svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/></svg> | |
| 619 | - <?php esc_html_e('Page Cache Compatibility', 'mxchat'); ?> | |
| 620 | - </h3> | |
| 621 | - </div> | |
| 622 | - <div class="mxch-card-body"> | |
| 623 | - <p class="mxch-field-description" style="margin-top: 0;"><?php esc_html_e('MxChat\'s chat send (and stream send, plus PDF / Word upload) all POST to /wp-admin/admin-ajax.php. Page-cache plugins occasionally cache those responses, which breaks the per-session nonce flow on the first message. MxChat auto-tells the five most common cache plugins to never cache chat AJAX via their own filter APIs — no setup needed for those. For other cache plugins (or Cloudflare APO), copy the manual exclusion string into your cache plugin\'s exclusion list.', 'mxchat'); ?></p> | |
| 624 | - | |
| 625 | - <?php | |
| 626 | - $mxch_cache_rows = array( | |
| 627 | - array('name' => 'WP Rocket', 'state' => 'auto', 'exclusion' => '/wp-admin/admin-ajax\\.php\\?action=mxchat_.*'), | |
| 628 | - array('name' => 'LiteSpeed Cache', 'state' => 'auto', 'exclusion' => '/wp-admin/admin-ajax.php?action=mxchat_*'), | |
| 629 | - array('name' => 'W3 Total Cache', 'state' => 'auto', 'exclusion' => '/wp-admin/admin-ajax.php?action=mxchat_*'), | |
| 630 | - array('name' => 'FlyingPress', 'state' => 'auto', 'exclusion' => '/wp-admin/admin-ajax.php?action=mxchat_*'), | |
| 631 | - array('name' => 'WP Super Cache', 'state' => 'auto', 'exclusion' => 'wp-admin/admin-ajax.php'), | |
| 632 | - array('name' => 'Cloudflare APO', 'state' => 'manual', 'exclusion' => 'Page Rule / Cache Rule: URI Path contains "/wp-admin/admin-ajax.php" → Bypass Cache'), | |
| 633 | - ); | |
| 634 | - ?> | |
| 635 | - | |
| 636 | - <div class="mxch-cache-compat-grid" style="display: grid; grid-template-columns: 1fr; gap: 12px; margin-top: 16px;"> | |
| 637 | - <?php foreach ($mxch_cache_rows as $row) : | |
| 638 | - $is_auto = ($row['state'] === 'auto'); | |
| 639 | - $pill_class = $is_auto ? 'mxch-status-pill-active' : 'mxch-status-pill-warning'; | |
| 640 | - $pill_label = $is_auto ? __('Auto-handled', 'mxchat') : __('Manual', 'mxchat'); | |
| 641 | - ?> | |
| 642 | - <div class="mxch-cache-compat-row" style="display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 14px; background: #f8fafc; border: 1px solid var(--mxch-card-border); border-radius: var(--mxch-radius-md);"> | |
| 643 | - <div style="display: flex; align-items: center; gap: 10px; min-width: 0; flex: 0 0 auto;"> | |
| 644 | - <span style="font-weight: 500;"><?php echo esc_html($row['name']); ?></span> | |
| 645 | - <span class="mxch-status-pill <?php echo esc_attr($pill_class); ?>"> | |
| 646 | - <span class="mxch-status-dot"></span> | |
| 647 | - <?php echo esc_html($pill_label); ?> | |
| 648 | - </span> | |
| 649 | - </div> | |
| 650 | - <div style="display: flex; align-items: center; gap: 8px; flex: 1 1 auto; min-width: 0;"> | |
| 651 | - <code style="background: #fff; border: 1px solid var(--mxch-card-border); padding: 4px 8px; border-radius: var(--mxch-radius-sm); font-size: 12px; color: var(--mxch-text-secondary); flex: 1 1 auto; overflow-x: auto; white-space: nowrap; min-width: 0;"><?php echo esc_html($row['exclusion']); ?></code> | |
| 652 | - <button type="button" class="mxch-btn mxch-btn-secondary mxch-btn-sm" data-mxch-copy="<?php echo esc_attr($row['exclusion']); ?>" style="flex: 0 0 auto;"> | |
| 653 | - <?php esc_html_e('Copy', 'mxchat'); ?> | |
| 654 | - </button> | |
| 655 | - </div> | |
| 656 | - </div> | |
| 657 | - <?php endforeach; ?> | |
| 658 | - </div> | |
| 659 | - | |
| 660 | - <div class="mxch-notice mxch-notice-info" style="margin-top: 16px;"> | |
| 661 | - <svg class="mxch-notice-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg> | |
| 662 | - <span><?php esc_html_e('Auto-handled plugins receive a filter from MxChat that excludes chat AJAX from their cache. Even so, having the exclusion in your own exclusion list is harmless and acts as a belt-and-suspenders guarantee.', 'mxchat'); ?></span> | |
| 663 | - </div> | |
| 664 | - </div> | |
| 665 | - </div> | |
| 666 | - | |
| 667 | - <!-- Provider Reliability Card --> | |
| 668 | - <?php | |
| 669 | - $auto_retry_enabled = !isset($options['auto_retry_on_transient_error']) || | |
| 670 | - (string) $options['auto_retry_on_transient_error'] !== '0'; | |
| 671 | - ?> | |
| 672 | - <div class="mxch-card"> | |
| 673 | - <div class="mxch-card-header"> | |
| 674 | - <h3 class="mxch-card-title"> | |
| 675 | - <svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-6.219-8.56"/><polyline points="21 4 21 10 15 10"/></svg> | |
| 676 | - <?php esc_html_e('Provider Reliability', 'mxchat'); ?> | |
| 677 | - </h3> | |
| 678 | - <span class="mxch-status-pill <?php echo $auto_retry_enabled ? 'mxch-status-pill-active' : 'mxch-status-pill-disabled'; ?>"> | |
| 679 | - <span class="mxch-status-dot"></span> | |
| 680 | - <?php echo $auto_retry_enabled ? esc_html__('Active', 'mxchat') : esc_html__('Disabled', 'mxchat'); ?> | |
| 681 | - </span> | |
| 682 | - </div> | |
| 683 | - <div class="mxch-card-body mxchat-autosave-section"> | |
| 684 | - <div class="mxch-field"> | |
| 685 | - <label class="mxch-field-label" for="auto_retry_on_transient_error"> | |
| 686 | - <?php esc_html_e('Auto-retry on provider overload', 'mxchat'); ?> | |
| 687 | - </label> | |
| 688 | - <div class="mxch-field-control"> | |
| 689 | - <label class="mxch-toggle"> | |
| 690 | - <input type="checkbox" | |
| 691 | - id="auto_retry_on_transient_error" | |
| 692 | - name="mxchat_options[auto_retry_on_transient_error]" | |
| 693 | - class="mxchat-autosave-field" | |
| 694 | - value="1" | |
| 695 | - <?php checked($auto_retry_enabled); ?> /> | |
| 696 | - <span class="mxch-toggle-slider"></span> | |
| 697 | - </label> | |
| 698 | - </div> | |
| 699 | - <p class="mxch-field-description"><?php esc_html_e('When the AI provider returns a transient error (rate-limit / overload / 429 / 503 / Gemini "model overloaded"), MxChat retries the chat-send up to twice before surfacing the error. Visitors see a brief pause instead of a raw provider error in the bot bubble.', 'mxchat'); ?></p> | |
| 700 | - <p class="mxch-field-hint"><?php esc_html_e('Configuration errors (invalid API key, 401/403/404/422) still surface immediately — never retried.', 'mxchat'); ?></p> | |
| 701 | - </div> | |
| 702 | - </div> | |
| 703 | - </div> | |
| 704 | - | |
| 705 | 606 | <!-- Debug Mode Card --> |
| 706 | 607 | <?php |
| 707 | 608 | $debug_mode = isset($options['debug_mode']) ? $options['debug_mode'] : 'off'; |
| 708 | 609 | $debug_active = ($debug_mode === 'on'); |
| @@ -1041,40 +942,8 @@ | ||
| 1041 | 942 | <h1 class="mxch-content-title"><?php esc_html_e('Video Tutorials', 'mxchat'); ?></h1> |
| 1042 | 943 | <p class="mxch-content-subtitle"><?php esc_html_e('Learn how to get the most out of MxChat with our video guides.', 'mxchat'); ?></p> |
| 1043 | 944 | </div> |
| 1044 | 945 | |
| 1045 | - <?php | |
| 1046 | - // Setup Guide — reopen the onboarding wizard (plan-347916, moved here from Display tab). | |
| 1047 | - // Only shows once the user has dismissed/graduated from the Onboarding page. | |
| 1048 | - if (function_exists('mxchat_onboarding_is_dismissed') && mxchat_onboarding_is_dismissed()): | |
| 1049 | - $auto_grad = function_exists('mxchat_onboarding_is_auto_graduated') && mxchat_onboarding_is_auto_graduated(); | |
| 1050 | - ?> | |
| 1051 | - <div class="mxch-card mxch-onboarding-unhide-card" style="margin-bottom: 24px;"> | |
| 1052 | - <div class="mxch-card-header"> | |
| 1053 | - <h3 class="mxch-card-title"> | |
| 1054 | - <svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 10v6M2 10l10-5 10 5-10 5z"/><path d="M6 12v5c0 2 3 3 6 3s6-1 6-3v-5"/></svg> | |
| 1055 | - <?php esc_html_e('Setup Guide', 'mxchat'); ?> | |
| 1056 | - </h3> | |
| 1057 | - </div> | |
| 1058 | - <div class="mxch-card-body"> | |
| 1059 | - <p style="margin:0 0 12px;color:var(--mxch-text-secondary);font-size:13px;line-height:1.5;"> | |
| 1060 | - <?php if ($auto_grad): ?> | |
| 1061 | - <?php esc_html_e('You finished the setup guide. Reopen it any time to revisit the steps or change a setup choice.', 'mxchat'); ?> | |
| 1062 | - <?php else: ?> | |
| 1063 | - <?php esc_html_e('You hid the setup guide from the MxChat menu. Reopen it any time to revisit the steps.', 'mxchat'); ?> | |
| 1064 | - <?php endif; ?> | |
| 1065 | - </p> | |
| 1066 | - <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" style="margin:0;"> | |
| 1067 | - <?php wp_nonce_field('mxchat_unhide_onboarding'); ?> | |
| 1068 | - <input type="hidden" name="action" value="mxchat_unhide_onboarding" /> | |
| 1069 | - <button type="submit" class="mxch-btn mxch-btn-secondary mxch-btn-sm"> | |
| 1070 | - <?php esc_html_e('Reopen setup guide', 'mxchat'); ?> | |
| 1071 | - </button> | |
| 1072 | - </form> | |
| 1073 | - </div> | |
| 1074 | - </div> | |
| 1075 | - <?php endif; ?> | |
| 1076 | - | |
| 1077 | 946 | <div class="mxch-card" style="margin-bottom: 24px;"> |
| 1078 | 947 | <div class="mxch-card-body"> |
| 1079 | 948 | <div style="display: flex; align-items: flex-start; gap: 16px;"> |
| 1080 | 949 | <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="color: var(--mxch-warning); flex-shrink: 0;"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg> |
| @@ -1390,43 +1259,20 @@ | ||
| 1390 | 1259 | } |
| 1391 | 1260 | }); |
| 1392 | 1261 | }); |
| 1393 | 1262 | |
| 1394 | - // Handle initial deep-link (?tab=<slug> takes precedence over #hash so the | |
| 1395 | - // Onboarding setup-step CTAs land on the right sub-tab). Whitelist of valid | |
| 1396 | - // section ids must stay in sync with the .mxch-section[id] values above. | |
| 1397 | - const validTabs = [ | |
| 1398 | - 'chatbot-ai-models', 'chatbot-behavior', 'chatbot-display', | |
| 1399 | - 'chatbot-lead-capture', 'chatbot-quick-questions', 'chatbot-rate-limits', | |
| 1400 | - 'api-keys', 'optimization', 'testing', | |
| 1401 | - 'integrations-toolbar', 'integrations-loops', 'integrations-brave', | |
| 1402 | - 'integrations-slack', 'integrations-telegram', | |
| 1403 | - 'tutorials' | |
| 1404 | - ]; | |
| 1405 | - function activateTab(target) { | |
| 1406 | - if (!target) return false; | |
| 1407 | - if (validTabs.indexOf(target) === -1) return false; | |
| 1408 | - const targetLink = document.querySelector('[data-target="' + target + '"]'); | |
| 1409 | - if (!targetLink) return false; | |
| 1410 | - const parentItem = targetLink.closest('.mxch-nav-item'); | |
| 1411 | - if (parentItem && targetLink.classList.contains('mxch-nav-sub-link')) { | |
| 1412 | - parentItem.classList.add('expanded'); | |
| 1413 | - } | |
| 1414 | - showSection(target); | |
| 1415 | - setActiveNav(targetLink); | |
| 1416 | - return true; | |
| 1417 | - } | |
| 1418 | - const urlParams = new URLSearchParams(window.location.search); | |
| 1419 | - const tabParam = urlParams.get('tab'); | |
| 1420 | - let tabActivated = false; | |
| 1421 | - if (tabParam) { | |
| 1422 | - tabActivated = activateTab(tabParam); | |
| 1423 | - // Invalid ?tab=… silently falls through to default (#hash or AI Models). | |
| 1424 | - } | |
| 1425 | - if (!tabActivated) { | |
| 1426 | - const hash = window.location.hash.slice(1); | |
| 1427 | - if (hash) { | |
| 1428 | - activateTab(hash); | |
| 1263 | + // Handle initial hash | |
| 1264 | + const hash = window.location.hash.slice(1); | |
| 1265 | + if (hash) { | |
| 1266 | + const targetLink = document.querySelector('[data-target="' + hash + '"]'); | |
| 1267 | + if (targetLink) { | |
| 1268 | + // Expand parent if it's a sub-link | |
| 1269 | + const parentItem = targetLink.closest('.mxch-nav-item'); | |
| 1270 | + if (parentItem && targetLink.classList.contains('mxch-nav-sub-link')) { | |
| 1271 | + parentItem.classList.add('expanded'); | |
| 1272 | + } | |
| 1273 | + showSection(hash); | |
| 1274 | + setActiveNav(targetLink); | |
| 1429 | 1275 | } |
| 1430 | 1276 | } |
| 1431 | 1277 | |
| 1432 | 1278 | // Rate limit accordion |