Woocommerce 如何从模板重定向挂钩中排除 myaccount 的子页面(端点)?

Posted

技术标签:

【中文标题】Woocommerce 如何从模板重定向挂钩中排除 myaccount 的子页面(端点)?【英文标题】:Woocommerce how to exclude the child pages (endpoints) of myaccount from the template redirect hook? 【发布时间】:2022-01-05 05:27:51 【问题描述】:

登录注册表单只能像弹出窗口一样显示,所以我进行了重定向,以避免未登录用户的默认 myaccount 页面。

add_action( 'template_redirect', 'wish_custom_redirect' );
function wish_custom_redirect() 
  global $wp;
  if (!is_user_logged_in() &&  is_page('my-account') ) 
    wp_redirect( '/' );
    exit;
  

要查看他们的帐户页面,用户必须登录或以弹出形式注册。 但是有一个问题 - /my-account/lost-password/, my-account/reset-password/ 是 myaccount 的子端点。他们不必为未登录的用户进行重定向。 我试着那样做


add_action( 'template_redirect', 'wish_custom_redirect' );
function wish_custom_redirect() 
  global $wp;
  if (!is_user_logged_in() &&  is_page('my-account') &&  !is_page('my-account/lost-password/')  ) 
    wp_redirect( '/' );
    exit;
  

但它仍然会重定向。也许这根本不是一个糟糕的解决方案,还有更好的方法吗?或者如何正确重定向?

add_action('wp_logout','auto_redirect_after_logout');

function auto_redirect_after_logout()

  wp_redirect( home_url() );
  exit();

仅在注销时重定向会有所帮助,但不会避免用户看到默认页面。他们可以注销,然后返回上一页 /myaccount,然后查看默认注册表单。

【问题讨论】:

【参考方案1】:

有多种方法可以做到这一点,您可以使用is_wc_endpoint_url 函数,也可以使用global $wp 及其属性request

既然你已经尝试过global $wp,那我就用同样的方法。

你的代码应该是这样的:

add_action( 'template_redirect', 'wish_custom_redirect' );

function wish_custom_redirect() 
  global $wp;

  if (
        !is_user_logged_in() 
        &&
        ('my-account' == $wp->request)
        &&
        ('lost-password' != $wp->request)
     ) 
  
    wp_safe_redirect( site_url() );
    exit;
  


它已经在 woocommerce 5.7 上进行了测试并且工作正常。


相关帖子:

用于在my-account 页面上重定向自定义端点:

https://***.com/a/70395951/15040627

【讨论】:

以上是关于Woocommerce 如何从模板重定向挂钩中排除 myaccount 的子页面(端点)?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 woocommerce 自定义支付网关中的 process_payment 函数执行 POST 重定向?

WooCommerce 操作挂钩和覆盖模板

成功付款后 woocommerce_thankyou 挂钩不起作用

从 Paypal 重定向回来后,Wordpress + WooCommerce 中的会话不一致

wordpress url 重定向挂钩 | PHP |

从国家重定向中排除 IP 地址