(WooCommerce) ¿Cómo obtener el usuario perteneciente a un pedido?
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

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();

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.
