(Woocommerce) Як отримати користувача, який належить до замовлення? [зачинено]


23

Я роблю функцію, яку потрібно викликати після завершення замовлення в WooCommerce. Для цього я використовую гачок * 'woocommerce_order_status_completed' *. Хочу перевірити, чи є у замовлення товар, що належить до певної категорії товару. Якщо це так, користувач буде доданий до групи в 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

Відповіді:


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();

7
WC_OrderКлас WooCommerce, get_user()який повертає об’єкт користувача або falseдля гостей, і get_user_id()який повертає ідентифікатор користувача або нуль для гостей ... Вам більше не потрібно турбуватися про зворотний дзвінок, якщо ви використовуєте ці.
Набіл Кадімі

1
будьте обережні, коли замовлення, яке належить гостю на get_user_id, поверне 0
Vincent Guesné
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.