REST API V2에서 WP 탐색 메뉴 가져 오기


14

WP REST API v2 플러그인을 사용하여 JSON 응답에서 탐색 메뉴를 가져 오려고합니다.

REST API v2에 대한 탐색 메뉴 플러그인 확장은 없지만 V1에만 해당됩니다.

코덱스 WordPress 게시물 유형 에서 탐색 메뉴가 게시물 유형으로 취급된다는 것을 알게되었습니다.

에서 나머지 API를 문서 , 이것은 우리가 유형의 게시물을 얻는 방법이다 :

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

나는 그렇게하려고 노력했다.

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

403 오류가 발생했습니다.

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

서버가 내 요청을 이해했지만 데이터 제공을 거부했습니다.

Q :이 문제를 어떻게 해결할 수 있습니까?


이 모든 대답은 끔찍합니다. 이것을 설치하고 확장하십시오. 이미 내장되어 있어야하며 커뮤니티는 GitHub에서 문제를 열어야합니다.
SacWebDeveloper

답변:



48

최고의 답변이 "Install plugin X"일 때 마음에 들지 않기 때문에 여기에 해결 방법이 있습니다.

현재 WP Rest에서는 메뉴를 사용할 수 없습니다. 따라서 사용자 정의 엔드 포인트를 등록한 다음 필요한 애플리케이션에서 해당 경로를 호출하면됩니다.

그래서 당신은 다음과 같은 것을 포함 할 것입니다 (functions.php, plugin, 어디서나) :

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',
    ) );
} );

위 예제의 경우 다음에서 데이터에 액세스합니다.

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

위 방법을 사용하여 WP Rest에서 사용할 수없는 모든 유형의 데이터를 얻으려는 경로를 만들 수 있습니다. 응용 프로그램으로 보내기 전에 일부 데이터를 처리해야하는 경우에도 좋습니다.


4
플러그인 링크 이상으로 해결 방법을 공유해 주셔서 감사합니다. ;-) get_menu()일반적인 이름처럼 가능한 이름 충돌을 피하기 위해 함수 이름을 접두사하거나 네임 스페이스를 사용하는 것이 좋습니다 .
birgire

놀랍게도 사람들은 대부분의 사람들이 이미 30-70 개의 플러그인이 이미 설치되어 있다는 것을 인식하지 못합니다. 그들은 심지어 다른 사람들을 비활성화시키는 플러그인을 가지고 있습니다! 미쳤다. 이 스레드를 유지하기 위해 플러그인을 설치하려고 생각합니다.
Ignacio Bustos

그것은 단지 출력 false
만한다

1

@Liren 답변이 잘 작동합니다. 그러나 초보자는 거의 경로를 조정할 수 없습니다. 다음은 최소한의 수정 으로 WordPress Rest API v2 에서 잘 작동 하는 코드입니다 .

wp_get_nav_menu_items () 함수 에서만 메뉴 이름을 바꾸십시오 . 메뉴 이름과 슬러그가 작동하지 않으면 (거짓 리턴) 메뉴 ID를 사용하십시오 (해당 메뉴를 편집하는 동안 대시 보드에 표시).

function get_my_menu() {
    // Replace your menu name, slug or ID carefully
    return wp_get_nav_menu_items('Main Navigation');
}

add_action( 'rest_api_init', function () {
    register_rest_route( 'wp/v2', 'menu', array(
        'methods' => 'GET',
        'callback' => 'get_my_menu',
    ) );
} );

경로 URL :

https://website.com/wp-json/wp/v2/menu

자세한 내용은 자습서 : WordPress Rest API – 탐색 메뉴 항목 가져 오기 에서 다룹니다.


그것은 하나 개의 경로가 좋은 해결책이다
juanitourquiza을


0

이런 종류의 작업에는 플러그인을 사용해야한다고 생각하지 않습니다. 또한 hkc의 대답 은 실제로 그렇게 나쁘지는 않습니다. nav_menu_item포스트 유형 (wp 탐색 메뉴에 사용되는) 으로이 작업을 수행하기 위해서는 추가 설명이 필요 합니다.

이 포스트 유형은 이미 등록되어 있으므로 변경해야합니다 register_post_type_args. 필터 에 연결하면 쉽게 수행 할 수 있습니다 . 이 필터를 사용하면 특정 게시물 유형에 대한 인수를 변경할 수 있습니다. 아래 코드는 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);

위의 코드에서 알 수 있듯이 코드는 REST에서 게시물 유형을 표시하는 것보다 조금 더 많은 역할을합니다. 또한 Liren의 답변에 설명 된 것처럼 기본 Posts REST 컨트롤러가 REST에서 다소 유사한 출력을 표시하도록 변경합니다 . 그 외에도 모든 포스트 유형 REST 컨트롤러가 수행하는 작업을 수행하므로 더 많은 제어 및 기능을 제공합니다. 또한 다른 REST 경로와 충돌하지 않으며 적어도 작업하기가 더 편리하므로 더 안정적인 옵션으로 고려하십시오.


0

@Lirens 답변에 동의하지만 메뉴는 슬러그가 아닌 ID로 호출해야합니다. 또한 메뉴 경로 앞의 슬래시가 필요하지 않습니다. 따라서 다음과 같이됩니다.

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

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

이처럼 그것은 나를 위해 일했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.