WordPress 的菜单设计

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');

?>
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