Make WordPress Core

Changeset 61252


Ignore:
Timestamp:
11/17/2025 10:56:06 AM (10 months ago)
Author:
jorgefilipecosta
Message:

Fix: Core abilities invalid schemas (has examples and returns empty array intested of object).

This commit fixes two issues with the core abilities schemas we have:

  • They have examples on the schema with is not complient with the version draft-04 of schema JSON we are using.
  • The top level defaults are defined as an empty array and they are of type object, but a php empty array gets JSON serialized and returned in the rest API as [] instead of {}, causing problems on the client validation.

Developed in https://github.com/WordPress/wordpress-develop/pull/10510.

Props jorgefilipecosta, gziolo.
Fixes #64252.

Location:
branches/6.9
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/6.9

  • branches/6.9/src/wp-includes/abilities.php

    r61075 r61252  
    221221                                                'type'        => 'string',
    222222                                                'description' => __( 'The database server vendor and version string reported by the driver.' ),
    223                                                 'examples'    => array( '8.0.34', '10.11.6-MariaDB' ),
    224223                                        ),
    225224                                        'wp_version'     => array(
  • branches/6.9/src/wp-includes/rest-api/endpoints/class-wp-rest-abilities-v1-list-controller.php

    r61047 r61252  
    196196
    197197        /**
     198         * Normalizes schema empty object defaults.
     199         *
     200         * Converts empty array defaults to objects when the schema type is 'object'
     201         * to ensure proper JSON serialization as {} instead of [].
     202         *
     203         * @since 6.9.0
     204         *
     205         * @param array<string, mixed> $schema The schema array.
     206         * @return array<string, mixed> The normalized schema.
     207         */
     208        private function normalize_schema_empty_object_defaults( array $schema ): array {
     209                if ( isset( $schema['type'] ) && 'object' === $schema['type'] && isset( $schema['default'] ) ) {
     210                        $default = $schema['default'];
     211                        if ( is_array( $default ) && empty( $default ) ) {
     212                                $schema['default'] = (object) $default;
     213                        }
     214                }
     215                return $schema;
     216        }
     217
     218        /**
    198219         * Prepares an ability for response.
    199220         *
     
    210231                        'description'   => $ability->get_description(),
    211232                        'category'      => $ability->get_category(),
    212                         'input_schema'  => $ability->get_input_schema(),
    213                         'output_schema' => $ability->get_output_schema(),
     233                        'input_schema'  => $this->normalize_schema_empty_object_defaults( $ability->get_input_schema() ),
     234                        'output_schema' => $this->normalize_schema_empty_object_defaults( $ability->get_output_schema() ),
    214235                        'meta'          => $ability->get_meta(),
    215236                );
Note: See TracChangeset for help on using the changeset viewer.