WooCommerce: Как получить пользователя, принадлежащего заказу?
Я создаю функцию, которая должна вызываться после завершения заказа в 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('Членство','product_cat',$product->post);
if($has_membership_product) {
break;
}
}
$group = Groups_Group::read_by_name('ISA Члены');
if(!group) {
return; // TODO: Добавить сообщение об ошибке + email?
}
$user_id = 0 // TODO: Получить id пользователя из заказа.
$user_group = array(
"user_id" => $user_id,
"group_id" => $group->group_id
);
$result = Groups_User_Group::create($user_group);
if(!result) {
return; // TODO: Добавить сообщение об ошибке + email?
}
}
Технические детали:
Версия WordPress: 3.8
Версия WooCommerce: 2.1

Из метода __get()
в классе WC_Order
видно, что свойство user_id
берется/сохраняется как пост-мета _customer_user
для соответствующего заказа.
/**
* Функция __get.
*
* @access public
* @param mixed $key
* @return mixed
*/
public function __get( $key ) {
// Получаем значения или значение по умолчанию, если не установлено
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;
}
Таким образом, в вашем коде вы можете получить идентификатор пользователя следующим образом:
$order = new WC_Order( $order_id );
$user_id = $order->user_id;
Предполагаю, что вы не собираетесь разрешать оформление заказа без регистрации, но, возможно, вам понадобится какое-то резервное решение на случай отсутствия идентификатора пользователя.
Обновление для WooCommerce 3.0
Проигнорируйте всё вышесказанное. Как указано в комментариях, теперь есть прямые методы для получения этой информации. Фактически, почти все "магические методы" были удалены, и прямое обращение к свойствам объекта вызовет PHP-предупреждения.
$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();

Класс WooCommerce WC_Order
содержит метод get_user()
, который возвращает объект пользователя или false
для гостей, и get_user_id()
, который возвращает ID пользователя или ноль для гостей... Вам больше не нужно беспокоиться о callback, если вы используете эти методы.
