Parser

The Argument_Parser class converts fluent builder objects into the array format WordPress expects. It is the bridge between the builder API and WordPress functions like register_rest_route(), register_post_meta(), and WP_REST_Controller::get_item_schema().

Namespace: PinkCrab\WP_Rest_Schema\Parser\Argument_Parser


Static Methods

Argument_Parser::for_route( Argument ...$arguments ): array

Accepts multiple arguments and returns a merged keyed array suitable for the args parameter of register_rest_route().

use PinkCrab\WP_Rest_Schema\Argument\String_Type;
use PinkCrab\WP_Rest_Schema\Argument\Integer_Type;
use PinkCrab\WP_Rest_Schema\Parser\Argument_Parser;

register_rest_route( 'my/v1', '/search', array(
    'methods'  => 'GET',
    'callback' => 'handle_search',
    'args'     => Argument_Parser::for_route(
        String_Type::field( 'query' )->required()->min_length( 1 ),
        Integer_Type::field( 'page' )->minimum( 1 )->default( 1 ),
        String_Type::field( 'order' )->expected( 'asc', 'desc' )->default( 'desc' )
    ),
) );

Output format:

array(
    'query' => array(
        'type'      => 'string',
        'required'  => true,
        'minLength' => 1,
    ),
    'page' => array(
        'type'    => 'integer',
        'minimum' => 1,
        'default' => 1,
    ),
    'order' => array(
        'type'    => 'string',
        'enum'    => array( 'asc', 'desc' ),
        'default' => 'desc',
    ),
)

Argument_Parser::for_meta_data( Argument $argument ): array

Returns the array format suitable for the schema key inside show_in_rest when using register_post_meta().

register_post_meta( 'post', 'subtitle', array(
    'type'         => 'string',
    'single'       => true,
    'show_in_rest' => array(
        'schema' => Argument_Parser::for_meta_data(
            String_Type::field( 'subtitle' )
                ->max_length( 200 )
                ->description( 'An optional subtitle.' )
        ),
    ),
) );

Output format:

array(
    'type'        => 'string',
    'maxLength'   => 200,
    'description' => 'An optional subtitle.',
)

Argument_Parser::as_array( Argument $argument ): array

Returns a keyed array where the argument’s key is the array key. This is the most common format.

$result = Argument_Parser::as_array(
    String_Type::field( 'name' )->required()
);

Output format:

array(
    'name' => array(
        'type'     => 'string',
        'required' => true,
    ),
)

Argument_Parser::as_single( Argument $argument ): array

Returns just the argument’s properties without the outer key. Used internally by the object and array parsers when building nested schemas.

$result = Argument_Parser::as_single(
    String_Type::field( 'name' )->required()
);

Output format:

array(
    'type'     => 'string',
    'required' => true,
)

Argument_Parser::as_list( Argument $argument ): array

Returns the argument as a flat list (same as as_single()). This is what for_meta_data() calls internally.

$result = Argument_Parser::as_list(
    Integer_Type::field( 'count' )->minimum( 0 )
);

Parsed Schema Keywords

The parser maps builder methods to WordPress schema keywords:

Builder Method Schema Key
type() type
format() format
description() description
name() name
default() default
required() required
readonly() readonly
title() title
expected() enum
context() context
validation() validate_callback
sanitization() sanitize_callback
min_length() minLength
max_length() maxLength
pattern() pattern
minimum() minimum
maximum() maximum
exclusive_minimum() exclusiveMinimum
exclusive_maximum() exclusiveMaximum
multiple_of() multipleOf
*_item() items
min_items() minItems
max_items() maxItems
unique_items() uniqueItems
*_property() properties
additional_properties() additionalProperties
*_pattern_property() patternProperties
min_properties() minProperties
max_properties() maxProperties
any_of() anyOf
one_of() oneOf
all_of() allOf

Which Method to Use

WordPress Context Parser Method
register_rest_route() args Argument_Parser::for_route()
register_post_meta() show_in_rest.schema Argument_Parser::for_meta_data()
WP_REST_Controller::get_item_schema() Use Schema builder instead
Custom / manual usage Argument_Parser::as_array() or as_single()

Examples

Multiple route arguments

$args = Argument_Parser::for_route(
    String_Type::field( 'search' )
        ->required()
        ->min_length( 1 )
        ->sanitization( 'sanitize_text_field' ),
    Integer_Type::field( 'page' )
        ->minimum( 1 )
        ->default( 1 ),
    Integer_Type::field( 'per_page' )
        ->minimum( 1 )
        ->maximum( 100 )
        ->default( 10 ),
    String_Type::field( 'orderby' )
        ->expected( 'date', 'title', 'relevance' )
        ->default( 'relevance' ),
    String_Type::field( 'order' )
        ->expected( 'asc', 'desc' )
        ->default( 'desc' )
);

Object meta data

register_post_meta( 'product', 'dimensions', array(
    'type'         => 'object',
    'single'       => true,
    'show_in_rest' => array(
        'schema' => Argument_Parser::for_meta_data(
            Object_Type::field( 'dimensions' )
                ->number_property( 'width', fn( Number_Type $n ) => $n->minimum( 0 ) )
                ->number_property( 'height', fn( Number_Type $n ) => $n->minimum( 0 ) )
                ->number_property( 'depth', fn( Number_Type $n ) => $n->minimum( 0 ) )
                ->additional_properties( false )
        ),
    ),
) );

Array meta data

register_post_meta( 'post', 'gallery', array(
    'type'         => 'array',
    'single'       => true,
    'show_in_rest' => array(
        'schema' => Argument_Parser::for_meta_data(
            Array_Type::field( 'gallery' )
                ->object_item( function( Object_Type $o ) {
                    return $o
                        ->integer_property( 'id', fn( Integer_Type $i ) => $i->minimum( 1 ) )
                        ->string_property( 'url', fn( String_Type $s ) => $s->format( String_Type::FORMAT_URI ) )
                        ->string_property( 'alt' );
                } )
                ->min_items( 1 )
        ),
    ),
) );

This site uses Just the Docs, a documentation theme for Jekyll.