O coração do plugin é a divisão do carrinho em pacotes de envio independentes — um por vendedor. Esta página explica em detalhes como esse processo acontece, do momento em que o cliente vê o checkout até o cálculo final do frete.
O ponto de partida: pacote único do WooCommerce
Por padrão, o WooCommerce trata o carrinho como um único pacote de envio. Quer o cliente compre 1 item ou 50, em qualquer combinação de produtos, o cálculo de frete usa um endereço de origem (o CEP da loja) e um endereço de destino (o do cliente).
Isso é suficiente pra loja monovendor. Pra marketplace, é insuficiente.
A divisão em pacotes
O Frete para Marketplace se conecta ao filtro woocommerce_cart_shipping_packages, intercepta esse pacote único e o substitui por N pacotes, onde N é o número de vendedores diferentes representados no carrinho.
Em código (alto nível), é como se o plugin fizesse:
pacote_original = [produto_A_v1, produto_B_v2, produto_C_v1]
# vira
pacote_v1 = [produto_A_v1, produto_C_v1] → CEP origem: vendedor 1
pacote_v2 = [produto_B_v2] → CEP origem: vendedor 2
Como o plugin descobre o vendedor de cada produto
Cada marketplace armazena essa relação produto-vendedor de um jeito diferente:
| Marketplace | Como o plugin lê |
|---|---|
| Dokan | dokan_get_vendor_by_product() |
| YITH | Taxonomia de vendedor (term meta) |
| WC Vendors | Autor do produto (post_author) |
| WCFM | API interna do WCFM |
| WC Marketplace | Relação produto-vendedor do plugin |
A integração roda automaticamente — você não precisa configurar de qual fonte ler.
O que cada pacote contém
Depois do split, cada pacote tem os campos padrão do WooCommerce mais campos novos prefixados com wcsp_:
$package = array(
// Campos novos do plugin
'wcsp_vendor_id' => 123,
'wcsp_vendor_name' => 'Loja do João',
'wcsp_vendor_postcode' => '01001-000',
// Campos padrão do WooCommerce
'contents' => array( /* itens deste vendedor */ ),
'contents_cost' => 150.00,
'destination' => array( /* CEP, cidade, estado de destino */ ),
'applied_coupons' => array(),
// ...
);
Esses campos wcsp_* são lidos depois pelos integradores de método de envio (Correios, Melhor Envio, etc.) pra trocar o CEP de origem na hora de calcular.
Exemplo prático
Carrinho:
- Produto A — Vendedor 1 (CEP origem 01001-000, São Paulo) — R$ 80
- Produto B — Vendedor 2 (CEP origem 80010-000, Curitiba) — R$ 120
- Produto C — Vendedor 1 — R$ 40
Endereço de entrega: 30130-000 (Belo Horizonte).
Resultado:
| Pacote | Itens | Subtotal | CEP origem | CEP destino |
|---|---|---|---|---|
| Vendedor 1 | A + C | R$ 120 | 01001-000 | 30130-000 |
| Vendedor 2 | B | R$ 120 | 80010-000 | 30130-000 |
Cada pacote vai pro Correios (ou Melhor Envio) com a sua origem própria e recebe um valor de frete realista.
E se o cliente compra produtos da loja matriz junto?
O plugin trata produtos sem vendedor (da loja matriz, fora do marketplace) como um pacote separado também — usando o CEP da loja como origem. Você acaba com:
- Pacote 1: produtos do vendedor X
- Pacote 2: produtos do vendedor Y
- Pacote 3 (opcional): produtos da loja matriz
E o nome de cada pacote no checkout?
Por padrão, o título do pacote no checkout é o nome da loja do vendedor (ex: "Loja do João"). Você pode customizar via filtro wcsp_package_name — detalhes em Filtro wcsp_package_name.
Se um vendedor acaba sem itens no pacote (caso raro de remoção dinâmica), o plugin oculta esse pacote do checkout pra não confundir o cliente.