fix: add createMenuItem, deleteMenuItem, reorderMenuItems, getMenuItems; fix updateMenuItem returning menu:null

This commit is contained in:
2026-06-02 11:31:08 +00:00
parent f90c890865
commit d4989c958a
+58 -8
View File
@@ -3,22 +3,72 @@ namespace AskTamMCP\Tools;
defined('ABSPATH') || exit; defined('ABSPATH') || exit;
class MenuTools { class MenuTools {
public static function listMenus(array $args): array { public static function listMenus(array $args): array {
$menus = wp_get_nav_menus(); $menus = wp_get_nav_menus();
return ['menus'=>array_map(fn($m)=>['id'=>$m->term_id,'name'=>$m->name,'slug'=>$m->slug,'count'=>$m->count],$menus)]; return ['menus' => array_map(fn($m) => ['id' => $m->term_id, 'name' => $m->name, 'slug' => $m->slug, 'count' => $m->count], $menus)];
} }
public static function getMenu(array $args): array { public static function getMenu(array $args): array {
$items = wp_get_nav_menu_items($args['menu']); $items = wp_get_nav_menu_items($args['menu']);
if (!$items) throw new \RuntimeException("Menu not found or empty: {$args['menu']}"); if ($items === false) throw new \RuntimeException("Menu not found: {$args['menu']}");
return ['items'=>array_map(fn($i)=>['id'=>$i->ID,'title'=>$i->title,'url'=>$i->url,'parent'=>(int)$i->menu_item_parent,'order'=>(int)$i->menu_order,'type'=>$i->type,'object'=>$i->object,'object_id'=>(int)$i->object_id],$items)]; $items = $items ?: [];
return ['items' => array_map(fn($i) => ['id' => $i->ID, 'title' => $i->title, 'url' => $i->url, 'parent' => (int) $i->menu_item_parent, 'order' => (int) $i->menu_order, 'type' => $i->type, 'object' => $i->object, 'object_id' => (int) $i->object_id], $items)];
} }
public static function getMenuItems(array $args): array {
return self::getMenu($args);
}
public static function createMenuItem(array $args): array {
if (empty($args['menu'])) throw new \RuntimeException("menu is required.");
$data = [
'menu-item-title' => $args['title'] ?? '',
'menu-item-url' => $args['url'] ?? '#',
'menu-item-status' => 'publish',
'menu-item-type' => $args['type'] ?? 'custom',
];
if (!empty($args['parent'])) $data['menu-item-parent-id'] = (int) $args['parent'];
if (!empty($args['position'])) $data['menu-item-position'] = (int) $args['position'];
if (!empty($args['object_id'])) {
$data['menu-item-object-id'] = (int) $args['object_id'];
$data['menu-item-object'] = $args['object'] ?? 'page';
$data['menu-item-type'] = $args['type'] ?? 'post_type';
}
$id = wp_update_nav_menu_item($args['menu'], 0, $data);
if (is_wp_error($id)) throw new \RuntimeException($id->get_error_message());
return ['item_id' => $id, 'id' => $id, 'menu' => $args['menu']];
}
public static function updateMenuItem(array $args): array { public static function updateMenuItem(array $args): array {
$data = ['menu-item-title'=>$args['title'],'menu-item-url'=>$args['url'],'menu-item-status'=>'publish']; if (empty($args['menu'])) throw new \RuntimeException("menu is required.");
if (!empty($args['parent'])) $data['menu-item-parent-id'] = (int)$args['parent']; $data = [];
if (!empty($args['position'])) $data['menu-item-position'] = (int)$args['position']; if (isset($args['title'])) $data['menu-item-title'] = $args['title'];
$item_id = !empty($args['item_id']) ? (int)$args['item_id'] : 0; if (isset($args['url'])) $data['menu-item-url'] = $args['url'];
if (isset($args['parent'])) $data['menu-item-parent-id']= (int) $args['parent'];
if (isset($args['position'])) $data['menu-item-position'] = (int) $args['position'];
if (empty($data)) throw new \RuntimeException("No fields to update.");
$data['menu-item-status'] = 'publish';
$item_id = (int) ($args['item_id'] ?? 0);
$id = wp_update_nav_menu_item($args['menu'], $item_id, $data); $id = wp_update_nav_menu_item($args['menu'], $item_id, $data);
if (is_wp_error($id)) throw new \RuntimeException($id->get_error_message()); if (is_wp_error($id)) throw new \RuntimeException($id->get_error_message());
return ['id'=>$id,'menu'=>$args['menu']]; return ['item_id' => $id, 'id' => $id, 'menu' => (int) $args['menu'], 'updated' => true];
}
public static function deleteMenuItem(array $args): array {
$item_id = (int) ($args['item_id'] ?? 0);
if (!$item_id) throw new \RuntimeException("item_id is required.");
$result = wp_delete_post($item_id, true);
if (!$result) throw new \RuntimeException("Failed to delete menu item: {$item_id}");
return ['item_id' => $item_id, 'deleted' => true];
}
public static function reorderMenuItems(array $args): array {
$ids = $args['menu_item_ids'] ?? [];
if (empty($ids)) throw new \RuntimeException("menu_item_ids is required.");
foreach ($ids as $pos => $id) {
wp_update_post(['ID' => (int) $id, 'menu_order' => $pos + 1]);
}
return ['reordered' => true, 'count' => count($ids)];
} }
} }