Obtenha o menu de navegação do WP a partir da REST API V2

8

Estou tentando obter o menu de navegação da resposta JSON usando o plug-in WP REST API v2 .

Não há extensão de plug-in de menu de navegação para a API REST v2 , mas apenas para V1.

Do códice Tipos de postagem do WordPress , aprendi que o menu de navegação é tratado como um tipo de postagem.

De Rest Doc de API , é assim que recebemos mensagens de um tipo:

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

Eu tentei fazer assim:

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

Recebi erro 403.

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

o servidor entendeu meu pedido, mas se recusou a fornecer os dados.

P: Como posso corrigir isso?

    
por Murhaf Sousli 20.11.2015 / 22:45

4 respostas

6

Existe uma extensão de plug-in de menu de navegação para a API REST v2: enlace

    
por Yan Takushevich 28.01.2016 / 09:27
21

Como eu mesmo não gosto quando a resposta principal é "Instalar plug-in X", aqui está como resolvi o problema:

Os menus não estão disponíveis no WP Rest. Então, o que você precisa fazer é registrar seu próprio endpoint personalizado e, em seguida, basta chamar essa rota do seu aplicativo que precisa dela.

Então você incluiria algo assim (em seu functions.php, plugin, where):

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 o exemplo acima, você acessaria os dados de:

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

Você pode usar o método acima para criar rotas que desejar para obter qualquer tipo de dados que não estejam disponíveis no WP Rest. Também é bom se você precisar processar alguns dados antes de enviá-los ao seu aplicativo.

    
por Liren 24.07.2017 / 23:20
0

Você precisa adicionar 'show_in_rest' => true, ao registrar o tipo de postagem.

Veja detalhes aqui enlace

    
por hkc 20.01.2016 / 23:00
0

Eu não acho que um plugin deva ser usado para esse tipo de tarefa. Também a resposta do hkc não é tão ruim assim, só precisa de mais explicações para fazer isso funcionar com o nav_menu_item post type (aquele usado para menus de navegação wp).

Este tipo de postagem já está registrado e, portanto, precisamos alterá-lo. Isso é feito facilmente conectando-se ao filtro register_post_type_args . Este filtro nos permite alterar os argumentos para um tipo de postagem específico. O código abaixo mostra apenas o tipo% post 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 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 REST Posts padrão para mostrar uma saída semelhante no REST, conforme descrito na resposta de Liren . Embora ao lado disso, ele também faz o que todos os controladores REST do tipo post fazem e, portanto, oferece mais controle e funcionalidade. Considere também isso como uma opção mais estável, uma vez que não entraria em conflito com outras rotas REST e, por último, mas não menos importante, também é mais conveniente trabalhar com elas.

    
por Fleuv 23.11.2018 / 11:09