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. Modifiquemeta_datapra adicionar campos.$rate— dados completos da linha que casou. Temrow(linha do CSV) emap(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_endweight_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
- Hooks e filtros — referência completa.
- Snippets PHP — outros snippets úteis.
- Integração com ERP — pra ID do método.