it-swarm.asia

احصل على WP قائمة التنقل من REST API V2

أحاول الحصول على قائمة التنقل من استجابة JSON باستخدام WP REST API v2 plugin.

لا يوجد ملحق إضافي لقائمة التنقل لـ REST API v2 ، ولكن فقط لـ V1.

من codex WordPress Post Types ، علمت أن قائمة التنقل تعامل كنوع منشور.

من Rest API Doc ، هذه هي الطريقة التي نحصل على نشرات من نوع:

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

فهم الخادم طلبي لكنه رفض إعطاء البيانات.

س: كيف يمكنني إصلاح هذا؟

12
Murhaf Sousli

هناك ملحق مكون إضافي لقائمة التنقل لـ REST API v2: https://wordpress.org/plugins/wp-api-menus/

6
Yan Takushevich

نظرًا لأنني لا أحب ذلك بنفسي عندما يكون الجواب العلوي هو "تثبيت المكون الإضافي X" ، فإليك طريقة حلها:

القوائم غير متاحة حاليًا في WP الراحة. إذن ما عليك القيام به هو تسجيل نقطة النهاية المخصصة الخاصة بك ثم قم فقط بالاتصال بهذا المسار من التطبيق الذي يحتاجه.

لذلك عليك تضمين شيء مثل هذا (في وظائفك. php ، البرنامج المساعد ، أينما):

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 الراحة. جيد أيضًا إذا كنت بحاجة إلى معالجة بعض البيانات قبل إرسالها إلى التطبيق الخاص بك.

34
Liren

لا أعتقد أنه يجب استخدام مكون إضافي لهذا النوع من المهام. أيضا إجابة 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. يغير أيضًا وحدة التحكم في النشرات الافتراضية [REST _ لإظهار إخراج مماثل إلى حد ما في REST كما هو موصوف في إجابة لرين . على الرغم من أنه بجانب ذلك ، فإنه يقوم أيضًا بما تفعله كل أنواع النشر REST التحكم وبالتالي يمنحك المزيد من التحكم والوظائف. ضع في اعتبارك أيضًا هذا خيارات أكثر ثباتًا نظرًا لعدم تعارضها مع طرق أخرى [REST وأخيرًا وليس آخرًا ، كما أنها طريقة أكثر ملاءمة للعمل معها.

0
Fleuv

أتفق مع إجابةLirens ، ولكن يجب استدعاء القوائم بمعرف ، وليس سبيكة. أيضا ، ليست هناك حاجة شرطة مائلة قبل مسار القائمة. لذلك يصبح شيء مثل هذا:

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

مثل هذا عملت بالنسبة لي.

0
Sjoerd Oudman

تحتاج إلى إضافة 'show_in_rest' => true, أثناء تسجيل نوع المنشور.

انظر التفاصيل هنا http://v2.wp-api.org/extending/custom-content-types/

0
hkc