FernandoAcosta.Net

Snippets PHP úteis

1 min de leituraAtualizado há 4 dias1.7.0

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.

Foi útil?