web-dev-qa-db-fra.com

PHP Erreur fatale: impossible d'utiliser un objet de type WP_REST_Response comme tableau dans wp-includes/api/endpoints/classe-wp-rest-posts-controller-php.php

J'ai ajouté un point de terminaison personnalisé à WordPress comme suit:


add_action( 'rest_api_init', function () {
    register_rest_route( 'menc/v1', '/crosscat/(?P[\w-]+)/(?P[\w-]+)', array(
        'methods' => 'GET',
        'callback' => 'dept_cat_api',
        'args' => array(
            'dept' => array(
                'sanitize_callback' => function($param, $request, $key) {
                    return sanitize_text_field( $param );
                }
            ),
            'cat' => array(
                'sanitize_callback' => function($param, $request, $key) {
                    return sanitize_text_field( $param );
                }
            ),
        ),
    ) );
} );


function dept_cat_api( $data ) {
    $args = array(
        'post_type' => 'post',
        'tax_query' => array(
            'relation' => 'AND',
            array(
                'taxonomy' => 'crosspost',
                'field'    => 'slug',
                'terms'    => array( $data['dept'] ),
            ),
            array(
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => array( $data['cat'] ),
            ),
        ),
    );

    $posts = get_posts( $args );

    if ( empty( $posts ) ) 
        return new WP_Error( 'no_posts', 'Invalid term(s)', array( 'status' => 404 ) );

    $controller = new WP_REST_Posts_Controller('post');
    $response = array();
    foreach ( $posts as $post ) {
        $data    = $controller->prepare_item_for_response( $post, $data );
        $response[] = $controller->prepare_response_for_collection( $data );
    }

    // return results
    return new WP_REST_Response($response, 200);

}

Quelle cerise sélectionne les publications en fonction de l'intersection d'une catégorie et de termes d'une taxonomie personnalisée donnée. Dans mon environnement de développement local, cela renvoie les messages auxquels je m'attendais ou la réponse 404 où il le devrait. Sur la production, il renvoie une erreur de 500 http et le journal des erreurs signale une

Erreur irrécupérable PHP: impossible d'utiliser l'objet de type WP_REST_Response comme tableau dans /wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php à la ligne 1554

Je ne sais pas s'il s'agit d'un problème de serveur ou s'il y a une erreur que je ne peux pas voir. Une fonction similaire qui fait la même chose, avec des balises au lieu de catégories, fonctionne très bien.

1
jshwlkr

Personne n'a signalé que j'utilisais mal '$ data'.

function dept_cat_api( $request ) {
$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'crosspost',
            'field'    => 'slug',
            'terms'    => array( $request['dept'] ),
        ),
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => array( $request['cat'] ),
        ),
    ),
);

$posts = get_posts( $args );

if ( empty( $posts ) ) return new WP_Error( 'no_posts', 'Invalid term(s)', array( 'status' => 404 ) );

$controller = new WP_REST_Posts_Controller('post');

foreach ( $posts as $post ) {
    $response = $controller->prepare_item_for_response( $post, $request );
    $data[] = $controller->prepare_response_for_collection( $response );
}

// return results
return new WP_REST_Response($data, 200);

}
2
jshwlkr