WooCommerce: Как получить пользователя, принадлежащего заказу?

16 мар. 2014 г., 13:31:25
Просмотры: 78.9K
Голосов: 29

Я создаю функцию, которая должна вызываться после завершения заказа в 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

0
Все ответы на вопрос 1
2
41

Из метода __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();
16 мар. 2014 г. 15:08:26
Комментарии

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

Nabil Kadimi Nabil Kadimi
1 янв. 2015 г. 18:00:25

будьте осторожны, когда заказ принадлежит гостю, get_user_id вернет 0

Vincent Guesné Vincent Guesné
24 окт. 2019 г. 20:40:39