Changeset 3451734
- Timestamp:
- 02/02/2026 05:54:34 AM (2 weeks ago)
- Location:
- abtestkit/trunk
- Files:
-
- 5 edited
-
abtestkit.php (modified) (5 diffs)
-
assets/img/onboarding-dashboard.png (modified) (previous)
-
assets/js/onboarding.js (modified) (2 diffs)
-
assets/js/pt-wizard.js (modified) (8 diffs)
-
readme.txt (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
abtestkit/trunk/abtestkit.php
r3446844 r3451734 3 3 * Plugin Name: abtestkit 4 4 * Plugin URI: https://wordpress.org/plugins/abtestkit 5 * Description: Split testing for WooCommerce & WordPress, compatible with all page builders, themes & caching plugins.6 * Version: 1.0. 95 * Description: Split testing for WooCommerce, compatible with all page builders, themes & caching plugins. 6 * Version: 1.0.10 7 7 * Author: abtestkit 8 8 * License: GPL-2.0-or-later … … 92 92 return [ 93 93 'plugin' => 'abtestkit', 94 'version' => '1.0. 9',94 'version' => '1.0.10', 95 95 'site' => md5( home_url() ), // anonymous hash 96 96 'wp' => get_bloginfo( 'version' ), … … 225 225 plugins_url( 'assets/js/onboarding.js', __FILE__ ), 226 226 array( 'wp-element', 'wp-components', 'wp-api-fetch' ), 227 '1.0. 9',227 '1.0.10', 228 228 true 229 229 ); … … 3768 3768 plugins_url( 'assets/js/pt-wizard.js', __FILE__ ), 3769 3769 [ 'wp-element', 'wp-components', 'wp-api-fetch', 'wp-editor' ], 3770 '1.0. 9',3770 '1.0.10', 3771 3771 true 3772 3772 ); … … 3791 3791 plugins_url( 'assets/js/admin-list-guard.js', __FILE__ ), 3792 3792 [ 'jquery' ], 3793 ( defined( 'ABTESTKIT_VERSION' ) ? ABTESTKIT_VERSION : '1.0. 9' ),3793 ( defined( 'ABTESTKIT_VERSION' ) ? ABTESTKIT_VERSION : '1.0.10' ), 3794 3794 true 3795 3795 ); -
abtestkit/trunk/assets/js/onboarding.js
r3425058 r3451734 127 127 "p", 128 128 { style: { marginBottom: 12 } }, 129 "abtestkit automatically declaresa winner when there is strong evidence one version is performing better - so you don’t have to guess.",129 "abtestkit can automatically declare a winner when there is strong evidence one version is performing better - so you don’t have to guess.", 130 130 ), 131 131 h( … … 147 147 "li", 148 148 null, 149 h("strong", null, " Confidencethreshold"),150 ": the algorithm declares a winner when it reaches high confidence (commonly 95%).",149 h("strong", null, "Winning threshold"), 150 ": For automatic testing, you decide how confident the algorithm needs to be to declare a winner.", 151 151 ), 152 152 ), -
abtestkit/trunk/assets/js/pt-wizard.js
r3442225 r3451734 768 768 const [postType, setPostType] = useState(""); // required on first step 769 769 770 // Hard reset for anything downstream of test type selection. 771 // This prevents "state leaking" (e.g. Version B sticking around across runs). 772 const resetWizardState = () => { 773 // Lists/search 774 setPageSearch(""); 775 setPages([]); 776 setLoading(false); 777 setError(""); 778 779 // A/B selection 780 setPageA(null); 781 setBMode("duplicate"); 782 setPageBSearch(""); 783 setPagesB([]); 784 setPageB(null); 785 setHasEditedB(false); 786 setTempBDraftId(null); 787 setRequiresBEdit(false); 788 789 // Goal / conversions 790 setGoal(""); 791 setConversionChosen(false); 792 setClickScope("on_test_pages"); 793 794 // Click targets 795 setLinks(""); 796 setPrettyPicks([]); 797 setShowManualTargets(false); 798 setGoalPageSearch(""); 799 setGoalPages([]); 800 setGoalPage(null); 801 802 // Product overrides 803 setProductPreviewToken(""); 804 setProductBTitle(""); 805 setProductBPrice(""); 806 setProductBSalePrice(""); 807 setProductBShortDesc(""); 808 setProductBLongDesc(""); 809 setProductBImageUrl(""); 810 setProductBImageId(""); 811 setProductBGalleryUrls(""); 812 setProductBGalleryIds([]); 813 814 // Reset “prefill from A” flags 815 shortHydratedRef.current = false; 816 longHydratedRef.current = false; 817 }; 818 819 const selectTestType = (type) => { 820 // When user picks a new test type, reset everything else. 821 resetWizardState(); 822 setPostType(type); 823 setStep(0); 824 }; 825 826 770 827 // Data 771 828 const [pageSearch, setPageSearch] = useState(""); … … 865 922 // DO NOT reset when pageB changes (because creating a draft will always change it). 866 923 useEffect(() => { 924 // Switching B source should clear B selection/draft and any “edited” state. 867 925 setHasEditedB(false); 926 setPageB(null); 927 setTempBDraftId(null); 928 setPageBSearch(""); 929 setPagesB([]); 868 930 }, [bMode]); 869 931 … … 944 1006 // Step 1: must pick Version A 945 1007 const canNext1 = !!pageA; 1008 1009 // If Version A changes, Version B must be reset (prevents mismatched A/B pairs) 1010 useEffect(() => { 1011 setPageB(null); 1012 setTempBDraftId(null); 1013 setHasEditedB(false); 1014 setPageBSearch(""); 1015 setPagesB([]); 1016 1017 // Also clear conversion config + targets, because they’re tied to the chosen pages 1018 setGoal(""); 1019 setConversionChosen(false); 1020 setClickScope("on_test_pages"); 1021 setLinks(""); 1022 setPrettyPicks([]); 1023 setShowManualTargets(false); 1024 setGoalPage(null); 1025 setGoalPages([]); 1026 setGoalPageSearch(""); 1027 1028 // Reset product preview token + hydration guards (safe even for non-product) 1029 setProductPreviewToken(""); 1030 shortHydratedRef.current = false; 1031 longHydratedRef.current = false; 1032 }, [pageA && pageA.id]); 946 1033 947 1034 // Keep the pretty list in sync with the CSV (manual edits / clears) … … 1272 1359 Card, 1273 1360 { 1274 onClick: () => se tPostType("page"),1361 onClick: () => selectTestType("page"), 1275 1362 style: { 1276 1363 cursor: "pointer", … … 1304 1391 Card, 1305 1392 { 1306 onClick: () => se tPostType("post"),1393 onClick: () => selectTestType("post"), 1307 1394 style: { 1308 1395 cursor: "pointer", … … 1336 1423 Card, 1337 1424 { 1338 onClick: () => se tPostType("product"),1425 onClick: () => selectTestType("product"), 1339 1426 style: { 1340 1427 cursor: "pointer", … … 2719 2806 value: String(decisionRule), 2720 2807 options: [ 2721 { label: " 25 impressions + 3 conversions (Fast, less precise)", value: "fast" },2722 { label: " 50 impressions + 5 conversions (Balanced)", value: "balanced" },2723 { label: " 75 impressions + 10 conversions (Precise)", value: "precise" },2808 { label: "Fast, less precise (25 impressions + 3 conversions)", value: "fast" }, 2809 { label: "Balanced (50 impressions + 5 conversions)", value: "balanced" }, 2810 { label: "Precise (75 impressions + 10 conversions)", value: "precise" }, 2724 2811 { label: "Manual (never auto-confirm a winner)", value: "manual" }, 2725 2812 ], … … 3090 3177 steps[step].content, 3091 3178 h("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 16 } }, [ 3092 h( 3093 Button, 3094 { 3095 isSecondary: true, 3096 disabled: step === 0, 3097 onClick: () => setStep(Math.max(0, step - 1)), 3179 h( 3180 Button, 3181 { 3182 isSecondary: true, 3183 disabled: step === 0, 3184 onClick: () => { 3185 const isClickGoal = goal === "clicks"; 3186 3187 // This is the step where click targets are selected 3188 const clickTargetStep = 3189 postType === "product" ? 4 : 5; 3190 3191 const leavingClickTargets = 3192 isClickGoal && step === clickTargetStep; 3193 3194 const hasTargets = 3195 (links && links.trim().length > 0) || 3196 (prettyPicks && prettyPicks.length > 0); 3197 3198 if (leavingClickTargets && hasTargets) { 3199 const ok = window.confirm( 3200 "Going back will clear your selected click targets.\n\nPress OK to continue." 3201 ); 3202 3203 if (!ok) return; 3204 3205 // Clear click targets + related state 3206 setLinks(""); 3207 setPrettyPicks([]); 3208 setShowManualTargets(false); 3209 3210 // Clear 'other page' selection if used 3211 setGoalPage(null); 3212 setGoalPages([]); 3213 setGoalPageSearch(""); 3214 } 3215 3216 setStep(Math.max(0, step - 1)); 3098 3217 }, 3099 "Back" 3100 ), 3218 }, 3219 "Back" 3220 ), 3101 3221 3102 3222 // Right-side action area: show Next on normal steps, or Draft/Start on Summary -
abtestkit/trunk/readme.txt
r3446844 r3451734 1 === abtestkit - universal AB testing for WooCommerce & Wordpress===1 === abtestkit - AB testing for WooCommerce === 2 2 Contributors: abtestkit 3 3 Tags: ab testing, split testing, ab testing WooCommerce, split testing WooCommerce, a/b testing, conversion, optimization, experiment, a b testing, CRO, … … 5 5 Tested up to: 6.9 6 6 Requires PHP: 7.4 7 Stable tag: 1.0. 97 Stable tag: 1.0.10 8 8 License: GPL-2.0-or-later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 77 77 == Changelog == 78 78 79 = 1.0.10 = 80 * Bug fixes & stability improvements 81 * Fixed edge case in test wizard when navigating backwards 82 * Prevented stale selections persisting across test types 83 * Improved reliability of test configuration flow 84 79 85 = 1.0.9 = 80 86 * Test info Dropdown added to dashboard … … 127 133 == Upgrade Notice == 128 134 135 = 1.0.10 = 136 Bug fixes & stability improvements 137 129 138 = 1.0.9 = 130 139 Test information Dropdown added to dashboard
Note: See TracChangeset
for help on using the changeset viewer.