(WooCommerce) ¿Cómo obtener el usuario perteneciente a un pedido?

16 mar 2014, 13:31:25
Vistas: 78.9K
Votos: 29

Estoy creando una función que necesita ser llamada después de que se complete un pedido en WooCommerce. Para esto estoy usando el hook *'woocommerce_order_status_completed'*. Quiero verificar si el pedido tiene un producto que pertenece a una categoría específica de productos. Si este es el caso, el usuario será añadido a un grupo dentro de WordPress. Para manejar la lógica de grupos, estoy utilizando la API de otro plugin. 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: el id) desde 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('Membresía','product_cat',$product->post);

        if($has_membership_product) {
            break;
        }
    }

    $group = Groups_Group::read_by_name('Miembros ISA');

    if(!group) {
        return; // TODO: Agregar mensaje de error + email?
    }

    $user_id = 0 // TODO: Obtener id de usuario del pedido.

    $user_group = array(
        "user_id" => $user_id,
        "group_id" => $group->group_id
    );

    $result = Groups_User_Group::create($user_group);

    if(!result) {
        return; // TODO: Agregar mensaje de error + email?
    }

}

Detalles técnicos:

Versión de WordPress: 3.8

Versión de WooCommerce: 2.1

0
Todas las respuestas a la pregunta 1
2
41

Desde el método __get() en la clase WC_Order se puede ver que la propiedad user_id se obtiene/almacena como meta dato _customer_user para el pedido en cuestión.

/**
 * Función __get.
 *
 * @access public
 * @param mixed $key
 * @return mixed
 */
public function __get( $key ) {
    // Obtiene valores o valor por defecto si no está establecido
    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;
}

Así que en tu código puedes obtener el ID de usuario así:

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

Supongo que no vas a permitir compra como invitado, pero quizás quieras algún tipo de alternativa en caso de que no haya un ID de usuario.

Actualización para WooCommerce 3.0

Ignora todo lo anterior. Como se señaló en los comentarios, hay métodos directos para obtener esta información. De hecho, casi todos los "métodos mágicos" han sido eliminados y acceder directamente a las propiedades del objeto generará advertencias PHP.

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();
16 mar 2014 15:08:26
Comentarios

La clase WC_Order de WooCommerce incluye get_user() que devuelve el objeto de usuario o false para invitados, y get_user_id() que devuelve el ID de usuario o cero para invitados... Ya no necesitas preocuparte por un callback si estás usando estos métodos.

Nabil Kadimi Nabil Kadimi
1 ene 2015 18:00:25

ten cuidado cuando el pedido pertenece a un invitado, get_user_id devolverá 0

Vincent Guesné Vincent Guesné
24 oct 2019 20:40:39