Woocommerce

Criar cupom no WooCommerce por código: WC_Coupon com validade e limite

Cliente comprou, você quer devolver um cupom único de 10% pra ele voltar, e cadastrar um por um no admin não escala. Dá pra criar cupom no WooCommerce por código com a classe WC_Coupon, disparado no hook de pedido concluído. São umas quinze linhas.

A função no functions.php do tema filho

add_action('woocommerce_order_status_completed', 'rt_cupom_pos_compra');

function rt_cupom_pos_compra($order_id) {
    $order = wc_get_order($order_id);
    if (!$order || $order->get_meta('_rt_cupom')) {
        return;
    }

    $codigo = 'volta' . strtolower(wp_generate_password(6, false, false));

    $cupom = new WC_Coupon();
    $cupom->set_code($codigo);
    $cupom->set_discount_type('percent');
    $cupom->set_amount(10);
    $cupom->set_date_expires(strtotime('+30 days'));
    $cupom->set_usage_limit(1);
    $cupom->set_individual_use(true);
    $cupom->set_email_restrictions([$order->get_billing_email()]);
    $cupom->save();

    $order->update_meta_data('_rt_cupom', $codigo);
    $order->save();
}

Cupom continua sendo post do tipo shop_coupon (o HPOS mudou os pedidos, não os cupons), então o save() já cria o registro e ele vale no carrinho na hora. Guardo o código como meta do pedido pra não gerar dois se o status voltar pra processando e cair em concluído de novo, o que acontece mais do que você imagina.

Três pegadinhas

O código sempre vira minúsculo: o WooCommerce pendura wc_strtolower no filtro woocommerce_coupon_code. Se você gerar em maiúsculas e depois comparar com a string original, vai achar que o cupom sumiu. Já mando minúsculo e paro de sofrer.

A validade é comparada por timestamp cru, no estilo time() maior que a data de expiração. Quando o valor tem só a data, como acontece quando você cadastra pelo admin, o cupom morre à meia-noite que abre aquele dia e recusa durante o dia inteiro. Mandando o retorno de strtotime você fica com hora cheia e evita a reclamação.

E set_email_restrictions trava no e-mail de faturamento. Se o cliente comprar de novo com outro e-mail, o cupom recusa com mensagem genérica e ele te xinga no WhatsApp. Em loja com muito pedido de convidado, prefiro só usage_limit 1 e mando o código por e-mail.

Antes de subir, faça um pedido de um real, marque como concluído e confira em Marketing, Cupons se validade e limite gravaram como você esperava.

Post Recentes

Modifier de produto no Magento 2: campo novo no form sem sobrescrever XML

Como registrar um modifier no pool do formulário de produto do Magento 2 e criar um campo próprio na aba,…

1 dia atrás

Tela branca no WordPress 6.9: como achar o erro com PHP 8.3

Site abrindo em branco sem mensagem nenhuma? Leia o log do PHP-FPM, identifique o plugin que causou o fatal e…

1 dia atrás

DateTimeImmutable modify: por que a data não muda no PHP 8.3

Trocou DateTime por DateTimeImmutable e a data parou de andar? O modify devolve uma cópia nova em vez de alterar…

2 dias atrás

Defer nos scripts do WordPress 6.9 sem plugin, com wp_enqueue_script

Use o parâmetro strategy do wp_enqueue_script para adiar o JavaScript do tema, sem plugin de otimização, e entenda por que…

3 dias atrás

Banner de cookie que bloqueia de verdade: script só carrega depois do aceite

O banner aparece, o visitante não clica em nada e o Analytics já gravou cookie. Veja como segurar o script…

4 dias atrás

Revisar git diff com IA antes do commit: script que lê só o staged

Var_dump esquecido e senha de teste passam batido no commit. Um script PHP que lê o git diff --staged e…

4 dias atrás