我正在做一个需要在WooCommerce中完成订单后调用的函数。为此,我使用了*'woocommerce_order_status_completed'*挂钩。
我要检查订单中是否有属于特定产品类别的产品。
如果是这种情况,将添加用户到Wordpress中的群组。为了处理组逻辑,我使用了另一个插件的API。此方法需要* group_id *和* user_id *。
我唯一缺少的是获取* user_id *。
如何获取用户(详细信息: id),从我的WooCommerce订单中获取?
代码:
function isa_set_isa_member_group_after_order_completed($order_id) {
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach($items as $item) {
$product = $order->get_product_from_item($item);
$has_membership_product = has_term('Lidmaatschap','product_cat',$product->post);
if($has_membership_product) {
break;
}
}
$group = Groups_Group::read_by_name('ISA Leden');
if(!group) {
return; // TODO: Add error message + email?
}
$user_id = 0 // TODO: Get user id from order.
$user_group = array(
"user_id" => $user_id,
"group_id" => $group->group_id
);
$result = Groups_User_Group::create($user_group);
if(!result) {
return; // TODO: Add error message + email?
}
}
技术细节:
WordPress版本:3.8
WooCommerce版本:2.1
#1 楼
从__get()
类中的WC_Order
方法中,您可以看到user_id
属性是针对该订单取自/存储为_customer_user
post meta的。 /**
* __get function.
*
* @access public
* @param mixed $key
* @return mixed
*/
public function __get( $key ) {
// Get values or default if not set
if ( 'completed_date' == $key ) {
$value = ( $value = get_post_meta( $this->id, '_completed_date', true ) ) ? $value : $this->modified_date;
} elseif ( 'user_id' == $key ) {
$value = ( $value = get_post_meta( $this->id, '_customer_user', true ) ) ? absint( $value ) : '';
} else {
$value = get_post_meta( $this->id, '_' . $key, true );
}
return $value;
}
所以在您的代码中,您可以像这样抓住用户ID: '不会允许访客结帐,但如果没有用户ID,您可能需要某种后备。
WooCommerce 3.0的更新
忽略以上所有内容。正如评论中指出的那样,有直接方法可以获取此信息。实际上,几乎所有“魔术方法”都已被删除,直接访问对象属性将引发PHP警告。
$order = new WC_Order( $order_id );
$user_id = $order->user_id;
评论
WooCommerce WC_Order类随附有get_user()(对于来宾返回用户对象或false)和get_user_id()(对于来宾返回用户id或零)……如果您正在使用这些,则无需担心回调。
– Nabil Kadimi
2015年1月1日16:00
当心属于get_user_id上访客的订单将返回0
– VincentGuesné
19-10-24在17:40