(Woocommerce) Wie bekommt man den Benutzer, der zu einer Bestellung gehört? [geschlossen]

23

Ich erstelle eine Funktion, die aufgerufen werden muss, nachdem eine Bestellung in WooCommerce abgeschlossen wurde. Hierfür verwende ich den Hook * 'woocommerce_order_status_completed' *. Ich möchte überprüfen, ob die Bestellung ein Produkt einer bestimmten Produktkategorie enthält. In diesem Fall wird der Benutzer zu einer Gruppe in Wordpress hinzugefügt. Um die Gruppenlogik zu handhaben, benutze ich die API eines anderen Plugins. Diese Methode benötigt die * group_id * und die * user_id *. Ich vermisse nur die * user_id *.

Wie kann ich den Benutzer (im Detail: die ID) aus meiner WooCommerce-Bestellung abrufen?

Code:

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

}

Technische Details:

WordPress-Version: 3.8

WooCommerce Version: 2.1

Nazeem
quelle

Antworten:

33

An der __get()Methode in der WC_OrderKlasse können Sie erkennen, dass die user_idEigenschaft _customer_userder betreffenden Bestellung als Post-Meta entnommen / gespeichert wird .

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

So können Sie in Ihrem Code die Benutzer-ID wie folgt abrufen:

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

Ich gehe davon aus, dass Sie das Auschecken von Gästen nicht zulassen, aber Sie möchten möglicherweise eine Art Fallback, falls es keine Benutzer-ID gibt.

Update für WooCommerce 3.0

Ignorieren Sie alle oben genannten Punkte. Wie in den Kommentaren erwähnt, gibt es direkte Methoden, um diese Informationen zu erhalten. Tatsächlich wurden fast alle "magischen Methoden" entfernt und der direkte Zugriff auf Objekteigenschaften löst PHP-Warnungen aus.

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();
helgatheviking
quelle
7
In der WooCommerce- WC_OrderKlasse wird get_user()das Benutzerobjekt oder falsefür Gäste und get_user_id()die Benutzer-ID oder die Null für Gäste zurückgegeben. Sie müssen sich keine Gedanken mehr über einen Rückruf machen, wenn Sie diese verwenden.
Nabil Kadimi
1
Vorsicht, wenn die Bestellung des Gastes auf get_user_id 0
Mepps,