WooCommerce my-account重定向:如何正确排除子端点


WooCommerce my-account重定向:如何正确排除子端点

本教程旨在解决woocommerce中,为未登录用户重定向`my-account`主页时,如何避免同时重定向`lost-password`等子端点的问题。我们将介绍使用`template_redirect`钩子结合`global $wp->request`来精确控制重定向逻辑,确保用户仍能访问必要的账户恢复页面,同时强制未登录用户从主账户页跳转,从而优化用户体验并实现自定义登录流程。

理解需求:为何需要重定向my-account页面?

在许多自定义WooCommerce店铺中,开发者可能希望为未登录用户提供一个弹出式的登录/注册表单,而不是让他们直接访问默认的my-account页面。为了实现这一目标,通常会使用template_redirect钩子,在用户未登录且尝试访问my-account页面时,将其重定向到首页或其他指定页面。

最初的实现可能如下所示:

add_action( 'template_redirect', 'wish_custom_redirect' );
function wish_custom_redirect() {
  if (!is_user_logged_in() &&  is_page('my-account') ) {
    wp_redirect( '/' ); // 重定向到首页
    exit;
  }
}

这段代码能够成功地将未登录用户从my-account主页重定向。

遇到的挑战:子端点被误重定向

my-account页面在WooCommerce中拥有多个子端点(Endpoints),例如/my-account/lost-password/(找回密码)、/my-account/reset-password/(重置密码)等。这些子端点对于未登录用户来说至关重要,因为它们提供了账户恢复的途径。然而,如果仅仅依赖is_page('my-account')进行判断,这些子端点也会被视为my-account页面的一部分,从而导致未登录用户无法访问它们,并被错误地重定向。

尝试使用!is_page('my-account/lost-password/')来排除特定子端点通常是无效的,因为WooCommerce的端点并非传统意义上的独立WordPress页面,is_page()函数无法准确识别它们。

解决方案:利用global $wp->request

为了精确控制重定向逻辑,我们需要一种方法来识别当前请求的具体WooCommerce端点。global $wp对象及其request属性提供了当前URL路径的干净版本,这正是我们所需的信息。$wp->request会返回当前URL的路径部分,例如,对于/my-account/lost-password/,$wp->request的值将是my-account/lost-password。对于/my-account/,它将是my-account。

通过检查$wp->request的值,我们可以区分my-account主页和其特定的子端点。

实现代码示例

以下是经过优化和测试的代码,它能够正确地重定向未登录用户,同时允许他们访问lost-password等必要的子端点:

add_action( 'template_redirect', 'wish_custom_redirect' );

function wish_custom_redirect() {
  global $wp; // 获取全局的$wp对象

  // 检查用户是否未登录
  if (
        !is_user_logged_in()
        &&
        // 检查当前请求是否是'my-account'主页
        ('my-account' == $wp->request)
        &&
        // 排除'lost-password'端点,确保其可访问
        ('lost-password' != $wp->request)
     )
  {
    // 执行安全重定向到网站首页
    wp_safe_redirect( site_url() );
    exit; // 终止脚本执行
  }
}

代码解析

  1. global $wp;: 这一行声明我们将使用WordPress的全局$wp对象。这个对象包含了当前请求的各种信息,其中$wp->request是关键。

  2. !is_user_logged_in(): 这是一个标准的WordPress函数,用于判断当前用户是否已登录。只有未登录用户才需要进行重定向判断。

    Claude Claude

    Anthropic发布的与ChatGPT竞争的聊天机器人

    Claude 1166 查看详情 Claude
  3. ('my-account' == $wp->request): 这是核心判断之一。它检查当前请求的路径是否精确地匹配my-account。这意味着它只针对my-account主页生效,而不是像/my-account/orders/或/my-account/edit-account/这样的子端点。

    • 重要提示: 如果你的my-account页面URL结构不是/my-account/,例如是/user-account/,那么你需要将'my-account'替换为你的实际页面slug。
  4. ('lost-password' != $wp->request): 这一条件用于排除特定的子端点。在这里,我们确保当前请求不是lost-password端点。如果用户访问/my-account/lost-password/,$wp->request的值实际上是my-account/lost-password。这个判断语句是为了防止在未来可能扩展的逻辑中,将lost-password作为my-account的一个直接子路径来处理时出现问题。更准确地,我们应该关注$wp->query_vars来判断具体的端点,但在当前场景下,('my-account' == $wp->request)已经排除了所有子端点,所以('lost-password' != $wp->request)是确保如果未来有其他逻辑将lost-password视为my-account的直接子路径时不会被误重定向。

    • 更精确的排除方式(针对其他子端点): 如果你需要排除更多子端点(例如reset-password),并且你的重定向逻辑是针对所有my-account相关页面,那么你需要检查$wp->query_vars。例如:
      global $wp_query;
      $endpoint = isset( $wp_query->query_vars['lost-password'] ) ? 'lost-password' : '';
      // 或者使用WooCommerce提供的函数
      if ( ! is_user_logged_in() && is_account_page() && ! is_wc_endpoint_url( 'lost-password' ) && ! is_wc_endpoint_url( 'reset-password' ) ) {
          wp_safe_redirect( site_url() );
          exit;
      }

      但对于仅针对my-account主页的重定向,上述简洁的代码已经足够。

  5. wp_safe_redirect( site_url() );: 推荐使用wp_safe_redirect()代替wp_redirect()。wp_safe_redirect()在执行重定向前会进行安全检查,防止开放重定向漏洞。site_url()获取WordPress网站的根URL。

  6. exit;: 在执行重定向后,务必调用exit;来终止脚本的进一步执行,防止出现意外行为或内容输出。

