我认为插件不应该用于此类任务。而且hkc\'s answer 实际上并没有那么糟糕,只需要进一步的解释就可以了nav_menu_item
post类型(用于wp导航菜单的类型)。
这个帖子类型已经注册了,因此我们需要修改它,这可以通过挂接到register_post_type_args
滤器此筛选器允许我们更改特定post类型的参数。下面的代码显示了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);
正如您可能已经从上面的代码中注意到的,代码所做的不仅仅是在其余部分中显示post类型。它还更改了默认Posts REST控制器,以在REST中显示类似的输出,如中所述
Liren\'s answer. 尽管接下来它也做了所有post类型REST控制器所做的事情,因此为您提供了更多的控制和功能。还可以将其视为一个更稳定的选项,因为它不会与其他REST路线冲突,最后但并非最不重要的是,它还可以更方便地使用。