{"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-05-21T08:02:43","modified_gmt":"2026-05-21T08:02:43","slug":"berestov-element-scheduler","status":"publish","type":"plugin","link":"https:\/\/ru.wordpress.org\/plugins\/berestov-element-scheduler\/","author":23366035,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.34","stable_tag":"1.0.34","tested":"7.0","requires":"4.8","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-05-21 08:02:43","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":304,"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"},"1.0.15":{"tag":"1.0.15","author":"andreyberestov","date":"2026-04-17 16:18:32"},"1.0.26":{"tag":"1.0.26","author":"andreyberestov","date":"2026-04-18 15:02:38"},"1.0.27":{"tag":"1.0.27","author":"andreyberestov","date":"2026-04-19 14:03:40"},"1.0.34":{"tag":"1.0.34","author":"andreyberestov","date":"2026-05-21 08:02:43"}},"upgrade_notice":{"1.0.34":"<p>Refines Auto footer output and adds a validator hint for DOM-sensitive homepages.<\/p>","1.0.33":"<p>Small polish release for probe checks, mode help text, and DOM rewrite debug output.<\/p>","1.0.31":"<p>Uses a short-lived internal probe token for DOM checks and makes JavaScript the default mode.<\/p>","1.0.30":"<p>Refines DOM rewrite compatibility detection and adds a small before\/after debug view.<\/p>","1.0.29":"<ul>\n<li>Uses a cache-resistant probe for DOM compatibility checks.<\/li>\n<\/ul>","1.0.28":"<ul>\n<li>Limits DOM rewrite compatibility updates to the dry settings probe only.<\/li>\n<\/ul>","1.0.27":"<ul>\n<li>Refreshes DOM rewrite compatibility checks on each settings page load and runs them in a dry pass without applying active rules.<\/li>\n<\/ul>","1.0.26":"<ul>\n<li>Improved detection of themes sensitive to DOM rewriting. Server-side and Auto modes are now more safely limited to compatible environments to prevent layout issues.<\/li>\n<\/ul>","1.0.15":"<ul>\n<li>Restores readable UTF-8 page source in server\/auto mode after DOM-based replacement.<\/li>\n<\/ul>","1.0.14":"<ul>\n<li>Improves UTF-8 document loading in Server and Auto mode to prevent stray XML preambles from appearing in cached page source.<\/li>\n<\/ul>","1.0.13":"<ul>\n<li>Cleans serialized Server and Auto output more strictly to prevent stray XML preambles in cached HTML and reconfirms WordPress 4.8+ support.<\/li>\n<\/ul>","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":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3500475,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3500475,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3500475,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.12","1.0.15","1.0.26","1.0.27","1.0.34"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3500475,"resolution":"1","location":"assets","locale":"","width":1753,"height":3144},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3500475,"resolution":"2","location":"assets","locale":"","width":1752,"height":433},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3500475,"resolution":"3","location":"assets","locale":"","width":1751,"height":543},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3500475,"resolution":"4","location":"assets","locale":"","width":1759,"height":1180}},"screenshots":{"1":"Global settings and rules list.","2":"Weekday calendar with drag and drop.","3":"Expanded rule editor.","4":"Parity and persistent schedule boxes."}},"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>The plugin does not contact external services or third-party APIs.<\/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.34<\/h4>\n\n<ul>\n<li>Removes literal \\n tail markers from Auto footer script output.<\/li>\n<li>Adds a W3C Validator hint for DOM-sensitive homepages.<\/li>\n<\/ul>\n\n<h4>1.0.33<\/h4>\n\n<ul>\n<li>Adds checker-friendly probe token handling and refines DOM rewrite debug highlighting.<\/li>\n<li>Reorders the replacement mode help text to match the current mode order.<\/li>\n<\/ul>\n\n<h4>1.0.31<\/h4>\n\n<p>Uses a short-lived internal probe token for DOM checks and makes JavaScript the default mode.<\/p>\n\n<h4>1.0.30<\/h4>\n\n<ul>\n<li>Simplifies DOM rewrite compatibility checks to compare the full home page skeleton using div\/nav\/ul\/menu tags only.<\/li>\n<li>Adds a small debug view to the DOM rewrite help tip showing before\/after structure sequences.<\/li>\n<\/ul>\n\n<h4>1.0.29<\/h4>\n\n<ul>\n<li>Switches DOM compatibility checks to a cache-resistant POST probe.<\/li>\n<li>Reduces false positives on cached sites during dry detection.<\/li>\n<\/ul>\n\n<h4>1.0.28<\/h4>\n\n<ul>\n<li>Limits DOM rewrite compatibility updates to the dry settings probe only.<\/li>\n<li>Prevents runtime requests from overwriting the compatibility status.<\/li>\n<\/ul>\n\n<h4>1.0.27<\/h4>\n\n<ul>\n<li>Refreshes DOM rewrite compatibility checks on each settings page load and runs them in a dry pass without applying active rules.<\/li>\n<li>Adds small help tips for Site charset, mbstring, and DOM rewrite compatibility.<\/li>\n<\/ul>\n\n<h4>1.0.26<\/h4>\n\n<ul>\n<li>Improves DOM rewrite compatibility detection by comparing full document structure (tag skeleton) on the home page.<\/li>\n<li>More reliably detects themes sensitive to DOM normalization and safely restricts them to JavaScript mode.<\/li>\n<li>Refines environment checks and removes intermediate detection logic for a cleaner and more stable behavior.<\/li>\n<\/ul>\n\n<h4>1.0.15<\/h4>\n\n<ul>\n<li>Restored readable UTF-8 page source in server\/auto mode after DOM-based replacement by decoding numeric entities in serialized HTML.<\/li>\n<\/ul>\n\n<h4>1.0.14<\/h4>\n\n<ul>\n<li>Switched DOM HTML loading to a UTF-8-safe path that avoids injecting an XML preamble into serialized Server and Auto output.<\/li>\n<li>Preserved the existing replacement flow while reducing the chance of malformed cached page source.<\/li>\n<li>Reconfirmed compatibility with WordPress 4.8+.<\/li>\n<\/ul>\n\n<h4>1.0.13<\/h4>\n\n<ul>\n<li>Tightened full-document output cleanup after DOM serialization to remove stray XML preambles before cached HTML is served.<\/li>\n<li>Reconfirmed compatibility with WordPress 4.8+.<\/li>\n<\/ul>\n\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:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/293687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=293687"}],"author":[{"embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/andreyberestov"}],"wp:attachment":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=293687"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=293687"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=293687"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=293687"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=293687"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=293687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}