web-dev-qa-db-fra.com

WP-API v2 Formatage de réponse personnalisé aux points de terminaison

J'essaie d'utiliser un point de terminaison personnalisé (essentiellement pour faire fonctionner un tri aléatoire) et j'utilise le code suivant:

// Custom WP API endpoint
function theme_enable_random_api() {

    // create json-api endpoint

    add_action('rest_api_init', function () {

        // http://example.com/wp-json/random/v2/posts

        register_rest_route('random/v2', '/random', array (
            'methods'             => 'GET',
            'callback'            => 'wp_json_offers_v2__posts',
            'permission_callback' => function (WP_REST_Request $request) {
                return true;
            }
        ));
    });

    // handle the request

    function wp_json_offers_v2__posts($request) {
        // json-api params

        $parameters = $request->get_query_params();

        // default search args

        $args = array(
            'post_type'     => $parameters['type'],
            'numberposts'   => 9,
            'offset'        => $parameters['offset'],
            'post_not_in'       => $parameters['exclude'],
            'orderby'       => 'Rand',
        );

        // run query

        $posts = get_posts($args);

        // return results
        return new WP_REST_Response($posts, 200);
    }

}

add_action('init', 'theme_enable_random_api');

Cependant, la réponse que je reçois n'est pas la même que celle que je recevrais d'un appel standard à l'API.

La norme:

  

Endpoint personnalisé:

  

Le problème est que je ne peux pas accéder aux informations de taxonomie/acf comme dans la version standard. Je ne suis pas génial avec PHP donc je ne l’aurai probablement pas bien compris.

À votre santé.

5
evu

Vous pouvez appeler les méthodes de l'API REST pour préparer votre sortie de la même manière que le plugin par défaut. Cela permettra également à tous les plugins de se lier à la sortie puisque vous avez utilisé le plugin ACF, comme indiqué dans votre exemple de sortie.

La classe WP_REST_Posts_Controller a les éléments suivants dans sa méthode get posts

$posts_query = new WP_Query();
$query_result = $posts_query->query( $query_args );

$posts = array();
foreach ( $query_result as $post ) {
    if ( ! $this->check_read_permission( $post ) ) {
        continue;
    }

    $data = $this->prepare_item_for_response( $post, $request );
    $posts[] = $this->prepare_response_for_collection( $data );
}

Vous pouvez donc instancier une nouvelle instance WP_REST_Posts_Controller et appeler les méthodes prepare_item_for_response et prepare_response_for_collection de vos données pour la formater de manière identique aux points d'extrémité par défaut.

Quelque chose comme ce qui suit devrait fonctionner (non testé)

function wp_json_offers_v2__posts($request) {
    // json-api params

    $parameters = $request->get_query_params();

    // default search args

    $args = array(
        'post_type'     => $parameters['type'],
        'numberposts'   => 9,
        'offset'        => $parameters['offset'],
        'post_not_in'       => $parameters['exclude'],
        'orderby'       => 'Rand',
    );

    // run query

    $posts = get_posts($args);

    $controller = new WP_REST_Posts_Controller($parameters['type']);

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

    // return results
    return new WP_REST_Response($posts, 200);
}
6
Chris Morris

La réponse ci-dessus a oublié de définir une nouvelle variable de tableau. Une fois que vous ajoutez que cela fonctionne très bien.

function get_all_posts($request)
{
    $posts = get_posts([
        'posts_per_page' => -1,
        'post_status' => 'publish'
    ]);

    $controller = new WP_REST_Posts_Controller('post');

    $array = [];

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

    return $array;
}

La sortie ressemble à la réponse normale de l'API.

1
Myles Hyson