FernandoAcosta.Netdocs

Como o carrinho é dividido por vendedor

3 min de leituraAtualizado há 5 dias

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.

Pacotes vazios não aparecem

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.

Próximos passos

Foi útil?