{"id":293687,"date":"2026-04-07T08:36:29","date_gmt":"2026-04-07T08:36:29","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/berestov-element-scheduler\/"},"modified":"2026-04-07T08:36:49","modified_gmt":"2026-04-07T08:36:49","slug":"berestov-element-scheduler","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/berestov-element-scheduler\/","author":23366035,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.12","stable_tag":"1.0.12","tested":"6.9.4","requires":"6.2","requires_php":"7.0","requires_plugins":null,"header_name":"Berestov Element Scheduler","header_author":"Andrey Berestov","header_description":"Allows you to schedule replacements of website elements, such as contacts, banners, etc.","assets_banners_color":"a97349","last_updated":"2026-04-07 08:36:49","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.myetherwallet.com\/#send\/0x37385DA1388F2921583d4750FB44Def7D76cAb23","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/andreyberestov","rating":0,"author_block_rating":0,"active_installs":0,"downloads":26,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.12":{"tag":"1.0.12","author":"andreyberestov","date":"2026-04-07 08:36:49"}},"upgrade_notice":{"1.0.12":"<ul>\n<li>Moves runtime script delivery to WordPress script APIs while preserving existing Server, JavaScript, and Auto behavior.<\/li>\n<\/ul>","1.0.11":"<ul>\n<li>Confirms the renamed build has no legacy custom REST namespace and adds reviewer-requested frontend buffering and late escaping fixes.<\/li>\n<\/ul>","1.0.10":"<ul>\n<li>Replaces GMT wording with UTC in the settings UI and clarifies the schedule offset description.<\/li>\n<\/ul>","1.0.9":"<ul>\n<li>Fixes JavaScript and Auto mode schedule switching when the configured plugin GMT offset should control the active day.<\/li>\n<\/ul>","1.0.8":"<ul>\n<li>Restores working JavaScript and Auto mode client scripts after the 1.0.7 escaping change.<\/li>\n<\/ul>","1.0.7":"<ul>\n<li>Fixes frontend output escaping checks, updates the menu label, and adds a short security summary to the readme.<\/li>\n<\/ul>","1.0.6":"<ul>\n<li>Keeps Server mode PHP-only and clarifies the distinction between Server and Auto.<\/li>\n<\/ul>","1.0.4":"<ul>\n<li>Rebuilds JavaScript scheduling on top of the stable 1.0.0 behavior and fixes timezone-safe cached-page replacement.<\/li>\n<\/ul>","1.0.3":"<ul>\n<li>Restores working JavaScript replacement on cached pages and stabilizes Auto mode correction.<\/li>\n<\/ul>","1.0.2":"<ul>\n<li>Fixes a JavaScript mode regression and improves Auto mode reliability on cached pages.<\/li>\n<\/ul>","1.0.1":"<ul>\n<li>Adds cache-aware JavaScript scheduling and the new Auto mode for stale cached pages.<\/li>\n<\/ul>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3500475,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3500475,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3500475,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3500475,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.12"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3500475,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3500475,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3500475,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3500475,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"Global settings and rules list.","2":"Weekday calendar with drag and drop.","3":"Expanded rule editor.","4":"Parity and persistent schedule boxes."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2736,2628,4853,4454,4685],"plugin_category":[58],"plugin_contributors":[247977],"plugin_business_model":[],"class_list":["post-293687","plugin","type-plugin","status-publish","hentry","plugin_tags-contacts","plugin_tags-insert","plugin_tags-replacement","plugin_tags-rotation","plugin_tags-scheduler","plugin_category-user-management","plugin_contributors-andreyberestov","plugin_committers-andreyberestov"],"banners":{"banner":"https:\/\/ps.w.org\/berestov-element-scheduler\/assets\/banner-772x250.png?rev=3500475","banner_2x":"https:\/\/ps.w.org\/berestov-element-scheduler\/assets\/banner-1544x500.png?rev=3500475","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/berestov-element-scheduler\/assets\/icon-128x128.png?rev=3500475","icon_2x":"https:\/\/ps.w.org\/berestov-element-scheduler\/assets\/icon-256x256.png?rev=3500475","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/berestov-element-scheduler\/assets\/screenshot-1.png?rev=3500475","caption":"Global settings and rules list."},{"src":"https:\/\/ps.w.org\/berestov-element-scheduler\/assets\/screenshot-2.png?rev=3500475","caption":"Weekday calendar with drag and drop."},{"src":"https:\/\/ps.w.org\/berestov-element-scheduler\/assets\/screenshot-3.png?rev=3500475","caption":"Expanded rule editor."},{"src":"https:\/\/ps.w.org\/berestov-element-scheduler\/assets\/screenshot-4.png?rev=3500475","caption":"Parity and persistent schedule boxes."}],"raw_content":"<!--section=description-->\n<p>Berestov Element Scheduler replaces the inner HTML of selected frontend elements by schedule.<\/p>\n\n<p>It can match a parent element by class or ID and replace everything inside that parent with the value you define.<\/p>\n\n<p>Supported schedule groups:<\/p>\n\n<ul>\n<li>Weekdays<\/li>\n<li>Odd and even month days<\/li>\n<li>Odd and even ISO weeks<\/li>\n<li>Persistent replacement<\/li>\n<\/ul>\n\n<p>Features:<\/p>\n\n<ul>\n<li>Unlimited rules<\/li>\n<li>Search by class or ID<\/li>\n<li>Class mode works across all matched elements<\/li>\n<li>Multiple different rules per schedule slot<\/li>\n<li>Duplicate prevention inside the same slot<\/li>\n<li>Server-side, JavaScript, or Auto replacement mode<\/li>\n<li>UTC offset based switching<\/li>\n<li>Drag and drop schedule UI<\/li>\n<li>Translation-ready admin UI<\/li>\n<\/ul>\n\n<p>Use cases:<\/p>\n\n<ul>\n<li>Rotate phone numbers<\/li>\n<li>Schedule banners<\/li>\n<li>Switch promo blocks<\/li>\n<li>Replace HTML snippets by schedule<\/li>\n<\/ul>\n\n<p>Days without a rule stay unchanged.<\/p>\n\n<p>Security<\/p>\n\n<ul>\n<li>Capability checks and nonce validation for all administrative actions.<\/li>\n<li>Strict sanitization and option whitelisting for all saved settings.<\/li>\n<li>Only explicitly allowed configuration fields are accepted.<\/li>\n<li>HTML output follows WordPress capability rules (unfiltered_html).<\/li>\n<li>No external requests or file operations performed by the plugin.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the Plugins screen in WordPress.<\/li>\n<li>Open <code>E Scheduler<\/code> in the admin menu.<\/li>\n<li>Create one or more rules.<\/li>\n<li>Drag rules into the required schedule box.<\/li>\n<li>Save settings.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20replace%20only%20plain%20text%3F\"><h3>Does it replace only plain text?<\/h3><\/dt>\n<dd><p>No. It can replace the full inner HTML of the matched parent element.<\/p><\/dd>\n<dt id=\"if%20i%20use%20class%20mode%2C%20does%20it%20replace%20every%20matched%20element%3F\"><h3>If I use class mode, does it replace every matched element?<\/h3><\/dt>\n<dd><p>Yes. Class mode replaces all frontend elements that contain the selected class.<\/p><\/dd>\n<dt id=\"can%20one%20slot%20contain%20many%20rules%3F\"><h3>Can one slot contain many rules?<\/h3><\/dt>\n<dd><p>Yes. Each slot can contain many different rules, but the same rule cannot be added twice to the same slot.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20one%20rule%20is%20assigned%20to%20several%20schedule%20groups%3F\"><h3>What happens if one rule is assigned to several schedule groups?<\/h3><\/dt>\n<dd><p>The rule becomes active when any assigned condition matches. It is applied once per request.<\/p><\/dd>\n<dt id=\"which%20mode%20should%20i%20use%3F\"><h3>Which mode should I use?<\/h3><\/dt>\n<dd><p>Server-side mode uses PHP replacement only and avoids visual flicker. JavaScript mode is suitable for sites that use full page caching. Auto mode prefers server-side output and lets JavaScript correct stale cached markup when needed.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>Switched head and JavaScript footer runtime script delivery to WordPress script APIs.<\/li>\n<li>Preserved Auto mode footer injection flow for cached-page recovery and dual delivery behavior.<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li>Confirmed the renamed build does not register legacy custom REST routes.<\/li>\n<li>Paired frontend output buffering with an explicit shutdown close path.<\/li>\n<li>Moved inline client payload and runner output through late escaping.<\/li>\n<li>Synced the plugin version metadata after the rename.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Fixed JavaScript and Auto mode time context calculation so schedule switching follows the configured plugin GMT offset without applying the browser timezone twice.<\/li>\n<li>Keeps Server mode schedule context unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Restored JavaScript mode after 1.0.7 by removing the escaping change that stripped inline client scripts.<\/li>\n<li>Kept the menu label and readme security summary.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Escaped inline client payload and runner output to satisfy WordPress coding standards checks.<\/li>\n<li>Renamed the admin menu label to E Scheduler.<\/li>\n<li>Added a short security summary to the readme.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Kept Server mode PHP-only by registering client payload and runner hooks only for JavaScript and Auto modes.<\/li>\n<li>Clarified admin and readme mode descriptions so Server and Auto stay conceptually distinct.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Added a stronger inline payload and runner fallback between head and footer for JavaScript and Auto modes.<\/li>\n<li>Kept Server mode unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Rebased JavaScript replacement on the stable 1.0.0 approach and added full schedule data for cache-safe client-side evaluation.<\/li>\n<li>Fixed JavaScript time context calculation so browser timezone differences do not break schedules that use the plugin GMT offset.<\/li>\n<li>Stabilized Auto mode by reapplying current rules in the browser using the same client-side schedule engine.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Restored working JavaScript replacement while keeping schedule evaluation inside the browser for cached pages.<\/li>\n<li>Simplified the JavaScript schedule engine so active rules are computed directly from saved rules and schedule groups.<\/li>\n<li>Kept Auto mode cache-safe by restoring server-replaced markup only when the current active rule set differs from the cached markup.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fixed a JavaScript mode regression where client-side replacement could stop applying.<\/li>\n<li>Added a safe fallback that preserves same-context JavaScript replacement while keeping cached-page schedule correction.<\/li>\n<li>Hardened Auto mode behavior for cached pages.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Made JavaScript mode schedule-aware on cached pages by evaluating rules in the browser.<\/li>\n<li>Added Auto mode with server-side output plus JavaScript correction for stale cached markup.<\/li>\n<li>Refined admin mode descriptions for caching-related behavior.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Added current-slot markers for weekday and parity schedules.<\/li>\n<li>Fixed persistent replacement activation.<\/li>\n<li>Final repo-ready release.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Added a compact wallet reveal button in the admin footer.<\/li>\n<li>Refined the readme tags, upgrade notice, and wording.<\/li>\n<\/ul>\n\n<h4>0.1.7<\/h4>\n\n<ul>\n<li>Clarified rule editor labels for parent matching and inner content replacement.<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Added persistent replacement schedule box.<\/li>\n<li>Added automatic \"(copy)\" suffix to copied rules.<\/li>\n<li>Kept duplicate-safe rule activation across overlapping schedule groups.<\/li>\n<li>Refined button styling and admin footer donation note.<\/li>\n<li>Fixed plugin checker issues around textdomain loading, nonce flow, and translators comments.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Added support for multiple different rules per weekday.<\/li>\n<li>Prevented duplicate placement of the same rule inside one day.<\/li>\n<li>Kept class replacement working across all matched elements.<\/li>\n<li>Updated calendar UI for multi-rule days.<\/li>\n<li>Updated readme and translation template.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Added translation template.<\/li>\n<li>Improved rule drag and drop behavior.<\/li>\n<li>Added compact collapsed rule layout.<\/li>\n<li>Added per-rule save buttons.<\/li>\n<li>Added rule removal from the calendar.<\/li>\n<li>Polished admin UI and readme.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Initial public build.<\/li>\n<\/ul>","raw_excerpt":"Schedule frontend element replacements by day, parity, or persistent rules.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/293687","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=293687"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/andreyberestov"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=293687"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=293687"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=293687"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=293687"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=293687"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=293687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}