{"id":391592,"date":"2026-10-30T07:49:02","date_gmt":"2026-10-30T07:49:02","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/site-read-only-mode\/"},"modified":"2026-10-30T07:48:30","modified_gmt":"2026-10-30T07:48:30","slug":"axle-read-only-mode","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/axle-read-only-mode\/","author":20612273,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.0.0","stable_tag":"3.0.0","tested":"7.1.4","requires":"6.6","requires_php":"7.4","requires_plugins":null,"header_name":"Axle Read-Only Mode","header_author":"Aryan Jasala","header_description":"Puts the site in read-only mode during a migration or deploy, so nothing written in the meantime gets lost. Visitors still see the site; edits, uploads, comments, forms and scheduled tasks wait until you unfreeze.","assets_banners_color":"70a4c7","last_updated":"2026-10-30 07:48:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/axle-read-only-mode\/","header_author_uri":"https:\/\/profiles.wordpress.org\/aryanjasala\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":51,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"3.0.0":{"tag":"3.0.0","author":"aryanjasala","date":"2026-10-30 07:48:30","revision":3774624}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3774624,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3774624,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3774624,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3774624,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["3.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3774624,"resolution":"1","location":"assets","locale":"","width":2560,"height":1600},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3774624,"resolution":"2","location":"assets","locale":"","width":2560,"height":1600},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3774624,"resolution":"3","location":"assets","locale":"","width":2560,"height":1600}},"screenshots":{"1":"The block editor during a freeze.","2":"Tools &gt; Axle Read-Only Mode during a freeze, with countdown and blocked attempts.","3":"What visitors see when they send a form during a freeze."}},"plugin_section":[],"plugin_tags":[19981,263488,732,4155,18591],"plugin_category":[52,59],"plugin_contributors":[289675],"plugin_business_model":[],"class_list":["post-391592","plugin","type-plugin","status-publish","hentry","plugin_tags-deploy","plugin_tags-freeze","plugin_tags-maintenance","plugin_tags-migration","plugin_tags-read-only","plugin_category-performance","plugin_category-utilities-and-tools","plugin_contributors-aryanjasala","plugin_committers-aryanjasala"],"banners":{"banner":"https:\/\/ps.w.org\/axle-read-only-mode\/assets\/banner-772x250.png?rev=3774624","banner_2x":"https:\/\/ps.w.org\/axle-read-only-mode\/assets\/banner-1544x500.png?rev=3774624","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/axle-read-only-mode\/assets\/icon-128x128.png?rev=3774624","icon_2x":"https:\/\/ps.w.org\/axle-read-only-mode\/assets\/icon-256x256.png?rev=3774624","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/axle-read-only-mode\/assets\/screenshot-1.png?rev=3774624","caption":"The block editor during a freeze."},{"src":"https:\/\/ps.w.org\/axle-read-only-mode\/assets\/screenshot-2.png?rev=3774624","caption":"Tools &gt; Axle Read-Only Mode during a freeze, with countdown and blocked attempts."},{"src":"https:\/\/ps.w.org\/axle-read-only-mode\/assets\/screenshot-3.png?rev=3774624","caption":"What visitors see when they send a form during a freeze."}],"raw_content":"<!--section=description-->\n<p>When you move a site to a new server, or replace the live database with one from staging, anything saved on the old copy during the move is lost: a post an editor was finishing, a comment, a form entry, a WooCommerce order.<\/p>\n\n<p>Maintenance mode hides the whole site from visitors. Axle Read-Only Mode keeps the site online but makes it <strong>read-only<\/strong>:<\/p>\n\n<ul>\n<li><strong>Editors<\/strong> can open and read everything in wp-admin, but cannot save. The block editor disables Save and Publish and shows why. People who already have the editor open are locked within a minute, through the WordPress heartbeat, and unlocked again when the freeze ends.<\/li>\n<li><strong>Admin actions<\/strong> that change data are refused: saving settings, uploading media, installing or updating plugins, trashing posts. Automatic updates are paused.<\/li>\n<li><strong>The REST API and XML-RPC<\/strong> refuse anything that writes, with HTTP status 423. Reading still works.<\/li>\n<li><strong>Visitor submissions<\/strong> (optional, on by default): comments, sign-ups, contact forms, checkouts and any other form post get a \"back soon\" page with HTTP 503 and a Retry-After header, which search engines understand.<\/li>\n<li><strong>Scheduled tasks<\/strong> (optional, on by default) are held back and run when the freeze ends.<\/li>\n<\/ul>\n\n<p>Logging in always works, so an admin can always unfreeze.<\/p>\n\n<p>Free and open source under the GPL. No pro version, no upsells, no ads in wp-admin, no tracking. And it stays that way.<\/p>\n\n<p>Part of Axle by AryanX, a family of plugins for running WordPress sites safely.<\/p>\n\n<h4>See what was blocked<\/h4>\n\n<p>Every blocked attempt is listed: who tried, when, and what (a post save, an upload, a REST request, a contact form). After the move you know exactly which edits to redo on the new server. The last ten freezes are kept too, with how many attempts each one blocked.<\/p>\n\n<h4>Freeze safely<\/h4>\n\n<ul>\n<li>Pick an end time and the freeze ends by itself. A deploy script that fails halfway cannot leave the site frozen for days.<\/li>\n<li>Running late? Add 30 minutes or an hour from the freeze screen or the admin bar. A live countdown shows the time left.<\/li>\n<li>Schedule a freeze for later, for example the start of a maintenance window.<\/li>\n<li>Tick \"Let me keep editing\" to exempt yourself.<\/li>\n<li>Write your own message for visitors, for example \"We are moving servers. Back by 3 pm.\"<\/li>\n<li>Freeze for an hour straight from the admin bar (under the site name), and unfreeze from the admin bar or the notice on every screen.<\/li>\n<\/ul>\n\n<h4>From a deploy script<\/h4>\n\n<pre><code>wp axle-read-only-mode on --minutes=30 --reason=\"Moving servers\"\nwp axle-read-only-mode off\nwp axle-read-only-mode status\nwp axle-read-only-mode extend 30\nwp axle-read-only-mode log\n<\/code><\/pre>\n\n<p>WP-CLI itself is never blocked, so your scripts can keep importing and replacing data. Use <code>--no-visitors<\/code> or <code>--no-cron<\/code> to leave those running.<\/p>\n\n<p>Or freeze from wp-config.php while files are being swapped:<\/p>\n\n<pre><code>define( 'AXLE_READ_ONLY_MODE', true );\ndefine( 'AXLE_READ_ONLY_MODE_REASON', 'Moving servers' );\n<\/code><\/pre>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20is%20this%20different%20from%20a%20maintenance%20mode%20plugin%3F\"><h3>How is this different from a maintenance mode plugin?<\/h3><\/dt>\n<dd><p>Maintenance mode shows visitors a placeholder page instead of the site. Axle Read-Only Mode keeps the site fully visible and only stops changes. Use it when the site has to stay online during the move.<\/p><\/dd>\n<dt id=\"does%20it%20stop%20every%20plugin%27s%20forms%3F\"><h3>Does it stop every plugin's forms?<\/h3><\/dt>\n<dd><p>It stops every form that posts to the site from the front end, every REST API write and every admin-ajax request that is not on the read-only list. A form that sends data straight to an outside service is not affected.<\/p><\/dd>\n<dt id=\"a%20read-only%20screen%20of%20my%20plugin%20stopped%20working%20during%20the%20freeze.\"><h3>A read-only screen of my plugin stopped working during the freeze.<\/h3><\/dt>\n<dd><p>Admin-ajax requests are blocked unless they are known to be read-only. Add the action name with the <code>axle_read_only_mode_allowed_ajax_actions<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20someone%20keep%20working%20while%20the%20site%20is%20frozen%3F\"><h3>Can someone keep working while the site is frozen?<\/h3><\/dt>\n<dd><p>Yes. Tick \"Let me keep editing\" when you freeze, or use the <code>axle_read_only_mode_user_can_bypass<\/code> filter.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.0.0<\/h4>\n\n<ul>\n<li>Changed (breaking change): rename to Axle Read-Only Mode for WordPress.org<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Fix: refuse abilities that write during a freeze on WordPress 6.9 and 7.0<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Changed (breaking change): rename to Axle Read-Only Mode for WordPress.org<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Fix: make the abilities visible to MCP agents, and let the MCP adapter run them during a freeze<\/li>\n<li>New: add abilities so AI agents can check and control a freeze, and refuse other abilities that write during one<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: add filters for the freeze lengths, messages and limits, and actions for each blocked request<\/li>\n<li>Fix: stop bots from flooding the freeze log, and keep personal data out of it<\/li>\n<li>Fix: keep editor housekeeping working during a freeze<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: list of blocked attempts, so you know which edits to redo after a migration.<\/li>\n<li>New: history of the last ten freezes.<\/li>\n<li>New: extend a freeze by 30 minutes or an hour, with a live countdown.<\/li>\n<li>New: freeze and unfreeze from the admin bar.<\/li>\n<li>New: custom message for visitors.<\/li>\n<li>New: <code>wp axle-read-only-mode extend<\/code> and <code>wp axle-read-only-mode log<\/code>.<\/li>\n<li>Rewritten as PSR-4 classes.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Read-only mode for migrations and deploys. Visitors still see the site; nothing can be saved, so no edits, orders or comments get lost.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/391592","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=391592"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/aryanjasala"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=391592"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=391592"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=391592"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=391592"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=391592"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=391592"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}