Eu não acho que um plugin deva ser usado para esse tipo de tarefa. Além disso, a resposta do hkc não é tão ruim assim, é necessária apenas mais explicações para fazer esse trabalho funcionar com o nav_menu_item
tipo de post (o usado para os menus de navegação wp).
Esse tipo de post já está registrado e, portanto, precisamos alterá-lo, isso é facilmente feito conectando-o ao register_post_type_args
filtro. Esse filtro nos permite alterar os argumentos para um tipo de postagem específico. O código abaixo mostra exatamente isso para o nav_menu_item
tipo de postagem.
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);
Como você deve ter notado no código acima, o código faz um pouco mais do que apenas mostrar o tipo de postagem no REST. Ele também altera o controlador Posts REST padrão para mostrar uma saída um pouco semelhante no REST, conforme descrito na resposta de Liren . Embora próximo disso, ele também faça o que todos os controladores REST do tipo pós fazem e, portanto, oferece mais controle e funcionalidade. Considere também isso como uma opção mais estável, pois não entraria em conflito com outras rotas REST e, por último, mas não menos importante, também é muito mais conveniente trabalhar.