ฉันไม่คิดว่าควรใช้ปลั๊กอินสำหรับงานประเภทนี้ นอกจากนี้คำตอบของ 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 เล็กน้อย นอกจากนี้ยัง alters เริ่มต้นควบคุมโพสต์ REST เพื่อแสดงการส่งออกค่อนข้างคล้ายกันในส่วนที่เหลือตามที่อธิบายไว้ในคำตอบของ Liren แม้ว่าถัดจากนั้นยังทำหน้าที่ควบคุมการโพสต์ประเภท REST ทั้งหมดและทำให้คุณสามารถควบคุมและการทำงานได้มากขึ้น พิจารณาตัวเลือกนี้ว่าเป็นตัวเลือกที่มีความเสถียรมากกว่าเพราะจะไม่ขัดแย้งกับเส้นทาง REST อื่น ๆ และสุดท้าย แต่ไม่ท้ายสุดมันก็สะดวกกว่าที่จะทำงานด้วย