WordPress 的大部分的详情数据都存放在 wp_posts 表中,即使是网站的菜单项也是存放在这个表,然后 theme 注册几个放置菜单的位置,在页面模版中引用特定特定位置处的菜单渲染。这个菜单位置又是存放在 options 表中。
使用插件随机插入菜单数据
<?php
/**
* Plugin Name: Menu Inserter with Tailwind
* Description: 一个带有管理页面的插件,可以插入和删除随机菜单项,同时引入 Tailwind CSS。
* Version: 1.0
* Author: Your Name
*/
// 删除所有菜单项和菜单位置的函数
function miwt_clear_all_menus($menu_locations) {
foreach ($menu_locations as $location => $menu_id) {
// 获取菜单项
$menu_items = wp_get_nav_menu_items($menu_id);
// 删除所有菜单项
if ($menu_items) {
foreach ($menu_items as $item) {
wp_delete_post($item->ID, true);
}
}
// 移除菜单位置
$locations = get_theme_mod('nav_menu_locations');
unset($locations[$location]);
set_theme_mod('nav_menu_locations', $locations);
}
error_log("All menus and locations have been cleared."); // 输出日志
}
// 插入随机菜单项的函数
function miwt_insert_random_menu_items() {
// 获取注册的菜单位置
$registered_menus = get_registered_nav_menus();
error_log("Registered Menus: " . print_r($registered_menus, true)); // 输出所有注册的菜单位置日志
if (empty($registered_menus)) {
error_log("No registered menus found."); // 如果没有注册的菜单,输出日志并退出
return;
}
// 获取第一个注册的菜单位置名称
reset($registered_menus);
$first_menu_location = key($registered_menus);
error_log("First Menu Location: " . $first_menu_location); // 输出第一个菜单位置日志
// 获取当前菜单位置
$menu_locations = get_nav_menu_locations();
// 清理所有菜单和位置
miwt_clear_all_menus($menu_locations);
// 创建并分配新的菜单
$menu_id = wp_create_nav_menu('Primary Menu');
if (is_wp_error($menu_id)) {
error_log("Error creating menu: " . $menu_id->get_error_message()); // 输出创建菜单的错误日志
return;
}
error_log("Created Menu ID: " . $menu_id); // 输出创建的菜单ID日志
$locations = get_theme_mod('nav_menu_locations');
$locations[$first_menu_location] = $menu_id;
set_theme_mod(name: 'nav_menu_locations', $locations);
$item_ids = get_option('miwt_item_ids', []);
for ( $i = 0; $i < 4; $i++ ) {
$title = '随机菜单项 ' . rand(1, 100);
$url = home_url('/random-item-' . rand(1, 100));
$item_id = wp_update_nav_menu_item($menu_id, 0, array(
'menu-item-title' => $title,
'menu-item-url' => $url,
'menu-item-status' => 'publish',
));
if (is_wp_error($item_id)) {
error_log("Error inserting menu item: " . $item_id->get_error_message()); // 输出插入菜单项的错误日志
continue;
}
$item_ids[] = $item_id;
error_log("Inserted Menu Item: Title = $title, URL = $url, ID = $item_id"); // 输出每个菜单项日志
}
// 添加级联菜单项
$parent_title = '级联菜单 ' . rand(1, 100);
$parent_url = home_url('/cascade-menu-' . rand(1, 100));
$parent_id = wp_update_nav_menu_item($menu_id, 0, array(
'menu-item-title' => $parent_title,
'menu-item-url' => $parent_url,
'menu-item-status' => 'publish',
));
if (is_wp_error($parent_id)) {
error_log("Error inserting parent menu item: " . $parent_id->get_error_message()); // 输出插入父菜单项的错误日志
return;
}
$item_ids[] = $parent_id;
error_log("Inserted Parent Menu Item: Title = $parent_title, URL = $parent_url, ID = $parent_id"); // 输出级联菜单项日志
// 添加子菜单项
for ( $j = 0; $j < 3; $j++ ) {
$child_title = '子菜单项 ' . rand(1, 100);
$child_url = home_url('/child-item-' . rand(1, 100));
$child_id = wp_update_nav_menu_item($menu_id, 0, array(
'menu-item-title' => $child_title,
'menu-item-url' => $child_url,
'menu-item-status' => 'publish',
'menu-item-parent-id' => $parent_id,
));
if (is_wp_error($child_id)) {
error_log("Error inserting child menu item: " . $child_id->get_error_message()); // 输出插入子菜单项的错误日志
continue;
}
$item_ids[] = $child_id;
error_log("Inserted Child Menu Item: Title = $child_title, URL = $child_url, ID = $child_id"); // 输出子菜单项日志
}
update_option('miwt_item_ids', $item_ids);
}
// 删除菜单项的函数
function miwt_delete_random_menu_items() {
$item_ids = get_option('miwt_item_ids', []);
foreach ( $item_ids as $item_id ) {
wp_delete_post($item_id, true);
error_log("Deleted Menu Item ID: " . $item_id); // 输出删除的菜单项日志
}
update_option('miwt_item_ids', []);
}
// 创建管理页面
function miwt_add_admin_menu()
{
add_menu_page(
'Menu Inserter Settings',
'Menu Inserter',
'manage_options',
'menu-inserter',
'miwt_settings_page',
'dashicons-admin-generic'
);
}
add_action('admin_menu', 'miwt_add_admin_menu');
// 管理页面内容
function miwt_settings_page()
{
$is_enabled = get_option('miwt_is_enabled', 'off');
if (isset($_POST['miwt_toggle_menu'])) {
$is_enabled = $_POST['miwt_toggle_menu'] === 'on' ? 'on' : 'off';
update_option('miwt_is_enabled', $is_enabled);
if ($is_enabled === 'on') {
miwt_insert_random_menu_items();
echo '<div class="updated"><p>菜单项已插入。</p></div>';
} else {
miwt_delete_random_menu_items();
echo '<div class="updated"><p>菜单项已删除。</p></div>';
}
}
?>
<div class="wrap">
<h1>Menu Inserter Settings</h1>
<form method="post">
<label for="miwt_toggle_menu" class="inline-flex items-center">
<input type="checkbox" name="miwt_toggle_menu" id="miwt_toggle_menu" class="form-checkbox" <?php checked($is_enabled, 'on'); ?>>
<span class="ml-2">启用插入随机菜单项</span>
</label>
<button type="submit" class="ml-4 button button-primary">保存设置</button>
</form>
</div>
<?php
}
// 引入 Tailwind CSS
function miwt_enqueue_admin_scripts($hook)
{
if ($hook != 'toplevel_page_menu-inserter') {
return;
}
wp_enqueue_script('tailwind-css', 'https://unpkg.com/@tailwindcss/browser@4');
}
add_action('admin_enqueue_scripts', 'miwt_enqueue_admin_scripts');
function print_registered_menus() {
$locations = get_registered_nav_menus();
echo '<pre>';
print_r($locations);
echo '</pre>';
}
add_action('admin_notices', 'print_registered_menus');
?>