REST API V2'den WP Navigasyon Menüsünü Alın


14

WP REST API v2 eklentisini kullanarak JSON yanıtından gezinme menüsünü almaya çalışıyorum .

REST API v2 için navigasyon menüsü eklentisi uzantısı yok , sadece V1 için.

Kodeks WordPress Yazı Türleri'nden , gezinme menüsünün bir yazı türü olarak ele alındığını öğrendim.

Gönderen istirahat API Doc , bu bizim bir tür mesajları almak nasıl:

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

Ben böyle almaya çalıştı:

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

403 hatası aldım.

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

sunucu isteğimi anladı ama veriyi vermeyi reddetti.

S: Bunu nasıl düzeltebilirim?


Tüm bu cevaplar sadece korkunç. Bunu yükleyin, uzatın. Zaten yerleşik olmalı, topluluk GitHub'da bir sorun açmalıdır.
SacWebDeveloper

Yanıtlar:



49

En iyi cevap "X eklentisini yükle" olduğunda kendimi sevmediğim için, şu şekilde çözdüm:

Menüler şu anda WP Rest'de mevcut değildir. Yapmanız gereken , kendi özel uç noktanızı kaydettirmek ve ardından uygulamanızdan ihtiyacı olan rotayı çağırmaktır.

Yani böyle bir şey eklersiniz (işlevlerinize.php, plugin, her yerde):

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

Yukarıdaki örnek için verilere şu adresten erişebilirsiniz:

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

WP Rest'de bulunmayan herhangi bir veri türünü almak için istediğiniz rotaları oluşturmak için yukarıdaki yöntemi kullanabilirsiniz. Uygulamanıza göndermeden önce bazı verileri işlemeniz gerekirse de iyi.


4
geçici çözümünüzü bir eklenti bağlantısından daha fazlası ile paylaştığınız için teşekkür ederiz ;-) get_menu()Oldukça genel olduğu gibi , olası ad çakışmasını önlemek için işlev adlarınızı öneklemek veya ad alanını kullanmak daha iyi olurdu .
birgire

Harika, insanlar çoğu insanın zaten yüklü 30 ila 70 eklentisi olduğunu fark etmiyor. Başkalarını devre dışı bırakacak eklentileri bile var! çılgınca. Ben bu konu tutmak için bir eklenti yükleyeceğim düşünüyorum.
Ignacio Bustos

sadece çıktıfalse
moesphemie

1

@ Liren cevap iyi çalışıyor. Ancak az sayıda yeni başlayan kişi rotayı ayarlayamayabilir. İşte minimum değişiklik ile WordPress Rest API v2 ile iyi çalışan kod .

Menü adınızı yalnızca wp_get_nav_menu_items () işlevinde değiştirin. Menü adı ve bilgi işe yaramazsa (Yanlış döndür), Menü Kimliğini kullanın (bu Menüyü düzenlerken Gösterge Tablosunda görünür).

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

Rota URL'si:

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

Öğreticinin diğer ayrıntıları: WordPress Rest API - Gezinme Menüsü Öğelerini Al


Sadece bir rota için iyi bir çözüm
juanitourquiza


0

Bir eklentinin bu tür görevler için kullanılması gerektiğini düşünmüyorum. Ayrıca hkc'nin cevabı aslında o kadar da kötü değil, sadece nav_menu_itemyazı tipi (wp navigasyon menüleri için kullanılan) ile bu işi yapmak için biraz daha açıklamaya ihtiyaç var .

Bu yazı tipi zaten kayıtlı ve bu nedenle değiştirmemiz gerekiyor, bu kolayca register_post_type_argsfiltreye takılarak yapılır . Bu filtre, belirli bir gönderi türü için bağımsız değişkenleri değiştirmemize olanak tanır. Aşağıdaki kod, nav_menu_itemgönderi türü için olanı gösterir .

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);

Yukarıdaki koddan fark etmiş olabileceğiniz gibi, kod sadece REST'teki yazı türünü göstermekten biraz daha fazlasını yapar. Ayrıca, Liren'in cevabında açıklandığı gibi REST'te benzer bir çıktı göstermek için varsayılan Mesajlar REST denetleyicisini değiştirir . Her ne kadar yanında tüm post tipi REST denetleyicilerinin yaptığını yapar ve böylece size daha fazla kontrol ve işlevsellik kazandırır. Ayrıca, diğer REST rotalarıyla çakışmayacağı ve son olarak, aynı zamanda çalışmak için daha uygun olduğu için bunu daha istikrarlı bir seçenek olarak düşünün.


0

@Lirens'in cevabına katılıyorum, ancak menüler sülük tarafından değil, kimlikle çağrılmalıdır. Ayrıca, menü yolundan önce eğik çizgi gerekli değildir. Yani daha çok şuna benzer:

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

Bu şekilde benim için çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.