注意事项与扩展

  • 测试兼容性: 上述代码已在WooCommerce 5.7版本上测试通过。在部署到生产环境前,请务必在你的开发环境中测试其与当前WordPress和WooCommerce版本的兼容性。
  • 其他子端点: 如果你需要允许访问其他特定的子端点(如reset-password),你可以在if条件中添加类似的排除逻辑,例如&& ('reset-password' != $wp->request)。
  • 使用is_wc_endpoint_url(): 对于更复杂的WooCommerce端点判断,WooCommerce提供了is_wc_endpoint_url()函数,它可以用来检查当前是否是特定的WooCommerce端点。例如,is_wc_endpoint_url('lost-password')会返回真,如果当前页面是找回密码端点。这种方法在处理多个端点时可能更清晰。
    // 另一种实现方式,使用is_wc_endpoint_url()
    add_action( 'template_redirect', 'wish_custom_redirect_v2' );
    function wish_custom_redirect_v2() {
      if (
            !is_user_logged_in()
            && is_account_page() // 确保当前是我的账户页面
            && !is_wc_endpoint_url( 'lost-password' ) // 排除找回密码端点
            && !is_wc_endpoint_url( 'reset-password' ) // 排除重置密码端点
            // 可以继续添加其他需要排除的端点
         )
      {
        wp_safe_redirect( site_url() );
        exit;
      }
    }

    请注意,is_account_page()会检查当前是否是任何my-account相关的页面,包括其子端点。因此,结合!is_wc_endpoint_url()可以非常灵活地控制重定向。

  • 登出后的重定向: 如果你希望用户登出后也重定向到首页,可以单独使用wp_logout钩子:
    add_action('wp_logout','auto_redirect_after_logout');
    function auto_redirect_after_logout(){
      wp_redirect( home_url() );
      exit();
    }

    这与上述防止未登录用户访问my-account页面的逻辑是独立的,两者可以同时使用。

总结

通过利用template_redirect钩子并结合global $wp->request(或更高级的is_wc_endpoint_url()),我们可以精确控制WooCommerce my-account页面的重定向行为。这使得开发者能够为未登录用户提供自定义的登录/注册体验,同时确保账户恢复等关键功能不受影响,从而提升网站的用户友好性和安全性。在实施此类功能时,务必考虑所有可能的子端点,并进行充分的测试。

以上就是WooCommerce my-account重定向:如何正确排除子端点的详细内容,更多请关注其它相关文章!


# 如何正确  # 抚顺专业seo公司价格  # 阳江手机网站优化  # 翠竹网站优化服务  # 外贸网站建设 公司  # 浏览器网站建设北路  # 金丝蓉 Kim Seo-hyeong  # 福清网络seo优化  # 南平网站建设建站  # 河南抖音平台seo推广营销词  # 灌南网站建设报价  # 我们可以  # 找回密码  # word  # 多个  # 自定义  # 首页  # 文档  # 如果你  # 重定向  # red  # 开发环境  # 注册表  # wordpress  # go 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: J*aScript桌面应用_Electron多进程架构实战  抖音网页版地址直接进入_抖音网页版在线观看入口  iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】  《健康大兴》注册方法介绍  Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程  视频号视频怎么免费保存到相册?保存到相册需要注意什么?  如何查询个人病历记录  向往的生活小游戏启动处_向往的生活小游戏立即启动  J*aScript事件处理:优化键盘输入与表单提交的实践指南  search中maxlength属性用法解析  《一起考教师》账号注销方法  VS Code如何设置默认配置  在J*a里什么是行为抽象_抽象行为对代码复用的提升作用  菜鸟驿站的取件码忘了怎么办 手机快速查询指南  OpenWeatherMap API:通过城市名称获取天气预报数据指南  word表格如何按某一列内容进行排序_Word表格按列排序方法  腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法  快手极速版在线体验区 快手极速版网页体验入口  申通快递物流信息查询 申通快递包裹状态追踪  《图怪兽》退出登录方法  海外搜索引擎推广效果怎么样,怎么分析效果!  2025SNH48年度青春盛典门票价格及购买方式  使用Python和NLTK从文本中高效提取名词的实用教程  Yandex世界探索 最新官方免登录入口全知道  Animex动漫社正版在线入口 Animex动漫社动漫官方观看网  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  更换小红书群背景怎么换?小红书群规则怎么设置?  安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法  微信网页版在线登录 微信网页版在线使用入口  Coolpad5890 ROM刷机包  MySQL多重关联查询:利用别名高效获取同一表的多个关联字段  iSpring三分屏制作教程  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  网站体验不好=浪费钱:如何提升-用户体验效果差  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程  mysql怎么查询数据_mysql基础查询语句使用教程  网易云音乐闹钟铃声设置教程  《大周列国志》皇帝律令功能介绍  风神瞳获取全攻略  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南  青橙手机语音助手怎么唤醒_青橙手机语音助手设置与唤醒方法  Excel如何制作月度销售统计图_Excel动态图表制作与控件应用  猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法  《知到》打卡课程方法  Google Drive API 认证:服务账户与OAuth 2.0的选择与实践 

 2025-10-27

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.