No creo que deba usarse un complemento para este tipo de tareas. Además, la respuesta de hkc no es tan mala, solo necesita alguna explicación adicional para que esto funcione con el nav_menu_item
tipo de publicación (la que se usa para los menús de navegación de wp).
Este tipo de publicación ya está registrado y, por lo tanto, debemos modificarlo, esto se hace fácilmente enganchándolo al register_post_type_args
filtro. Este filtro nos permite cambiar los argumentos para un tipo de publicación específico. El siguiente código muestra exactamente eso para el nav_menu_item
tipo de publicación.
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 habrás notado en el código anterior, el código hace un poco más que solo mostrar el tipo de publicación en REST. También altera el controlador REST de publicaciones predeterminado para mostrar una salida algo similar en REST como se describe en la respuesta de Liren . Aunque además de eso, también hace lo que hacen todos los controladores REST de tipo publicación y, por lo tanto, le brinda más control y funcionalidad. También considere esto como una opción más estable ya que no entraría en conflicto con otras rutas REST y, por último, pero no menos importante, también es mucho más conveniente trabajar con él.