我认为不应将插件用于此类任务。同样,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中显示帖子类型。它还会更改默认的Posts REST控制器,以在REST中显示一些类似的输出,如Liren's answer中所述。尽管除此之外,它还可以完成所有后置类型REST控制器的工作,从而为您提供更多控制和功能。还应将其视为更稳定的选项,因为它不会与其他REST路由冲突,并且最后但并非最不重要的是,它也更方便使用。