Tôi không nghĩ rằng một plugin nên được sử dụng cho các loại nhiệm vụ này. Ngoài ra câu trả lời của hkc thực sự không tệ, nó chỉ cần một số giải thích thêm để làm cho công việc này với nav_menu_item
loại bài đăng (loại được sử dụng cho các menu điều hướng wp).
Loại bài đăng này đã được đăng ký và do đó chúng tôi cần thay đổi nó, điều này được thực hiện dễ dàng bằng cách móc vào register_post_type_args
bộ lọc. Bộ lọc này cho phép chúng tôi thay đổi các đối số cho một loại bài đăng cụ thể. Mã dưới đây chỉ hiển thị cho nav_menu_item
loại bài đăng.
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);
Như bạn có thể nhận thấy từ đoạn mã trên, mã thực hiện nhiều hơn một chút so với việc chỉ hiển thị loại bài đăng trong REST. Nó cũng thay đổi trình điều khiển Post REST mặc định để hiển thị đầu ra hơi giống trong REST như được mô tả trong câu trả lời của Liren . Mặc dù bên cạnh đó, nó cũng thực hiện những gì tất cả các bộ điều khiển REST loại bài làm và do đó cung cấp cho bạn nhiều quyền kiểm soát và chức năng hơn. Cũng xem xét điều này như một tùy chọn ổn định hơn vì nó sẽ không xung đột với các tuyến REST khác và cuối cùng nhưng không kém phần quan trọng, nó cũng thuận tiện hơn khi làm việc với.