FernandoAcosta.Netdocs

Customizar o endereço usado no cálculo de frete

2 min de leituraAtualizado há 5 dias

Antes do WooCommerce calcular o frete, a Calculadora de Frete Otimizada monta um array de endereço com:

  • postcode — o CEP que o cliente digitou.
  • country — sempre BR.
  • state — UF detectada pelo CEP.
  • city — preenchida via ViaCEP (se a opção Identificar cidade automaticamente estiver ligada).

Esse array passa pelo filtro woocommerce_cart_calculate_shipping_address com prioridade 20. Se você quer alterar qualquer campo antes do cálculo — corrigir, sobrescrever, normalizar — esse é o ponto certo.

Quando faz sentido usar

  • Forçar uma cidade específica quando você sabe que aquele CEP atende mais de uma cidade e seu sistema de frete precisa de uma escolha consistente.
  • Sobrescrever o estado detectado em CEPs limítrofes ou novos.
  • Normalizar nomes de cidade (acentos, maiúsculas) pra bater com sua tabela de frete personalizada.
  • Adicionar metadados que outras integrações usam.

Assinatura

apply_filters( 'woocommerce_cart_calculate_shipping_address', $address );

$address é um array associativo. Você retorna o array modificado (ou o mesmo, se não houver mudanças).

Exemplo: forçar cidade pra um CEP de capital

CEPs de São Paulo capital (01000-000 a 05999-999) que cliente preenche e você quer normalizar pra "São Paulo" sempre:

add_filter( 'woocommerce_cart_calculate_shipping_address', function( $address ) {
    if ( empty( $address['postcode'] ) ) {
        return $address;
    }

    $cep = preg_replace( '/\D/', '', $address['postcode'] );

    if ( $cep >= '01000000' && $cep <= '05999999' ) {
        $address['city'] = 'São Paulo';
    }

    return $address;
}, 25 );

Note a prioridade 25 — maior que a do plugin (20), pra garantir que sua lógica rode depois.

Exemplo: sobrescrever estado pra CEP específico

add_filter( 'woocommerce_cart_calculate_shipping_address', function( $address ) {
    if ( ! empty( $address['postcode'] ) ) {
        $cep = preg_replace( '/\D/', '', $address['postcode'] );

        if ( $cep === '12345678' ) {
            $address['state'] = 'RJ';
        }
    }

    return $address;
}, 25 );

Exemplo: normalizar nome de cidade sem acentos

Útil se sua tabela de frete está sem acentos:

add_filter( 'woocommerce_cart_calculate_shipping_address', function( $address ) {
    if ( ! empty( $address['city'] ) ) {
        $address['city'] = remove_accents( $address['city'] );
    }
    return $address;
}, 25 );

Estrutura do array

Os campos sempre presentes:

Chave Tipo Conteúdo
postcode string CEP formatado (00000-000)
country string BR
state string UF (ex: SP, RJ) ou string vazia se CEP fora de range
city string Nome da cidade (vazio se cidade desligada, - se ViaCEP falhou)

Outras chaves do $address podem existir (passadas pelo WooCommerce). Se você não conhece uma chave, deixa ela como está — não remova chaves que você não criou.

Não retorne array vazio

Se você retornar null, false, ou um array vazio, o WooCommerce pode não conseguir calcular o frete. Sempre retorne o $address (modificado ou não).

Onde colocar o código

functions.php do tema filho, plugin de snippets ou plugin próprio.

Filtros relacionados

Foi útil?