FernandoAcosta.Netdocs

Salvar dados da tabela no pedido

2 min de leituraAtualizado há 5 dias

Sua tabela CSV pode ter colunas que não são usadas no cálculo (ex: nome da transportadora, código interno, observação) mas que seriam úteis pra ver depois no pedido — pra a equipe de logística, pra integração ou pra o painel admin.

O filtro wc_table_shipping_rate permite pegar essas colunas e salvar como metadata no pedido.

O hook

apply_filters( 'wc_table_shipping_rate', $args, $rate, $method, $extra_data );

Os parâmetros relevantes:

  • $args — array com keys do rate: id, label, cost, taxes, package, meta_data. Modifique meta_data pra adicionar campos.
  • $rate — dados completos da linha que casou. Tem row (linha do CSV) e map (mapeamento de colunas).

Exemplo: salvar nome da transportadora

Sua tabela tem uma coluna Nome mapeada como label. Você quer que o nome da transportadora apareça nos detalhes do pedido (em vez de só "Frete Offline"):

add_filter( 'wc_table_shipping_rate', 'wcts_salvar_transportadora', 10, 3 );
function wcts_salvar_transportadora( $args, $rate, $method ) {
    $row = $rate['row'];
    $map = $rate['map'];

    $args['meta_data']['Transportadora'] = isset( $row[ $map['label'] ] )
        ? $row[ $map['label'] ]
        : 'Não identificada';

    return $args;
}

Resultado: nos detalhes do pedido (admin), aparece um campo Transportadora: Express (ou o nome que veio da linha que casou).

Salvar várias colunas custom

Se você tem colunas extras na tabela (não mapeadas pelo plugin), elas vêm em $row mesmo assim. Pra acessar use o nome da coluna do CSV:

add_filter( 'wc_table_shipping_rate', 'wcts_salvar_extras', 10, 3 );
function wcts_salvar_extras( $args, $rate, $method ) {
    $row = $rate['row'];

    if ( isset( $row['CodigoInterno'] ) ) {
        $args['meta_data']['Código transportadora'] = $row['CodigoInterno'];
    }

    if ( isset( $row['CentroDistribuicao'] ) ) {
        $args['meta_data']['CD'] = $row['CentroDistribuicao'];
    }

    return $args;
}

Isso salva Código transportadora e CD no pedido, prontos pra serem lidos por integrações.

Acessar via código depois

Depois que o pedido é criado, leia o metadata via WC_Order:

$order = wc_get_order( $order_id );
foreach ( $order->get_items( 'shipping' ) as $item ) {
    $codigo = $item->get_meta( 'Código transportadora' );
    $transp = $item->get_meta( 'Transportadora' );
}

Esconder do front-end

Por padrão, o WooCommerce mostra metadata nos detalhes do pedido visíveis pro cliente. Se quiser esconder, use prefixo com underscore:

$args['meta_data']['_codigo_transportadora'] = $row['CodigoInterno'];

Metadata começando com _ é considerada interna e não aparece pra o cliente — só fica disponível via código.

Modo banco de dados

No modo DB, em vez de $rate['row'] você tem $rate['rate_data'] com os campos da tabela MySQL. Os campos disponíveis são:

  • id, instance_id, postcode_start, postcode_end
  • weight_start, weight_end, cost, delivery_time, label

Colunas extras do CSV original não são preservadas na tabela DB — apenas as 8 padrão. Se você precisa de colunas custom em produção e usa modo DB, use o filter wcts_row_importer_parsed_data pra adicionar suporte na importação.

Exemplo combinado

Salva o nome da linha (label) com fallback pro modo DB:

add_filter( 'wc_table_shipping_rate', 'wcts_salvar_label', 10, 3 );
function wcts_salvar_label( $args, $rate, $method ) {
    $label = '';

    if ( isset( $rate['row'], $rate['map']['label'] ) ) {
        // modo CSV
        $label = $rate['row'][ $rate['map']['label'] ] ?? '';
    } elseif ( isset( $rate['rate_data']['label'] ) ) {
        // modo DB
        $label = $rate['rate_data']['label'];
    }

    if ( $label ) {
        $args['meta_data']['Transportadora'] = $label;
    }

    return $args;
}

Isso garante o mesmo comportamento independente do modo de armazenamento.

Veja também

Foi útil?