Make WordPress Core


Ignore:
Timestamp:
09/23/2019 08:26:10 PM (5 years ago)
Author:
SergeyBiryukov
Message:

Site Health: Include simple debug data in fatal error protection email.

Introduce recovery_email_debug_info filter for the debug information included in the email.

Props Clorith, TimothyBlynJacobs.
Fixes #48090.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-recovery-mode-email-service.php

    r45932 r46273  
    139139        $support = apply_filters( 'recovery_email_support_info', __( 'Please contact your host for assistance with investigating this issue further.' ) );
    140140
    141         /* translators: Do not translate LINK, EXPIRES, CAUSE, DETAILS, SITEURL, PAGEURL, SUPPORT: those are placeholders. */
     141        /**
     142         * Filters the debug information included in the fatal error protection email.
     143         *
     144         * @since 5.3.0
     145         *
     146         * @param $message array An associated array of debug information.
     147         */
     148        $debug = apply_filters( 'recovery_email_debug_info', $this->get_debug( $extension ) );
     149
     150        /* translators: Do not translate LINK, EXPIRES, CAUSE, DETAILS, SITEURL, PAGEURL, SUPPORT. DEBUG: those are placeholders. */
    142151        $message = __(
    143152            'Howdy!
     
    154163
    155164To keep your site safe, this link will expire in ###EXPIRES###. Don\'t worry about that, though: a new link will be emailed to you if the error occurs again after it expires.
     165
     166When seeking help with this issue, you may be asked for some of the following information:
     167###DEBUG###
    156168
    157169###DETAILS###'
     
    166178                '###PAGEURL###',
    167179                '###SUPPORT###',
     180                '###DEBUG###',
    168181            ),
    169182            array(
     
    175188                home_url( $_SERVER['REQUEST_URI'] ),
    176189                $support,
     190                implode( "\r\n", $debug ),
    177191            ),
    178192            $message
     
    237251
    238252        if ( 'plugin' === $extension['type'] ) {
    239             if ( ! function_exists( 'get_plugins' ) ) {
    240                 require_once ABSPATH . 'wp-admin/includes/plugin.php';
    241             }
    242 
    243             $plugins = get_plugins();
    244 
    245             $name = '';
    246 
    247             // Assume plugin main file name first since it is a common convention.
    248             if ( isset( $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ] ) ) {
    249                 $name = $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ]['Name'];
     253            $plugin = $this->get_plugin( $extension );
     254
     255            if ( false === $plugin ) {
     256                $name = $extension['slug'];
    250257            } else {
    251                 foreach ( $plugins as $file => $plugin_data ) {
    252                     if ( 0 === strpos( $file, "{$extension['slug']}/" ) || $file === $extension['slug'] ) {
    253                         $name = $plugin_data['Name'];
    254                         break;
    255                     }
    256                 }
    257             }
    258 
    259             if ( empty( $name ) ) {
    260                 $name = $extension['slug'];
     258                $name = $plugin['Name'];
    261259            }
    262260
     
    273271        return $cause;
    274272    }
     273
     274    /**
     275     * Return the details for a single plugin based on the extension data from an error.
     276     *
     277     * @since 5.3.0
     278     *
     279     * @param array $extension The extension that caused the error.
     280     * @return bool|array A plugin array {@see get_plugins()} or `false` if no plugin was found.
     281     */
     282    private function get_plugin( $extension ) {
     283        if ( ! function_exists( 'get_plugins' ) ) {
     284            require_once ABSPATH . 'wp-admin/includes/plugin.php';
     285        }
     286
     287        $plugins = get_plugins();
     288
     289        // Assume plugin main file name first since it is a common convention.
     290        if ( isset( $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ] ) ) {
     291            return $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ];
     292        } else {
     293            foreach ( $plugins as $file => $plugin_data ) {
     294                if ( 0 === strpos( $file, "{$extension['slug']}/" ) || $file === $extension['slug'] ) {
     295                    return $plugin_data;
     296                }
     297            }
     298        }
     299
     300        return false;
     301    }
     302
     303    /**
     304     * Return debug information in an easy to manipulate format.
     305     *
     306     * @since 5.3.0
     307     *
     308     * @param array $extension The extension that caused the error.
     309     * @return array An associated array of debug information.
     310     */
     311    private function get_debug( $extension ) {
     312        $theme      = wp_get_theme();
     313        $wp_version = get_bloginfo( 'version' );
     314
     315        if ( $extension ) {
     316            $plugin = $this->get_plugin( $extension );
     317        } else {
     318            $plugin = null;
     319        }
     320
     321        $debug = array(
     322            /* translators: %s: Current WordPress version number. */
     323            'wp'    => sprintf(
     324                __( 'WordPress version %s' ),
     325                $wp_version
     326            ),
     327            'theme' => sprintf(
     328                /* translators: 1: Current active theme name. 2: Current active theme version. */
     329                __( 'Current theme: %1$s (version %2$s)' ),
     330                $theme->get( 'Name' ),
     331                $theme->get( 'Version' )
     332            ),
     333        );
     334
     335        if ( null !== $plugin ) {
     336            $debug['plugin'] = sprintf(
     337                /* translators: 1: The failing plugins name. 2: The failing plugins version. */
     338                __( 'Current plugin: %1$s (version %2$s)' ),
     339                $plugin['Name'],
     340                $plugin['Version']
     341            );
     342        }
     343
     344        $debug['php'] = sprintf(
     345            /* translators: %s: The currently used PHP version. */
     346            __( 'PHP version %s' ),
     347            PHP_VERSION
     348        );
     349
     350        return $debug;
     351    }
    275352}
Note: See TracChangeset for help on using the changeset viewer.