{"id":5072,"date":"2025-02-22T06:52:03","date_gmt":"2025-02-22T06:52:03","guid":{"rendered":"https:\/\/s-o-s.net\/rollback-auto-update\/"},"modified":"2025-02-22T06:52:03","modified_gmt":"2025-02-22T06:52:03","slug":"rollback-auto-update","status":"publish","type":"post","link":"https:\/\/s-o-s.net\/en_gb\/rollback-auto-update\/","title":{"rendered":"Rollback Auto Update"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<article id=\"post-136404\" class=\"alignwide post-136404 plugin type-plugin status-publish hentry plugin_section-featured plugin_tags-auto-update plugin_tags-failure plugin_tags-feature-plugin plugin_tags-update plugin_contributors-afragen plugin_contributors-costdev plugin_contributors-pbiron plugin_committers-afragen plugin_committers-githubsync\">\n<div class=\"plugin-banner\" id=\"plugin-banner-rollback-update-failure\"><\/div>\n<header class=\"plugin-header\">\n<div class=\"entry-heading-container\">\n<div>\n<div class=\"entry-thumbnail\">\n\t\t\t\t\t<img decoding=\"async\" class=\"plugin-icon\" src=\"https:\/\/ps.w.org\/rollback-update-failure\/assets\/icon.svg?rev=2787335\" alt=\"\">\t\t\t\t<\/div>\n<div>\n<h1 class=\"plugin-title\">Rollback Auto Update<\/h1>\n<p>\t\t\t\t\t<span class=\"byline\">By <span class=\"author vcard\"><a target=\"_blank\" class=\"url fn n\" href=\"https:\/\/profiles.wordpress.org\/afragen\/\" rel=\"noopener\">Andy Fragen<\/a><\/span><\/span>\n\t\t\t\t<\/div>\n<\/p><\/div>\n<div class=\"plugin-actions\">\n<div class=\"wp-block-button is-small plugin-download download-button\"><a target=\"_blank\" class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/downloads.wordpress.org\/plugin\/rollback-update-failure.7.2.1.zip\" rel=\"noopener\">Download<\/a><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/header>\n<p><!-- .entry-header --><\/p>\n<p>\t<span id=\"description\"><\/span><br \/>\n\t<span id=\"reviews\"><\/span><br \/>\n\t<span id=\"installation\"><\/span><br \/>\n\t<span id=\"developers\"><\/span><br \/>\n\t<span id=\"advanced\" class=\"\"><\/span><br \/>\n\t<span id=\"section-links\"><\/p>\n<ul class=\"tabs clear\">\n<li id=\"tablink-description\"><a target=\"_blank\" href=\"https:\/\/wordpress.org\/plugins\/rollback-update-failure\/#description\" rel=\"noopener\">Details<\/a><\/li>\n<li id=\"tablink-reviews\"><a target=\"_blank\" href=\"https:\/\/wordpress.org\/plugins\/rollback-update-failure\/#reviews\" rel=\"noopener\">Reviews<\/a><\/li>\n<li id=\"tablink-developers\"><a target=\"_blank\" href=\"https:\/\/wordpress.org\/plugins\/rollback-update-failure\/#developers\" rel=\"noopener\">Development<\/a><\/li>\n<\/ul>\n<div id=\"link-support\">\n\t\t\t<a target=\"_blank\" href=\"https:\/\/wordpress.org\/support\/plugin\/rollback-update-failure\/\" rel=\"noopener\">Support<\/a>\n\t\t<\/div>\n<p>\t<\/span><br \/>\n\t<script type=\"text\/javascript\">if ( '#changelog' == window.location.hash ) { window.setTimeout( function() { window.location.hash=\"#developers\"; }, 10 ); }<\/script><\/p>\n<div class=\"entry-content\">\n<div id=\"tab-description\" class=\"plugin-description section\">\n<h2 id=\"description-header\">Description<\/h2>\n<p>This is a feature plugin is for testing Rollback Auto-Update, aka Rollback part 3. This feature only protects plugins during the auto-update process.<\/p>\n<p>As part of the normal Rollback process, the currently installed version of the plugin is moved to <code>wp-content\/upgrade-temp-backup\/plugins<\/code>. An active plugin is checked to ensure it doesn\u2019t cause a PHP fatal error when visiting the site. An inactive plugin is not checked because it cannot cause your site to white screen.<\/p>\n<p>Rollback parts 1 was merged into WordPress 6.2 as the <code>move_dir()<\/code>. Rollback part 2 was merged into WordPress 6.3 and protects the manual update process of plugins and themes.<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/core.trac.wordpress.org\/changeset\/53578\" rel=\"nofollow ugc noopener\" class=\"broken_link\">r53578<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/core.trac.wordpress.org\/changeset\/55204\" rel=\"nofollow ugc noopener\" class=\"broken_link\">r55204<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/core.trac.wordpress.org\/changeset\/55219\" rel=\"nofollow ugc noopener\" class=\"broken_link\">r55219<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/core.trac.wordpress.org\/changeset\/55220\" rel=\"nofollow ugc noopener\" class=\"broken_link\">r55220<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/core.trac.wordpress.org\/changeset\/55223\" rel=\"nofollow ugc noopener\" class=\"broken_link\">r55223<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/core.trac.wordpress.org\/changeset\/55720\" rel=\"nofollow ugc noopener\" class=\"broken_link\">r55720<\/a><\/li>\n<\/ul>\n<h3>Testing<\/h3>\n<ul>\n<li>Requires WordPress 6.3<\/li>\n<li>This <strong>only<\/strong> works on auto-updates.<\/li>\n<li>Run the following commands from the terminal. You might need to run the command several times to get it started:<br \/>\nwp cron event run wp_version_check<\/li>\n<li>When updating a plugin, you should be able to see the old plugin in the <code>wp-content\/upgrade-temp-backup\/plugins\/PLUGINNAME<\/code> folder. The same should apply for themes. Since updates sometimes run fast and we may miss the folder creation during testing, you can simulate an update failure to demonstrate.<\/li>\n<li>When a plugin auto-update fails, the previous version should be restored. To test that, change the version of a plugin to a previous number, run the update, and on fail the previous version (the one where you changed the version number) should still be installed on the site. To simulate an update failure and confirm this works, use the built-in <strong>Simulate failure<\/strong> link. Just activate\/deactivate from the <code>plugins.php<\/code> page action link. This link will only be present if the plugin has an update pending.<\/li>\n<\/ul>\n<h3>Reporting<\/h3>\n<p>Please submit <a target=\"_blank\" href=\"https:\/\/github.com\/afragen\/rollback-update-failure\/issues\" rel=\"nofollow ugc noopener\">issues<\/a> and <a target=\"_blank\" href=\"https:\/\/github.com\/afragen\/rollback-update-failure\/pulls\" rel=\"nofollow ugc noopener\">PRs<\/a> to GitHub.<\/p>\n<p>Logo from a meme generator. <a target=\"_blank\" href=\"http:\/\/hyperboleandahalf.blogspot.com\/2010\/06\/this-is-why-ill-never-be-adult.html\" rel=\"nofollow ugc noopener\">Original artwork<\/a> by Allie Brosh.<\/p>\n<\/div>\n<div id=\"tab-reviews\" class=\"plugin-reviews section\">\n<h2 id=\"reviews-header\">Reviews<\/h2>\n<div class=\"plugin-reviews\">\n<article class=\"plugin-review\">\n<div class=\"review-avatar\">\n\t\t\t\t\t\t<img decoding=\"async\" alt=\"\" src=\"https:\/\/secure.gravatar.com\/avatar\/b7c2b137412347eb3058fac75ad00b3bdb56b7862a54aad2d31035f770c87b72?s=60&amp;d=retro&amp;r=g\" srcset=\"https:\/\/secure.gravatar.com\/avatar\/b7c2b137412347eb3058fac75ad00b3bdb56b7862a54aad2d31035f770c87b72?s=120&amp;d=retro&amp;r=g 2x\" class=\"avatar avatar-60 photo\" height=\"60\" width=\"60\">\t\t\t\t\t<\/div>\n<div class=\"review\">\n<header>\n<div class=\"header-top\">\n<div class=\"wporg-ratings\" aria-label=\"1 out of 5 stars\" data-title-template=\"%s out of 5 stars\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-empty\"><\/span><span class=\"dashicons dashicons-star-empty\"><\/span><span class=\"dashicons dashicons-star-empty\"><\/span><span class=\"dashicons dashicons-star-empty\"><\/span><\/div>\n<h3 class=\"review-title\"><a target=\"_blank\" class=\"url\" href=\"https:\/\/wordpress.org\/support\/topic\/useless-495\/\" rel=\"noopener\">Useless against Fatal Errors<\/a><\/h3>\n<\/p><\/div>\n<div class=\"header-bottom\">\n\t\t\t\t\t\t\t\t<span class=\"review-author author vcard\"><a target=\"_blank\" href=\"https:\/\/profiles.wordpress.org\/thejasonator\/\" title=\"Posts by thejasonator\" rel=\"author noopener\">thejasonator<\/a><\/span><br \/>\n\t\t\t\t\t\t\t\t<span class=\"review-date\">July 11, 2022<\/span><br \/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"review-replies\">2 replies<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n<\/header>\n<div class=\"review-content\">When a plugin update succeeds, but the new version causes a Fatal Error (like what recently happened with WP Crontrol version 1.13.x), you would expect Rollback Update Failure to roll back the offending plugin to the previous version, but alas! Rollback Update Failure isn\u2019t immune to Fatal Errors.<\/p>\n<p>What it needs is an external Cron process OUTSIDE of WordPress that monitors an update log for an update, followed by Fatal Errors in the PHP error log, and then does what Rollback Update Failure is supposed to do, otherwise WordPress is always going to be susceptible to idiot plugin developers that cause Fatal Errors with plugin updates.<\/p><\/div>\n<\/p><\/div>\n<\/article>\n<article class=\"plugin-review\">\n<div class=\"review-avatar\">\n\t\t\t\t\t\t<img decoding=\"async\" alt=\"\" src=\"https:\/\/secure.gravatar.com\/avatar\/380b31171d26ad194e987b878a5e56999e1c8973f8d08a6388201fdf49ef9d99?s=60&amp;d=retro&amp;r=g\" srcset=\"https:\/\/secure.gravatar.com\/avatar\/380b31171d26ad194e987b878a5e56999e1c8973f8d08a6388201fdf49ef9d99?s=120&amp;d=retro&amp;r=g 2x\" class=\"avatar avatar-60 photo\" height=\"60\" width=\"60\">\t\t\t\t\t<\/div>\n<div class=\"review\">\n<header>\n<div class=\"header-top\">\n<div class=\"wporg-ratings\" aria-label=\"5 out of 5 stars\" data-title-template=\"%s out of 5 stars\" data-rating=\"5\" style=\"color:#ffb900;\"><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><\/div>\n<h3 class=\"review-title\"><a target=\"_blank\" class=\"url\" href=\"https:\/\/wordpress.org\/support\/topic\/wow-849\/\" rel=\"noopener\">Wow!<\/a><\/h3>\n<\/p><\/div>\n<div class=\"header-bottom\">\n\t\t\t\t\t\t\t\t<span class=\"review-author author vcard\"><a target=\"_blank\" href=\"https:\/\/profiles.wordpress.org\/itsmuxr\/\" title=\"Posts by itsmuxr\" rel=\"author noopener\">itsmuxr<\/a><\/span><br \/>\n\t\t\t\t\t\t\t\t<span class=\"review-date\">July 14, 2021<\/span><br \/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"review-replies\">1 reply<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n<\/header>\n<div class=\"review-content\">That is great! I have just one question! How many times this plugin could roll back a theme or a plugin update, can it roll back for example three steps back? Thank you for your answer in advance!<\/div>\n<\/p><\/div>\n<\/article>\n<article class=\"plugin-review\">\n<div class=\"review-avatar\">\n\t\t\t\t\t\t<img decoding=\"async\" alt=\"\" src=\"https:\/\/secure.gravatar.com\/avatar\/90bde9d8d9a447db0db87d33a4deff89d698b33b1f8aed916f69d28ca5101cad?s=60&amp;d=retro&amp;r=g\" srcset=\"https:\/\/secure.gravatar.com\/avatar\/90bde9d8d9a447db0db87d33a4deff89d698b33b1f8aed916f69d28ca5101cad?s=120&amp;d=retro&amp;r=g 2x\" class=\"avatar avatar-60 photo\" height=\"60\" width=\"60\">\t\t\t\t\t<\/div>\n<div class=\"review\">\n<header>\n<div class=\"header-top\">\n<div class=\"wporg-ratings\" aria-label=\"5 out of 5 stars\" data-title-template=\"%s out of 5 stars\" data-rating=\"5\" style=\"color:#ffb900;\"><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><\/div>\n<h3 class=\"review-title\"><a target=\"_blank\" class=\"url\" href=\"https:\/\/wordpress.org\/support\/topic\/%d9%87%d8%a7%d9%84%db%8c%db%8c%db%8c%db%8c\/\" rel=\"noopener\">\u0647\u0627\u0644\u06cc\u06cc\u06cc\u06cc<\/a><\/h3>\n<\/p><\/div>\n<div class=\"header-bottom\">\n\t\t\t\t\t\t\t\t<span class=\"review-author author vcard\"><a target=\"_blank\" href=\"https:\/\/profiles.wordpress.org\/hashempoor\/\" title=\"Posts by hashempoor\" rel=\"author noopener\">hashempoor<\/a><\/span><br \/>\n\t\t\t\t\t\t\t\t<span class=\"review-date\">June 4, 2021<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n<\/header>\n<div class=\"review-content\">\u062e\u06cc\u0644\u06cc \u062e\u0648\u0628\u0647<\/div>\n<\/p><\/div>\n<\/article>\n<article class=\"plugin-review\">\n<div class=\"review-avatar\">\n\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"https:\/\/secure.gravatar.com\/avatar\/b68cce6bc8e6b689fcde9837420e350ae2dee9cd9477d52030c046de13e825ca?s=60&amp;d=retro&amp;r=g\" srcset=\"https:\/\/secure.gravatar.com\/avatar\/b68cce6bc8e6b689fcde9837420e350ae2dee9cd9477d52030c046de13e825ca?s=120&amp;d=retro&amp;r=g 2x\" class=\"avatar avatar-60 photo\" height=\"60\" width=\"60\">\t\t\t\t\t<\/div>\n<div class=\"review\">\n<header>\n<div class=\"header-top\">\n<div class=\"wporg-ratings\" aria-label=\"5 out of 5 stars\" data-title-template=\"%s out of 5 stars\" data-rating=\"5\" style=\"color:#ffb900;\"><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><span class=\"dashicons dashicons-star-filled\"><\/span><\/div>\n<h3 class=\"review-title\"><a target=\"_blank\" class=\"url\" href=\"https:\/\/wordpress.org\/support\/topic\/ok-709\/\" rel=\"noopener\">OK<\/a><\/h3>\n<\/p><\/div>\n<div class=\"header-bottom\">\n\t\t\t\t\t\t\t\t<span class=\"review-author author vcard\"><a target=\"_blank\" href=\"https:\/\/profiles.wordpress.org\/ghasemihesar\/\" title=\"Posts by Abolfazl Ghasemihesar\" rel=\"author noopener\">Abolfazl Ghasemihesar<\/a><\/span><br \/>\n\t\t\t\t\t\t\t\t<span class=\"review-date\">May 10, 2021<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n<\/header>\n<div class=\"review-content\">OK!<\/div>\n<\/p><\/div>\n<\/article><\/div>\n<p>\t\t<a target=\"_blank\" class=\"reviews-link\" href=\"https:\/\/wordpress.org\/support\/plugin\/rollback-update-failure\/reviews\/\" rel=\"noopener\"><br \/>\n\t\t\tRead all 5 reviews\t\t<\/a><\/div>\n<div id=\"tab-developers\" class=\"plugin-developers section\">\n<h2 id=\"developers-header\">Contributors &amp; Developers<\/h2>\n<div class=\"plugin-contributors\">\n<p>\u201cRollback Auto Update\u201d is open source software. The following people have contributed to this plugin.<\/p>\n<p><span class=\"screen-reader-text\">Contributors<\/span><\/p>\n<ul id=\"contributors-list\" class=\"contributors-list\">\n<li>\n\t\t\t\t<img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"https:\/\/secure.gravatar.com\/avatar\/82779a185fccde41e1dd3b914bde84cd6be76c8dcb8f6b983f461c8f5687a87e?s=32&amp;d=mm&amp;r=g\" srcset=\"https:\/\/secure.gravatar.com\/avatar\/82779a185fccde41e1dd3b914bde84cd6be76c8dcb8f6b983f461c8f5687a87e?s=64&amp;d=mm&amp;r=g 2x\" class=\"avatar avatar-32 photo\" height=\"32\" width=\"32\">\t\t\t\t<a target=\"_blank\" href=\"https:\/\/profiles.wordpress.org\/afragen\/\" rel=\"noopener\"><br \/>\n\t\t\t\t\tAndy Fragen\t\t\t\t<\/a>\n\t\t\t<\/li>\n<li>\n\t\t\t\t<img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"https:\/\/secure.gravatar.com\/avatar\/737c2df3eecd59128718fa1f089e99f9463e664b51920f15bf781b2578015a2f?s=32&amp;d=mm&amp;r=g\" srcset=\"https:\/\/secure.gravatar.com\/avatar\/737c2df3eecd59128718fa1f089e99f9463e664b51920f15bf781b2578015a2f?s=64&amp;d=mm&amp;r=g 2x\" class=\"avatar avatar-32 photo\" height=\"32\" width=\"32\">\t\t\t\t<a target=\"_blank\" href=\"https:\/\/profiles.wordpress.org\/costdev\/\" rel=\"noopener\"><br \/>\n\t\t\t\t\tColin Stewart\t\t\t\t<\/a>\n\t\t\t<\/li>\n<li>\n\t\t\t\t<img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"https:\/\/secure.gravatar.com\/avatar\/7a36060ae08c0b5588810cd5e6ea430fe9b10ce7ca8debbe928a1e254e78b4d4?s=32&amp;d=mm&amp;r=g\" srcset=\"https:\/\/secure.gravatar.com\/avatar\/7a36060ae08c0b5588810cd5e6ea430fe9b10ce7ca8debbe928a1e254e78b4d4?s=64&amp;d=mm&amp;r=g 2x\" class=\"avatar avatar-32 photo\" height=\"32\" width=\"32\">\t\t\t\t<a target=\"_blank\" href=\"https:\/\/profiles.wordpress.org\/pbiron\/\" rel=\"noopener\"><br \/>\n\t\t\t\t\tPaul Biron\t\t\t\t<\/a>\n\t\t\t<\/li>\n<\/ul><\/div>\n<div class=\"plugin-development\">\n<p>\u201cRollback Auto Update\u201d has been translated into 7 locales. Thank you to <a target=\"_blank\" href=\"https:\/\/translate.wordpress.org\/projects\/wp-plugins\/rollback-update-failure\/contributors\" rel=\"noopener\">the translators<\/a> for their contributions.<\/p>\n<p><a target=\"_blank\" href=\"https:\/\/translate.wordpress.org\/projects\/wp-plugins\/rollback-update-failure\" rel=\"noopener\">Translate \u201cRollback Auto Update\u201d into your language.<\/a><\/p>\n<h3>Interested in development?<\/h3>\n<p><a target=\"_blank\" href=\"https:\/\/plugins.trac.wordpress.org\/browser\/rollback-update-failure\/\" rel=\"noopener\" class=\"broken_link\">Browse the code<\/a>, check out the <a target=\"_blank\" href=\"https:\/\/plugins.svn.wordpress.org\/rollback-update-failure\/\" rel=\"noopener\">SVN repository<\/a>, or subscribe to the <a target=\"_blank\" href=\"https:\/\/plugins.trac.wordpress.org\/log\/rollback-update-failure\/\" rel=\"noopener\" class=\"broken_link\">development log<\/a> by <a target=\"_blank\" href=\"https:\/\/plugins.trac.wordpress.org\/log\/rollback-update-failure\/?limit=100&amp;mode=stop_on_copy&amp;format=rss\" rel=\"noopener\" class=\"broken_link\">RSS<\/a>.<\/p>\n<\/div>\n<\/div>\n<div id=\"tab-changelog\" class=\"plugin-changelog section\">\n<h2 id=\"changelog-header\">Changelog<\/h2>\n<p>Please see the Github repository: <a target=\"_blank\" href=\"https:\/\/github.com\/afragen\/rollback-update-failure\/blob\/main\/CHANGELOG.md\" rel=\"nofollow ugc noopener\">CHANGELOG.md<\/a>.<\/p>\n<h4>7.2.1 \/ 2024-04-17<\/h4>\n<ul>\n<li>add check for loopback not working and rollback auto-update for safety<\/li>\n<\/ul>\n<h4>7.2.0 \/ 2024-03-11<\/h4>\n<ul>\n<li>update kill switch using <code>method_exists()<\/code><\/li>\n<li>update for latest PR, cannot include mods to <code>load.php<\/code><\/li>\n<\/ul>\n<h4>7.1.2 \/ 2024-03-03<\/h4>\n<ul>\n<li>update kill switch<\/li>\n<\/ul>\n<h4>7.1.1 \/ 2024-02-14<\/h4>\n<ul>\n<li>update kill switch<\/li>\n<\/ul>\n<h4>7.1.0 \/ 2023-11-07<\/h4>\n<ul>\n<li>use <code>( new WP_Upgrader() )-&gt;maintenance_mode()<\/code> for Upgrader classes, fixes error in <code>maintenance_mode()<\/code> when <code>$wp_filesystem<\/code> not set<\/li>\n<\/ul>\n<h4>7.0.3 \/ 2023-10-16<\/h4>\n<ul>\n<li>update kill switch<\/li>\n<li>update for PR<\/li>\n<li>fix readme.txt, thanks Otto<\/li>\n<\/ul>\n<h4>7.0.2 \/ 2023-10-12<\/h4>\n<ul>\n<li>just a bump for dot org<\/li>\n<\/ul>\n<h4>7.0.1 \/ 2023-10-12<\/h4>\n<ul>\n<li>needed to require upgrader classes in main plugin file<\/li>\n<\/ul>\n<h4>7.0.0 \/ 2023-10-11<\/h4>\n<ul>\n<li>attempt to sync with refactored PR<\/li>\n<li>simpler replacement with modified upgrader classes<\/li>\n<li>error logging present<\/li>\n<\/ul>\n<h4>6.3.1 \/ 2023-10-22<\/h4>\n<ul>\n<li>removed too much stuff<\/li>\n<\/ul>\n<h4>6.3.0 \/ 2023-10-21<\/h4>\n<ul>\n<li>refactor RAU for merge<\/li>\n<li>update commit conditional<\/li>\n<\/ul>\n<h4>6.2.2 \/ 2023-09-13<\/h4>\n<ul>\n<li>re-activate plugins at end of main loop<\/li>\n<\/ul>\n<h4>6.2.1 \/ 2023-09-02<\/h4>\n<ul>\n<li>add error exception for defining function in main plugin class<\/li>\n<\/ul>\n<h4>6.2.0 \/ 2023-08-15<\/h4>\n<ul>\n<li>minor email message adjustment<\/li>\n<li>add default value in email processing for invalid current version<\/li>\n<li>use <code>WP_Automatic_Upgrader::after_plugin_theme_update()<\/code> for sending email<\/li>\n<\/ul>\n<h4>6.1.0 \/ 2023-08-12<\/h4>\n<ul>\n<li>add failure email back otherwise no update email is sent<\/li>\n<\/ul>\n<h4>6.0.1 \/ 2023-08-12<\/h4>\n<ul>\n<li>add back <code>sleep( 2 )<\/code> to prevent potential race condition<\/li>\n<li>update error exception list<\/li>\n<\/ul>\n<h4>6.0.0 \/ 2023-08-09<\/h4>\n<ul>\n<li>increase requirements to WP 6.3 and PHP 7.0<\/li>\n<li>add version check for Rollback part 3<\/li>\n<li>deactivate\/reactivate plugin during auto-update test similar <code>plugin_sandbox_scrape()<\/code> as Core<\/li>\n<li>add shutdown function<\/li>\n<li>add method to check if we want an error to pass through, likley caused by calling <code>include()<\/code> on an activated plugin<\/li>\n<li>log caught error from error handler, exception handler, and shutdown function<\/li>\n<li>temporary halt to failure email<\/li>\n<\/ul>\n<h4>5.3.3 \/ 2023-07-16<\/h4>\n<ul>\n<li>remove Reflection in <code>WP_Rollback_Auto_Update::cron_rollback()<\/code> as methods are public<\/li>\n<\/ul>\n<h4>5.3.2 \/ 2023-07-10<\/h4>\n<ul>\n<li>cleanup<\/li>\n<\/ul>\n<h4>5.3.1 \/ 2023-06-21<\/h4>\n<ul>\n<li>cleanup email sending<\/li>\n<\/ul>\n<h4>5.3.0 \/ 2023-05-21<\/h4>\n<ul>\n<li>improved language for email<\/li>\n<li>ensure <code>find_core_auto_update()<\/code> is available<\/li>\n<li>put guard for Rollback part 2 not being committed back<\/li>\n<li>add theme update data to failure email<\/li>\n<\/ul>\n<h4>5.2.0 \/ 2023-05-09<\/h4>\n<ul>\n<li>restart theme auto-updates<\/li>\n<li>remove guard for Rollback not being committed<\/li>\n<li>set Plugin_Upgrader via hook<\/li>\n<li>cleanup Plugin_Upgrader hook from fatal update<\/li>\n<\/ul>\n<h4>5.1.1 \/ 2023-05-05<\/h4>\n<ul>\n<li>update readme<\/li>\n<\/ul>\n<h4>5.1.0 \/ 2023-05-03<\/h4>\n<ul>\n<li>align docblocks with PR<\/li>\n<li>update for Rollback committed to core<\/li>\n<li>change <code>temp-backup<\/code> to <code>upgrade-temp-backup<\/code><\/li>\n<\/ul>\n<h4>5.0.6 \/ 2023-04-25<\/h4>\n<ul>\n<li>update code logic for creating <code>temp-backup<\/code> dir, thanks @azaozz<\/li>\n<\/ul>\n<h4>5.0.5 \/ 2023-04-14<\/h4>\n<ul>\n<li>hotfix for no autoload<\/li>\n<\/ul>\n<h4>5.0.4 \/ 2023-04-14<\/h4>\n<ul>\n<li>update tests<\/li>\n<li>update GitHub Actions<\/li>\n<li>ignore vendor directory<\/li>\n<\/ul>\n<h4>5.0.3 \/ 2023-03-22<\/h4>\n<ul>\n<li>update @since<\/li>\n<li>update using constant to check version for when <code>move_dir()<\/code> was committed<\/li>\n<li>update using constant to check version for when <code>Rollback<\/code> was committed<\/li>\n<li>update for PR compatibility<\/li>\n<li>developery stuff<\/li>\n<\/ul>\n<h4>5.0.2 \/ 2023-02-05<\/h4>\n<ul>\n<li>make variables static to retain value during auto-updater run<\/li>\n<\/ul>\n<h4>5.0.1 \/ 2023-02-03<\/h4>\n<ul>\n<li>ensure <code>move_dir()<\/code> called with 3rd parameter as <code>move_dir($from, $to, true)<\/code><\/li>\n<\/ul>\n<h4>5.0.0 \/ 2023-02-02<\/h4>\n<ul>\n<li>during <code>WP_Rollback_Auto_Update::restart_updates<\/code> remove shutdown hook for <code>WP_Upgrader::delete_temp_backup<\/code><\/li>\n<li>skip second sequential call to <code>create_backup<\/code><\/li>\n<li>now require at least WP 6.2-beta1, deactivate if requirements not met<\/li>\n<li>Faster Updates no longer required as <a target=\"_blank\" href=\"https:\/\/core.trac.wordpress.org\/changeset\/55204\" rel=\"nofollow ugc noopener\" class=\"broken_link\">committed to core<\/a><\/li>\n<\/ul>\n<h4>4.1.2 \/ 2023-01-25<\/h4>\n<ul>\n<li>update <code>move_dir()<\/code> for new parameter<\/li>\n<\/ul>\n<h4>4.1.1 \/ 2023-01-20<\/h4>\n<ul>\n<li>ensure specific functions are loaded to check for Faster Updates<\/li>\n<\/ul>\n<h4>4.1.0 \/ 2023-01-19<\/h4>\n<ul>\n<li>change directory name of rollback to distinguish from update.<\/li>\n<li>update for <code>move_dir()<\/code> possibly returning <code>WP_Error<\/code><\/li>\n<li>fix <code>sprintf<\/code> error<\/li>\n<\/ul>\n<h4>4.0.0 \/ 2023-01-10<\/h4>\n<ul>\n<li>cast <code>upgrade_plugins<\/code> transient to object, overkill but someone reported an error<\/li>\n<li>merge Rollback Auto Update<\/li>\n<li>require <a target=\"_blank\" href=\"https:\/\/github.com\/afragen\/faster-updates\" rel=\"nofollow ugc noopener\">Faster Updates<\/a> for <code>move_dir()<\/code>, auto-install\/activate<\/li>\n<li>no longer requires special filter in <code>WP_Upgrader::install_package<\/code><\/li>\n<li>testing only on <code>update-core.php<\/code><\/li>\n<\/ul>\n<h4>3.3.2 \/ 2022-12-30<\/h4>\n<ul>\n<li>update for <a target=\"_blank\" href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/pull\/3791\" rel=\"nofollow ugc noopener\">new filter hook in WP_Upgrader::install_package<\/a><\/li>\n<li>update nonce verification for failure simulator<\/li>\n<\/ul>\n<h4>3.3.1 \/ 2022-10-25<\/h4>\n<ul>\n<li>use <code>array_unique<\/code> when saving simulated failure options<\/li>\n<li>load failure simulator in <code>init<\/code> hook for WP-CLI<\/li>\n<\/ul>\n<h4>3.3.0 \/ 2022-10-14<\/h4>\n<ul>\n<li>use <code>wp-content\/temp-backup<\/code> and not <code>wp-content\/upgrade\/temp-backup<\/code> as <code>WP_Upgrader::unpack_package<\/code> deletes contents of <code>wp-content-upgrade<\/code> at each update<\/li>\n<li>add simulated failure into plugin<\/li>\n<\/ul>\n<h4>3.2.1 \/ 2022-09-23<\/h4>\n<ul>\n<li>bump auto-deactivation check for WP version<\/li>\n<\/ul>\n<h4>3.2.0 \/ 2022-09-19<\/h4>\n<ul>\n<li>backup runs on <code>upgrader_source_selection<\/code> from <code>upgrader_pre_install<\/code> to resolve an edge case<\/li>\n<li>rename functions for action not hook<\/li>\n<\/ul>\n<h4>3.1.1 \/ 2022-07-31<\/h4>\n<ul>\n<li>update VirtualBox testing URL in readme(s)<\/li>\n<\/ul>\n<h4>3.1.0 \/ 2022-06-27<\/h4>\n<ul>\n<li>fix to ensure restore functions correctly during bulk update<\/li>\n<\/ul>\n<h4>3.0.0 \/ 2022-06-14<\/h4>\n<ul>\n<li>remove references to VirtualBox<\/li>\n<li>add <code>pre_move_dir<\/code> and <code>post_move_dir<\/code> hooks<\/li>\n<li>use with VirtualBox environment will require a <a target=\"_blank\" href=\"https:\/\/gist.github.com\/costdev\/502a2ca52a440e5775e2db970227b9b3\" rel=\"nofollow ugc noopener\">mu-plugin and a watcher script<\/a> or similar for VirtualBox based environments<\/li>\n<li>update error messaging in <code>delete_temp_backup()<\/code><\/li>\n<\/ul>\n<h4>2.2.0 \/ 2022-05-11<\/h4>\n<ul>\n<li>add initial setup of weekly <code>wp_delete_temp_updater_backups<\/code> cron task, oops<\/li>\n<\/ul>\n<h4>2.1.2 \/ 2022-05-11<\/h4>\n<ul>\n<li>fix <code>shutdown<\/code> hook in <code>wp_delete_all_temp_backups()<\/code> for plugin namespace, not for PR<\/li>\n<\/ul>\n<h4>2.1.1 \/ 2022-05-11<\/h4>\n<ul>\n<li>update testing workflows<\/li>\n<li>fix action hook <code>wp_delete_temp_updater_backups<\/code> for plugin namespace, not for PR<\/li>\n<\/ul>\n<h4>2.1.0 \/ 2202-04-12<\/h4>\n<ul>\n<li>pass basename of destination to <code>copy_dir( $skip_list )<\/code> to avoid potential endless looping.<\/li>\n<\/ul>\n<h4>2.0.0 \/ 2022-04-06<\/h4>\n<ul>\n<li>refactor to ease PR back into core by separating out changes into respective files\/classes<\/li>\n<\/ul>\n<h4>1.5.0 \/ 2022-04-04<\/h4>\n<ul>\n<li>remove anonymous callbacks<\/li>\n<li>add class <code>$options<\/code> for callback functions<\/li>\n<li>update <code>is_virtualbox()<\/code> for testing<\/li>\n<li>add testing scaffold<\/li>\n<\/ul>\n<h4>1.4.0 \/ 2022-04-03<\/h4>\n<ul>\n<li>move kill switch to WP6.1-beta1<\/li>\n<li>add non-direct filesystem rename variants to <code>move_dir()<\/code><\/li>\n<li>bring into alignment with PR<\/li>\n<\/ul>\n<h4>1.3.6 \/ 2022-03-31<\/h4>\n<ul>\n<li>update credit<\/li>\n<\/ul>\n<h4>1.3.5 \/ 2022-03-31<\/h4>\n<ul>\n<li>add more Site Health info for runtime environment<\/li>\n<li>update <code>move_dir()<\/code><\/li>\n<li>add <code>is_virtualbox()<\/code><\/li>\n<li>remove <code>WP_RUNTIME_ENVIRONMENT<\/code> and <code>wp_get_runtime_environment()<\/code><\/li>\n<\/ul>\n<h4>1.3.4 \/ 2022-03-21<\/h4>\n<ul>\n<li>run <code>restore_temp_backup()<\/code> in <code>shutdown<\/code> hook<\/li>\n<\/ul>\n<h4>1.3.3 \/ 2022-03-18<\/h4>\n<ul>\n<li>add <code>wp_get_runtime_environment()<\/code> to return value of constant <code>WP_RUNTIME_ENVIRONMENT<\/code><\/li>\n<li>allowed values are obviously up for discussion<\/li>\n<li>update to most of current PR<\/li>\n<\/ul>\n<h4>1.3.2 \/ 2022-02-15<\/h4>\n<ul>\n<li>update to correspond to core patch<\/li>\n<\/ul>\n<h4>1.3.1 \/ 2022-01-19<\/h4>\n<ul>\n<li>add logo credit, Logo from a meme generator. <a target=\"_blank\" href=\"http:\/\/hyperboleandahalf.blogspot.com\/2010\/06\/this-is-why-ill-never-be-adult.html\" rel=\"nofollow ugc noopener\">Original artwork<\/a> by Allie Brosh.<\/li>\n<li>remove <code>(int)<\/code> casting for <code>disk_free_space()<\/code><\/li>\n<\/ul>\n<h4>1.3.0 \/ 2021-01-12<\/h4>\n<ul>\n<li>introduce <code>is_virtual_box()<\/code> to get whether running in VirtualBox, requires <code>define( 'ENV_VB', true )<\/code> or <code>genenv( 'WP_ENV_VB' )<\/code> evaluating to true<\/li>\n<li>skips <code>rename()<\/code> as VirtualBox gets borked when using <code>rename()<\/code><\/li>\n<\/ul>\n<h4>1.2.0 \/ 2021-12-17<\/h4>\n<ul>\n<li>updated for more parity with planned code<\/li>\n<li>updated version check for revert<\/li>\n<li>update to use <code>move_dir()<\/code> instead of <code>$wp_filesystem-&gt;move()<\/code><\/li>\n<\/ul>\n<h4>1.1.3 \/ 2021-09-17<\/h4>\n<ul>\n<li>update version check<\/li>\n<\/ul>\n<h4>1.1.1 \/ 2021-09-07<\/h4>\n<ul>\n<li>update check for <code>disk_free_space()<\/code><\/li>\n<\/ul>\n<h4>1.1.0 \/ 2021-09-01<\/h4>\n<ul>\n<li>automatically deactivate plugin after feature committed to core, currently set to <code>5.9-beta1<\/code><\/li>\n<li>check for disabled function <code>disk_free_space()<\/code> and degrade gracefully<\/li>\n<\/ul>\n<h4>1.0.0 \/ 2021-08-30<\/h4>\n<ul>\n<li>updated to be on par with <a target=\"_blank\" href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/pull\/1492\" rel=\"nofollow ugc noopener\">PR #1492<\/a>, thanks @aristah<\/li>\n<li>original zip rollback is now branch <a target=\"_blank\" href=\"https:\/\/github.com\/WordPress\/rollback-update-failure\/tree\/zip-rollback\" rel=\"nofollow ugc noopener\">zip-rollback<\/a><\/li>\n<\/ul>\n<h4>0.5.3 \/ 2021-07-01<\/h4>\n<ul>\n<li>add <a class='bp-suggestions-mention' href='https:\/\/s-o-s.net\/en_gb\/members\/10up\/' rel='nofollow'>@10up<\/a> GitHub Actions integration for WordPress SVN<\/li>\n<\/ul>\n<h4>0.5.2 \/ 2021-06-10<\/h4>\n<ul>\n<li>exit early if <code>$hook_extra<\/code> is empty<\/li>\n<\/ul>\n<h4>0.5.1 \/ 2021-03-15<\/h4>\n<ul>\n<li>update error message for installation not update<\/li>\n<\/ul>\n<h4>0.5.0 \/ 2021-02-10<\/h4>\n<ul>\n<li>initial commit<\/li>\n<li>use simpler hook for <code>extract_rollback<\/code><\/li>\n<li>update for <code>upgrader_install_package_result<\/code> filter and parameters passed<\/li>\n<li>add text domain<\/li>\n<li>update error message display<\/li>\n<li>added filter <code>rollback_update_testing<\/code> to simulate a failure.<\/li>\n<li>override filter if there\u2019s already a WP_Error<\/li>\n<\/ul>\n<\/div><\/div>\n<p><!-- .entry-content --><\/p>\n<p>\t<!-- .entry-meta --><br \/>\n<\/article>\n<p><br \/>\n<br \/><a href=\"https:\/\/wordpress.org\/plugins\/rollback-update-failure\/\" target=\"_blank\" rel=\"noopener\">Source link <\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Rollback Auto Update By Andy Fragen Download Details Reviews Development Support Description This is a feature plugin is for testing Rollback Auto-Update, aka Rollback part 3. This feature only protects plugins during the auto-update process. As part of the normal Rollback process, the currently installed version of the plugin is moved to wp-content\/upgrade-temp-backup\/plugins. An active [&hellip;]<\/p>","protected":false},"author":212,"featured_media":5073,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"give_campaign_id":0,"footnotes":""},"categories":[3143,39,40],"tags":[2968,3179,2962],"class_list":["post-5072","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-featured-plugin","category-lite-version","category-wp-plugin-solution","tag-auto","tag-rollback","tag-update"],"acf":[],"fifu_image_url":"https:\/\/ps.w.org\/rollback-update-failure\/assets\/banner-772x250-rtl.png?rev=2557438","_links":{"self":[{"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/posts\/5072","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/users\/212"}],"replies":[{"embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/comments?post=5072"}],"version-history":[{"count":0,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/posts\/5072\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/media\/5073"}],"wp:attachment":[{"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/media?parent=5072"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/categories?post=5072"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/tags?post=5072"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}