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— sempreBR.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.
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
- Customizar opções via código — controlar as configurações do plugin.
- Mostrar campos de país, estado ou cidade — trazer de volta campos ocultos.