Coleção de snippets prontos pra customizar o comportamento do Frete Offline via hooks. Cole no functions.php do tema filho ou num plugin de snippets (Code Snippets, FluentSnippets).
Bugs em código customizado precisam ser depurados pelo dev que escreveu. Teste em ambiente de homologação antes de subir pra produção.
Referência completa dos hooks usados aqui em Hooks e filtros.
Frete grátis com mínimo de compra (qualquer método)
Aplica frete grátis em todos os métodos do Frete Offline quando o subtotal for ≥ R$ 200.
add_filter( 'wc_table_shipping_cost', 'wcts_free_shipping_minimo', 10, 3 );
function wcts_free_shipping_minimo( $cost, $rate, $package ) {
if ( 200 <= $package['contents_cost'] ) {
$cost = 0;
}
return $cost;
}
Pra mudar o valor mínimo, troque o 200 pelo valor desejado.
Frete grátis só pra um método específico
Quando você tem múltiplos métodos de frete offline e quer frete grátis em apenas um deles. Substitua 9999 pelo ID do rate desejado:
add_filter( 'wc_table_shipping_cost', 'wcts_free_shipping_metodo_especifico', 10, 3 );
function wcts_free_shipping_metodo_especifico( $cost, $rate, $package ) {
$id = 9999; // ID do rate desejado
if ( 200 <= $package['contents_cost'] && $id === $rate['id'] ) {
$cost = 0;
}
return $cost;
}
Pra descobrir o ID do rate, ative o Debug Log e veja wp-content/uploads/wc-logs/wc-table-shipping-*.log durante uma cotação.
Capar peso máximo do carrinho
Sua tabela vai até 30 kg. Quer que pacotes acima de 30 kg sejam calculados como se fossem 30 kg (em vez do método sumir):
add_filter( 'wc_table_shipping_weight', 'wcts_cap_peso', 10, 4 );
function wcts_cap_peso( $cart_weight, $package, $extra_weight, $weight_unit ) {
if ( $cart_weight > 30 ) {
$cart_weight = 30;
}
return $cart_weight;
}
Adicionar percentual de peso (peso dimensional)
Adiciona 15% ao peso pra simular peso dimensional/cubado:
add_filter( 'wc_table_shipping_weight', 'wcts_peso_dimensional', 10, 2 );
function wcts_peso_dimensional( $weight, $package ) {
return $weight * 1.15;
}
Pra cálculo dimensional real (LxWxH/6000), veja a versão expandida abaixo.
Peso dimensional baseado nas dimensões dos produtos
add_filter( 'wc_table_shipping_weight', 'wcts_dimensional', 10, 2 );
function wcts_dimensional( $weight, $package ) {
$dimensional = 0;
foreach ( $package['contents'] as $item ) {
$product = $item['data'];
$l = (float) $product->get_length();
$w = (float) $product->get_width();
$h = (float) $product->get_height();
if ( $l && $w && $h ) {
$dimensional += ( $l * $w * $h ) / 6000; // fator DIM padrão
}
}
return max( $weight, $dimensional );
}
O resultado é o maior entre peso real e peso dimensional — comportamento padrão de transportadoras.
Tabela diferente por país do cliente
Use um attachment ID por país. Substitua 123/124 pelos IDs reais (você descobre ao subir os arquivos pela media library):
add_filter( 'wc_table_shipping_table_rate', 'wcts_tabela_por_pais', 10, 3 );
function wcts_tabela_por_pais( $table, $package, $method ) {
$country = $package['destination']['country'] ?? 'BR';
$tabelas = [
'BR' => 123,
'AR' => 124,
];
return $tabelas[ $country ] ?? $table;
}
Restringir método a estado específico
O método só aparece se o estado de destino é São Paulo:
add_filter( 'wcts_custom_rules', 'wcts_so_sp', 10, 5 );
function wcts_so_sp( $valid, $instance_id, $map, $row, $package ) {
if ( 'SP' !== $package['destination']['state'] ) {
return false;
}
return $valid;
}
Pra múltiplos estados, use in_array():
if ( ! in_array( $package['destination']['state'], [ 'SP', 'RJ', 'MG' ], true ) ) {
return false;
}
Desconto de 10% pra clientes recorrentes
Se o cliente tem pedidos anteriores, desconta 10% no frete:
add_filter( 'wc_table_shipping_cost', 'wcts_desconto_recorrentes', 10, 3 );
function wcts_desconto_recorrentes( $cost, $rate, $package ) {
$user_id = get_current_user_id();
if ( $user_id && wc_get_customer_order_count( $user_id ) > 0 ) {
$cost *= 0.9;
}
return $cost;
}
Limitar frete a 50% do valor do carrinho
Garante que o frete nunca passe de 50% do subtotal:
add_filter( 'wc_table_shipping_cost', 'wcts_cap_frete_carrinho', 10, 4 );
function wcts_cap_frete_carrinho( $cost, $rate, $package, $method ) {
$max_cost = $package['contents_cost'] * 0.5;
return min( $cost, $max_cost );
}
Forçar reprocessamento de tabelas em DB via WP-CLI
Quando a importação pra banco de dados está parada (Action Scheduler travado):
wp action-scheduler run --force
Útil em servidores sem cron ativo.
Próximos passos
- Hooks e filtros — referência completa de cada hook.
- Salvar dados da tabela no pedido — recipe específica pra metadata.