Я не думаю, що плагін слід використовувати для подібних завдань. Також відповідь 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, і останнє, але не менш важливо, це також зручніше працювати.