wake-up-neo.net

WP-API v2 Benutzerdefinierte Endpunktantwortformatierung

Ich versuche, einen benutzerdefinierten Endpunkt zu verwenden (um eine zufällige Sortierung zu ermöglichen) und verwende den folgenden Code:

// 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');

Die Antwort, die ich erhalte, stimmt jedoch nicht mit der Antwort überein, die ich von einem Standardaufruf an die API erhalten würde.

Standard:

  

Benutzerdefinierter Endpunkt:

  

Das Problem ist wirklich, dass ich nicht wie im Standard auf die Taxonomie-/ACF-Informationen zugreifen kann. Ich bin nicht besonders gut mit PHP, daher verstehe ich es höchstwahrscheinlich nicht richtig.

Prost.

5
evu

Sie können die API-Methoden REST aufrufen, um Ihre Ausgabe auf dieselbe Weise vorzubereiten wie das Plug-In. Dadurch können auch Plug-Ins in die Ausgabe eingebunden werden, wie Sie das ACF-Plug-In in Ihrem verwendet haben Beispielausgabe.

Die Klasse WP_REST_Posts_Controller enthält die folgende Methode zum Abrufen von Beiträgen

$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 );
}

Sie können also eine neue WP_REST_Posts_Controller-Instanz instanziieren und die Methoden prepare_item_for_response und prepare_response_for_collection für Ihre Daten aufrufen, um sie identisch mit den Standardendpunkten zu formatieren.

Etwas Ähnliches wie das Folgende sollte funktionieren (ungetestet)

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

In der obigen Antwort wurde vergessen, eine neue Array-Variable festzulegen. Sobald Sie hinzufügen, dass es großartig funktioniert.

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;
}

Die Ausgabe sieht genauso aus wie die normale API-Antwort.

1
Myles Hyson