在收购WooCommerce之后,您如何增加客户能力?

时间:2020-05-26 作者:bucktastic

有人在我孩子的功能文件中购买了产品后,我可以这样做来添加功能吗?请注意,我使用的是s2member和woocommerce,我是一个新手。

add_action( \'cap_added\', \'change_user_cap_with_purchase\', 1 ); 
function change_user_cap_with_purchase ( $order_id ){
            $order = wc_get_order( $order_id );

            foreach( $order->get_items() as $item ) {
                // Product ID
                if ( $item[\'product_id\'] == 999 ) {
                function add_cap_to_role() {
    $customer = get_role(\'customer\');
    $customer->add_cap(\'cst11\');
 }
            }        
}

1 个回复
最合适的回答,由SO网友:Mort 1305 整理而成

首先,您表示要向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 给你更多可能的帮助。