Plugin Directory

Changeset 3451734


Ignore:
Timestamp:
02/02/2026 05:54:34 AM (2 weeks ago)
Author:
abtestkit
Message:

Release 1.0.10: onboarding fixes and stability improvements

Location:
abtestkit/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • abtestkit/trunk/abtestkit.php

    r3446844 r3451734  
    33 * Plugin Name:       abtestkit
    44 * 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.9
     5 * Description:       Split testing for WooCommerce, compatible with all page builders, themes & caching plugins.
     6 * Version:           1.0.10
    77 * Author:            abtestkit
    88 * License:           GPL-2.0-or-later
     
    9292    return [
    9393        'plugin'   => 'abtestkit',
    94         'version'  => '1.0.9',
     94        'version'  => '1.0.10',
    9595        'site'     => md5( home_url() ), // anonymous hash
    9696        'wp'       => get_bloginfo( 'version' ),
     
    225225        plugins_url( 'assets/js/onboarding.js', __FILE__ ),
    226226        array( 'wp-element', 'wp-components', 'wp-api-fetch' ),
    227         '1.0.9',
     227        '1.0.10',
    228228        true
    229229    );
     
    37683768        plugins_url( 'assets/js/pt-wizard.js', __FILE__ ),
    37693769        [ 'wp-element', 'wp-components', 'wp-api-fetch', 'wp-editor' ],
    3770         '1.0.9',
     3770        '1.0.10',
    37713771        true
    37723772    );
     
    37913791        plugins_url( 'assets/js/admin-list-guard.js', __FILE__ ),
    37923792        [ 'jquery' ],
    3793         ( defined( 'ABTESTKIT_VERSION' ) ? ABTESTKIT_VERSION : '1.0.9' ),
     3793        ( defined( 'ABTESTKIT_VERSION' ) ? ABTESTKIT_VERSION : '1.0.10' ),
    37943794        true
    37953795    );
  • abtestkit/trunk/assets/js/onboarding.js

    r3425058 r3451734  
    127127          "p",
    128128          { style: { marginBottom: 12 } },
    129           "abtestkit automatically declares a 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.",
    130130        ),
    131131        h(
     
    147147            "li",
    148148            null,
    149             h("strong", null, "Confidence threshold"),
    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.",
    151151          ),
    152152        ),
  • abtestkit/trunk/assets/js/pt-wizard.js

    r3442225 r3451734  
    768768    const [postType, setPostType] = useState(""); // required on first step
    769769
     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
    770827    // Data
    771828    const [pageSearch, setPageSearch] = useState("");
     
    865922    // DO NOT reset when pageB changes (because creating a draft will always change it).
    866923    useEffect(() => {
     924      // Switching B source should clear B selection/draft and any “edited” state.
    867925      setHasEditedB(false);
     926      setPageB(null);
     927      setTempBDraftId(null);
     928      setPageBSearch("");
     929      setPagesB([]);
    868930    }, [bMode]);
    869931
     
    9441006    // Step 1: must pick Version A
    9451007    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]);
    9461033
    9471034    // Keep the pretty list in sync with the CSV (manual edits / clears)
     
    12721359            Card,
    12731360            {
    1274               onClick: () => setPostType("page"),
     1361              onClick: () => selectTestType("page"),
    12751362              style: {
    12761363                cursor: "pointer",
     
    13041391            Card,
    13051392            {
    1306               onClick: () => setPostType("post"),
     1393              onClick: () => selectTestType("post"),
    13071394              style: {
    13081395                cursor: "pointer",
     
    13361423            Card,
    13371424            {
    1338               onClick: () => setPostType("product"),
     1425              onClick: () => selectTestType("product"),
    13391426              style: {
    13401427                cursor: "pointer",
     
    27192806          value: String(decisionRule),
    27202807          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" },
    27242811            { label: "Manual (never auto-confirm a winner)", value: "manual" },
    27252812          ],
     
    30903177            steps[step].content,
    30913178h("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)),
     3179h(
     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));
    30983217    },
    3099     "Back"
    3100   ),
     3218  },
     3219  "Back"
     3220),
    31013221
    31023222  // 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 ===
    22Contributors: abtestkit
    33Tags: ab testing, split testing, ab testing WooCommerce, split testing WooCommerce, a/b testing, conversion, optimization, experiment, a b testing, CRO,
     
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 1.0.9
     7Stable tag: 1.0.10
    88License: GPL-2.0-or-later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    7777== Changelog ==
    7878
     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
    7985= 1.0.9 =
    8086* Test info Dropdown added to dashboard
     
    127133== Upgrade Notice ==
    128134
     135= 1.0.10 =
     136Bug fixes & stability improvements
     137
    129138= 1.0.9 =
    130139Test information Dropdown added to dashboard
Note: See TracChangeset for help on using the changeset viewer.