(Woocommerce) Como fazer o usuário pertencer a um pedido? [fechadas]

23

Estou criando uma função que precisa ser chamada após a conclusão de um pedido no WooCommerce. Para isso, estou usando o gancho * 'woocommerce_order_status_completed' *. Quero verificar se o pedido tem um produto pertencente a uma categoria de produto específica. Se for esse o caso, o usuário será adicionado a um grupo no Wordpress. Para lidar com a lógica do grupo, estou usando a API de outro plug-in. Este método precisa do * group_id * e do * user_id *. A única coisa que sinto falta é obter o * user_id *.

Como posso obter o usuário (em detalhes: o ID) do meu pedido do 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?
    }

}

Detalhes técnicos:

Versão do WordPress: 3.8

Versão WooCommerce: 2.1

Nazeem
fonte

Respostas:

33

No __get()método da WC_Orderclasse, você pode ver que a user_idpropriedade é retirada / armazenada como _customer_userpós-meta para o pedido em questão.

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

Portanto, no seu código, você pode pegar o ID do usuário da seguinte maneira:

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

Presumo que você não permita o check-out de convidados, mas você pode querer algum tipo de fallback, caso não exista um ID do usuário.

Atualização para o WooCommerce 3.0

Desconsidere todos os itens acima. Como apontado nos comentários, existem métodos diretos para obter essas informações. De fato, quase todos os "métodos mágicos" foram removidos e o acesso direto às propriedades do objeto gera avisos do PHP.

$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();
helgatheviking
fonte
7
A WC_Orderclasse WooCommerce vem com a get_user()qual retorna o objeto de usuário ou falsepara convidados e get_user_id()retorna a ID de usuário ou zero para convidados ... Você não precisa mais se preocupar com um retorno de chamada se estiver usando esses.
Nabil Kadimi
1
cuidado quando o pedido pertencente ao convidado em get_user_id retornará 0
Mepps