(Woocommerce) วิธีรับผู้ใช้ที่อยู่ในคำสั่งซื้อ [ปิด]


23

ฉันกำลังสร้างฟังก์ชั่นซึ่งจำเป็นต้องเรียกใช้หลังจากที่คำสั่งซื้อเสร็จสิ้นภายใน WooCommerce สำหรับสิ่งนี้ฉันใช้ * 'woocommerce_order_status_completed' * hook ฉันต้องการตรวจสอบว่าคำสั่งซื้อมีผลิตภัณฑ์ที่เป็นของหมวดหมู่ผลิตภัณฑ์เฉพาะหรือไม่ หากเป็นกรณีนี้ผู้ใช้จะถูกเพิ่มในกลุ่มภายใน 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('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()ส่งคืนรหัสผู้ใช้หรือศูนย์สำหรับแขก ... คุณไม่จำเป็นต้องกังวลเกี่ยวกับการโทรกลับหากคุณกำลังใช้
Nabil Kadimi

1
ระวังเมื่อคำสั่งซื้อที่เป็นของผู้เข้าพักที่ get_user_id จะส่งคืน 0
Mepps
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.