
本教程旨在解决woocommerce中,为未登录用户重定向`my-account`主页时,如何避免同时重定向`lost-password`等子端点的问题。我们将介绍使用`template_redirect`钩子结合`global $wp->request`来精确控制重定向逻辑,确保用户仍能访问必要的账户恢复页面,同时强制未登录用户从主账户页跳转,从而优化用户体验并实现自定义登录流程。
在许多自定义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()函数无法准确识别它们。
为了精确控制重定向逻辑,我们需要一种方法来识别当前请求的具体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; // 终止脚本执行
  }
}global $wp;: 这一行声明我们将使用WordPress的全局$wp对象。这个对象包含了当前请求的各种信息,其中$wp->request是关键。
!is_user_logged_in(): 这是一个标准的WordPress函数,用于判断当前用户是否已登录。只有未登录用户才需要进行重定向判断。
('my-account' == $wp->request): 这是核心判断之一。它检查当前请求的路径是否精确地匹配my-account。这意味着它只针对my-account主页生效,而不是像/my-account/orders/或/my-account/edit-account/这样的子端点。
('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的直接子路径时不会被误重定向。
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主页的重定向,上述简洁的代码已经足够。
wp_safe_redirect( site_url() );: 推荐使用wp_safe_redirect()代替wp_redirect()。wp_safe_redirect()在执行重定向前会进行安全检查,防止开放重定向漏洞。site_url()获取WordPress网站的根URL。
exit;: 在执行重定向后,务必调用exit;来终止脚本的进一步执行,防止出现意外行为或内容输出。
// 另一种实现方式,使用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()可以非常灵活地控制重定向。
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中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号