在满足特定条件后将用户重定向回他们的购物车的一般做法是什么

What is the general practice to redirect users back to their shopping cart after a certain criteria is matched

我正在使用 Wordpress + Buddyboss + Woocommerce + Learndash 构建一个在线课程网站。根据我们的政策,所有用户都必须先完成个人资料才能下订单。我能够使用以下代码实现此目的:

add_action('woocommerce_before_checkout_form',function(){
  if (is_user_logged_in()){
    $user = wp_get_current_user();
    if ( bpprocn_has_incomplete_profile($user->id) ) { //check if profile is completed
      if (wp_redirect(bp_core_get_user_domain( $user->id ) . bp_get_profile_slug() . '/edit/group/2')) exit; //redirect user to profile edit page
    }
  }
});

现在,在用户完成个人资料编辑并点击“保存”后,我需要将他们重定向回他们的购物车。我能够构建一个在呈现“保存配置文件”按钮后触发的自定义操作,并使用此操作在“保存配置文件”按钮旁边显示 link。

add_action('wsk_add_continue_shop_button',function(){
    $user = wp_get_current_user();
    if (WC()->cart->get_cart_contents_count() && !bpprocn_has_incomplete_profile($user->id)) echo '<a class="uk-button" href="/cart">continue shopping</a>';  // if user's cart is not empty and profile is completed, show the "continue shopping" link.
  });

这当然不是最好的解决方案,因为它依赖于用户点击link,如果一些用户忽略了新添加的link,他们的用户体验将会非常糟糕。所以我绝对需要在用户完成他们的个人资料并点击“保存个人资料”后自动将用户重定向回他们的购物车。

我不能简单地在上面的代码中做 wp_redirect(),因为那样会重定向那些已经完成个人资料、购物车中有东西并进入个人资料编辑页面的用户,这意味着这些用户会除非他们清除购物车,否则永远不会看到个人资料编辑页面。

我对 PHP 和 Wordpress 的了解非常有限,所以我需要一些建议。我能想到的一件事是检查 $_POST 是否为空,如果它不为空则可能意味着用户只是提交了他们个人资料的一些更改或新信息,在这些情况下我可以做 wp_redirect.但这种做法靠谱吗?如果用户只想编辑他的个人资料,而他的购物车中有东西,他也会被重定向,这是不需要的。

我能想到的另一个问题是,当我做第一次重定向时(当用户尝试下订单时,如果他们的个人资料不完整,将他们重定向到他们的个人资料编辑页面),有没有办法标记这个用户作为“该用户刚刚尝试下订单并被重定向”,这样他就可以与那些没有尝试下订单并且只想编辑他们的个人资料的用户区分开来?在我看来,这样做我需要利用会话数据,但我对会话操作的了解几乎为零……wordpress 在这方面有什么帮助吗?

也许您可以使用原始的 Wordpress 事件 - profile_update。 它在更新现有用户后直接触发。

add_action( 'profile_update', 'checkUserUpdate', 10, 1 );

函数检查用户更新($user_id){ // 检查您的用户配置文件是否完整以及您的 WC 购物车是否为空并将他重定向到购物车 }

我想到了解决这个问题的方法。似乎有效,但需要更多测试。

add_action('woocommerce_before_checkout_form',function(){
  if (is_user_logged_in()){
    $user = wp_get_current_user();
    if ( bpprocn_has_incomplete_profile($user->id) ) { //check if profile is completed
      if (wp_redirect(bp_core_get_user_domain( $user->id ) . bp_get_profile_slug() . '/edit/group/2?redirected=wsk_checkout')) exit; //redirect user to profile edit page with a GET parameter
    }
  }
});

如果用户在没有完整个人资料的情况下尝试结帐,他们将被重定向到带有 GET 参数的个人资料编辑页面。在此页面上,如果他们完成个人资料并保存更改,将触发“profile_update”操作,个人资料编辑页面将重新加载 HTTP_REFERER,其中包含先前设置的 GET 参数:

add_action('profile_update',function(){
  $user = wp_get_current_user();
  if (WC()->cart->get_cart_contents_count() && !bpprocn_has_incomplete_profile($user->id) && str_contains($_SERVER['HTTP_REFERER'],'wsk_checkout')) { 
      wp_redirect('/checkout');
      exit;
    }
  });

以上代码检查用户的购物车是否不为空,个人资料是否完整,GET 参数是否存在于 HTTP_REFERER,如果是,则将他们重定向回结帐页面。

这样,用户只是尝试更新他们的个人资料并且碰巧在购物车中有东西不会被重定向到结帐页面,因为他们没有 GET 参数。