首先,您表示要向WordPress站点的用户添加功能。(这与向角色添加功能不同,也不同于向用户添加角色。更多信息is here.) 因为你是新手,我想指出这一点。
第二,代码。我不知道您的订购过程是什么样子的,所以我不能建议您使用什么挂钩。WooCommerce提供了大量entry points 进入其流程。为了便于讨论,假设您希望在站点用户完成订单付款时添加该功能。在这种情况下,当WC_Order->payment_complete()
方法被调用。您可以使用woocommerce_payment_complete 动作挂钩(您已经知道如何使用挂钩)。
add_action(\'woocommerce_payment_complete\', \'bucktastic_adds_cap\');
function bucktastic_adds_cap($order_id) { ... }
此钩子传递
WC_Order 在钩子的回调函数中使用。然后,我们必须使用这个订单号来操纵所讨论的订单。那么,让我们
grab order对象,以便我们可以操纵顺序(您也知道如何操作)。
$order = wc_get_order($order_id);
这可能会回来
FALSE
, 因此,在继续脚本之前,我们必须检查这一点。但是,假设我们得到了order对象。接下来要做的事情是尝试获取客户的WordPress用户。根据
the docs, 我们的WC\\U订单有一个很好的小功能,可以返回我们网站的用户
WP_User, 与订单关联的人员:
$user = $order->get_user();
同样,此函数可以返回
FALSE
, 所以我们必须检查一下。现在我们有了用户对象,我们可以为该用途添加一个功能。(您已经知道如何使用
WP_User->add_cap()
方法,并且您建议要添加
cst11
网站用户的功能。)把这一切放在一起。。。
add_action(\'woocommerce_payment_complete\', \'bucktastic_adds_cap\');
function bucktastic_adds_cap($order_id) {
// Grab the order, but do not continue if the order number is invalid
$order = wc_get_order($order_id);
if($order === FALSE) return;
// Grab the user, but do not continue if no user could be found
$user = $order->get_user();
if($user === FALSE) return;
// Add the capability to bucktastic\'s website user.
$user->add_cap(\'cst11\');
}
我确实有一些问题要问你,因为你的代码表示你正在寻求比你在问题中陈述的更多的帮助。
1)为什么在添加功能之前要迭代所有列表项并检查项目编号?您是否仅在用户购买特定物品时才尝试向其添加功能?
2)为什么要重新定义函数add_cap_to_role()
要在每次迭代订单的某个项目时添加该功能?(这肯定会引发错误。但如果您正在编写PHP,那么您对如何编写代码有了基本的了解,并且已经知道了这一点。)
3)为什么要求自己调用函数来添加功能?(这就是回调函数的用途,您可以在钩子之外的其他地方使用它,因此让另一个函数执行完全相同的操作是不好的编码实践。)
4)如果要向单个用户帐户添加功能,为什么要在每次购买时都试图操纵该角色?(请参阅我的开场白,了解我为什么要问这个问题。)
EDIT: Here\'s a link 给你更多可能的帮助。