Ich denke nicht, dass ein Plugin für diese Art von Aufgaben verwendet werden sollte. Auch die Antwort von hkc ist eigentlich nicht so schlecht, es bedarf nur einiger weiterer Erklärungen, damit dies mit dem nav_menu_item
Beitragstyp (der für WP-Navigationsmenüs verwendet wird) funktioniert .
Dieser Beitragstyp ist bereits registriert und daher müssen wir ihn ändern. Dies erfolgt einfach durch Einhängen in den register_post_type_args
Filter. Mit diesem Filter können wir die Argumente für einen bestimmten Beitragstyp ändern. Der folgende Code zeigt genau das für den nav_menu_item
Beitragstyp.
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);
Wie Sie vielleicht anhand des obigen Codes bemerkt haben, zeigt der Code nicht nur den Beitragstyp im REST an. Außerdem wird der Standard-REST-Controller "Posts" so geändert, dass im REST eine ähnliche Ausgabe angezeigt wird, wie in der Antwort von Liren beschrieben . Daneben werden jedoch auch die Funktionen aller REST-Post-Controller ausgeführt, wodurch Sie mehr Kontrolle und Funktionalität erhalten. Betrachten Sie dies auch als stabilere Option, da sie nicht mit anderen REST-Routen in Konflikt gerät und nicht zuletzt auch komfortabler zu bearbeiten ist.