Make WordPress Core

Changeset 51815


Ignore:
Timestamp:
09/15/2021 06:39:09 PM (5 years ago)
Author:
SergeyBiryukov
Message:

Upgrade/Install: Create a temporary backup of plugins and themes before updating.

This aims to make the update process more reliable and ensures that if a plugin or theme update fails, the previous version can be safely restored.

  • When updating a plugin or theme, the old version is moved to a temporary backup directory:
    • wp-content/upgrade/temp-backup/plugins/[plugin-slug] for plugins
    • wp-content/upgrade/temp-backup/themes/[theme-slug] for themes.
  • If the update fails, then the temporary backup kept in the upgrade/temp-backup directory is restored to its original location.
  • If the update succeeds, the temporary backup is deleted.

To further help troubleshoot plugin and theme updates, two new checks were added to the Site Health screen:

  • A check to make sure that the temp-backup directory is writable.
  • A check that there is enough disk space available to safely perform updates.

To avoid confusion: The temp-backup directory will NOT be used to "roll back" a plugin to a previous version after a completed update. This directory will simply contain a transient backup of the previous version of a plugin or theme being updated, and as soon as the update process finishes, the directory will be empty.

Props aristath, afragen, pbiron, dd32, poena, TimothyBlynJacobs, audrasjb, mikeschroder, a2hosting, hellofromTonya, KZeni, galbaras, richards1052, Boniu91, mai21, francina, SergeyBiryukov.
See #51857.

