(Woocommerce) Bagaimana cara mendapatkan pengguna milik pesanan? [Tutup]

23

Saya membuat fungsi yang perlu dipanggil setelah pesanan selesai dalam WooCommerce. Untuk ini saya menggunakan hook * * woocommerce_order_status_completed '*. Saya ingin memeriksa apakah pesanan memiliki produk yang termasuk dalam kategori produk tertentu. Jika demikian, pengguna akan ditambahkan ke grup di dalam Wordpress. Untuk menangani logika grup, saya menggunakan API plugin lain. Metode ini membutuhkan * group_id * dan * user_id *. Satu-satunya hal yang saya lewatkan adalah mendapatkan * user_id *.

Bagaimana saya bisa mendapatkan pengguna (secara detail: id), dari Pesanan WooCommerce saya?

kode:

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?
    }

}

Rincian teknis:

Versi WordPress: 3.8

Versi WooCommerce: 2.1

Nazeem
sumber

Jawaban:

33

Dari __get()metode di WC_Orderkelas Anda dapat melihat bahwa user_idproperti diambil dari / disimpan sebagai _customer_userpos meta untuk pesanan yang bersangkutan.

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

Jadi dalam kode Anda, Anda dapat mengambil id pengguna seperti:

$order = new WC_Order( $order_id );
$user_id = $order->user_id;

Saya kira Anda tidak akan mengizinkan checkout tamu, tetapi Anda mungkin ingin beberapa jenis mundur jika tidak ada id pengguna.

Pembaruan untuk WooCommerce 3.0

Abaikan semua hal di atas. Seperti yang ditunjukkan dalam komentar ada metode langsung untuk mendapatkan informasi ini. Bahkan, hampir semua "metode ajaib" telah dihapus dan secara langsung mengakses properti objek akan memberikan peringatan PHP.

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();
helgatheviking
sumber
7
WC_OrderKelas WooCommerce hadir dengan get_user()yang mengembalikan objek pengguna atau falseuntuk tamu dan get_user_id()yang mengembalikan id pengguna atau nol untuk tamu ... Anda tidak perlu lagi khawatir tentang panggilan balik jika Anda menggunakannya.
Nabil Kadimi
1
Waspadalah ketika pesanan milik tamu di get_user_id akan mengembalikan 0
Vincent Guesné