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

20

Estoy creando una función que debe llamarse después de completar 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 del grupo, estoy haciendo uso de 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 al usuario (en detalle: la ID) 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

    
pregunta Nazeem 16.03.2014 - 12:31

1 respuesta

30

Desde el método __get() en la clase WC_Order puede ver que la propiedad user_id se toma / almacena como _customer_user post 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;
}

Por lo tanto, en tu código puedes capturar el ID de usuario así:

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

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

Actualización para WooCommerce 3.0

Ignora 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 de los objetos arrojará advertencias de PHP.

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();
    
respondido por el helgatheviking 16.03.2014 - 14:08

Lea otras preguntas en las etiquetas