{"id":294363,"date":"2026-05-11T07:53:30","date_gmt":"2026-05-11T07:53:30","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/spintax\/"},"modified":"2026-05-11T07:53:09","modified_gmt":"2026-05-11T07:53:09","slug":"spintax","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/spintax\/","author":23448903,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.0","stable_tag":"1.5.0","tested":"6.9.4","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"Spintax","header_author":"301st","header_description":"Template-based dynamic content generation using spintax markup. Create reusable templates with randomised text variants, variable substitution, and permutation logic.","assets_banners_color":"0c0f15","last_updated":"2026-05-11 07:53:09","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/spintax.net","header_author_uri":"https:\/\/301.st","rating":0,"author_block_rating":0,"active_installs":0,"downloads":29,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.0":{"tag":"1.5.0","author":"301st","date":"2026-05-11 07:53:09"}},"upgrade_notice":{"1.4.0":"<p>New <code>{?VAR?then|else}<\/code> conditional syntax, smarter sentence-end capitalisation around abbreviations, and a fix for <code>#set<\/code> directives with empty values.<\/p>","1.1.0":"<p>Per-element permutation separators, auto-spacing for word separators, improved input sanitization.<\/p>","1.0.1":"<p>Fixes permutation config handling, preview rendering, and scope isolation. Recommended update.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3528366,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3528366,"resolution":"256x256","location":"assets","locale":""},"icon.svg":{"filename":"icon.svg","revision":3528366,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3528366,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3528366,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3528366,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3528366,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3528366,"resolution":"3","location":"assets","locale":""}},"screenshots":{"1":"Template editor with spintax markup and live preview.","2":"Settings page with global variables editor.","3":"Template list with shortcode, cache status, and cron schedule."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[8494,2487,186,47760,4516],"plugin_category":[43,55],"plugin_contributors":[255945],"plugin_business_model":[],"class_list":["post-294363","plugin","type-plugin","status-publish","hentry","plugin_tags-content-generation","plugin_tags-dynamic-content","plugin_tags-seo","plugin_tags-spintax","plugin_tags-templates","plugin_category-customization","plugin_category-seo-and-marketing","plugin_contributors-301st","plugin_committers-301st"],"banners":{"banner":"https:\/\/ps.w.org\/spintax\/assets\/banner-772x250.png?rev=3528366","banner_2x":"https:\/\/ps.w.org\/spintax\/assets\/banner-1544x500.png?rev=3528366","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/spintax\/assets\/icon.svg?rev=3528366","icon":"https:\/\/ps.w.org\/spintax\/assets\/icon.svg?rev=3528366","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/spintax\/assets\/screenshot-1.png?rev=3528366","caption":"Template editor with spintax markup and live preview."},{"src":"https:\/\/ps.w.org\/spintax\/assets\/screenshot-2.png?rev=3528366","caption":"Settings page with global variables editor."},{"src":"https:\/\/ps.w.org\/spintax\/assets\/screenshot-3.png?rev=3528366","caption":"Template list with shortcode, cache status, and cron schedule."}],"raw_content":"<!--section=description-->\n<p>Spintax is a WordPress plugin for template-based content generation using spintax markup. Create reusable templates with randomised text variants, variable substitution, and permutation logic \u2014 then embed them anywhere on your site via shortcodes or PHP.<\/p>\n\n<p><strong>Key features:<\/strong><\/p>\n\n<ul>\n<li><strong>Enumerations<\/strong> <code>{a|b|c}<\/code> \u2014 randomly pick one option, with nesting support<\/li>\n<li><strong>Permutations<\/strong> <code>[&lt;config&gt;a|b|c]<\/code> \u2014 pick N elements, shuffle, join with custom separators<\/li>\n<li><strong>Variables<\/strong> <code>%var%<\/code> \u2014 global, local (<code>#set<\/code>), and shortcode-level variable scopes<\/li>\n<li><strong>Conditionals<\/strong> <code>{?VAR?then|else}<\/code> \u2014 render a branch based on whether a variable is set (also <code>{?!VAR?then}<\/code> inverted)<\/li>\n<li><strong>Plural agreement<\/strong> <code>{plural &lt;count&gt;: form1|form2|form3}<\/code> \u2014 pick grammatically correct noun form by count. RU\/UK\/BE 3-form (one|few|many), EN-style 2-form (one|many). First spintax engine with first-class plurals.<\/li>\n<li><strong>Nested templates<\/strong> \u2014 embed templates within templates via <code>#include<\/code> or <code>[spintax]<\/code><\/li>\n<li><strong>Object cache<\/strong> \u2014 rendered output cached via WP Object Cache API (Redis\/Memcached ready)<\/li>\n<li><strong>Cron regeneration<\/strong> \u2014 optional scheduled cache refresh per template<\/li>\n<li><strong>Validation<\/strong> \u2014 bracket matching, circular reference detection, syntax checking<\/li>\n<li><strong>Admin UI<\/strong> \u2014 code editor, live preview, shortcode copy, settings page<\/li>\n<\/ul>\n\n<p><strong>Syntax based on the GTW (Generating The Web) standard.<\/strong><\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin does <strong>not<\/strong> connect to any external services, APIs, or third-party servers.<\/p>\n\n<p>All content generation happens locally on your WordPress server. No data is sent externally. No remote requests are made during activation, rendering, or caching.<\/p>\n\n<h3>Privacy Policy<\/h3>\n\n<p>This plugin does not collect, store, or transmit any personal user data. It does not use cookies, tracking pixels, analytics, or any form of telemetry.<\/p>\n\n<p>Templates and their rendered output are stored entirely within your WordPress database and object cache.<\/p>\n\n<h3>Credits<\/h3>\n\n<ul>\n<li>Syntax based on the <a href=\"https:\/\/spintax.net\">GTW (Generating The Web)<\/a> standard<\/li>\n<li>Developed by <a href=\"https:\/\/301.st\">301st<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>spintax<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>Create templates under the \"Spintax\" menu in the admin sidebar<\/li>\n<li>Embed templates using <code>[spintax slug=\"my-template\"]<\/code> in posts\/pages or <code>spintax_render('my-template')<\/code> in theme files<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20create%20a%20template%3F\"><h3>How do I create a template?<\/h3><\/dt>\n<dd><p>Go to Spintax &gt; Add New in the WordPress admin. Enter a title and your spintax markup in the editor.<\/p><\/dd>\n<dt id=\"what%20syntax%20does%20the%20plugin%20use%3F\"><h3>What syntax does the plugin use?<\/h3><\/dt>\n<dd><ul>\n<li><code>{a|b|c}<\/code> \u2014 randomly picks one option<\/li>\n<li><code>[a|b|c]<\/code> \u2014 permutation: picks N elements, shuffles, joins with space<\/li>\n<li><code>[&lt;minsize=2;maxsize=3;sep=\", \";lastsep=\" and \"&gt; a|b|c|d]<\/code> \u2014 configured permutation<\/li>\n<li><code>%variable%<\/code> \u2014 variable reference<\/li>\n<li><code>#set %var% = value<\/code> \u2014 local variable definition<\/li>\n<li><code>{?VAR?then|else}<\/code> \u2014 conditional: render a branch by truthiness of <code>%VAR%<\/code> (also <code>{?!VAR?then}<\/code> inverted)<\/li>\n<li><code>{plural %Count%: form1|form2|form3}<\/code> \u2014 plural agreement: picks the correct grammatical form by count (RU 3-form, EN 2-form)<\/li>\n<li><code>\/#comment#\/<\/code> \u2014 block comment (stripped from output)<\/li>\n<li><code>#include \"slug\"<\/code> \u2014 embed another template<\/li>\n<\/ul>\n\n<p>Full syntax reference with examples and a live playground: https:\/\/spintax.net\/docs\/syntax<\/p><\/dd>\n<dt id=\"where%20can%20i%20learn%20more%3F\"><h3>Where can I learn more?<\/h3><\/dt>\n<dd><ul>\n<li><strong>Documentation hub:<\/strong> https:\/\/spintax.net\/docs\/ \u2014 guides, reference, recipes<\/li>\n<li><strong>Compact syntax reference:<\/strong> https:\/\/spintax.net\/docs\/syntax \u2014 all primitives in one page (13 languages)<\/li>\n<li><strong>Plural agreement guide:<\/strong> https:\/\/spintax.net\/docs\/plural-spintax\/ \u2014 <code>{plural N: form1|form2|form3}<\/code> in depth (EN\/RU)<\/li>\n<li><strong>Conditional spintax guide:<\/strong> https:\/\/spintax.net\/docs\/conditional-spintax\/ \u2014 <code>{?VAR?then|else}<\/code> value-driven branching (EN\/RU)<\/li>\n<li><strong>Authoring mindset:<\/strong> https:\/\/spintax.net\/docs\/authoring-mindset\/ \u2014 write the final text first, add markup last (EN\/RU)<\/li>\n<li><strong>Live playground:<\/strong> https:\/\/spintax.net\/play\/ \u2014 write a template, set variables, render N variants in your browser (EN\/RU)<\/li>\n<\/ul><\/dd>\n<dt id=\"does%20caching%20require%20redis%20or%20memcached%3F\"><h3>Does caching require Redis or Memcached?<\/h3><\/dt>\n<dd><p>The plugin uses the WordPress Object Cache API. With a persistent backend (Redis, Memcached), cached output persists across requests. Without one, templates are re-rendered on each page load.<\/p><\/dd>\n<dt id=\"can%20i%20pass%20variables%20through%20shortcodes%3F\"><h3>Can I pass variables through shortcodes?<\/h3><\/dt>\n<dd><p>Yes: <code>[spintax slug=\"greeting\" name=\"Alice\" city=\"Moscow\"]<\/code> makes <code>%name%<\/code> and <code>%city%<\/code> available inside the template.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Add: plural agreement primitive <code>{plural &lt;count&gt;: form1|form2|form3}<\/code> \u2014 pick the correct grammatical form by count. RU\/UK\/BE = 3 forms (<code>one|few|many<\/code>); EN\/ES\/PT\/DE etc. = 2 forms (<code>one|many<\/code>). Count is a <code>%var%<\/code> reference or literal integer (resolved after variable expansion, so helper-var patterns via <code>#set<\/code> work). Locale comes from per-template post meta <code>_spintax_locale<\/code> or the WordPress site locale. Lenient at runtime: malformed constructs render verbatim with fullwidth braces instead of crashing the page. First spintax engine to treat plural as a first-class primitive.<\/li>\n<li>Add: validator surface for plural blocks \u2014 structural check (form slot rejects nested <code>{}<\/code>, <code>[]<\/code>) always on; arity check (RU expects 3, EN expects 2) when locale is known.<\/li>\n<li>Internal: 74 PHPUnit cases mirroring the canonical TS implementation (<code>spintax-plurals.test.ts<\/code> in casino-platform). Engine classes <code>Plurals<\/code>, <code>PluralArityError<\/code>, <code>PluralFormError<\/code> ship alongside <code>Conditionals<\/code> from 1.4.0.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Add: conditional syntax <code>{?VAR?then|else}<\/code> \u2014 render a branch based on whether a variable is set\/non-empty (also <code>{?!VAR?then}<\/code> for inverted, optional else). Resolves both before and after <code>%var%<\/code> expansion, so conditionals inside variable values work too.<\/li>\n<li>Add: single-token abbreviation whitelist in post-processing \u2014 known shorthands like <code>\u0441\u043e\u0446.<\/code>, <code>\u044d\u043b.<\/code>, <code>Mr.<\/code>, <code>Inc.<\/code> no longer trigger sentence-end capitalisation of the next word. Covers Russian editorial\/address\/unit shorthands plus English titles and business suffixes.<\/li>\n<li>Fix: <code>#set<\/code> directive with an empty value (<code>#set %x% =<\/code>) no longer silently swallows the next directive on the following line.<\/li>\n<li>Fix: HTML start tags inside permutation alternatives (e.g. <code>[&lt;li&gt;item&lt;\/li&gt;|&lt;li&gt;...]<\/code>) are no longer mis-parsed as a <code>&lt;config&gt;<\/code> block.<\/li>\n<li>Improve: cache description in template meta box and global settings now explains that visitors see the same generated variant per runtime context until expiry or regeneration.<\/li>\n<li>Internal: regression tests for IDN domains flanked by Cyrillic letters and for randomisation behaviour across renders.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Add: per-element permutation separators \u2014 assign custom separator to each element via <code>&lt; sep &gt;<\/code> before <code>|<\/code><\/li>\n<li>Add: auto-spacing for purely alphabetic word separators (e.g. <code>&lt;and&gt;<\/code>, <code>&lt;\u0438\u043b\u0438&gt;<\/code>)<\/li>\n<li>Security: sanitize raw spintax input with custom sanitize_spintax() \u2014 strips invalid UTF-8, null bytes, and control characters while preserving angle-bracket syntax<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: permutation minsize\/maxsize logic when only one parameter is specified<\/li>\n<li>Fix: preview rendering no longer strips spintax config from template input<\/li>\n<li>Fix: child templates no longer inherit parent's local #set variables<\/li>\n<li>Improve: global variables editor now uses #set textarea (paste full blocks)<\/li>\n<li>Improve: validation errors displayed on template edit screen with line numbers<\/li>\n<li>Improve: \"Regenerate Public Cache\" now forces fresh subtree render<\/li>\n<li>Add: demo template created on first activation<\/li>\n<li>Add: SECURITY.md with responsible disclosure policy<\/li>\n<li>Add: Privacy Policy and External Services sections in readme.txt<\/li>\n<li>Code: PHPCS 0 errors, full WP.org review compliance<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>GTW-compatible spintax engine with nested enumerations and permutations<\/li>\n<li>Template CPT with code editor and admin preview<\/li>\n<li>Shortcode and PHP rendering API<\/li>\n<li>Object cache with versioned keys and cascade invalidation<\/li>\n<li>Per-template cron regeneration<\/li>\n<li>Global and local variable scopes<\/li>\n<li>Settings page with global variables editor<\/li>\n<\/ul>","raw_excerpt":"Template-based dynamic content generation using spintax markup for WordPress.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/294363","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=294363"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/301st"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=294363"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=294363"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=294363"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=294363"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=294363"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=294363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}