WordPress.org

Make WordPress Core

Ticket #45933: 45933.6.diff

File 45933.6.diff, 4.6 KB (added by spacedmonkey, 5 months ago)

In this patch, a new function called _wp_die_process_input add support for WP_Error and formats the response.

  • src/wp-includes/functions.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    30263026
    30273027        $have_gettext = function_exists( '__' );
    30283028
    3029         if ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) {
    3030                 if ( empty( $title ) ) {
     3029        if ( empty( $title ) ) {
     3030            if ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) {
    30313031                        $error_data = $message->get_error_data();
    30323032                        if ( is_array( $error_data ) && isset( $error_data['title'] ) ) {
    30333033                                $title = $error_data['title'];
    30343034                        }
    30353035                }
    3036                 $errors = $message->get_error_messages();
    3037                 switch ( count( $errors ) ) {
    3038                         case 0:
    3039                                 $message = '';
    3040                                 break;
    3041                         case 1:
    3042                                 $message = "<p>{$errors[0]}</p>";
    3043                                 break;
    3044                         default:
    3045                                 $message = "<ul>\n\t\t<li>" . join( "</li>\n\t\t<li>", $errors ) . "</li>\n\t</ul>";
    3046                                 break;
    3047                 }
    3048         } elseif ( is_string( $message ) ) {
    3049                 $message = "<p>$message</p>";
    3050         }
     3036        }
     3037
     3038        $result = _wp_die_process_input( $message, $r );
     3039        if ( isset( $result['additional_errors'] ) && ! empty( $result['additional_errors'] ) ) {
     3040                $message = "<ul>\n\t\t<li>" . $result['message'] . "</li>\n\t\t<li>" . join( "</li>\n\t\t<li>", $result['additional_errors'] ) . "</li>\n\t</ul>";
     3041        } else {
     3042                $message = "<p>" . $result['message'] . "</p>";
     3043    }
     3044
    30513045
    30523046        if ( ! empty( $r['link_url'] ) && ! empty( $r['link_text'] ) ) {
    30533047                $link_url = $r['link_url'];
     
    30653059
    30663060        if ( ! did_action( 'admin_head' ) ) :
    30673061                if ( ! headers_sent() ) {
    3068                         status_header( $r['response'] );
     3062                        status_header( $result['data']['status'] );
    30693063                        nocache_headers();
    30703064                        header( 'Content-Type: text/html; charset=utf-8' );
    30713065                }
     
    32413235
    32423236        $r = wp_parse_args( $args, $defaults );
    32433237
    3244         $data = array(
    3245                 'code'    => 'wp_die',
    3246                 'message' => $message,
    3247                 'status'  => $r['response'],
    3248         );
     3238        $result = _wp_die_process_input( $message, $r );
    32493239
    32503240        if ( ! headers_sent() ) {
    32513241                header( 'Content-Type: application/json; charset=utf-8' );
    3252                 if ( null !== $r['response'] ) {
    3253                         status_header( $r['response'] );
     3242                nocache_headers();
     3243                if ( null !== $result['data']['status'] ) {
     3244                        status_header( $result['data']['status'] );
    32543245                }
    32553246        }
    32563247
    3257         echo wp_json_encode( $data );
     3248        echo wp_json_encode( $result );
    32583249        die();
    32593250}
    32603251
     
    32763267        global $wp_xmlrpc_server;
    32773268        $defaults = array( 'response' => 500 );
    32783269
    3279         $r = wp_parse_args( $args, $defaults );
     3270        $r      = wp_parse_args( $args, $defaults );
     3271        $result = _wp_die_process_input( $message, $r );
    32803272
    32813273        if ( $wp_xmlrpc_server ) {
    3282                 $error = new IXR_Error( $r['response'], $message );
     3274                $error = new IXR_Error( $result['data']['status'], $result['message'] );
    32833275                $wp_xmlrpc_server->output( $error->getXml() );
    32843276        }
    32853277        die();
     
    33033295        );
    33043296        $r        = wp_parse_args( $args, $defaults );
    33053297
    3306         if ( ! headers_sent() && null !== $r['response'] ) {
    3307                 status_header( $r['response'] );
     3298        $result = _wp_die_process_input( $message, $r );
     3299
     3300        if ( ! headers_sent() && null !== $result['data']['status'] ) {
     3301                status_header( $result['data']['status'] );
     3302                nocache_headers();
    33083303        }
    33093304
    3310         if ( is_scalar( $message ) ) {
    3311                 die( (string) $message );
     3305        if ( is_scalar( $result['message'] ) ) {
     3306                die( (string) $result['message'] );
    33123307        }
    33133308        die( '0' );
    33143309}
     
    33303325        die();
    33313326}
    33323327
     3328/**
     3329 * Helper function to process input from wp_die requests and format them into a usable array.
     3330 *
     3331 * @since 5.1.0
     3332 * @access private
     3333 *
     3334 * @param $message
     3335 * @param array $args
     3336 *
     3337 * @return array $results
     3338 */
     3339function _wp_die_process_input( $message = '', array $args = array() ) {
     3340
     3341        $defaults = array( 'response' => 500, 'code' => 'wp_die', );
     3342        $args = wp_parse_args( $args, $defaults );
     3343        $data = array(
     3344                'code'    => $args['code'],
     3345                'message' => '',
     3346                'data'    =>
     3347                        array(
     3348                                'status' => $args['response']
     3349                        ),
     3350        );
     3351
     3352        if ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) {
     3353                $errors = array();
     3354                foreach ( (array) $message->errors as $code => $messages ) {
     3355                        foreach ( (array) $messages as $display_message ) {
     3356                                $errors[] = array(
     3357                                        'code'    => $code,
     3358                                        'message' => $display_message,
     3359                                        'data'    => $message->get_error_data( $code ),
     3360                                );
     3361                        }
     3362                }
     3363                if ( $errors ) {
     3364                        $data = $errors[0];
     3365                        if ( count( $errors ) > 1 ) {
     3366                                // Remove the primary error.
     3367                                array_shift( $errors );
     3368                                $data['additional_errors'] = $errors;
     3369                        }
     3370                }
     3371        } else {
     3372                $data ['message'] = $message;
     3373        }
     3374
     3375
     3376        return $data;
     3377}
     3378
    33333379/**
    33343380 * Encode a variable into JSON, with some sanity checks.
    33353381 *