(Thương mại điện tử) Làm thế nào để người dùng thuộc về một đơn đặt hàng? [đóng cửa]


23

Tôi đang thực hiện một chức năng cần được gọi sau khi đơn hàng được hoàn thành trong WooC Commerce. Đối với điều này, tôi đang sử dụng hook * 'wooc Commerce_order_status_completed' *. Tôi muốn kiểm tra xem đơn đặt hàng có một sản phẩm thuộc danh mục sản phẩm cụ thể không. Nếu đây là trường hợp, người dùng sẽ được thêm vào một nhóm trong Wordpress. Để xử lý logic nhóm, tôi đang sử dụng API của plugin khác. Phương thức này cần * group_id * và * user_id *. Điều duy nhất tôi thiếu là nhận được * user_id *.

Làm cách nào tôi có thể có được người dùng (chi tiết: id), từ Đơn hàng WooC Commerce của tôi?

mã:

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

}

Chi tiết kỹ thuật:

Phiên bản WordPress: 3.8

Phiên bản WooC Commerce: 2.1

Câu trả lời:


33

Từ __get()phương thức trong WC_Orderlớp, bạn có thể thấy rằng thuộc user_idtính được lấy từ / được lưu dưới dạng _customer_usermeta post cho thứ tự được đề cập.

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

Vì vậy, trong mã của bạn, bạn có thể lấy id người dùng như vậy:

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

Tôi cho rằng bạn sẽ không cho phép kiểm tra khách, nhưng bạn có thể muốn một số loại dự phòng trong trường hợp không có id người dùng.

Cập nhật cho WooC Commerce 3.0

Bỏ qua tất cả những điều trên. Như đã chỉ ra trong các ý kiến ​​có các phương pháp trực tiếp để có được thông tin này. Trên thực tế, gần như tất cả các "phương thức ma thuật" đã bị xóa và truy cập trực tiếp vào các thuộc tính đối tượng sẽ đưa ra các cảnh báo PHP.

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();

7
Lớp WooC Commerce WC_Orderđi kèm với lớp get_user()trả về đối tượng người dùng hoặc falsecho khách và get_user_id()trả về id người dùng hoặc số 0 cho khách ... Bạn không còn phải lo lắng về việc gọi lại nếu bạn đang sử dụng chúng.
Nabil Kadimi

1
hãy cẩn thận khi đơn hàng thuộc về khách trên get_user_id sẽ trả về 0
Mepps
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.