Location:
trunk/src/wp-admin/includes
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/class-plugin-upgrader.php

    r51528 r51815  
    227227                                'clear_working'     => true,
    228228                                'hook_extra'        => array(
    229                                         'plugin' => $plugin,
    230                                         'type'   => 'plugin',
    231                                         'action' => 'update',
     229                                        'plugin'      => $plugin,
     230                                        'type'        => 'plugin',
     231                                        'action'      => 'update',
     232                                        'temp_backup' => array(
     233                                                'slug' => dirname( $plugin ),
     234                                                'src'  => WP_PLUGIN_DIR,
     235                                                'dir'  => 'plugins',
     236                                        ),
    232237                                ),
    233238                        )
     
    343348                                        'is_multi'          => true,
    344349                                        'hook_extra'        => array(
    345                                                 'plugin' => $plugin,
     350                                                'plugin'      => $plugin,
     351                                                'temp_backup' => array(
     352                                                        'slug' => dirname( $plugin ),
     353                                                        'src'  => WP_PLUGIN_DIR,
     354                                                        'dir'  => 'plugins',
     355                                                ),
    346356                                        ),
    347357                                )
  • trunk/src/wp-admin/includes/class-theme-upgrader.php

    r51528 r51815  
    329329                                'clear_working'     => true,
    330330                                'hook_extra'        => array(
    331                                         'theme'  => $theme,
    332                                         'type'   => 'theme',
    333                                         'action' => 'update',
     331                                        'theme'       => $theme,
     332                                        'type'        => 'theme',
     333                                        'action'      => 'update',
     334                                        'temp_backup' => array(
     335                                                'slug' => $theme,
     336                                                'src'  => get_theme_root( $theme ),
     337                                                'dir'  => 'themes',
     338                                        ),
    334339                                ),
    335340                        )
     
    444449                                        'is_multi'          => true,
    445450                                        'hook_extra'        => array(
    446                                                 'theme' => $theme,
     451                                                'theme'       => $theme,
     452                                                'temp_backup' => array(
     453                                                        'slug' => $theme,
     454                                                        'src'  => get_theme_root( $theme ),
     455                                                        'dir'  => 'themes',
     456                                                ),
    447457                                        ),
    448458                                )
  • trunk/src/wp-admin/includes/class-wp-site-health.php

    r51805 r51815  
    18841884
    18851885        /**
     1886         * Test available disk space for updates.
     1887         *
     1888         * @since 5.9.0
     1889         *
     1890         * @return array The test results.
     1891         */
     1892        public function get_test_available_updates_disk_space() {
     1893                $available_space       = function_exists( 'disk_free_space' ) ? (int) @disk_free_space( WP_CONTENT_DIR . '/upgrade/' ) : false;
     1894                $available_space_in_mb = $available_space / MB_IN_BYTES;
     1895
     1896                $result = array(
     1897                        'label'       => __( 'Disk space available to safely perform updates' ),
     1898                        'status'      => 'good',
     1899                        'badge'       => array(
     1900                                'label' => __( 'Security' ),
     1901                                'color' => 'blue',
     1902                        ),
     1903                        'description' => sprintf(
     1904                                /* translators: %s: Available disk space in MB or GB. */
     1905                                '<p>' . __( '%s available disk space was detected, update routines can be performed safely.' ),
     1906                                size_format( $available_space )
     1907                        ),
     1908                        'actions'     => '',
     1909                        'test'        => 'available_updates_disk_space',
     1910                );
     1911
     1912                if ( $available_space_in_mb < 100 ) {
     1913                        $result['description'] = __( 'Available disk space is low, less than 100 MB available.' );
     1914                        $result['status']      = 'recommended';
     1915                }
     1916
     1917                if ( $available_space_in_mb < 20 ) {
     1918                        $result['description'] = __( 'Available disk space is critically low, less than 20 MB available. Proceed with caution, updates may fail.' );
     1919                        $result['status']      = 'critical';
     1920                }
     1921
     1922                if ( ! $available_space ) {
     1923                        $result['description'] = __( 'Could not determine available disk space for updates.' );
     1924                        $result['status']      = 'recommended';
     1925                }
     1926
     1927                return $result;
     1928        }
     1929
     1930        /**
     1931         * Test if plugin and theme updates temp-backup directories are writable or can be created.
     1932         *
     1933         * @since 5.9.0
     1934         *
     1935         * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
     1936         *
     1937         * @return array The test results.
     1938         */
     1939        public function get_test_update_temp_backup_writable() {
     1940                global $wp_filesystem;
     1941
     1942                $result = array(
     1943                        'label'       => sprintf(
     1944                                /* translators: %s: temp-backup */
     1945                                __( 'Plugin and theme update %s directory is writable' ),
     1946                                'temp-backup'
     1947                        ),
     1948                        'status'      => 'good',
     1949                        'badge'       => array(
     1950                                'label' => __( 'Security' ),
     1951                                'color' => 'blue',
     1952                        ),
     1953                        'description' => sprintf(
     1954                                /* translators: %s: wp-content/upgrade/temp-backup */
     1955                                '<p>' . __( 'The %s directory used to improve the stability of plugin and theme updates is writable.' ),
     1956                                '<code>wp-content/upgrade/temp-backup</code>'
     1957                        ),
     1958                        'actions'     => '',
     1959                        'test'        => 'update_temp_backup_writable',
     1960                );
     1961
     1962                if ( ! $wp_filesystem ) {
     1963                        if ( ! function_exists( 'WP_Filesystem' ) ) {
     1964                                require_once wp_normalize_path( ABSPATH . '/wp-admin/includes/file.php' );
     1965                        }
     1966                        WP_Filesystem();
     1967                }
     1968                $wp_content = $wp_filesystem->wp_content_dir();
     1969
     1970                $upgrade_dir_exists      = $wp_filesystem->is_dir( "$wp_content/upgrade" );
     1971                $upgrade_dir_is_writable = $wp_filesystem->is_writable( "$wp_content/upgrade" );
     1972                $backup_dir_exists       = $wp_filesystem->is_dir( "$wp_content/upgrade/temp-backup" );
     1973                $backup_dir_is_writable  = $wp_filesystem->is_writable( "$wp_content/upgrade/temp-backup" );
     1974
     1975                $plugins_dir_exists      = $wp_filesystem->is_dir( "$wp_content/upgrade/temp-backup/plugins" );
     1976                $plugins_dir_is_writable = $wp_filesystem->is_writable( "$wp_content/upgrade/temp-backup/plugins" );
     1977                $themes_dir_exists       = $wp_filesystem->is_dir( "$wp_content/upgrade/temp-backup/themes" );
     1978                $themes_dir_is_writable  = $wp_filesystem->is_writable( "$wp_content/upgrade/temp-backup/themes" );
     1979
     1980                if ( $plugins_dir_exists && ! $plugins_dir_is_writable && $themes_dir_exists && ! $themes_dir_is_writable ) {
     1981                        $result['status']      = 'critical';
     1982                        $result['label']       = sprintf(
     1983                                /* translators: %s: temp-backup */
     1984                                __( 'Plugins and themes %s directories exist but are not writable' ),
     1985                                'temp-backup'
     1986                        );
     1987                        $result['description'] = sprintf(
     1988                                /* translators: 1: wp-content/upgrade/temp-backup/plugins, 2: wp-content/upgrade/temp-backup/themes. */
     1989                                '<p>' . __( 'The %1$s and %2$s directories exist but are not writable. These directories are used to improve the stability of plugin updates. Please make sure the server has write permissions to these directories.' ) . '</p>',
     1990                                '<code>wp-content/upgrade/temp-backup/plugins</code>',
     1991                                '<code>wp-content/upgrade/temp-backup/themes</code>'
     1992                        );
     1993                        return $result;
     1994                }
     1995
     1996                if ( $plugins_dir_exists && ! $plugins_dir_is_writable ) {
     1997                        $result['status']      = 'critical';
     1998                        $result['label']       = sprintf(
     1999                                /* translators: %s: temp-backup */
     2000                                __( 'Plugins %s directory exists but is not writable' ),
     2001                                'temp-backup'
     2002                        );
     2003                        $result['description'] = sprintf(
     2004                                /* translators: %s: wp-content/upgrade/temp-backup/plugins */
     2005                                '<p>' . __( 'The %s directory exists but is not writable. This directory is used to improve the stability of plugin updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
     2006                                '<code>wp-content/upgrade/temp-backup/plugins</code>'
     2007                        );
     2008                        return $result;
     2009                }
     2010
     2011                if ( $themes_dir_exists && ! $themes_dir_is_writable ) {
     2012                        $result['status']      = 'critical';
     2013                        $result['label']       = sprintf(
     2014                                /* translators: %s: temp-backup */
     2015                                __( 'Themes %s directory exists but is not writable' ),
     2016                                'temp-backup'
     2017                        );
     2018                        $result['description'] = sprintf(
     2019                                /* translators: %s: wp-content/upgrade/temp-backup/themes */
     2020                                '<p>' . __( 'The %s directory exists but is not writable. This directory is used to improve the stability of theme updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
     2021                                '<code>wp-content/upgrade/temp-backup/themes</code>'
     2022                        );
     2023                        return $result;
     2024                }
     2025
     2026                if ( ( ! $plugins_dir_exists || ! $themes_dir_exists ) && $backup_dir_exists && ! $backup_dir_is_writable ) {
     2027                        $result['status']      = 'critical';
     2028                        $result['label']       = sprintf(
     2029                                /* translators: %s: temp-backup */
     2030                                __( 'The %s directory exists but is not writable' ),
     2031                                'temp-backup'
     2032                        );
     2033                        $result['description'] = sprintf(
     2034                                /* translators: %s: wp-content/upgrade/temp-backup */
     2035                                '<p>' . __( 'The %s directory exists but is not writable. This directory is used to improve the stability of plugin and theme updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
     2036                                '<code>wp-content/upgrade/temp-backup</code>'
     2037                        );
     2038                        return $result;
     2039                }
     2040
     2041                if ( ! $backup_dir_exists && $upgrade_dir_exists && ! $upgrade_dir_is_writable ) {
     2042                        $result['status']      = 'critical';
     2043                        $result['label']       = sprintf(
     2044                                /* translators: %s: upgrade */
     2045                                __( 'The %s directory exists but is not writable' ),
     2046                                'upgrade'
     2047                        );
     2048                        $result['description'] = sprintf(
     2049                                /* translators: %s: wp-content/upgrade */
     2050                                '<p>' . __( 'The %s directory exists but is not writable. This directory is used for plugin and theme updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
     2051                                '<code>wp-content/upgrade</code>'
     2052                        );
     2053                        return $result;
     2054                }
     2055
     2056                if ( ! $upgrade_dir_exists && ! $wp_filesystem->is_writable( $wp_content ) ) {
     2057                        $result['status']      = 'critical';
     2058                        $result['label']       = sprintf(
     2059                                /* translators: %s: upgrade */
     2060                                __( 'The %s directory cannot be created' ),
     2061                                'upgrade'
     2062                        );
     2063                        $result['description'] = sprintf(
     2064                                /* translators: 1: wp-content/upgrade, 2: wp-content. */
     2065                                '<p>' . __( 'The %1$s directory does not exist, and the server does not have write permissions in %2$s to create it. This directory is used for plugin and theme updates. Please make sure the server has write permissions in %2$s.' ) . '</p>',
     2066                                '<code>wp-content/upgrade</code>',
     2067                                '<code>wp-content</code>'
     2068                        );
     2069                        return $result;
     2070                }
     2071
     2072                return $result;
     2073        }
     2074
     2075        /**
    18862076         * Test if loopbacks work as expected.
    18872077         *
     
    22672457                $tests = array(
    22682458                        'direct' => array(
    2269                                 'wordpress_version'         => array(
     2459                                'wordpress_version'            => array(
    22702460                                        'label' => __( 'WordPress Version' ),
    22712461                                        'test'  => 'wordpress_version',
    22722462                                ),
    2273                                 'plugin_version'            => array(
     2463                                'plugin_version'               => array(
    22742464                                        'label' => __( 'Plugin Versions' ),
    22752465                                        'test'  => 'plugin_version',
    22762466                                ),
    2277                                 'theme_version'             => array(
     2467                                'theme_version'                => array(
    22782468                                        'label' => __( 'Theme Versions' ),
    22792469                                        'test'  => 'theme_version',
    22802470                                ),
    2281                                 'php_version'               => array(
     2471                                'php_version'                  => array(
    22822472                                        'label' => __( 'PHP Version' ),
    22832473                                        'test'  => 'php_version',
    22842474                                ),
    2285                                 'php_extensions'            => array(
     2475                                'php_extensions'               => array(
    22862476                                        'label' => __( 'PHP Extensions' ),
    22872477                                        'test'  => 'php_extensions',
    22882478                                ),
    2289                                 'php_default_timezone'      => array(
     2479                                'php_default_timezone'         => array(
    22902480                                        'label' => __( 'PHP Default Timezone' ),
    22912481                                        'test'  => 'php_default_timezone',
    22922482                                ),
    2293                                 'php_sessions'              => array(
     2483                                'php_sessions'                 => array(
    22942484                                        'label' => __( 'PHP Sessions' ),
    22952485                                        'test'  => 'php_sessions',
    22962486                                ),
    2297                                 'sql_server'                => array(
     2487                                'sql_server'                   => array(
    22982488                                        'label' => __( 'Database Server version' ),
    22992489                                        'test'  => 'sql_server',
    23002490                                ),
    2301                                 'utf8mb4_support'           => array(
     2491                                'utf8mb4_support'              => array(
    23022492                                        'label' => __( 'MySQL utf8mb4 support' ),
    23032493                                        'test'  => 'utf8mb4_support',
    23042494                                ),
    2305                                 'ssl_support'               => array(
     2495                                'ssl_support'                  => array(
    23062496                                        'label' => __( 'Secure communication' ),
    23072497                                        'test'  => 'ssl_support',
    23082498                                ),
    2309                                 'scheduled_events'          => array(
     2499                                'scheduled_events'             => array(
    23102500                                        'label' => __( 'Scheduled events' ),
    23112501                                        'test'  => 'scheduled_events',
    23122502                                ),
    2313                                 'http_requests'             => array(
     2503                                'http_requests'                => array(
    23142504                                        'label' => __( 'HTTP Requests' ),
    23152505                                        'test'  => 'http_requests',
    23162506                                ),
    2317                                 'rest_availability'         => array(
     2507                                'rest_availability'            => array(
    23182508                                        'label'     => __( 'REST API availability' ),
    23192509                                        'test'      => 'rest_availability',
    23202510                                        'skip_cron' => true,
    23212511                                ),
    2322                                 'debug_enabled'             => array(
     2512                                'debug_enabled'                => array(
    23232513                                        'label' => __( 'Debugging enabled' ),
    23242514                                        'test'  => 'is_in_debug_mode',
    23252515                                ),
    2326                                 'file_uploads'              => array(
     2516                                'file_uploads'                 => array(
    23272517                                        'label' => __( 'File uploads' ),
    23282518                                        'test'  => 'file_uploads',
    23292519                                ),
    2330                                 'plugin_theme_auto_updates' => array(
     2520                                'plugin_theme_auto_updates'    => array(
    23312521                                        'label' => __( 'Plugin and theme auto-updates' ),
    23322522                                        'test'  => 'plugin_theme_auto_updates',
     2523                                ),
     2524                                'update_temp_backup_writable'  => array(
     2525                                        /* translators: %s: temp-backup */
     2526                                        'label' => sprintf( __( 'Updates %s directory access' ), 'temp-backup' ),
     2527                                        'test'  => 'update_temp_backup_writable',
     2528                                ),
     2529                                'available_updates_disk_space' => array(
     2530                                        'label' => __( 'Available disk space' ),
     2531                                        'test'  => 'available_updates_disk_space',
    23332532                                ),
    23342533                        ),
  • trunk/src/wp-admin/includes/class-wp-upgrader.php

    r51655 r51815  
    134134         * and also add the generic strings to `WP_Upgrader::$strings`.
    135135         *
     136         * Additionally, it will schedule a weekly task to clean up the temp-backup directory.
     137         *
    136138         * @since 2.8.0
     139         * @since 5.9.0 Added the `schedule_temp_backup_cleanup()` task.
    137140         */
    138141        public function init() {
    139142                $this->skin->set_upgrader( $this );
    140143                $this->generic_strings();
     144                $this->schedule_temp_backup_cleanup();
     145        }
     146
     147        /**
     148         * Schedule cleanup of the temp-backup directory.
     149         *
     150         * @since 5.9.0
     151         */
     152        protected function schedule_temp_backup_cleanup() {
     153                wp_schedule_event( time(), 'weekly', 'delete_temp_updater_backups' );
     154                add_action( 'delete_temp_updater_backups', array( $this, 'delete_all_temp_backups' ) );
    141155        }
    142156
     
    167181                $this->strings['maintenance_start'] = __( 'Enabling Maintenance mode&#8230;' );
    168182                $this->strings['maintenance_end']   = __( 'Disabling Maintenance mode&#8230;' );
     183
     184                /* translators: %s: temp-backup */
     185                $this->strings['temp_backup_mkdir_failed'] = sprintf( __( 'Could not create the %s directory.' ), 'temp-backup' );
     186                /* translators: %s: temp-backup */
     187                $this->strings['temp_backup_move_failed']    = sprintf( __( 'Could not move old version to the %s directory.' ), 'temp-backup' );
     188                $this->strings['temp_backup_restore_failed'] = __( 'Could not restore original version.' );
     189
    169190        }
    170191
     
    314335                if ( ! empty( $upgrade_files ) ) {
    315336                        foreach ( $upgrade_files as $file ) {
     337                                if ( 'temp-backup' === $file['name'] ) {
     338                                        continue;
     339                                }
    316340                                $wp_filesystem->delete( $upgrade_folder . $file['name'], true );
    317341                        }
     
    492516                if ( is_wp_error( $res ) ) {
    493517                        return $res;
     518                }
     519
     520                if ( ! empty( $args['hook_extra']['temp_backup'] ) ) {
     521                        $temp_backup = $this->move_to_temp_backup_dir( $args['hook_extra']['temp_backup'] );
     522                        if ( is_wp_error( $temp_backup ) ) {
     523                                return $temp_backup;
     524                        }
    494525                }
    495526
     
    812843                $this->skin->set_result( $result );
    813844                if ( is_wp_error( $result ) ) {
     845                        if ( ! empty( $options['hook_extra']['temp_backup'] ) ) {
     846                                $this->restore_temp_backup( $options['hook_extra']['temp_backup'] );
     847                        }
    814848                        $this->skin->error( $result );
    815849
     
    823857
    824858                $this->skin->after();
     859
     860                // Clean up the backup kept in the temp-backup directory.
     861                if ( ! empty( $options['hook_extra']['temp_backup'] ) ) {
     862                        $this->delete_temp_backup( $options['hook_extra']['temp_backup'] );
     863                }
    825864
    826865                if ( ! $options['is_multi'] ) {
     
    949988        }
    950989
     990        /**
     991         * Moves the plugin/theme being updated into a temp-backup directory.
     992         *
     993         * @since 5.9.0
     994         *
     995         * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
     996         *
     997         * @param array $args Array of data for the temp-backup. Must include a slug, the source, and directory.
     998         * @return bool|WP_Error
     999         */
     1000        public function move_to_temp_backup_dir( $args ) {
     1001                global $wp_filesystem;
     1002
     1003                if ( empty( $args['slug'] ) || empty( $args['src'] ) || empty( $args['dir'] ) ) {
     1004                        return false;
     1005                }
     1006
     1007                $dest_dir = $wp_filesystem->wp_content_dir() . 'upgrade/temp-backup/';
     1008                // Create the temp-backup directory if it doesn't exist.
     1009                if ( (
     1010                                ! $wp_filesystem->is_dir( $dest_dir )
     1011                                && ! $wp_filesystem->mkdir( $dest_dir )
     1012                        ) || (
     1013                                ! $wp_filesystem->is_dir( $dest_dir . $args['dir'] . '/' )
     1014                                && ! $wp_filesystem->mkdir( $dest_dir . $args['dir'] . '/' )
     1015                        )
     1016                ) {
     1017                        return new WP_Error( 'fs_temp_backup_mkdir', $this->strings['temp_backup_mkdir_failed'] );
     1018                }
     1019
     1020                $src  = trailingslashit( $args['src'] ) . $args['slug'];
     1021                $dest = $dest_dir . $args['dir'] . '/' . $args['slug'];
     1022
     1023                // Delete the temp-backup directory if it already exists.
     1024                if ( $wp_filesystem->is_dir( $dest ) ) {
     1025                        $wp_filesystem->delete( $dest, true );
     1026                }
     1027
     1028                // Move to the temp-backup directory.
     1029                if ( ! $wp_filesystem->move( $src, $dest, true ) ) {
     1030                        return new WP_Error( 'fs_temp_backup_move', $this->strings['temp_backup_move_failed'] );
     1031                }
     1032
     1033                return true;
     1034        }
     1035
     1036        /**
     1037         * Restores the plugin/theme from the temp-backup directory.
     1038         *
     1039         * @since 5.9.0
     1040         *
     1041         * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
     1042         *
     1043         * @param array $args Array of data for the temp-backup. Must include a slug, the source, and directory.
     1044         * @return bool|WP_Error
     1045         */
     1046        public function restore_temp_backup( $args ) {
     1047                global $wp_filesystem;
     1048
     1049                if ( empty( $args['slug'] ) || empty( $args['src'] ) || empty( $args['dir'] ) ) {
     1050                        return false;
     1051                }
     1052
     1053                $src  = $wp_filesystem->wp_content_dir() . 'upgrade/temp-backup/' . $args['dir'] . '/' . $args['slug'];
     1054                $dest = trailingslashit( $args['src'] ) . $args['slug'];
     1055
     1056                if ( $wp_filesystem->is_dir( $src ) ) {
     1057                        // Cleanup.
     1058                        if ( $wp_filesystem->is_dir( $dest ) && ! $wp_filesystem->delete( $dest, true ) ) {
     1059                                return new WP_Error( 'fs_temp_backup_delete', $this->strings['temp_backup_restore_failed'] );
     1060                        }
     1061
     1062                        // Move it.
     1063                        if ( ! $wp_filesystem->move( $src, $dest, true ) ) {
     1064                                return new WP_Error( 'fs_temp_backup_delete', $this->strings['temp_backup_restore_failed'] );
     1065                        }
     1066                }
     1067
     1068                return true;
     1069        }
     1070
     1071        /**
     1072         * Deletes a temp-backup.
     1073         *
     1074         * @since 5.9.0
     1075         *
     1076         * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
     1077         *
     1078         * @param array $args Array of data for the temp-backup. Must include a slug, the source, and directory.
     1079         * @return bool
     1080         */
     1081        public function delete_temp_backup( $args ) {
     1082                global $wp_filesystem;
     1083
     1084                if ( empty( $args['slug'] ) || empty( $args['dir'] ) ) {
     1085                        return false;
     1086                }
     1087
     1088                return $wp_filesystem->delete(
     1089                        $wp_filesystem->wp_content_dir() . "upgrade/temp-backup/{$args['dir']}/{$args['slug']}",
     1090                        true
     1091                );
     1092        }
     1093
     1094        /**
     1095         * Deletes all contents of the temp-backup directory.
     1096         *
     1097         * @since 5.9.0
     1098         *
     1099         * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
     1100         */
     1101        public function delete_all_temp_backups() {
     1102                /*
     1103                 * Check if there's a lock, or if currently performing an Ajax request,
     1104                 * in which case there's a chance we're doing an update.
     1105                 * Reschedule for an hour from now and exit early.
     1106                 */
     1107                if ( get_option( 'core_updater.lock' ) || get_option( 'auto_updater.lock' ) || wp_doing_ajax() ) {
     1108                        wp_schedule_single_event( time() + HOUR_IN_SECONDS, 'delete_temp_updater_backups' );
     1109                        return;
     1110                }
     1111
     1112                add_action(
     1113                        'shutdown',
     1114                        /*
     1115                         * This action runs on shutdown to make sure there's no plugin updates currently running.
     1116                         * Using a closure in this case is OK since the action can be removed by removing the parent hook.
     1117                         */
     1118                        function() {
     1119                                global $wp_filesystem;
     1120
     1121                                if ( ! $wp_filesystem ) {
     1122                                        include_once ABSPATH . '/wp-admin/includes/file.php';
     1123                                        WP_Filesystem();
     1124                                }
     1125
     1126                                $dirlist = $wp_filesystem->dirlist( $wp_filesystem->wp_content_dir() . 'upgrade/temp-backup/' );
     1127
     1128                                foreach ( array_keys( $dirlist ) as $dir ) {
     1129                                        if ( '.' === $dir || '..' === $dir ) {
     1130                                                continue;
     1131                                        }
     1132
     1133                                        $wp_filesystem->delete( $wp_filesystem->wp_content_dir() . 'upgrade/temp-backup/' . $dir, true );
     1134                                }
     1135                        }
     1136                );
     1137        }
    9511138}
    9521139
Note: See TracChangeset for help on using the changeset viewer.