Make WordPress Core

Changeset 50793


Ignore:
Timestamp:
04/27/2021 06:34:52 PM (2 years ago)
Author:
SergeyBiryukov
Message:

REST API: Check the results of get_metadata() in WP_REST_Meta_Fields methods.

This avoids PHP warnings in case the function returns boolean false instead of an array.

Props david.binda.
Fixes #53099.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php

    r50567 r50793  
    9595                $value = array();
    9696
    97                 foreach ( $all_values as $row ) {
    98                     $value[] = $this->prepare_value_for_response( $row, $request, $args );
     97                if ( is_array( $all_values ) ) {
     98                    foreach ( $all_values as $row ) {
     99                        $value[] = $this->prepare_value_for_response( $row, $request, $args );
     100                    }
    99101                }
    100102            }
     
    281283        $current_values = get_metadata( $meta_type, $object_id, $meta_key, false );
    282284        $subtype        = get_object_subtype( $meta_type, $object_id );
     285
     286        if ( ! is_array( $current_values ) ) {
     287            $current_values = array();
     288        }
    283289
    284290        $to_remove = $current_values;
     
    378384        $subtype   = get_object_subtype( $meta_type, $object_id );
    379385
    380         if ( 1 === count( $old_value ) && $this->is_meta_value_same_as_stored_value( $meta_key, $subtype, $old_value[0], $value ) ) {
     386        if ( is_array( $old_value ) && 1 === count( $old_value )
     387            && $this->is_meta_value_same_as_stored_value( $meta_key, $subtype, $old_value[0], $value )
     388        ) {
    381389            return true;
    382390        }
  • trunk/tests/phpunit/tests/rest-api/rest-term-meta-fields.php

    r49603 r50793  
    12871287
    12881288    /**
     1289     * @ticket 53099
     1290     */
     1291    public function test_get_term_metadata_returning_false_does_not_cause_php_warnings() {
     1292        add_filter( 'get_term_metadata', '__return_false', 11 );
     1293
     1294        // No PHP warning during GET request.
     1295        add_term_meta( self::$category_id, 'test_single', 'testvalue' );
     1296        $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/categories/%d', self::$category_id ) );
     1297        $response = rest_get_server()->dispatch( $request );
     1298
     1299        // No PHP warning during POST request.
     1300        $this->grant_write_permission();
     1301        $data    = array(
     1302            'meta' => array(
     1303                'test_multi' => array( 'val1' ),
     1304            ),
     1305        );
     1306        $request = new WP_REST_Request( 'POST', sprintf( '/wp/v2/categories/%d', self::$category_id ) );
     1307        $request->set_body_params( $data );
     1308        $response = rest_get_server()->dispatch( $request );
     1309
     1310        // No PHP warning during validation.
     1311        register_meta(
     1312            'term',
     1313            'my_meta_key',
     1314            array(
     1315                'show_in_rest' => true,
     1316                'single'       => true,
     1317                'type'         => 'integer',
     1318            )
     1319        );
     1320        $this->grant_write_permission();
     1321        $data    = array(
     1322            'meta' => array(
     1323                'my_meta_key' => '1', // Set to a string.
     1324            ),
     1325        );
     1326        $request = new WP_REST_Request( 'POST', sprintf( '/wp/v2/categories/%d', self::$category_id ) );
     1327        $request->set_body_params( $data );
     1328        $response = rest_get_server()->dispatch( $request );
     1329
     1330        remove_filter( 'get_term_metadata', '__return_false', 11 );
     1331
     1332        $data = $response->get_data();
     1333        $this->assertSame( 0, $data['meta']['my_meta_key'] );
     1334    }
     1335
     1336    /**
    12891337     * Internal function used to disable an insert query which
    12901338     * will trigger a wpdb error for testing purposes.
Note: See TracChangeset for help on using the changeset viewer.