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é.
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);
}
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.