(Woocommerce) ¿Cómo conseguir que el usuario pertenezca a un pedido? [cerrado]

23

Estoy haciendo una función que debe llamarse después de que se complete un pedido dentro de WooCommerce. Para esto estoy usando el gancho * 'woocommerce_order_status_completed' *. Quiero verificar si el pedido tiene un producto que pertenece a una categoría de producto específica. Si este es el caso, el usuario se agregará a un grupo dentro de Wordpress. Para manejar la lógica de grupo, estoy haciendo uso de la API de otro complemento. Este método necesita el * group_id * y el * user_id *. Lo único que me falta es obtener el * user_id *.

¿Cómo puedo obtener el usuario (en detalle: la identificación) de mi pedido de WooCommerce?

código:

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

}

Detalles técnicos:

Versión de WordPress: 3.8

Versión de WooCommerce: 2.1

Nazeem
fuente

Respuestas:

33

Desde el __get()método en la WC_Orderclase, puede ver que la user_idpropiedad se toma / almacena como _customer_usermeta meta para el pedido en cuestión.

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

Entonces, en su código, puede obtener la identificación de usuario de esta manera:

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

Supongo que no va a permitir el pago de invitados, pero es posible que desee algún tipo de reserva en caso de que no haya una identificación de usuario.

Actualización para WooCommerce 3.0

Haga caso omiso de todo lo anterior. Como se señaló en los comentarios, existen métodos directos para obtener esta información. De hecho, casi todos los "métodos mágicos" se han eliminado y el acceso directo a las propiedades del objeto arrojará advertencias de PHP.

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();
helgatheviking
fuente
77
WC_OrderViene con la clase WooCommerce get_user()que devuelve el objeto de usuario o falsepara invitados y get_user_id()que devuelve la identificación de usuario o cero para invitados ... Ya no necesita preocuparse por una devolución de llamada si los está utilizando.
Nabil Kadimi
1
tenga cuidado cuando el pedido que pertenece al invitado en get_user_id devolverá 0
Vincent Guesné