You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress:如何基于JavaScript变量切换加载不同菜单

解决PHP无法识别JS变量实现菜单切换的问题

核心问题在于:PHP是服务器端语言,页面渲染阶段就已执行完毕;JavaScript是客户端语言,在浏览器加载页面后才运行,所以无法直接将JS变量传递给PHP用于初始页面渲染。下面给你几个可行的解决方案:

方案一:纯前端切换(最简便,推荐)

直接用PHP渲染出两个菜单,再通过JS+CSS控制显示/隐藏,不需要服务器端判断。

步骤1:修改PHP代码,给两个菜单添加标识类

<div class="row">
    <?php
    // 渲染桌面菜单,添加desktop-only类
    wp_nav_menu( array( 
        'theme_location' => 'desktop-custom-menu', 
        'container_class' => 'custom-menu-class desktop-only' ) ); 
    ?>
    <?php
    // 渲染移动端菜单,添加mobile-only类
    wp_nav_menu( array( 
        'theme_location' => 'mobile-custom-menu', 
        'container_class' => 'custom-menu-class mobile-only' ) ); 
    ?>
</div>

步骤2:添加CSS默认隐藏逻辑

/* 默认隐藏移动端菜单 */
.mobile-only {
    display: none;
}

/* 屏幕宽度小于992px时,显示移动端菜单,隐藏桌面菜单 */
@media (max-width: 991px) {
    .desktop-only {
        display: none;
    }
    .mobile-only {
        display: block;
    }
}

步骤3:优化JS代码(可选,处理窗口 resize 场景)

如果需要在窗口尺寸变化时实时切换,补充JS监听:

function toggleMenuDisplay() {
    const desktopMenu = document.querySelector('.desktop-only');
    const mobileMenu = document.querySelector('.mobile-only');
    if (window.innerWidth < 992) {
        desktopMenu.style.display = 'none';
        mobileMenu.style.display = 'block';
    } else {
        desktopMenu.style.display = 'block';
        mobileMenu.style.display = 'none';
    }
}

// 页面加载时执行一次
toggleMenuDisplay();
// 监听窗口尺寸变化
window.addEventListener('resize', toggleMenuDisplay);

方案二:通过Cookie传递JS变量给PHP(适合需要服务器端渲染单菜单的场景)

如果必须让PHP只渲染对应菜单,可以通过Cookie将JS的屏幕尺寸标识传递给服务器,页面刷新时PHP读取Cookie值。

步骤1:修改JS代码,将displaySize存入Cookie

function setDisplaySizeCookie() {
    let displaySize = window.innerWidth < 992 ? 'mobile' : 'desktop';
    // 设置Cookie,有效期1天
    document.cookie = `displaySize=${displaySize}; path=/; max-age=86400`;
}

// 页面加载时设置Cookie
setDisplaySizeCookie();
// 窗口变化时更新Cookie
window.addEventListener('resize', setDisplaySizeCookie);

步骤2:修改PHP代码,读取Cookie值并渲染对应菜单

<div class="row">
    <?php
    // 从Cookie获取displaySize,默认设为desktop
    $displaySize = isset($_COOKIE['displaySize']) ? $_COOKIE['displaySize'] : 'desktop';
    
    if ($displaySize === 'desktop') {
        wp_nav_menu( array( 
            'theme_location' => 'desktop-custom-menu', 
            'container_class' => 'custom-menu-class' ) ); 
    } else {
        wp_nav_menu( array( 
            'theme_location' => 'mobile-custom-menu', 
            'container_class' => 'custom-menu-class' ) ); 
    }
    ?>
</div>

注意:首次加载页面时,Cookie还未设置,PHP会默认渲染桌面菜单,JS执行后会设置Cookie,刷新页面后才会匹配正确的菜单。

方案三:利用WordPress内置功能(进阶)

如果你的主题支持,也可以直接使用WordPress的wp_nav_menu配合响应式CSS实现,无需单独写两个菜单。但如果业务需求必须用两个不同的菜单,方案一或二更合适。


内容的提问来源于stack exchange,提问作者Mance Rah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:35:27