{"id":232748,"date":"2025-05-15T19:11:55","date_gmt":"2025-05-15T19:11:55","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ghostlabs-cycle-block-lite\/"},"modified":"2026-09-14T09:32:52","modified_gmt":"2026-09-14T09:32:52","slug":"ghostlabs-cycle-block-lite","status":"publish","type":"plugin","link":"https:\/\/tg.wordpress.org\/plugins\/ghostlabs-cycle-block-lite\/","author":23277533,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.2","stable_tag":"2.0.2","tested":"7.1.1","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Cycle Block","header_author":"GhostLabs","header_description":"Have your content update on its own by cycling through content variations.","assets_banners_color":"f2eef7","last_updated":"2026-09-14 09:32:52","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/theghostlab.io","header_plugin_uri":"https:\/\/theghostlab.io\/cycle-block","header_author_uri":"https:\/\/theghostlab.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":732,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"ghostlabs","date":"2025-05-15 19:11:48","revision":3294374},"1.0.1":{"tag":"1.0.1","author":"ghostlabs","date":"2025-05-16 21:32:16","revision":3295022},"1.0.2":{"tag":"1.0.2","author":"ghostlabs","date":"2025-05-25 06:47:52","revision":3300101},"1.0.3":{"tag":"1.0.3","author":"ghostlabs","date":"2025-12-05 19:38:30","revision":3412565},"1.0.4":{"tag":"1.0.4","author":"ghostlabs","date":"2025-12-05 20:00:00","revision":3412588},"2.0.2":{"tag":"2.0.2","author":"ghostlabs","date":"2026-09-14 09:32:52","revision":3694867}},"upgrade_notice":{"2.0.2":"<p>Requires PHP 8.1 or newer; sites on an older version will not be offered this update. Adds the\nin-place upgrade to Cycle Block Pro and a rebuilt settings screen. Nothing about how your content\nrotates changes, and nothing is sent anywhere unless you start the upgrade yourself.<\/p>","1.2.0":"<p>Adds the in-place upgrade to Cycle Block Pro and a rebuilt settings screen. Nothing about how\nyour content rotates changes, and nothing is sent anywhere unless you start the upgrade\nyourself.<\/p>","1.1.0":"<p>Requires PHP 8.1 or newer; sites on an older version will not be offered this update. Every\nfeature you had is still here. Your content is unaffected: variations live in your posts, not in\nthe plugin.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3294374,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3294374,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3412551,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3412551,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3412551,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"theghostlab\/cycle":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"theghostlab\/cycle","title":"Cycle","category":"media","icon":"update","description":"Create variations of your content, set a cycle strategy, and have your content update on its own.","keywords":["content","random"],"version":"0.1.0","textdomain":"ghostlabs-cycle-block-lite","attributes":{"blockId":{"type":"string","default":""},"previewContent":{"type":"string","default":""},"currentId":{"type":"string","default":""},"pastEntryId":{"type":"string","default":""},"entries":{"type":"array","default":[]},"update":{"type":"object","default":{"on":"","interval":7,"frequency":"d"}},"randomize":{"type":"object","default":{"setting":"random"}},"repeat":{"type":"boolean","default":true},"entriesStatus":{"type":"array","default":[]},"metadata":{"type":"object","default":{"name":""}},"previousSettings":{"type":"object"}},"usesContext":["postId"],"supports":{"align":true,"alignWide":true,"anchor":true,"ariaLabel":true},"styles":[],"example":{"attributes":{"message":"This is a notice!"}},"editorStyle":["file:style.scss","file:index.css"],"editorScript":["file:index.js","cycle-helper-js"],"viewScript":["file:view.js","theghostlab-cycle-block-shared-view-script"]},"theghostlab\/cycle-entry":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"theghostlab\/cycle-entry","title":"Variation","category":"text","icon":"page","parent":["theghostlab\/cycle"],"description":"","keywords":["content","random","entry"],"version":"0.1.0","textdomain":"ghostlabs-cycle-block-lite","attributes":{"id":{"type":"string","default":""},"parentId":{"type":"string","default":""},"content":{"type":"string","source":"html","selector":"p"},"label":{"type":"string","default":""},"metadata":{"type":"object","default":{"name":""}},"className":{"type":"string","default":"theghostlab-cycle-entry"},"index":{"type":"number","default":0},"customEvents":{"type":"array","default":[]}},"supports":{"align":true,"anchor":true,"ariaLabel":true},"styles":[],"editorScript":"file:index.js","editorStyle":"file:index.css","style":["file:style-index.css"]}},"tagged_versions":["1.0","1.0.1","1.0.2","1.0.3","1.0.4","2.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3694861,"resolution":"1","location":"assets","locale":"","width":2560,"height":1536},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3694861,"resolution":"2","location":"assets","locale":"","width":2560,"height":1536},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3694861,"resolution":"3","location":"assets","locale":"","width":2552,"height":1240},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3694861,"resolution":"4","location":"assets","locale":"","width":2560,"height":1776},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3694861,"resolution":"5","location":"assets","locale":"","width":2560,"height":2576},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3694861,"resolution":"6","location":"assets","locale":"","width":2560,"height":1536}},"screenshots":{"1":"Three versions of one hero, written once and named. Pick the schedule \u2014 daily, weekly or monthly \u2014 choose shuffle or sequence, repeat or stop on the last one, and preview every variation from the editor without waiting for the clock.","2":"A variation is ordinary block content \u2014 a Cover, headings, buttons, columns, anything \u2014 so it inherits your theme. The Custom Events panel shows what Pro adds: a view event, and an optional click event, for every event you define, sent to Google Analytics 4, Matomo, Plausible or Umami.","3":"Chosen on the server before the page is sent. One variation is in the HTML, so there is no flicker, no layout shift, and no hidden duplicate content for search engines to find.","4":"Nine schedules in the list; this edition honours three. Pick a Pro one and the block says so, names the schedule it is still cycling on, and changes nothing.","5":"Settings \u2192 Cycle Block: where your controls live, the license entry, and what Pro adds beside what you already have.","6":"Upgrade in place on a single-site install. Paste a license key and the site switches to Pro with every block, schedule and setting exactly as it was."}},"plugin_section":[],"plugin_tags":[242361,148076,255678,20954,1518],"plugin_category":[53],"plugin_contributors":[242362],"plugin_business_model":[],"class_list":["post-232748","plugin","type-plugin","status-publish","hentry","plugin_tags-content-rotation","plugin_tags-gutenberg","plugin_tags-rotating-content","plugin_tags-scheduled-content","plugin_tags-testimonials","plugin_category-ratings-and-reviews","plugin_contributors-ghostlabs","plugin_committers-ghostlabs"],"banners":{"banner":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/banner-772x250.png?rev=3412551","banner_2x":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/banner-1544x500.png?rev=3412551","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/icon.svg?rev=3412551","icon":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/icon.svg?rev=3412551","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/screenshot-1.png?rev=3694861","caption":"Three versions of one hero, written once and named. Pick the schedule \u2014 daily, weekly or monthly \u2014 choose shuffle or sequence, repeat or stop on the last one, and preview every variation from the editor without waiting for the clock."},{"src":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/screenshot-2.png?rev=3694861","caption":"A variation is ordinary block content \u2014 a Cover, headings, buttons, columns, anything \u2014 so it inherits your theme. The Custom Events panel shows what Pro adds: a view event, and an optional click event, for every event you define, sent to Google Analytics 4, Matomo, Plausible or Umami."},{"src":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/screenshot-3.png?rev=3694861","caption":"Chosen on the server before the page is sent. One variation is in the HTML, so there is no flicker, no layout shift, and no hidden duplicate content for search engines to find."},{"src":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/screenshot-4.png?rev=3694861","caption":"Nine schedules in the list; this edition honours three. Pick a Pro one and the block says so, names the schedule it is still cycling on, and changes nothing."},{"src":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/screenshot-5.png?rev=3694861","caption":"Settings \u2192 Cycle Block: where your controls live, the license entry, and what Pro adds beside what you already have."},{"src":"https:\/\/ps.w.org\/ghostlabs-cycle-block-lite\/assets\/screenshot-6.png?rev=3694861","caption":"Upgrade in place on a single-site install. Paste a license key and the site switches to Pro with every block, schedule and setting exactly as it was."}],"raw_content":"<!--section=description-->\n<p>Write several versions of a section once, and let the page show a different one over time.<\/p>\n\n<p>A testimonial that changes every week. A hero message that rotates each month. A call to action\nthat differs every day. You write the variations in the block editor, choose how often they\nchange, and the page takes it from there.<\/p>\n\n<p><strong>How it works<\/strong><\/p>\n\n<p>Add a <strong>Cycle<\/strong> block, then add a variation inside it for each version you want. Anything can go\nin a variation \u2014 headings, images, buttons, columns, other blocks. Pick an interval, and that is\nthe whole setup.<\/p>\n\n<ul>\n<li><strong>Daily, weekly or monthly<\/strong> rotation.<\/li>\n<li><strong>Shuffle<\/strong>, so a full pass shows every variation before any repeats.<\/li>\n<li><strong>Sequence<\/strong>, if you want them in the order you wrote them.<\/li>\n<li><strong>Repeat<\/strong>, or stop on the last variation once the cycle has run through.<\/li>\n<li><strong>Preview from the editor<\/strong>, stepping through every variation without waiting for the schedule\nand without disturbing what visitors see.<\/li>\n<li><strong>Unlimited variations<\/strong> per block, and as many blocks as you like per page.<\/li>\n<\/ul>\n\n<p><strong>Rendered on the server, which matters more than it sounds<\/strong><\/p>\n\n<p>The variation is chosen before the page is sent to the browser. Only one is ever in the HTML.<\/p>\n\n<ul>\n<li><strong>No flicker and no layout shift.<\/strong> Nothing swaps after the page has painted, so the block\nnever causes the jump that hurts Core Web Vitals.<\/li>\n<li><strong>No hidden duplicate content.<\/strong> Search engines see one variation, not all of them stacked in\nthe markup with the rest hidden by CSS.<\/li>\n<li><strong>No JavaScript required<\/strong> to choose or display a variation.<\/li>\n<li><strong>Nothing is written into your post content<\/strong>, so your saved posts do not change as the\nschedule advances.<\/li>\n<\/ul>\n\n<p><strong>Built to behave<\/strong><\/p>\n\n<ul>\n<li>Every variation is real block content, so it inherits your theme's colours, typography and\nspacing rather than fighting them.<\/li>\n<li>The schedule is tracked per block <em>and<\/em> per post, so duplicating a page gives the copy its own\nschedule instead of sharing one.<\/li>\n<li>If anything goes wrong \u2014 a missing schedule, a plugin conflict \u2014 the block falls back to\nshowing its content rather than breaking the page.<\/li>\n<li>Built to WCAG 2.2 AA and fully translatable.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin contacts GhostLabs' licensing service in exactly one situation: when you start the\nupgrade to Cycle Block Pro from the settings screen \u2014 by submitting a license key, or by clicking\n\"Complete upgrade\" after a purchase. It sends the license key you entered (or the one-time claim\ntoken from your purchase), this site's domain name, the plugin's slug and the edition being\nrequested, so the service can verify the license and deliver the Cycle Block Pro package. Nothing is sent on any other page\nload, and nothing is ever sent without that explicit action.<\/p>\n\n<p>The service is operated by GhostLabs. <a href=\"https:\/\/theghostlab.io\/terms-of-service\">Terms of service<\/a> \u00b7\n<a href=\"https:\/\/theghostlab.io\/privacy-policy\">Privacy policy<\/a><\/p>\n\n<h3>Source code<\/h3>\n\n<p>The plugin's compiled JavaScript is built from readable sources, and both are published\ntogether at:<\/p>\n\n<p>https:\/\/github.com\/theghostlab\/wp-ghostlabs-cycle-block-lite<\/p>\n\n<p>That repository contains this plugin exactly as distributed, plus the uncompiled <code>src\/<\/code> and\n    dev\/ behind its bundles and the configuration used to build them. Every dependency is a\npublic package, and the one GhostLabs library the plugin uses is carried as readable source\ninside it (<code>lib\/wp-kit\/<\/code>, GPL-2.0-or-later) \u2014 so <code>composer install &amp;&amp; pnpm install &amp;&amp; pnpm run\nbuild<\/code> needs no credentials of any kind and reproduces the shipped <code>build\/<\/code>, <code>assets\/js\/<\/code> and\n    assets\/css\/settings.css byte for byte.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install through the <strong>Plugins<\/strong> screen, or upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate it through the <strong>Plugins<\/strong> screen.<\/li>\n<li>In any post, page or template, add the <strong>Cycle<\/strong> block, then add a variation inside it for\neach version of the content you want.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20does%20it%20decide%20which%20variation%20to%20show%3F\"><h3>How does it decide which variation to show?<\/h3><\/dt>\n<dd><p>Each block keeps a queue. When enough time has passed for the interval you chose, the next\nvariation in the queue is handed out and the queue moves on. With shuffle on, the queue is\nreshuffled at the start of each pass, so every variation appears once before any repeats.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20nobody%20visits%20for%20a%20while%3F\"><h3>What happens if nobody visits for a while?<\/h3><\/dt>\n<dd><p>The block moves on by one variation, not by however many intervals were missed. A page nobody\nvisited for a month does not skip a month's worth of content the next time someone arrives.<\/p><\/dd>\n<dt id=\"i%20use%20a%20caching%20plugin.%20will%20variations%20still%20rotate%3F\"><h3>I use a caching plugin. Will variations still rotate?<\/h3><\/dt>\n<dd><p>This is the one thing worth checking. A full-page cache stores the finished HTML, chosen\nvariation included, so the rotation effectively runs at your cache's expiry rather than at the\ninterval you set.<\/p>\n\n<p>If your cache lifetime is shorter than your interval \u2014 a daily cache with a weekly rotation, for\nexample \u2014 everything behaves as expected. If it is longer, either shorten the cache lifetime for\nthose pages or lengthen the interval to match.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20any%20block%3F\"><h3>Does it work with any block?<\/h3><\/dt>\n<dd><p>Yes. A variation is an ordinary block container, so it can hold headings, paragraphs, images,\nbuttons, columns, groups, and blocks from other plugins.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20page%20if%20the%20plugin%20is%20deactivated%3F\"><h3>What happens to my page if the plugin is deactivated?<\/h3><\/dt>\n<dd><p>Every variation shows, one after another, as ordinary content. Nothing is lost and nothing\nbreaks \u2014 your content was never stored anywhere but in the post itself.<\/p><\/dd>\n<dt id=\"i%20duplicated%20a%20page.%20do%20both%20copies%20share%20a%20schedule%3F\"><h3>I duplicated a page. Do both copies share a schedule?<\/h3><\/dt>\n<dd><p>No. The schedule is keyed to the block <em>and<\/em> the post, so a duplicate starts its own.<\/p><\/dd>\n<dt id=\"does%20this%20do%20a%2Fb%20testing%3F\"><h3>Does this do A\/B testing?<\/h3><\/dt>\n<dd><p>Not in the statistical sense \u2014 it rotates content on a schedule rather than splitting traffic\nand measuring significance. If you want to know which variation performs, the Pro edition adds\nCustom Events \u2014 a view event, and an optional click event, for every event you define; this\nedition rotates, it does not measure.<\/p><\/dd>\n<dt id=\"why%20does%20it%20need%20php%208.1%3F\"><h3>Why does it need PHP 8.1?<\/h3><\/dt>\n<dd><p>The plugin is built on modern PHP. Most hosts have offered 8.1 or newer for some time, and your\nhost's control panel will show which version your site runs. Earlier releases of this plugin ran\non PHP 7.4, which has been unsupported since 2022.<\/p><\/dd>\n<dt id=\"i%20bought%20cycle%20block%20pro.%20how%20do%20i%20switch%20this%20site%20to%20it%3F\"><h3>I bought Cycle Block Pro. How do I switch this site to it?<\/h3><\/dt>\n<dd><p>On a single site, open Settings \u2192 Cycle Block, click \"Have a license?\", and paste the license key from your receipt\nemail. The plugin verifies the key, installs Cycle Block Pro, and deactivates itself \u2014 your\nblocks, schedules and settings carry over untouched, and your key carries over with them, so you\nnever enter it twice. If any step fails, nothing on your site has changed, and you can always\ninstall Cycle Block Pro manually from your account page instead.<\/p>\n\n<p>On a WordPress multisite network the in-place switch does not run, and the settings screen says so\nrather than asking for a key: a network administrator installs Cycle Block Pro from the network\nadmin, and the license key is entered on each site. Your blocks, schedules and settings carry over\nuntouched either way.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.2<\/h4>\n\n<p>The relaunch release. WordPress.org last published 1.0.4, so everything listed under 1.2.0 and\n1.1.0 below reaches sites for the first time in this version, together with:\n* Choosing a schedule this edition does not include now says so in the editor, names the\n  schedule the block is still cycling on, and changes nothing; the server enforces the same\n  range, so no client-side edit can widen it.\n* A security review against the OWASP Top 10 and an accessibility review to WCAG 2.2 AA, with\n  every finding fixed.\n* Multisite: the in-place upgrade is offered only where it can actually be performed.\n* The JavaScript and CSS ship readable and unminified, and the published source repository\n  rebuilds them byte for byte.<\/p>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: upgrade to Cycle Block Pro in place. Enter a license key under Settings \u2192 Cycle Block \u2014\nor complete a purchase and click one button \u2014 and this site switches editions with every\nblock, schedule and setting exactly as it was. See the \"External services\" section for\nprecisely what is sent, and when.<\/li>\n<li>New: the settings screen now explains what the plugin stores and where its controls live,\nholds the license entry, and shows what the Pro edition adds beside what you already have.<\/li>\n<li>New: Docs and Support links on the plugin's row of the Plugins screen.<\/li>\n<li>The published source repository now builds with no credentials of any kind: the one GhostLabs\nlibrary the plugin uses is carried inside it as readable GPL source (<code>lib\/wp-kit\/<\/code>).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Rebuilt on the codebase GhostLabs develops Cycle Block from, so this edition now receives the\nsame fixes as the Pro edition instead of lagging behind it.<\/li>\n<li>Accessibility pass to WCAG 2.2 AA across the editor interface.<\/li>\n<li>The whole plugin is now translatable, and translations from WordPress.org are picked up\nautomatically.<\/li>\n<li>The front-end stylesheet is loaded only on pages that actually use the block, instead of on\nevery page of the site.<\/li>\n<li>Fixed: a block whose queue had run out could log a PHP warning on the front end.<\/li>\n<li>Fixed: rendering over the REST API no longer advances the schedule \u2014 a request that is not a\npage view should not consume a variation.<\/li>\n<li><strong>Requires PHP 8.1<\/strong> (previously 7.4).<\/li>\n<\/ul>","raw_excerpt":"Rotate content variations on a schedule \u2014 daily, weekly or monthly. Rendered server-side, so there&#039;s no flicker or layout shift.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/232748","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=232748"}],"author":[{"embeddable":true,"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ghostlabs"}],"wp:attachment":[{"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=232748"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=232748"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=232748"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=232748"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=232748"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=232748"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}