REST API V2 से WP नेविगेशन मेनू प्राप्त करें


14

मैं WP REST API v2 प्लगइन का उपयोग करके JSON प्रतिक्रिया से नेविगेशन मेनू प्राप्त करने का प्रयास कर रहा हूं ।

REST API v2 के लिए कोई नेविगेशन मेनू प्लगइन एक्सटेंशन नहीं है , लेकिन केवल V1 के लिए है।

कोडेक्स वर्डप्रेस पोस्ट प्रकारों से , मैंने सीखा कि नेविगेशन मेनू को पोस्ट प्रकार के रूप में माना जाता है।

से बाकी एपीआई डॉक्टर , यह कैसे हम एक प्रकार के पदों मिलता है:

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}}

सर्वर ने मेरे अनुरोध को समझा लेकिन उसने डेटा देने से इनकार कर दिया।

प्रश्न: मैं इसे कैसे ठीक कर सकता हूं?


इन सभी के जवाब बस भयानक हैं। इसे स्थापित करें, इसे विस्तारित करें। यह पहले से ही निर्मित होना चाहिए, समुदाय को GitHub पर एक मुद्दा खोलना चाहिए।
SacWebDeveloper

जवाबों:



48

चूँकि मुझे यह पसंद नहीं है, जब शीर्ष उत्तर "इंस्टॉल एक्स एक्स" है, यहाँ बताया गया है कि मैंने इसे कैसे हल किया:

वर्तमान में WP Rest में मेनू उपलब्ध नहीं है। तो आपको जो करने की आवश्यकता है वह अपने स्वयं के कस्टम समापन बिंदु को पंजीकृत करना है और फिर अपने आवेदन से उस मार्ग को कॉल करें जिसे इसकी आवश्यकता है।

तो आप कुछ इस तरह से शामिल करेंगे (अपने कार्यों में। पीएचपी, प्लगइन, जहाँ भी):

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 रेस्ट में उपलब्ध नहीं है। यह भी अच्छा है अगर आपको अपने आवेदन पर भेजने से पहले कुछ डेटा को संसाधित करने की आवश्यकता है।


4
अपने वर्कअराउंड को साझा करने के लिए धन्यवाद, केवल एक प्लगइन लिंक के साथ ;-) यह बेहतर होगा कि अपने फ़ंक्शन नामों को प्रीफ़िक्स करें या नाम स्थान का उपयोग करें, संभव नाम टक्कर से बचने के लिए, जैसा get_menu()कि बहुत सामान्य है।
बिरगाइरे

बहुत बढ़िया, लोगों को एहसास नहीं है कि ज्यादातर लोग पहले से ही 30 से 70 प्लगइन्स पहले से ही इंस्टॉल कर चुके हैं। वे भी दूसरों को निष्क्रिय रखने के लिए प्लगइन्स हैं! यह पागल है। मुझे लगता है कि मैं इस धागे को रखने के लिए एक प्लगइन स्थापित करने जा रहा हूं।
इग्नासियो बस्टोस

यह केवल उत्पादन करता हैfalse
moesphemie

1

@ लिरन जवाब अच्छा काम करता है। हालांकि कुछ शुरुआती मार्ग को समायोजित करने में सक्षम नहीं हो सकते हैं। यहां वह कोड है जो न्यूनतम संशोधन के साथ वर्डप्रेस रेस्ट एपीआई v2 के साथ अच्छी तरह से काम करता है

केवल wp_get_nav_menu_items () फ़ंक्शन में अपना मेनू नाम बदलें । यदि मेनू नाम और स्लग काम नहीं करता है (गलत रिटर्न करें), मेनू आईडी का उपयोग करें (उस मेनू को संपादित करते समय डैशबोर्ड में दिखाई देता है)।

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

ट्यूटोरियल में शामिल अधिक विवरण: वर्डप्रेस बाकी एपीआई - नेविगेशनल मेनू आइटम प्राप्त करें


यह केवल एक मार्ग के लिए अच्छा समाधान है
juanitourquiza


0

मुझे नहीं लगता कि इस तरह के कार्यों के लिए एक प्लगइन का उपयोग किया जाना चाहिए। इसके अलावा एचसीसी का जवाब वास्तव में उतना बुरा नहीं है, इसे केवल 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 में पोस्ट प्रकार दिखाने की तुलना में थोड़ा अधिक है। यह डिफ़ॉल्ट पोस्ट REST कंट्रोलर को भी बदल देता है REST में कुछ इसी तरह का आउटपुट दिखाने के लिए जैसा कि लिरन के उत्तर में वर्णित है । यद्यपि इसके बगल में यह भी होता है कि REST कंट्रोलर सभी प्रकार के पोस्ट क्या करते हैं और इस प्रकार आपको अधिक नियंत्रण और कार्यक्षमता प्रदान करते हैं। इसे और अधिक स्थिर विकल्पों के रूप में भी समझें क्योंकि यह अन्य REST मार्गों के साथ संघर्ष नहीं करेगा और अंतिम लेकिन कम से कम, इसके साथ काम करने के लिए अधिक सुविधाजनक भी है।


0

मैं @ उत्तर के साथ सहमत हूं, लेकिन मेनू आईडी द्वारा बुलाया जाना चाहिए, स्लग नहीं। इसके अलावा, मेनू पथ से पहले स्लैश की जरूरत नहीं है। तो यह कुछ इस तरह हो जाता है:

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

इस तरह इसने मेरे लिए काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.