(Woocommerce) Как получить пользователя, принадлежащего к заказу? [закрыто]

23

Я делаю функцию, которую нужно вызывать после выполнения заказа в WooCommerce. Для этого я использую * 'woocommerce_order_status_completed' * hook. Я хочу проверить, есть ли в заказе товар, относящийся к определенной товарной категории. Если это так, пользователь будет добавлен в группу в Wordpress. Для обработки групповой логики я использую API другого плагина. Этот метод требует * group_id * и * user_id *. Единственное, чего мне не хватает, это получить * user_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

Nazeem
источник

Ответы:

33

Из __get()метода в WC_Orderклассе вы можете видеть, что user_idсвойство берется из / хранится как _customer_userмета-пост для рассматриваемого заказа.

/**
 * __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;
}

Таким образом, в вашем коде вы можете получить идентификатор пользователя следующим образом:

$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();
helgatheviking
источник
7
С WC_Orderклассом WooCommerce, get_user()который возвращает объект пользователя или falseдля гостей, и get_user_id()который возвращает идентификатор пользователя или ноль для гостей ... Вам больше не нужно беспокоиться об обратном вызове, если вы их используете.
Набиль Кадими
1
будьте осторожны, когда порядок, принадлежащий гостю на get_user_id, вернется 0
Винсент Гесне