FernandoAcosta.Netdocs

Snippets PHP úteis

2 min de leituraAtualizado há 5 dias

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).

Customizações avançadas não são cobertas pelo suporte

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

Foi útil?