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

花韻仙語
发布: 2025-10-27 09:12:06
原创
923人浏览过

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函数,用于判断当前用户是否已登录。只有未登录用户才需要进行重定向判断。

    降重鸟
    降重鸟

    要想效果好,就用降重鸟。AI改写智能降低AIGC率和重复率。

    降重鸟113
    查看详情 降重鸟
  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重定向:如何正确排除子端点的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号