Cole no functions.php do tema filho ou num plugin de snippets. Teste numa cópia do site antes. Referência dos filtros em Hooks e filtros.
Frete grátis só num método
Troque 64 pelo número da instância do método (veja Integração com ERP).
add_filter( 'wc_table_shipping_cost', function ( $cost, $rate, $package ) {
if ( 64 === (int) $rate['id'] && 200 <= $package['contents_cost'] ) {
$cost = 0;
}
return $cost;
}, 10, 3 );
Peso cubado
Usa o maior entre o peso real e o cubado (C × L × A / 6000, em cm e kg).
add_filter( 'wc_table_shipping_weight', function ( $weight, $package, $extra, $unit ) {
$cubado = 0;
foreach ( $package['contents'] as $item ) {
$p = $item['data'];
$cubado += (float) $p->get_length() * (float) $p->get_width() * (float) $p->get_height() / 6000 * $item['quantity'];
}
$cubado = 'g' === $unit ? $cubado * 1000 : $cubado;
return max( $weight, $cubado );
}, 10, 4 );
Tabela por país
Troque 123 e 124 pelos IDs dos arquivos na biblioteca de mídia.
add_filter( 'wc_table_shipping_table_rate', function ( $table, $package ) {
$tabelas = [ 'BR' => 123, 'AR' => 124 ];
$pais = $package['destination']['country'] ?? 'BR';
return $tabelas[ $pais ] ?? $table;
}, 10, 2 );
Só pra alguns estados
add_filter( 'wcts_custom_rules', function ( $valid, $instance_id, $map, $row, $package ) {
if ( ! in_array( $package['destination']['state'], [ 'SP', 'RJ', 'MG' ], true ) ) {
return false;
}
return $valid;
}, 10, 5 );
No modo banco de dados, use wcts_custom_rules_database (4 parâmetros: $valid, $instance_id, $rate_data, $package).
Salvar uma coluna extra da tabela no pedido
O que vai em meta_data da cotação o WooCommerce grava no item de frete do pedido, e aparece embaixo do frete nos detalhes do pedido. O exemplo grava a 7ª coluna do CSV (índice 6, a contagem começa em 0) com o nome Transportadora.
add_filter( 'wc_table_shipping_rate', function ( $args, $rate ) {
if ( isset( $rate['row'][6] ) && '' !== $rate['row'][6] ) {
$args['meta_data']['Transportadora'] = $rate['row'][6];
}
return $args;
}, 10, 2 );
Só funciona no modo CSV. No modo banco de dados, a linha guarda apenas as colunas mapeadas, e as outras não chegam ao filtro.
Desconto pra quem já comprou
add_filter( 'wc_table_shipping_cost', function ( $cost ) {
$user_id = get_current_user_id();
if ( $user_id && wc_get_customer_order_count( $user_id ) > 0 ) {
$cost *= 0.9;
}
return $cost;
} );
Frete no máximo 50% do carrinho
add_filter( 'wc_table_shipping_cost', function ( $cost, $rate, $package ) {
return min( $cost, $package['contents_cost'] * 0.5 );
}, 10, 3 );
Pra cobrar peso acima do limite da tabela não precisa de código: use Peso máximo da tabela e Custo por kg adicional.