Woocommerce

Campo extra no checkout em blocos do WooCommerce sem voltar pro shortcode

Trocou a página de finalizar compra pelo checkout em blocos e o campo de CPF sumiu. O filtro woocommerce_checkout_fields não é lido ali: o bloco é React e só desenha campo registrado pela API de campos adicionais do WooCommerce 9.x.

Registrando no hook certo

O registro tem que acontecer dentro de woocommerce_init, e o id precisa de namespace com barra. Isso vai no plugin do site ou no functions.php do tema filho:

add_action( 'woocommerce_init', function () {
    if ( ! function_exists( 'woocommerce_register_additional_checkout_field' ) ) {
        return;
    }

    woocommerce_register_additional_checkout_field( [
        'id'       => 'rtk-loja/cpf',
        'label'    => 'CPF',
        'location' => 'contact',
        'type'     => 'text',
        'required' => true,
    ] );
} );

O location aceita três valores e cada um muda onde o campo aparece: contact gruda no bloco do e-mail, address se repete em cobrança e entrega, e order abre um bloco de informações extras no fim. Chamado fora do woocommerce_init, ou com id sem barra, o campo não é registrado e a tela não reclama.

Onde o valor foi parar

A pegadinha é essa: o valor não vira uma meta com o nome que você escolheu. O WooCommerce prefixa a chave conforme o location, então procurar por cpf na meta do pedido não acha nada.

// contact e order caem no mesmo grupo
$cpf = $order->get_meta( '_wc_other/rtk-loja/cpf' );

// location address grava um par, cobrança e entrega
$cob = $order->get_meta( '_wc_billing/rtk-loja/cpf' );
$ent = $order->get_meta( '_wc_shipping/rtk-loja/cpf' );

Pedido antigo não ganha o campo retroativamente. Ajuste o template da nota fiscal para tratar meta vazia antes de subir isso em produção.

Se travou nisso e precisa de ajuda, me chama aqui.

Post Recentes

Fuso horário no PHP 8.3: log com 3 horas de diferença no servidor

O pedido entrou às 21h e o relatório mostra 00h do dia seguinte. Onde setar date.timezone no PHP 8.3 e…

1 dia atrás

Magento 2 não envia e-mail de pedido: async sending e cron parado

O pedido entra na loja e o e-mail nunca sai: antes de culpar o SMTP, veja o envio assíncrono, a…

2 dias atrás

cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

O WordPress só oferece hourly, twicedaily, daily e weekly. Use o filtro cron_schedules para criar um intervalo de 5 minutos…

3 dias atrás

E-mails do WooCommerce não chegam: como testar o envio de um pedido real

Dispare pela linha de comando o e-mail de um pedido que já existe na loja e descubra se a falha…

3 dias atrás

CodeIgniter 4 tela branca: CI_ENVIRONMENT e o erro que sumiu

Página em branco no CodeIgniter 4, sem nenhuma mensagem? O ambiente está em production e escondeu o erro. Troque o…

3 dias atrás

Google Consent Mode v2 no WordPress: default denied antes do gtag rodar

O Google Ads acusa consentimento ausente porque o gtag sobe antes do banner. Veja como injetar o default denied do…

5 dias atrás