Description
JM Split Tester runs experiments on posts, pages, and custom post types. Every variant is served on the original public URL. Visitors are assigned with a first-party cookie and keep that variant on later visits. Conversion tracking, statistics, and winner selection are built in. The plugin does not send data to Google Analytics or any other external service.
A challenger is a draft copy of the original. Edit that copy in the normal editor: title, content, excerpt, featured image, and page template. Visitors still request the original URL. The copy stays a draft and is labeled “Experiment variant” in the posts list.
Traffic splits are manual. The percentages must add up to exactly 100%.
Goals
- Page view
- Click
- Form submission
- Scroll depth
- Custom event from JavaScript or PHP
Each visitor is counted once per goal.
Statistics
Results use a two-proportion z-test against the control. A winner is reported only after the configured gates pass. The defaults are 95% confidence, 100 visitors per variant, 20 conversions per variant, and 7 days. Extra challengers use a Bonferroni correction, which can be turned off.
Applying a winner asks for confirmation, writes the winning copy onto the original post, and stores a snapshot. Rollback restores that snapshot. The post ID and public URL stay the same.
Themes and plugins
A variant can use another theme and a different set of active plugins. The change exists only for that request. If the chosen theme or a required plugin is missing, the request falls back to the original theme and plugin set.
Audience, schedule, and SEO
An experiment can include everyone, only logged-in visitors, or only logged-out visitors. Known crawlers are excluded by default and see the control, on the same canonical URL. The plugin does not add a noindex tag.
Start and end times are checked on the request. Visitors see the original when an experiment is outside its window or paused, even if WP-Cron has not updated the status yet.
Pause, complete, and remove are available on the experiments list.
Cache
Experiment pages send a private Cache-Control header and Vary: Cookie by default. When WP Fastest Cache or LiteSpeed Cache are active, logged-out visitors get a separate cached file per variant, chosen from the assignment cookie. The first visit, previews, and crawlers are not stored. A full-page cache that ignores cookies can still show one variant to everyone; exclude the experiment URL or vary on wpab_assignment_*.
Privacy
The plugin does not store IP addresses, full user agents, email addresses, or form contents. It stores a random anonymous id, a coarse device type, and a browser family. Raw events can be kept for 30, 90, 180, or 365 days, or not deleted automatically. WordPress personal-data export and erase are supported. Experiment configuration, daily totals, and rollback history are kept.
Uninstall removes the must-use loader. Experiment data is deleted only when that option is enabled.
Custom Plugin Development
Need to customize this plugin or build a custom WordPress plugin from scratch? I offer professional custom plugin development services, from adapting existing plugins to meet your specific requirements to developing fully custom solutions tailored to your needs.
Learn more about my custom WordPress plugin development services or book a free discovery call to discuss your project and explore the best solution for your requirements.
Installation
- Upload the
jm-split-testerfolder to/wp-content/plugins/, or install the zip from Plugins Add New Upload Plugin. - Activate JM Split Tester.
- Open JM Split Tester New Experiment.
Activation creates the database tables, grants administrators the manage_wpab capability, and copies wpab-runtime-loader.php into wp-content/mu-plugins/. No API keys are required.
FAQ
-
Yes. The public address stays the original post or page. The plugin does not add
?variant=to the URL visitors and crawlers use. -
How do I edit a variant?
-
Duplicate the original from the experiment wizard, then edit the draft copy in the block editor or the classic editor. Publish is blocked for that copy. Visitors see it only through the original URL, and only when they are assigned to that variant.
-
Will this change my site theme or deactivate plugins?
-
No. Theme and plugin changes are applied in memory for the current request. The options in Appearance and Plugins are left as they are. Must-use plugins always stay loaded.
-
How is a winner decided?
-
The plugin compares each challenger with the control using a two-proportion z-test. It will not declare a winner until the confidence level, sample size, conversion count, and minimum duration are all met. You choose when to apply the winner. Rollback restores the snapshot taken at that moment.
-
What do paused and scheduled experiments show?
-
Paused experiments, and experiments outside their start and end times, show the original content to everyone.
-
Are crawlers included in the test?
-
Not by default. Detected bots see the control and are not counted. The canonical URL is unchanged, and the plugin does not emit noindex.
-
Does the plugin use Google Analytics?
-
No. Page views, clicks, form submissions, scroll depth, and custom events are stored in your own database.
-
What does it store about visitors?
-
A random anonymous id in the
wpab_vidcookie, the assigned variant, event names, a coarse device type, and a browser family. It does not store the IP address, the full user agent, email addresses, or the contents of forms. -
What happens with a full-page cache?
-
Logged-out visitors can otherwise all receive the first cached HTML. WP Fastest Cache and LiteSpeed Cache each keep one copy per variant, selected by the assignment cookie. The first visit is not cached, so that response is not reused. Other page caches must vary on
wpab_assignment_*, or skip the URLs under test. A cache drop-in that exits before WordPress loads cannot be varied by this plugin.Compatibility with additional caching plugins will be added in future versions.
-
Can I preview a variant without affecting the results?
-
Yes. Administrators can open a signed preview link. The preview lasts 15 minutes, uses its own cookie, and is excluded from the statistics.
?wpab_reset=followed by the experiment id clears your own assignment. -
Is the plugin multisite aware?
-
Each site has its own tables and runtime index. The must-use loader is network-wide because must-use plugins load for the whole network. There is no network-admin screen in this version.
-
What is removed on uninstall?
-
The must-use loader and the private runtime index are always removed. Database tables and settings remain unless you enable “Delete all experiment data” before uninstalling.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“JM Split Tester” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “JM Split Tester” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.4
- The plugin is now named JM Split Tester.
- Requires PHP 8.1, which matches the code.
- The must-use loader follows the real plugin directory, and the runtime index is stored in the uploads directory.
1.0.3
- Serve a separate WP Fastest Cache file for each variant, so logged-out visitors are not all shown one cached page.
- Vary LiteSpeed Cache on the assignment cookie, and do not cache the first visit, previews, or crawlers.
- Remove the shared cache file for an experiment URL.
1.0.2
- Create a challenger by duplicating the original post and editing that draft. The public URL stays on the original.
- Pause, complete, or remove an experiment from the experiments list.
- Label variant copies as “Experiment variant” in the posts list.
1.0.0
- Initial release.
