Je ne pense pas qu'un plugin devrait être utilisé pour ce genre de tâches. De plus, la réponse de hkc n'est pas si mauvaise, il n'a besoin que de plus d'explications pour que cela fonctionne avec le nav_menu_item
type de message (celui utilisé pour les menus de navigation wp).
Ce type de message est déjà enregistré et nous devons donc le modifier, cela se fait facilement en se connectant au register_post_type_args
filtre. Ce filtre nous permet de modifier les arguments pour un type de message spécifique. Le code ci-dessous montre juste cela pour le nav_menu_item
type de message.
add_filter('register_post_type_args', function ($args, $post_type) {
if ($post_type == 'nav_menu_item' &&
class_exists('WP_REST_Posts_Controller') &&
!class_exists('WP_REST_NavMenuItem_Controller')) {
class WP_REST_NavMenuItem_Controller extends WP_REST_Posts_Controller {
public function get_items( $request ) {
$args = wp_parse_args($request, [
'order' => 'ASC',
'orderby' => 'menu_order',
]);
$output = [];
if (empty($request['menu'])) {
$menus = get_registered_nav_menus();
foreach ( $menus as $location => $description ) {
$items = wp_get_nav_menu_items($location, $args);
$output = array_merge($output, is_array($items) ? $items : []);
}
} else {
$items = wp_get_nav_menu_items($request['menu'], $args);
$output = array_merge($output, is_array($items) ? $items : []);
}
return rest_ensure_response($output);
}
public function get_collection_params() {
$query_params = parent::get_collection_params();
$query_params['menu'] = [
'description' => __( 'The name or also known as theme_location of the menu' ),
'type' => 'string',
];
return $query_params;
}
}
// Alter the post type arguments
$args['show_in_rest'] = true;
$args['rest_controller_class'] = 'WP_REST_NavMenuItem_Controller';
}
return $args;
}, 10, 2);
Comme vous l'avez peut-être remarqué dans le code ci-dessus, le code fait un peu plus que simplement afficher le type de message dans le REST. Il modifie également le contrôleur REST Posts par défaut pour afficher une sortie quelque peu similaire dans le REST, comme décrit dans la réponse de Liren . Bien qu'à côté de cela, il fait aussi ce que font tous les contrôleurs REST de type post et vous donne ainsi plus de contrôle et de fonctionnalités. Considérez également cela comme une option plus stable car cela n'entrerait pas en conflit avec d'autres routes REST et enfin et surtout, il est également plus pratique de travailler avec.