WordPress.org

Make WordPress Core

Ticket #48105: 48105.3.patch

File 48105.3.patch, 22.0 KB (added by Clorith, 5 months ago)
  • src/wp-settings.php

     
    256256require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-renderer-controller.php';
    257257require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-settings-controller.php';
    258258require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-themes-controller.php';
     259require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-site-health-controller.php';
    259260require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-meta-fields.php';
    260261require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-comment-meta-fields.php';
    261262require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-post-meta-fields.php';
  • src/wp-admin/includes/ajax-actions.php

     
    51205120 * Ajax handler for site health checks on server communication.
    51215121 *
    51225122 * @since 5.2.0
     5123 * @deprecated 5.4.0 Use WP_REST_Site_Health_Controller::test_dotorg_communication()
     5124 * @see WP_REST_Site_Health_Controller::test_dotorg_communication()
    51235125 */
    51245126function wp_ajax_health_check_dotorg_communication() {
     5127        _doing_it_wrong(
     5128                'wp_ajax_health_check_dotorg_communication',
     5129                sprintf(
     5130                        // translators: 1: The Site Health action that is no longer used by core. 2: The new function taht replaces it.
     5131                        __( 'The Site Health check for %1$s has been replaced with %2$s.' ),
     5132                        'wp_ajax_health_check_dotorg_communication',
     5133                        'WP_REST_Site_Health_Controller::test_dotorg_communication'
     5134                ),
     5135                '5.4.0'
     5136        );
     5137
    51255138        check_ajax_referer( 'health-check-site-status' );
    51265139
    51275140        if ( ! current_user_can( 'view_site_health_checks' ) ) {
     
    51405153 * Ajax handler for site health checks on debug mode.
    51415154 *
    51425155 * @since 5.2.0
     5156 * @deprecated 5.4.0 Use WP_REST_Site_Health_Controller::test_is_in_debug_mode()
     5157 * @see WP_REST_Site_Health_Controller::test_is_in_debug_mode()
    51435158 */
    51445159function wp_ajax_health_check_is_in_debug_mode() {
     5160        _doing_it_wrong(
     5161                'wp_ajax_health_check_is_in_debug_mode',
     5162                sprintf(
     5163                        // translators: 1: The Site Health action that is no longer used by core. 2: The new function taht replaces it.
     5164                        __( 'The Site Health check for %1$s has been replaced with %2$s.' ),
     5165                        'wp_ajax_health_check_is_in_debug_mode',
     5166                        'WP_REST_Site_Health_Controller::test_is_in_debug_mode'
     5167                ),
     5168                '5.4.0'
     5169        );
     5170
    51455171        wp_verify_nonce( 'health-check-site-status' );
    51465172
    51475173        if ( ! current_user_can( 'view_site_health_checks' ) ) {
     
    51605186 * Ajax handler for site health checks on background updates.
    51615187 *
    51625188 * @since 5.2.0
     5189 * @deprecated 5.4.0 Use WP_REST_Site_Health_Controller::test_background_updates()
     5190 * @see WP_REST_Site_Health_Controller::test_background_updates()
    51635191 */
    51645192function wp_ajax_health_check_background_updates() {
     5193        _doing_it_wrong(
     5194                'wp_ajax_health_check_background_updates',
     5195                sprintf(
     5196                // translators: 1: The Site Health action that is no longer used by core. 2: The new function taht replaces it.
     5197                        __( 'The Site Health check for %1$s has been replaced with %2$s.' ),
     5198                        'wp_ajax_health_check_background_updates',
     5199                        'WP_REST_Site_Health_Controller::test_background_updates'
     5200                ),
     5201                '5.4.0'
     5202        );
     5203
    51655204        check_ajax_referer( 'health-check-site-status' );
    51665205
    51675206        if ( ! current_user_can( 'view_site_health_checks' ) ) {
     
    51815220 * Ajax handler for site health checks on loopback requests.
    51825221 *
    51835222 * @since 5.2.0
     5223 * @deprecated 5.4.0 Use WP_REST_Site_Health_Controller::test_loopback_requests()
     5224 * @see WP_REST_Site_Health_Controller::test_loopback_requests()
    51845225 */
    51855226function wp_ajax_health_check_loopback_requests() {
     5227        _doing_it_wrong(
     5228                'wp_ajax_health_check_loopback_requests',
     5229                sprintf(
     5230                // translators: 1: The Site Health action that is no longer used by core. 2: The new function taht replaces it.
     5231                        __( 'The Site Health check for %1$s has been replaced with %2$s.' ),
     5232                        'wp_ajax_health_check_loopback_requests',
     5233                        'WP_REST_Site_Health_Controller::test_loopback_requests'
     5234                ),
     5235                '5.4.0'
     5236        );
     5237
    51865238        check_ajax_referer( 'health-check-site-status' );
    51875239
    51885240        if ( ! current_user_can( 'view_site_health_checks' ) ) {
     
    52185270 * Ajax handler for site health check to get directories and database sizes.
    52195271 *
    52205272 * @since 5.2.0
     5273 * @deprecated 5.4.0 Use WP_REST_Site_Health_Controller::get_directory_sizes()
     5274 * @see WP_REST_Site_Health_Controller::get_directory_sizes()
    52215275 */
    52225276function wp_ajax_health_check_get_sizes() {
     5277        _doing_it_wrong(
     5278                'wp_ajax_health_check_get_sizes',
     5279                sprintf(
     5280                // translators: 1: The Site Health action that is no longer used by core. 2: The new function taht replaces it.
     5281                        __( 'The Site Health check for %1$s has been replaced with %2$s.' ),
     5282                        'wp_ajax_health_check_get_sizes',
     5283                        'WP_REST_Site_Health_Controller::get_directory_sizes'
     5284                ),
     5285                '5.4.0'
     5286        );
     5287
    52235288        check_ajax_referer( 'health-check-site-status-result' );
    52245289
    52255290        if ( ! current_user_can( 'view_site_health_checks' ) || is_multisite() ) {
  • src/wp-admin/admin-ajax.php

     
    134134        'wp-privacy-export-personal-data',
    135135        'wp-privacy-erase-personal-data',
    136136        'health-check-site-status-result',
    137         'health-check-dotorg-communication',
    138         'health-check-is-in-debug-mode',
    139         'health-check-background-updates',
    140         'health-check-loopback-requests',
    141         'health-check-get-sizes',
    142137        'toggle-auto-updates',
    143138);
    144139
  • src/js/_enqueues/admin/site-health.js

     
    162162
    163163                if ( 1 <= SiteHealth.site_status.async.length ) {
    164164                        $.each( SiteHealth.site_status.async, function() {
     165                                var url = ajaxurl;
    165166                                var data = {
    166167                                        'action': 'health-check-' + this.test.replace( '_', '-' ),
    167168                                        '_wpnonce': SiteHealth.nonce.site_status
    168169                                };
    169170
     171                                if ( "undefined" !== typeof( this.has_rest ) && this.has_rest ) {
     172                                        url = this.test;
     173                                        data = {
     174                                                '_wpnonce': SiteHealth.nonce.rest_api
     175                                        };
     176                                }
     177
    170178                                if ( this.completed ) {
    171179                                        return true;
    172180                                }
     
    176184                                this.completed = true;
    177185
    178186                                $.post(
    179                                         ajaxurl,
    180                                         data,
    181                                         function( response ) {
    182                                                 /** This filter is documented in wp-admin/includes/class-wp-site-health.php */
    183                                                 AppendIssue( wp.hooks.applyFilters( 'site_status_test_result', response.data ) );
    184                                                 maybeRunNextAsyncTest();
    185                                         }
    186                                 );
     187                                        url,
     188                                        data
     189                                ).done( function( response ) {
     190                                        /** This filter is documented in wp-admin/includes/class-wp-site-health.php */
     191                                        AppendIssue( wp.hooks.applyFilters( 'site_status_test_result', response.data ) );
     192                                } ).fail( function( response ) {
     193                                        var description, issue;
     194
     195                                        if ( "undefined" !== typeof( response.responseJSON ) && "undefined" !== typeof( response.responseJSON.message ) ) {
     196                                                description = response.responseJSON.message;
     197                                        } else {
     198                                                description = __( 'No details available' );
     199                                        }
     200
     201                                        issue = {
     202                                                'status': 'recommended',
     203                                                'label': __( 'A test is unavailable' ),
     204                                                'badge': {
     205                                                        'color': 'red',
     206                                                        'label': __( 'Unavailable' )
     207                                                },
     208                                                'description': '<p>' + this.url + '</p><p>' + description + '</p>',
     209                                                'actions': ''
     210                                        };
     211
     212                                        /** This filter is documented in wp-admin/includes/class-wp-site-health.php */
     213                                        AppendIssue( wp.hooks.applyFilters( 'site_status_test_result', issue ) );
     214                                } ).always( function() {
     215                                        maybeRunNextAsyncTest();
     216                                } );
    187217
    188218                                return false;
    189219                        } );
     
    212242                }
    213243
    214244                if ( 0 < SiteHealth.site_status.async.length ) {
    215                         data = {
    216                                 'action': 'health-check-' + SiteHealth.site_status.async[0].test.replace( '_', '-' ),
    217                                 '_wpnonce': SiteHealth.nonce.site_status
    218                         };
    219 
    220                         SiteHealth.site_status.async[0].completed = true;
    221 
    222                         $.post(
    223                                 ajaxurl,
    224                                 data,
    225                                 function( response ) {
    226                                         AppendIssue( response.data );
    227                                         maybeRunNextAsyncTest();
    228                                 }
    229                         );
     245                        maybeRunNextAsyncTest();
    230246                } else {
    231247                        RecalculateProgression();
    232248                }
     
    234250
    235251        function getDirectorySizes() {
    236252                var data = {
    237                         action: 'health-check-get-sizes',
    238                         _wpnonce: SiteHealth.nonce.site_status_result
     253                        _wpnonce: SiteHealth.nonce.rest_api
    239254                };
    240255
    241256                var timestamp = ( new Date().getTime() );
     
    246261                }, 3000 );
    247262
    248263                $.post( {
    249                         type: 'POST',
    250                         url: ajaxurl,
     264                        url: SiteHealth.rest_base + 'wp-site-health/v1/get/directory-sizes',
    251265                        data: data,
    252266                        dataType: 'json'
    253267                } ).done( function( response ) {
    254                         updateDirSizes( response.data || {} );
     268                        updateDirSizes( response || {} );
    255269                } ).always( function() {
    256270                        var delay = ( new Date().getTime() ) - timestamp;
    257271
  • src/wp-admin/includes/class-wp-site-health.php

     
    8080
    8181                $health_check_js_variables = array(
    8282                        'screen'      => $screen->id,
     83                        'rest_base'   => rest_url( '/' ),
    8384                        'nonce'       => array(
     85                                'rest_api'           => wp_create_nonce( 'wp_rest' ),
    8486                                'site_status'        => wp_create_nonce( 'health-check-site-status' ),
    8587                                'site_status_result' => wp_create_nonce( 'health-check-site-status-result' ),
    8688                        ),
     
    133135                                if ( is_string( $test['test'] ) ) {
    134136                                        $health_check_js_variables['site_status']['async'][] = array(
    135137                                                'test'      => $test['test'],
     138                                                'has_rest'  => ( isset( $test['has_rest'] ) ? $test['has_rest'] : false ),
    136139                                                'completed' => false,
    137140                                        );
    138141                                }
     
    19631966         * experiences.
    19641967         *
    19651968         * @since 5.2.0
     1969         * @since 5.5.0 Added support for `has_rest` and `permissions`.
    19661970         *
    19671971         * @return array The list of tests to run.
    19681972         */
     
    20282032                        ),
    20292033                        'async'  => array(
    20302034                                'dotorg_communication' => array(
    2031                                         'label' => __( 'Communication with WordPress.org' ),
    2032                                         'test'  => 'dotorg_communication',
     2035                                        'label'    => __( 'Communication with WordPress.org' ),
     2036                                        'test'     => rest_url( 'wp-site-health/v1/test/dotorg-communication' ),
     2037                                        'has_rest' => true,
    20332038                                ),
    20342039                                'background_updates'   => array(
    2035                                         'label' => __( 'Background updates' ),
    2036                                         'test'  => 'background_updates',
     2040                                        'label'    => __( 'Background updates' ),
     2041                                        'test'     => rest_url( 'wp-site-health/v1/test/background-updates' ),
     2042                                        'has_rest' => true,
    20372043                                ),
    20382044                                'loopback_requests'    => array(
    2039                                         'label' => __( 'Loopback request' ),
    2040                                         'test'  => 'loopback_requests',
     2045                                        'label'    => __( 'Loopback request' ),
     2046                                        'test'     => rest_url( 'wp-site-health/v1/test/loopback-requests' ),
     2047                                        'has_rest' => true,
    20412048                                ),
    20422049                        ),
    20432050                );
    2044 
    2045                 // Conditionally include REST rules if the function for it exists.
    2046                 if ( function_exists( 'rest_url' ) ) {
    2047                         $tests['direct']['rest_availability'] = array(
    2048                                 'label' => __( 'REST API availability' ),
    2049                                 'test'  => 'rest_availability',
    2050                         );
    2051                 }
    20522051
    20532052                /**
    20542053                 * Add or modify which site status tests are run on a site.
     
    20742073                 *         Plugins and themes are encouraged to prefix test identifiers with their slug
    20752074                 *         to avoid any collisions between tests.
    20762075                 *
    2077                  *         @type string $label A friendly label for your test to identify it by.
    2078                  *         @type mixed  $test  A callable to perform a direct test, or a string Ajax action to be called
    2079                  *                             to perform an async test.
     2076                 *         @type string  $label       A friendly label for your test to identify it by.
     2077                 *         @type mixed   $test        A callable to perform a direct test, or a string AJAX action to be
     2078                 *                                    called to perform an async test.
     2079                 *         @type boolean $has_rest    Optional. Denote if `$test` has a REST API endpoint.
    20802080                 *     }
    20812081                 * }
    20822082                 */
  • src/wp-admin/includes/class-wp-site-health-auto-updates.php

     
    8585         * @return array The test results.
    8686         */
    8787        public function test_wp_version_check_attached() {
    88                 if ( ! is_main_site() ) {
    89                         return;
    90                 }
    91 
    92                 $cookies = wp_unslash( $_COOKIE );
    93                 $timeout = 10;
    94                 $headers = array(
    95                         'Cache-Control' => 'no-cache',
    96                 );
    97                 /** This filter is documented in wp-includes/class-wp-http-streams.php */
    98                 $sslverify = apply_filters( 'https_local_ssl_verify', false );
    99 
    100                 // Include Basic auth in loopback requests.
    101                 if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) {
    102                         $headers['Authorization'] = 'Basic ' . base64_encode( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) . ':' . wp_unslash( $_SERVER['PHP_AUTH_PW'] ) );
    103                 }
    104 
    105                 $url = add_query_arg(
    106                         array(
    107                                 'health-check-test-wp_version_check' => true,
    108                         ),
    109                         admin_url( 'site-health.php' )
    110                 );
    111 
    112                 $test = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout', 'sslverify' ) );
    113 
    114                 if ( is_wp_error( $test ) ) {
    115                         return array(
    116                                 'description' => sprintf(
    117                                         /* translators: %s: Name of the filter used. */
    118                                         __( 'Could not confirm that the %s filter is available.' ),
    119                                         '<code>wp_version_check()</code>'
    120                                 ),
    121                                 'severity'    => 'warning',
    122                         );
    123                 }
    124 
    125                 $response = wp_remote_retrieve_body( $test );
    126 
    127                 if ( 'yes' !== $response ) {
     88                if ( ! has_filter( 'wp_version_check', 'wp_version_check' ) ) {
    12889                        return array(
    12990                                'description' => sprintf(
    13091                                        /* translators: %s: Name of the filter used. */
     
    305266         * @return array The test results.
    306267         */
    307268        function test_check_wp_filesystem_method() {
     269                // Make sure the `request_filesystem_credentials` function is available during our REST call.
     270                if ( ! function_exists( 'request_filesystem_credentials' ) ) {
     271                        require_once( ABSPATH . '/wp-admin/includes/file.php' );
     272                }
     273
    308274                $skin    = new Automatic_Upgrader_Skin;
    309275                $success = $skin->request_filesystem_credentials( false, ABSPATH );
    310276
     
    351317                        return false;
    352318                }
    353319
     320                // Make sure the `get_core_checksums` function is available during our REST call.
     321                if ( ! function_exists( 'get_core_checksums' ) ) {
     322                        require_once( ABSPATH . '/wp-admin/includes/update.php' );
     323                }
     324
    354325                $checksums = get_core_checksums( $wp_version, 'en_US' );
    355326                $dev       = ( false !== strpos( $wp_version, '-' ) );
    356327                // Get the last stable version's files and test against that.
  • src/wp-includes/rest-api.php

     
    281281        $controller = new WP_REST_Themes_Controller;
    282282        $controller->register_routes();
    283283
     284        // Site Health
     285        $controller = new WP_REST_Site_Health_Controller;
     286        $controller->register_routes();
     287
    284288}
    285289
    286290/**
  • src/wp-admin/site-health.php

     
    2323wp_enqueue_style( 'site-health' );
    2424wp_enqueue_script( 'site-health' );
    2525
    26 if ( ! class_exists( 'WP_Site_Health' ) ) {
    27         require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
    28 }
    29 
    30 $health_check_site_status = WP_Site_Health::get_instance();
    31 
    32 // Start by checking if this is a special request checking for the existence of certain filters.
    33 $health_check_site_status->check_wp_version_check_exists();
    34 
    3526require_once ABSPATH . 'wp-admin/admin-header.php';
    3627?>
    3728<div class="health-check-header">
  • src/wp-includes/rest-api/endpoints/class-wp-rest-site-health-controller.php

     
     1<?php
     2/**
     3 * REST API: WP_REST_Site_Health_Controller class
     4 *
     5 * @package WordPress
     6 * @subpackage REST_API
     7 * @since 5.5.0
     8 */
     9
     10/**
     11 * Core class for interacting with Site Health elements.
     12 *
     13 * @since 5.5.0
     14 *
     15 * @see WP_REST_Controller
     16 */
     17class WP_REST_Site_Health_Controller extends WP_REST_Controller {
     18
     19        private $site_health;
     20
     21        /**
     22         * Constructor.
     23         */
     24        public function __construct() {
     25                if ( ! class_exists( 'WP_Site_Health' ) ) {
     26                        require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
     27                }
     28
     29                $this->namespace = 'wp-site-health/v1';
     30
     31                $this->site_health = WP_Site_Health::get_instance();
     32        }
     33
     34        /**
     35         * Register API routes.
     36         *
     37         * @since 5.5.0
     38         *
     39         * @see register_rest_route()
     40         */
     41        public function register_routes() {
     42                register_rest_route(
     43                        $this->namespace,
     44                        sprintf(
     45                                '/%s/%s',
     46                                'test',
     47                                'background-updates'
     48                        ),
     49                        array(
     50                                'methods'             => 'POST',
     51                                'callback'            => array( $this, 'test_background_updates' ),
     52                                'permission_callback' => function() {
     53                                        return $this->validate_request_permission( 'background_updates' );
     54                                },
     55                        )
     56                );
     57
     58                register_rest_route(
     59                        $this->namespace,
     60                        sprintf(
     61                                '/%s/%s',
     62                                'test',
     63                                'loopback-requests'
     64                        ),
     65                        array(
     66                                'methods'             => 'POST',
     67                                'callback'            => array( $this, 'test_loopback_requests' ),
     68                                'permission_callback' => function() {
     69                                        return $this->validate_request_permission( 'loopback_requests' );
     70                                },
     71                        )
     72                );
     73
     74                register_rest_route(
     75                        $this->namespace,
     76                        sprintf(
     77                                '/%s/%s',
     78                                'test',
     79                                'dotorg-communication'
     80                        ),
     81                        array(
     82                                'methods'             => 'POST',
     83                                'callback'            => array( $this, 'test_dotorg_communication' ),
     84                                'permission_callback' => function() {
     85                                        return $this->validate_request_permission( 'dotorg_communication' );
     86                                },
     87                        )
     88                );
     89
     90                register_rest_route(
     91                        $this->namespace,
     92                        sprintf(
     93                                '/%s/%s',
     94                                'test',
     95                                'debug_enabled'
     96                        ),
     97                        array(
     98                                'methods'             => 'POST',
     99                                'callback'            => array( $this, 'test_is_in_debug_mode' ),
     100                                'permission_callback' => function() {
     101                                        return $this->validate_request_permission( 'debug_enabled' );
     102                                },
     103                        )
     104                );
     105
     106                register_rest_route(
     107                        $this->namespace,
     108                        sprintf(
     109                                '/%s/%s',
     110                                'get',
     111                                'directory-sizes'
     112                        ),
     113                        array(
     114                                'methods'             => 'POST',
     115                                'callback'            => array( $this, 'get_directory_sizes' ),
     116                                'permission_callback' => function() {
     117                                        return $this->validate_request_permission( 'debug_enabled' ) && ! is_multisite();
     118                                },
     119                        )
     120                );
     121        }
     122
     123        /**
     124         * Validate if the current user can request this REST endpoint.
     125         *
     126         * @param string $check The endpoint check being ran.
     127         *
     128         * @return bool
     129         */
     130        public function validate_request_permission( $check ) {
     131                $default_capability = 'view_site_health_checks';
     132
     133                /**
     134                 * Filter the capability needed to run a given Site Health check.
     135                 *
     136                 * @since 5.5.0
     137                 *
     138                 * @param string $default_capability The default capability required for this check.
     139                 * @param string $check              The Site Health check being performed.
     140                 */
     141                $capability = apply_filters( "site_health_test_rest_capability_{$check}", $default_capability, $check );
     142
     143                return current_user_can( $capability );
     144        }
     145
     146        /**
     147         * Check if background updates work as expected.
     148         *
     149         * @since 5.5.0
     150         *
     151         * @return array
     152         */
     153        public function test_background_updates() {
     154                return array(
     155                        'data' => $this->site_health->get_test_background_updates()
     156                );
     157        }
     158
     159        /**
     160         * Check that the site can reach the WordPress.org API.
     161         *
     162         * @since 5.5.0
     163         *
     164         * @return array
     165         */
     166        public function test_dotorg_communication() {
     167                return array(
     168                        'data' => $this->site_health->get_test_dotorg_communication()
     169                );
     170        }
     171
     172        /**
     173         * Check that loopbacks can be performed.
     174         *
     175         * @since 5.5.0
     176         *
     177         * @return array
     178         */
     179        public function test_loopback_requests() {
     180                return array(
     181                        'data' => $this->site_health->get_test_loopback_requests()
     182                );
     183        }
     184
     185        /**
     186         * Check if the site has debug mode enabled.
     187         *
     188         * @since 5.5.0
     189         *
     190         * @return array
     191         */
     192        public function test_is_in_debug_mode() {
     193                return array(
     194                        'data' => $this->site_health->get_test_is_in_debug_mode()
     195                );
     196        }
     197
     198        /**
     199         * Get the current directory sizes for this install.
     200         *
     201         * @since 5.5.0
     202         */
     203        public function get_directory_sizes() {
     204                if ( ! class_exists( 'WP_Debug_Data' ) ) {
     205                        require_once( ABSPATH . 'wp-admin/includes/class-wp-debug-data.php' );
     206                }
     207
     208                $sizes_data = WP_Debug_Data::get_sizes();
     209                $all_sizes  = array( 'raw' => 0 );
     210
     211                foreach ( $sizes_data as $name => $value ) {
     212                        $name = sanitize_text_field( $name );
     213                        $data = array();
     214
     215                        if ( isset( $value['size'] ) ) {
     216                                if ( is_string( $value['size'] ) ) {
     217                                        $data['size'] = sanitize_text_field( $value['size'] );
     218                                } else {
     219                                        $data['size'] = (int) $value['size'];
     220                                }
     221                        }
     222
     223                        if ( isset( $value['debug'] ) ) {
     224                                if ( is_string( $value['debug'] ) ) {
     225                                        $data['debug'] = sanitize_text_field( $value['debug'] );
     226                                } else {
     227                                        $data['debug'] = (int) $value['debug'];
     228                                }
     229                        }
     230
     231                        if ( ! empty( $value['raw'] ) ) {
     232                                $data['raw'] = (int) $value['raw'];
     233                        }
     234
     235                        $all_sizes[ $name ] = $data;
     236                }
     237
     238                if ( isset( $all_sizes['total_size']['debug'] ) && 'not available' === $all_sizes['total_size']['debug'] ) {
     239                        return new WP_Error( 'not_available', 'not_available', $all_sizes );
     240                }
     241
     242                return $all_sizes;
     243        }
     244}