我正在使用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
}
}
});
字符串
现在,在用户完成编辑他们的配置文件并点击“保存”后,我需要将他们重定向回他们的购物车。我能够构建一个自定义操作,在呈现“保存配置文件”按钮后触发,并使用此操作在“保存配置文件”按钮旁边显示一个链接。
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.
});
型
这当然不是最好的解决方案,因为它依赖于用户点击链接,如果一些用户忽略了新添加的链接,他们的用户体验将非常糟糕。所以我肯定需要自动重定向用户回到他们的购物车,一旦他们完成他们的个人资料,并点击“保存个人资料”。
我不能简单地在上面的代码中做wp_redirect()
,因为这会重定向那些已经完成个人资料的用户,他们的购物车里有东西,并进入个人资料编辑页面,除非他们清除购物车,否则这些用户永远不会看到个人资料编辑页面。
我的PHP和WordPress的知识是相当有限的,所以我需要一些建议在这里.我能想到的一件事是检查如果$_POST
是空的,如果它不是空的,那么它可能意味着用户只是提交了一些更改或新的信息,在这些情况下,我可以做wp_redirect
.但这种方法可靠吗?如果一个用户只是想编辑他的个人资料,而他的购物车里有东西,他也会被重定向,这是不必要的。
我能想到的另一个问题是,当我进行第一次重定向时(当用户尝试下订单时,如果他们的个人资料不完整,请将他们重定向到他们的个人资料编辑页面),是否有办法将此用户标记为“此用户刚刚尝试下订单并被重定向”,以便将他与那些没有尝试下订单而只是想编辑其个人资料的用户区分开来?在我看来,要做到这一点,我需要挖掘到会话数据,但我有接近零的知识,关于会话操作.有什么wordpress在这方面有帮助吗?
2条答案
按热度按时间wlp8pajw1#
也许你可以使用原始的WordPress事件- profile_update。它会在现有用户更新后直接触发。
字符串
mmvthczy2#
我已经想到了一个解决的办法,看起来很有效,不过还需要更多的测试。
字符串
如果用户尝试在没有完成配置文件的情况下结账,他们将被重定向到带有GET参数的配置文件编辑页面。在此页面上,如果他们完成配置文件并保存更改,则会触发“profile_update”操作,配置文件编辑页面将重新加载包含先前设置的GET参数的
HTTP_REFERER
:型
上面的代码检查用户的购物车是否为空,他的个人资料是否完成,GET参数是否存在于
HTTP_REFERER
中,如果是,则将它们重定向回结帐页面。这样,用户只是试图更新他们的个人资料,并碰巧有一些在购物车不会被重定向到结帐页面,因为他们不会有GET参数。