REST এপিআই ভি 2 থেকে ডাব্লুপি নেভিগেশন মেনু পান


14

আমি ডাব্লুপি REST এপিআই ভি 2 প্লাগইন ব্যবহার করে জেএসএন প্রতিক্রিয়া থেকে নেভিগেশন মেনু পেতে চেষ্টা করছি ।

REST এপিআই v2 এর জন্য কোনও নেভিগেশন মেনু প্লাগইন এক্সটেনশন নেই , তবে কেবল ভি 1 এর জন্য।

কোডেক্স ওয়ার্ডপ্রেস পোস্ট প্রকার থেকে , আমি শিখলাম যে নেভিগেশন মেনুটি একটি পোস্ট ধরণের হিসাবে বিবেচিত হয়।

থেকে REST 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}}

সার্ভারটি আমার অনুরোধটি বুঝতে পেরেছিল তবে এটি ডেটা দিতে অস্বীকৃতি জানায়।

প্রশ্ন: আমি কীভাবে এটি ঠিক করতে পারি?


এই উত্তরগুলির সবগুলিই কেবল ভয়ঙ্কর। এটি ইনস্টল করুন, প্রসারিত করুন। এটি ইতিমধ্যে অন্তর্নির্মিত হওয়া উচিত, সম্প্রদায়ের গিটহাবের উপর একটি সমস্যা খোলা উচিত।
SacWebDeveloper

উত্তর:


6

REST API v2 এর জন্য একটি নেভিগেশন মেনু প্লাগইন এক্সটেনশন রয়েছে: https://wordpress.org/plugins/wp-api-menus/


আমি স্রেফ লিঙ্কটি পরিদর্শন করেছি এবং দেখেছি যে প্লাগইনটি দুর্ভাগ্যক্রমে 3 বছরের জন্য আপডেট করা হয়নি।
ডেভিড গ্যাসকিন

48

যেহেতু আমি নিজেই এটি পছন্দ করি না যখন শীর্ষ উত্তরটি "প্লাগইন এক্স ইনস্টল করুন" হয়, আমি এখানে এটি কীভাবে সমাধান করেছি:

মেনুগুলি বর্তমানে ডাব্লুপি রেস্টে উপলব্ধ নেই। সুতরাং আপনাকে যা করতে হবে তা হ'ল আপনার নিজস্ব কাস্টম এন্ডপয়েন্টটি নিবন্ধভুক্ত করা এবং তারপরে কেবল আপনার অ্যাপ্লিকেশন থেকে সেই রুটটি কল করুন যা এটির প্রয়োজন।

সুতরাং আপনি এর মতো কিছু অন্তর্ভুক্ত করবেন (আপনার ফাংশন.এফপি, প্লাগইনে, যেখানেই হোক):

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

আপনি ডাব্লুপি রেস্টে উপলভ্য নয় এমন কোনও ধরণের ডেটা পেতে আপনার পছন্দ মতো কোনও রুট তৈরি করতে আপনি উপরের পদ্ধতিটি ব্যবহার করতে পারেন। আপনার অ্যাপ্লিকেশনটিতে প্রেরণের আগে যদি আপনাকে কিছু ডেটা প্রক্রিয়া করতে হয় তবে ভাল।


4
আপনার কাজের অংশটি ভাগ করে নেওয়ার জন্য ধন্যবাদ, কেবলমাত্র একটি প্লাগইন লিঙ্কের চেয়ে বেশি ;-) আপনার ফাংশনটির নাম উপস্থাপন করা বা সম্ভাব্য নামের সংঘর্ষ এড়ানোর জন্য নেমস্পেস ব্যবহার করা ভাল, তবে get_menu()বেশ সাধারণ।
বিরগিরে

আশ্চর্যজনক, লোকেরা বুঝতে পারে না যে বেশিরভাগ লোক ইতিমধ্যে 30 থেকে 70 টি প্লাগইন ইনস্টল করেছেন। অন্যদের নিষ্ক্রিয় রাখতে তাদের প্লাগইন রয়েছে! এটা পাগল। আমি মনে করি আমি এই থ্রেডটি রাখতে একটি প্লাগইন ইনস্টল করতে যাচ্ছি।
Ignacio বুস্টোস

এটি কেবল আউটপুট দেয়false
ময়েসফেমি

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

রুট ইউআরএল:

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

টিউটোরিয়াল-এ আরও বিশদে আচ্ছাদিত: ওয়ার্ডপ্রেস রেস্ট এপিআই - নেভিগেশনাল মেনু আইটেম পান


এটির জন্য কেবলমাত্র একটি
রুটই


0

আমি মনে করি না এই ধরণের কাজের জন্য একটি প্লাগইন ব্যবহার করা উচিত। এছাড়াও এইচ সি সি এর উত্তর আসলে তেমন খারাপ নয়, nav_menu_itemপোস্ট টাইপ (ডাব্লুপি নেভিগেশন মেনুগুলির জন্য ব্যবহৃত একটি) দিয়ে এই কাজটি করার জন্য কেবল আরও কিছু ব্যাখ্যা প্রয়োজন ।

এই পোস্টের ধরণটি ইতিমধ্যে নিবন্ধীকৃত রয়েছে এবং সুতরাং আমাদের এটির পরিবর্তন করতে হবে, এটি সহজেই 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 তে কিছুটা অনুরূপ আউটপুট দেখানোর জন্য এটি ডিফল্ট পোস্ট আরএসটি নিয়ন্ত্রণকারীকেও পরিবর্তন করে । যদিও এর পরে এটি সমস্ত পোস্ট টাইপ আরইএসটি নিয়ন্ত্রণকারীরা যা করে তা করে এবং এটি আপনাকে আরও নিয়ন্ত্রণ এবং কার্যকারিতা দেয়। এটিকে আরও স্থিতিশীল বিকল্প হিসাবে বিবেচনা করুন কারণ এটি অন্যান্য আরএসটি রুটের সাথে বিরোধ না করে এবং শেষের দিকে নয় তবে এটি কাজ করার পক্ষে আরও সুবিধাজনক।


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

এটি আমার জন্য কাজ করেছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.