No creo que se deba utilizar un complemento para este tipo de tareas. Además, la respuesta de hkc en realidad no es tan mala, solo necesita una explicación adicional para que esto funcione con 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 puede hacer fácilmente conectándolo al filtro register_post_type_args
. Este filtro nos permite cambiar los argumentos para un tipo de publicación específico. El siguiente código muestra solo eso para el tipo de publicación nav_menu_item
.
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 puede haber notado en el código anterior, el código hace un poco más que solo mostrar el tipo de publicación en el REST. También altera el controlador REST de Publicaciones predeterminado para mostrar una salida algo similar en la 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 post 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 también es más conveniente trabajar con él.