如何实现点击“plaats een opdracht”菜单时按登录状态跳转页面?
嘿,这个需求在WordPress环境下(毕竟你提到了Gravity Forms,大概率是基于WP的)实现起来挺简单的,我给你准备了两种方案,按需选择就行:
方案一:自定义代码实现(灵活可控,推荐)
这种方式不需要额外插件,直接通过代码实现精准控制,分两种思路:
后端PHP替换链接(最安全)
后端直接根据用户登录状态生成正确的菜单链接,避免前端跳转的漏洞:
- 先给你的目标菜单项加个标识:进入WP后台的「外观→菜单」,找到“plaats een opdracht”这个菜单项,勾选右上角的「显示高级选项」,然后在「CSS类」里填个自定义类,比如
opdracht-menu-item。 - 打开主题的
functions.php文件(或者用子主题的functions.php,避免主题更新丢失代码),添加以下代码:
function swap_opdracht_menu_link($menu_items, $args) { // 替换成你实际的菜单位置名称,比如'primary' if ($args->theme_location === 'primary') { foreach ($menu_items as $item) { // 通过CSS类匹配菜单项,也可以用$item->title === 'plaats een opdracht'来匹配标题 if (in_array('opdracht-menu-item', $item->classes)) { if (is_user_logged_in()) { // 替换为你的Gravity Form页面ID,比如123是页面ID $item->url = get_permalink(123); } else { // 用WP默认注册链接,或者替换成你的自定义注册页面URL $item->url = wp_registration_url(); } } } } return $menu_items; } add_filter('wp_nav_menu_objects', 'swap_opdracht_menu_link', 10, 2);
- 保存代码后,切换登录/未登录状态测试一下,菜单链接会自动切换。
前端JS控制跳转(适合快速修改)
如果不想动PHP,也可以用前端JS结合WP的登录状态变量来实现:
- 先在主题的
functions.php里添加代码,把登录状态传给前端:
function pass_user_status_to_frontend() { wp_localize_script('jquery', 'wpSiteData', array( 'isLoggedIn' => is_user_logged_in(), 'formPageUrl' => esc_url(get_permalink(123)), // Gravity Form页面URL 'registerPageUrl' => esc_url(wp_registration_url()) // 注册页面URL )); } add_action('wp_enqueue_scripts', 'pass_user_status_to_frontend');
- 然后在主题的自定义JS文件(或者后台「外观→自定义→额外CSS/JS」里的JS部分)添加:
document.addEventListener('DOMContentLoaded', () => { const opdrachtBtn = document.querySelector('.opdracht-menu-item a'); if (opdrachtBtn) { opdrachtBtn.addEventListener('click', (e) => { if (!wpSiteData.isLoggedIn) { e.preventDefault(); window.location.href = wpSiteData.registerPageUrl; } else { window.location.href = wpSiteData.formPageUrl; } }); } });
方案二:插件实现(适合非技术用户)
如果你不想写代码,可以用WP的条件菜单插件来实现:
- 安装并激活
Conditional Menus或者Menu Item Visibility Control插件; - 先创建两个菜单项:一个链接到Gravity Form页面,另一个链接到注册页面;
- 给第一个菜单项设置「仅登录用户可见」,第二个设置「仅访客可见」;
- 把两个菜单项放到同一个菜单位置,插件会自动根据用户状态显示对应的按钮。
额外提示
如果你的“plaats een opdracht”不是WP默认菜单,而是自定义写的按钮,那直接在输出按钮的地方用PHP判断就行:
<?php if (is_user_logged_in()) : ?> <a href="<?php echo esc_url(get_permalink(123)); ?>" class="your-button-class">plaats een opdracht</a> <?php else : ?> <a href="<?php echo esc_url(wp_registration_url()); ?>" class="your-button-class">plaats een opdracht</a> <?php endif; ?>
记得把代码里的123替换成你实际的Gravity Form页面ID,注册页面如果是自定义的,也替换成对应的URL哦。
内容的提问来源于stack exchange,提问作者Ries
相关产品推荐
相关产品推荐

