Obtener el menú de navegación de WP de REST API V2

8

Estoy intentando obtener el menú de navegación de la respuesta JSON utilizando el complemento WP REST API v2 .

No hay una extensión del complemento del menú de navegación para la API REST v2 , pero solo para V1.

Desde el códice Tipos de publicaciones de WordPress , aprendí que el menú de navegación se trata como un tipo de publicación.

De Doc API de descanso , así es como obtenemos publicaciones de un tipo:

GET http://demo.wp-api.org/wp-json/wp/v2/types/<type>

Intenté conseguirlo así:

URL : http://localhost/wptest/wp-json/wp/v2/types/nav_menu_item

Recibí un error 403.

{"code":"rest_cannot_read_type","message":"Cannot view type.","data":{"status":403}}

el servidor entendió mi solicitud pero se negó a proporcionar los datos.

P: ¿Cómo puedo solucionar esto?

    
pregunta Murhaf Sousli 20.11.2015 - 22:45

4 respuestas

6

Hay una extensión del complemento del menú de navegación para la API REST v2: enlace

    
respondido por el Yan Takushevich 28.01.2016 - 09:27
21

Como a mí no me gusta cuando la respuesta principal es "Instalar el complemento X", aquí es cómo lo resolví:

Los menús actualmente no están disponibles en el Resto WP. Entonces, lo que debe hacer es registrar su propio punto final personalizado y luego simplemente llame a esa ruta desde la aplicación que la necesita.

Por lo tanto, incluirías algo como esto (en tus funciones.php, complemento, donde sea):

function get_menu() {
    # Change 'menu' to your own navigation slug.
    return wp_get_nav_menu_items('menu');
}

add_action( 'rest_api_init', function () {
        register_rest_route( 'myroutes', '/menu', array(
        'methods' => 'GET',
        'callback' => 'get_menu',
    ) );
} );

Para el ejemplo anterior, accedería a los datos desde:

http://your-domain.dev/wp-json/myroutes/menu

Puede utilizar el método anterior para crear cualquier ruta que desee para obtener cualquier tipo de datos que no estén disponibles en el Resto WP. También es bueno si necesita procesar algunos datos antes de enviarlos a su aplicación.

    
respondido por el Liren 24.07.2017 - 23:20
0

Debe agregar 'show_in_rest' => true, al registrar el tipo de publicación.

Consulte los detalles aquí enlace

    
respondido por el hkc 20.01.2016 - 23:00
0

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.

    
respondido por el Fleuv 23.11.2018 - 11:09

Lea otras preguntas en las etiquetas