WordPress.org

Make WordPress Core

Ticket #46066: 46066.diff

File 46066.diff, 6.8 KB (added by schlessera, 20 months ago)
  • src/wp-admin/includes/plugin.php

    diff --git src/wp-admin/includes/plugin.php src/wp-admin/includes/plugin.php
    index 05e3861f17..6cc613a42a 100644
    function is_plugin_paused( $plugin ) { 
    552552
    553553        list( $plugin ) = explode( '/', $plugin );
    554554
    555         return array_key_exists( $plugin, $GLOBALS['_paused_plugins'] );
     555        if ( ! array_key_exists( $plugin, $GLOBALS['_paused_plugins'] ) ) {
     556                return false;
     557        }
     558
     559        return $GLOBALS['_paused_plugins'][ $plugin ]['count'] >= WP_FATAL_ERROR_PROTECTION_REDIRECT_THRESHOLD;
    556560}
    557561
    558562/**
    function wp_get_plugin_error( $plugin ) { 
    576580                return false;
    577581        }
    578582
    579         return $GLOBALS['_paused_plugins'][ $plugin ];
     583        return $GLOBALS['_paused_plugins'][ $plugin ]['error'];
    580584}
    581585
    582586/**
  • src/wp-admin/includes/theme.php

    diff --git src/wp-admin/includes/theme.php src/wp-admin/includes/theme.php
    index 7c307c33eb..87fbc767b4 100644
    function is_theme_paused( $theme ) { 
    791791                return false;
    792792        }
    793793
    794         return array_key_exists( $theme, $GLOBALS['_paused_themes'] );
     794        if ( ! array_key_exists( $theme, $GLOBALS['_paused_themes'] ) ) {
     795                return false;
     796        }
     797
     798        return $GLOBALS['_paused_themes'][ $theme ]['count'] >= WP_FATAL_ERROR_PROTECTION_REDIRECT_THRESHOLD;
    795799}
    796800
    797801/**
    function wp_get_theme_error( $theme ) { 
    813817                return false;
    814818        }
    815819
    816         return $GLOBALS['_paused_themes'][ $theme ];
     820        return $GLOBALS['_paused_themes'][ $theme ]['error'];
    817821}
    818822
    819823/**
  • src/wp-includes/class-wp-paused-extensions-storage.php

    diff --git src/wp-includes/class-wp-paused-extensions-storage.php src/wp-includes/class-wp-paused-extensions-storage.php
    index 37b39d2788..5228a8e7bb 100644
    class WP_Paused_Extensions_Storage { 
    6767                }
    6868
    6969                if ( is_multisite() && is_site_meta_supported() ) {
    70                         // Do not update if the error is already stored.
    71                         if ( get_site_meta( get_current_blog_id(), $this->meta_prefix . $extension, true ) === $error ) {
    72                                 return true;
    73                         }
     70                        $record = get_site_meta( get_current_blog_id(), $this->meta_prefix . $extension, true );
    7471
    75                         return (bool) update_site_meta( get_current_blog_id(), $this->meta_prefix . $extension, $error );
     72                        $record = $this->update_record_count( $record, $error );
     73
     74                        return (bool) update_site_meta( get_current_blog_id(), $this->meta_prefix . $extension, $record );
    7675                }
    7776
    7877                $paused_extensions = $this->get_all();
    7978
    80                 // Do not update if the error is already stored.
    81                 if ( isset( $paused_extensions[ $extension ] ) && $paused_extensions[ $extension ] === $error ) {
    82                         return true;
    83                 }
     79                $record = $paused_extensions[ $extension ];
     80                $record = $this->update_record_count( $record, $error );
    8481
    85                 $paused_extensions[ $extension ] = $error;
     82                $paused_extensions[ $extension ] = $record;
    8683
    8784                return update_option( $this->option_name, $paused_extensions );
    8885        }
    class WP_Paused_Extensions_Storage { 
    132129         * @since 5.1.0
    133130         *
    134131         * @param string $extension Plugin or theme directory name.
    135          * @return array|null Error that is stored, or null if the extension is not paused.
     132         * @return array|null Record of an error that is stored and its count, or null if the extension is not paused.
    136133         */
    137134        public function get( $extension ) {
    138135                if ( ! $this->is_api_loaded() ) {
    class WP_Paused_Extensions_Storage { 
    140137                }
    141138
    142139                if ( is_multisite() && is_site_meta_supported() ) {
    143                         $error = get_site_meta( get_current_blog_id(), $this->meta_prefix . $extension, true );
    144                         if ( ! $error ) {
     140                        $record = get_site_meta( get_current_blog_id(), $this->meta_prefix . $extension, true );
     141                        if ( ! $record ) {
    145142                                return null;
    146143                        }
    147144
    148                         return $error;
     145                        return $record;
    149146                }
    150147
    151148                $paused_extensions = $this->get_all();
    class WP_Paused_Extensions_Storage { 
    178175                                        continue;
    179176                                }
    180177
    181                                 $error = maybe_unserialize( array_shift( $meta_values ) );
     178                                $record = maybe_unserialize( array_shift( $meta_values ) );
    182179
    183                                 $paused_extensions[ substr( $meta_key, strlen( $this->meta_prefix ) ) ] = $error;
     180                                $paused_extensions[ substr( $meta_key, strlen( $this->meta_prefix ) ) ] = $record;
    184181                        }
    185182
    186183                        return $paused_extensions;
    class WP_Paused_Extensions_Storage { 
    218215
    219216                return function_exists( 'get_option' );
    220217        }
     218
     219        /**
     220         * Update the error count of an error record.
     221         *
     222         * @param array $record {
     223         *     Record of an error and its associated count.
     224         *
     225         *     @type array $error The error that occurred.
     226         *     @type int   $count How many consecutive times the error occurred.
     227         * }
     228         * @param array $error Error to check for.
     229         * @return array Update record array.
     230         */
     231        protected function update_record_count( $record, $error ) {
     232                if ( ! is_array( $record ) ) {
     233                        $record = array( 'error' => '', 'count' => 1 );
     234                }
     235
     236                if ( $record['error'] === $error ) {
     237                        $record['count'] += $record['count'];
     238                } else {
     239                        $record['error'] = $error;
     240                        $record['count'] = 1;
     241                }
     242
     243                return $record;
     244        }
    221245}
  • src/wp-includes/error-protection.php

    diff --git src/wp-includes/error-protection.php src/wp-includes/error-protection.php
    index 45fba0cc33..9a2527d173 100644
    function wp_register_fatal_error_handler() { 
    159159                return;
    160160        }
    161161
     162        if ( ! defined( 'WP_FATAL_ERROR_PROTECTION_REDIRECT_THRESHOLD' ) ) {
     163                define( 'WP_FATAL_ERROR_PROTECTION_REDIRECT_THRESHOLD', 2 );
     164        }
     165
    162166        $handler = null;
    163167        if ( defined( 'WP_CONTENT_DIR' ) && is_readable( WP_CONTENT_DIR . '/fatal-error-handler.php' ) ) {
    164168                $handler = include WP_CONTENT_DIR . '/fatal-error-handler.php';
  • src/wp-includes/load.php

    diff --git src/wp-includes/load.php src/wp-includes/load.php
    index 7fe5566e7e..1a39ce00b8 100644
    function wp_skip_paused_plugins( array $plugins ) { 
    727727                list( $plugin ) = explode( '/', plugin_basename( $plugin ) );
    728728
    729729                if ( array_key_exists( $plugin, $paused_plugins ) ) {
    730                         unset( $plugins[ $index ] );
    731 
    732730                        // Store list of paused plugins for displaying an admin notice.
    733731                        $GLOBALS['_paused_plugins'][ $plugin ] = $paused_plugins[ $plugin ];
     732
     733                        // If the error could be replicated, pause the plugin.
     734                        if ( $paused_plugins[ $plugin ]['count'] >= WP_FATAL_ERROR_PROTECTION_REDIRECT_THRESHOLD ) {
     735                                unset( $plugins[ $index ] );
     736                        }
    734737                }
    735738        }
    736739
    function wp_skip_paused_themes( array $themes ) { 
    797800                $theme = basename( $theme );
    798801
    799802                if ( array_key_exists( $theme, $paused_themes ) ) {
    800                         unset( $themes[ $index ] );
    801803
    802804                        // Store list of paused themes for displaying an admin notice.
    803805                        $GLOBALS['_paused_themes'][ $theme ] = $paused_themes[ $theme ];
     806
     807                        // If the error could be replicated, pause the theme.
     808                        if ( $paused_themes[ $theme ]['count'] >= WP_FATAL_ERROR_PROTECTION_REDIRECT_THRESHOLD ) {
     809                                unset( $themes[ $index ] );
     810                        }
    804811                }
    805812        }
    806813