Nie sądzę, że do takich zadań powinna być używana wtyczka. Również odpowiedź hkc nie jest wcale taka zła, potrzebuje tylko dodatkowych wyjaśnień, aby działała z nav_menu_item
typem postu (tym używanym do menu nawigacji wp).
Ten typ postu jest już zarejestrowany i dlatego musimy go zmienić, łatwo to zrobić, podpinając register_post_type_args
filtr. Ten filtr pozwala nam zmieniać argumenty dla określonego typu postu. Poniższy kod pokazuje tylko ten nav_menu_item
typ postu.
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);
Jak można zauważyć z powyższego kodu, kod robi coś więcej niż tylko pokazywanie typu postu w REST. Zmienia również domyślny kontroler REST Postów, aby wyświetlać nieco podobne dane wyjściowe w REST, jak opisano w odpowiedzi Liren . Chociaż oprócz tego robi to, co robią wszystkie kontrolery REST typu post, a tym samym zapewnia większą kontrolę i funkcjonalność. Weź to również pod uwagę jako bardziej stabilną opcję, ponieważ nie kolidowałoby to z innymi trasami REST, a na koniec jest również wygodniejsze w pracy.