UniverCart
Tudo que você precisa pra instalar, configurar e dominar o side cart que recupera venda quando todos os outros falham.
Painel lateral fluido com cupons, brindes, recomendações e save-for-later.
Vendedor monta carrinho, gera URL bonita e manda no WhatsApp.
Cada carrinho abandonado vira link recuperável com tracking de conversão.
Recuperação via WhatsApp + ZapGrup com templates dinâmicos.
Visão geral
O UniverCart substitui o carrinho padrão do WooCommerce por um side cart premium e adiciona ferramentas de venda B2B e recuperação que normalmente custariam 5 plugins separados (Caddy + Cart Lift + WP Loyalty + funil de carrinho + WhatsApp blast).
Foi construído pra ser plug-and-play: você instala, ativa e o carrinho aparece automaticamente — em qualquer tema. Diferente de soluções genéricas, ele é opinionado pra mercado brasileiro: integração ZapGrup, URLs em PT-BR, brindes por nível e disparo em massa.
Após ativar o plugin, o side cart entra automaticamente. Não precisa shortcode, não precisa template override — funciona no tema padrão e em qualquer tema premium.
Instalação
- 1Faça upload do pluginSuba o ZIP em Plugins → Adicionar → Enviar plugin, ou descompacte em
/wp-content/plugins/univercart/via FTP. - 2AtiveEm Plugins, clique em "Ativar" no card do UniverCart. As tabelas auxiliares são criadas automaticamente (cart tracking, recovery links, save for later, dispatches, templates).
- 3ConfigureVá em UniverCart → Configurações e revise: aparência, frete grátis, recompensas, recomendações.
- 4Teste em uma loja vaziaAdicione um produto pelo frontend e verifique que o painel lateral abre. Se não abrir, confira se outro plugin de carrinho está conflitando.
Requisitos
| Setting | Default | Descrição |
|---|---|---|
WordPress | 6.2+ | Testado até 6.7 |
WooCommerce | 8.0+ | HPOS compatível. Testado até 9.6 |
PHP | 7.4+ | Recomendado 8.1+ |
ZapGrup | — | Opcional. Necessário só pro Disparar Carrinhos (plano Ultra) |
MySQL/MariaDB | 5.7+ / 10.4+ | Engine InnoDB obrigatória pra UNIQUE em slug |
WordPressdefault: 6.2+WooCommercedefault: 8.0+PHPdefault: 7.4+ZapGrupMySQL/MariaDBdefault: 5.7+ / 10.4+Painel lateral
O side cart é injetado automaticamente no body do site — funciona com qualquer tema. Ao clicar no carrinho ou adicionar um produto, o painel desliza da direita.
Comportamento
| Setting | Default | Descrição |
|---|---|---|
enabled | yes | Liga/desliga o side cart globalmente |
open_on_add | yes | Abre automaticamente quando produto é adicionado ao carrinho |
icon_position | bottom-right | Posição do botão flutuante: bottom-right ou bottom-left |
desktop_behavior | open_cart | Clique no ícone do carrinho em telas grandes: open_cart ou do_nothing |
mobile_behavior | open_cart | Idem para telas pequenas |
visibility_mode | hide_on | hide_on (mostrar exceto em…) ou show_on (mostrar apenas em…) |
visibility_pages | cart, checkout | Lista separada por vírgula. Aceita: cart, checkout, account, home, shop, IDs ou slugs |
enableddefault: yesopen_on_adddefault: yesicon_positiondefault: bottom-rightdesktop_behaviordefault: open_cartmobile_behaviordefault: open_cartvisibility_modedefault: hide_onvisibility_pagesdefault: cart, checkoutShortcode
Use [univercart_cart_icon] em menu, header ou footer do tema. Atributos:
[univercart_cart_icon label="meu carrinho" size="64" bg="#000" color="#fff"]
Aparência
Controle total das cores, geometria e ícone do side cart sem editar CSS.
| Setting | Default | Descrição |
|---|---|---|
primary_color | #2fad4e | Cor primária — botões, links, destaques |
bg_color | #ffffff | Cor de fundo do painel |
text_color | #1f2937 | Cor do texto principal |
border_radius | 12 | Borda arredondada em px (0–50) |
cart_width | 400 | Largura do painel em px (280–600) |
shortcode_icon_desktop | 56 | Tamanho do ícone do shortcode em telas grandes |
shortcode_icon_mobile | 48 | Tamanho do ícone em mobile |
shortcode_icon_bg | #000000 | Cor de fundo do ícone shortcode |
shortcode_icon_color | #ffffff | Cor do ícone shortcode |
primary_colordefault: #2fad4ebg_colordefault: #fffffftext_colordefault: #1f2937border_radiusdefault: 12cart_widthdefault: 400shortcode_icon_desktopdefault: 56shortcode_icon_mobiledefault: 48shortcode_icon_bgdefault: #000000shortcode_icon_colordefault: #ffffffFrete grátis · meter
Barra de progresso visível no topo do carrinho com a meta restante para frete grátis. Auto-detecta a regra do WooCommerce ou aceita meta manual.
| Setting | Default | Descrição |
|---|---|---|
free_shipping_enabled | yes | Liga a barra de progresso |
free_shipping_threshold | 0 | Meta manual em R$. Use 0 pra desativar |
free_shipping_auto | yes | Auto-detecta a regra de frete grátis configurada no Woo |
free_shipping_enableddefault: yesfree_shipping_thresholddefault: 0free_shipping_autodefault: yesQuando free_shipping_auto está ligado, o threshold detectado do Woo vence o manual. Desligue auto pra forçar a meta manual.
Recompensas progressivas★
Configure níveis ilimitados de recompensa por valor de carrinho. Cada nível pode ser free_shipping, discount ou gift. O cliente vê o progresso visual no carrinho e cada brinde é adicionado automaticamente quando o threshold é atingido.
Tipos de recompensa
Adiciona produto ao carrinho automaticamente. Bypass de stock check.
% ou valor fixo aplicado ao subtotal.
Marca este nível como meta de frete grátis na barra de progresso.
Estrutura de cada tier
[
{
"enabled": "yes",
"threshold": 199,
"type": "free_shipping",
"value": "",
"text": "Frete grátis",
"show_in_meter": "yes"
},
{
"enabled": "yes",
"threshold": 299,
"type": "gift",
"value": "13891", // ID do produto
"text": "Máscara de presente",
"show_in_meter": "yes"
}
]| Setting | Default | Descrição |
|---|---|---|
rewards_enabled | no | Liga o sistema de recompensas progressivas |
rewards_tax | before_tax | Cálculo do gasto: before_tax (subtotal) ou after_tax (total) |
rewards_tiers | [] | Array de tiers — reordenado por threshold ao salvar |
rewards_enableddefault: norewards_taxdefault: before_taxrewards_tiersdefault: []Brindes de produtos sem estoque (managing_stock=true && is_in_stock=false) são silenciosamente skippados — evita ordem 500 no checkout. Se o estoque voltar, o brinde é re-adicionado no próximo pageload.
Barra de anúncio
Mensagem persistente no topo do painel — útil pra promoções, prazos ou avisos. Aceita variáveis dinâmicas:
{cart_total}— total formatado{cart_count}— número de itens{first_name}— primeiro nome do cliente logado{free_shipping_remaining}— falta R$ X pra frete grátis
| Setting | Default | Descrição |
|---|---|---|
announcement_enabled | no | Liga a barra de anúncio no topo do painel |
announcement_text | — | Texto exibido (aceita HTML básico) |
announcement_bg | #059669 | Cor de fundo da barra (hex) |
announcement_color | #ffffff | Cor do texto |
announcement_enableddefault: noannouncement_textannouncement_bgdefault: #059669announcement_colordefault: #ffffffCores são validadas com regex hex estrito antes de injetar no inline style — previne CSS injection via setting.
Salvar para depois
Wishlist persistente integrada ao side cart. Aba dedicada com produtos salvos. Visitantes não logados também podem usar (via cookie de sessão).
| Setting | Default | Descrição |
|---|---|---|
sfl_enabled | yes | Liga a feature Salvar para Depois |
sfl_guest_enabled | yes | Permite visitantes (sessão WC) |
sfl_on_product | no | Exibe botão Salvar abaixo do botão Comprar na página individual do produto |
sfl_max_items | 20 | Limite de itens por usuário (1–100) |
sfl_enableddefault: yessfl_guest_enableddefault: yessfl_on_productdefault: nosfl_max_itemsdefault: 20Migração ao login
Quando um visitante faz login, os itens salvos por cookie são migrados automaticamente pra conta dele via hook wp_login.
Recomendações
Bloco de produtos recomendados exibido dentro do side cart. 3 fontes possíveis:
- Upsells — produtos vinculados manualmente como upsell no admin do produto
- Cross-sells — vinculados como cross-sell
- Related — auto-detect via categoria/tag (fallback)
- Bestsellers — fallback final por
total_sales
| Setting | Default | Descrição |
|---|---|---|
upsells_enabled | yes | Liga as recomendações |
upsells_source | both | both / related (apenas upsells) / cross_sells |
upsells_max | 4 | Máximo de produtos exibidos (1–12) |
upsells_hide_oos | yes | Oculta produtos sem estoque |
upsells_exclude_cats | — | IDs de categorias separados por vírgula |
upsells_exclude_products | — | IDs de produtos separados por vírgula |
upsells_title | Você também vai gostar | Título do bloco |
upsells_enableddefault: yesupsells_sourcedefault: bothupsells_maxdefault: 4upsells_hide_oosdefault: yesupsells_exclude_catsupsells_exclude_productsupsells_titledefault: Você também vai gostarAba de ofertas
Cupons disponíveis com aplicação em 1 clique direto do carrinho — sem o cliente ter que descobrir/digitar o código.
| Setting | Default | Descrição |
|---|---|---|
offers_enabled | no | Liga a aba de ofertas |
offers_coupons | — | Códigos separados por vírgula. Ex: BEMVINDO10, FRETE20 |
offers_btn_text | Aplicar | Texto do botão |
offers_enableddefault: nooffers_couponsoffers_btn_textdefault: AplicarMontador de CarrinhoPRO
Painel admin onde o time comercial monta carrinhos personalizados pra clientes B2B. Funcionalidade exclusiva — não existe em nenhum outro plugin do mercado.
Fluxo
- 1Buscar produtosBusca AI por nome, SKU ou ID. Filtros por categoria, preço, estoque. Suporte a variações.
- 2CustomizarOverride de preço por item, ajuste de quantidade, aplicação de cupons, frete customizado.
- 3Gerar linkSlug bonito (
kit-vip-joana) ou token hash. Validade configurável. - 4AcompanharVisitas, conversão e receita atribuída no dashboard.
Busca AI de produtos
Endpoint REST GET /univercart/v1/builder/search-products retorna payload compacto otimizado pra LLMs e UI.
Campos suportados
| Setting | Default | Descrição |
|---|---|---|
q | — | Busca livre — title, excerpt, content, SKU |
category | — | Slug da categoria |
per_page | 15 | Resultados por página (1–50) |
in_stock | true | Apenas produtos com estoque |
min_price | — | Preço mínimo (decimal) |
max_price | — | Preço máximo (decimal) |
ids | — | Array de IDs pra bulk lookup. Preserva ordem de input via FIELD() |
qcategoryper_pagedefault: 15in_stockdefault: truemin_pricemax_priceidsSQL direto evita problemas de serialização causados por filtros third-party que adicionam Closures aos query_vars (visto em produção).
Override de preço
Cada item no Montador aceita custom_price ou discount_pct. O preço efetivo é calculado e gravado como meta _uc_custom_price no cart_item_data.
Regras de segurança
- Preço zero ou negativo é recusado — produto pago nunca vira free por essa rota
- 100% de desconto vira centavo simbólico (R$ 0,01) — força produto a aparecer como pago
- Se o admin quer realmente brinde, usa o sistema de Recompensas
O hook woocommerce_before_calculate_totals aplica o _uc_custom_price em todo cálculo. Defensivo: ignora valores ≤ 0 mesmo que cheguem por outro caminho.
Frete customizado
Cada link gerado pelo Montador pode sobrescrever a regra de frete via shipping_override.
Modos
free— frete grátis sobrescreve qualquer métodofixed— valor fixo (ex: R$ 19,90)discount— % de desconto sobre o frete calculado
{
"enabled": true,
"display_name": "Frete promocional",
"mode": "fixed",
"fixed_value": 19.90
}Persiste em WC()->session->set('uc_shipping_override', $override) e atua via filter woocommerce_package_rates.
Carrinho salvo (URL)
Quando o admin marca is_saved=1 no Montador, o carrinho fica reutilizável pra sempre (ou até admin deletar). Ganha um slug bonito que vira a URL do checkout.
POST /univercart/v1/builder/save-cart
{
"name": "Kit VIP Joana",
"slug": "kit-vip-joana", // opcional, gerado de name se vazio
"items": [{"product_id": 123, "quantity": 2, "custom_price": 99.00}],
"coupons": ["VIP10"],
"shipping_override": { "enabled": true, "mode": "free", "display_name": "Frete VIP" }
}
→ link: https://lizzon.com.br/pedido/kit-vip-joana| Setting | Default | Descrição |
|---|---|---|
slug | — | [a-z0-9][a-z0-9-]* (gerado via sanitize_title se omitido) |
expires_at | +10 anos | Carrinho salvo. Token-only links expiram em recovery_link_expiry dias |
name | — | Label interno — exibido na lista de carrinhos salvos no admin |
slugexpires_atdefault: +10 anosnameUNIQUE index na coluna slug + retry com sufixo numérico (kit-joana, kit-joana-2, kit-joana-3) e fallback aleatório após 50 tentativas.
Recovery links
Cada carrinho gerado (Montador, Disparar Carrinhos, ou via API) cria um registro em wp_uc_recovery_links com token hash + dados do carrinho. URL no formato /uc-recover/{token} ou /pedido/{slug}.
Fluxo de resolução
- 1Cliente abre o linkRewrite rule do WP captura o token/slug e dispara
template_redirect. - 2Validação criptográficaToken URL é hashed (SHA-256 com salt do site) e comparado com o storage. Slug é look-up direto.
- 3Reconstrução do carrinho
WC()->cart->empty_cart()+add_to_cart()pra cada item, com_uc_custom_priceaplicado. - 4Aplicação de cupons + overrideCupons inválidos são silenciosamente dropados (admin já validou ao gerar). Shipping override persistido na sessão.
- 5Redirect para checkoutCliente já vê totais finais.
uc_recovery_link_idpersistido na sessão pra atribuição de conversão.
| Setting | Default | Descrição |
|---|---|---|
recovery_link_expiry | 30 | Validade em dias para links token-only (1–365) |
abandon_threshold_hours | 48 | Após X horas inativo, carrinho é marcado como abandonado |
data_retention_days | 90 | Dias antes do purge automático |
recovery_link_expirydefault: 30abandon_threshold_hoursdefault: 48data_retention_daysdefault: 90Tracking & analytics
Toda sessão de carrinho é instrumentada na tabela wp_uc_cart_tracking + wp_uc_cart_items. Sem cookies de terceiros, sem GA — dados ficam no seu banco.
Active → Abandoned → Completed. Drop-off por etapa.
Cada conversão linkada ao recovery_link_id que originou.
Ranking por quantidade e receita, filtrável por status e período.
Visitas vs conversões vs receita. Compare templates e canais.
Endpoints
GET /wc-data/stats?period=30d— KPIs de pedidos com paginação 500/batch (sem OOM em loja grande)GET /cart-tracking?status=abandoned— listagem paginadaGET /analytics/top-products— top SKUs por status e janela
Cupom via URL
Aplica cupom automaticamente ao chegar via link com parâmetro ?coupon=:
https://sualoja.com.br/?coupon=BLACKFRIDAY
Funciona com qualquer cupom criado em WooCommerce → Cupons. Inválido/expirado é ignorado silenciosamente — sem notice de erro pro cliente.
Disparar CarrinhosULTRA
Recuperação em massa de carrinhos abandonados via WhatsApp. Você seleciona até 1.000 carrinhos, escolhe um template, e dispara — cada cliente recebe a mensagem com link único.
Fluxo
- 1Selecionar carrinhosFiltros por status (abandoned, active), período, valor mínimo, ticket médio.
- 2Escolher templateMensagem com variáveis dinâmicas. Preview ao vivo do payload renderizado.
- 3Configurar disparoSessão WhatsApp, rate limit (balanced/aggressive/safe), modo dry-run.
- 4AcompanharStatus em tempo real via
GET /dispatch/{id}/synccom polling 3s.
Acima disso o request é rejeitado. Evita OOM no servidor e respeita rate limits do WhatsApp. Pra disparos maiores, divida em jobs.
Templates de mensagem
Templates editáveis com variáveis dinâmicas. Cada template tem nome, canal (whatsapp), corpo e preview ao vivo.
Variáveis suportadas
{nome}· primeiro nome do cliente{total}· valor formatado (R$ 1.234,56){qtd_itens}· número de itens no carrinho{primeiro_item}· nome do primeiro produto{link_carrinho}· URL única de recuperação{email}· email do cliente
Oi *{nome}* 👋
Notei que você deixou um carrinho de {total} aqui na loja.
Reservei pra você por mais 24h:
{link_carrinho}
Qualquer dúvida, é só responder. 🤝Endpoints CRUD
GET /dispatch/templatesPOST /dispatch/templatesPUT /dispatch/templates/{id}DELETE /dispatch/templates/{id}POST /dispatch/templates/preview— render com sample data
Integração ZapGrup
O Disparar Carrinhos delega o envio efetivo para a sua instância ZapGrup. O plugin nunca envia direto — só prepara o payload.
| Setting | Default | Descrição |
|---|---|---|
zapgrup_url | — | URL base da sua instância. Ex: https://zapgrup.univerzap.cloud (sem /api) |
zapgrup_api_key | — | Chave configurada no ZapGrup. Enviada como header X-ZapGrup-Key |
zapgrup_urlzapgrup_api_keyPayload enviado ao ZapGrup
POST {zapgrup_url}/api/dispatch/cart-blast
Headers:
Content-Type: application/json
X-ZapGrup-Key: {api_key}
Body:
{
"source": "univercart",
"dispatch_id": 42,
"channel": "whatsapp",
"session_id": "session-1",
"rate_limit_mode": "balanced",
"items": [...],
"callback_url": "https://sualoja/wp-json/univercart/v1/dispatch/callback"
}Se o ZapGrup retornar erro, todos os recovery links pré-gerados são automaticamente deletados — evita lixo no banco em caso de falha.
Rate limit & status
Três modos de envio configuráveis via parâmetro rate_limit_mode no payload do disparo:
| Setting | Default | Descrição |
|---|---|---|
balanced | — | Default. ~3-5s entre mensagens. Recomendado pra contas de produção. |
aggressive | — | Mais rápido (~1-2s). Risco maior de ban. Use só com session quente. |
safe | — | Espaçado (~8-12s). Pra sessions novas ou em recuperação. |
balancedaggressivesafeStatus em tempo real
O ZapGrup chama de volta em POST /dispatch/callback a cada evento (sent, failed, delivered). O plugin reconcilia o estado em wp_uc_dispatch_items. UI faz polling de 3s em GET /dispatch/{id}/sync.
Configurações
SPA dedicada em UniverCart → Configurações. 11 abas: Geral, Exibição, Aparência, Recompensas, Recomendações, Ofertas, Salvar pra Depois, Anúncio, Avançado, Disparos, Ferramentas.
Persistência
O sanitiser é estritamente per-key: só grava chaves que o cliente enviou. Campos não tocados nunca são reescritos. Saves de aba A não afetam aba B.
Aba de Ferramentas
- Limpar carrinhos antigos — Marca abandonados + remove fora da janela de retenção
- Limpar cache — Apaga transients
uc_*eunivercart_* - Resetar todos os dados — Backup automático + truncate em todas as tabelas. Requer confirmação digitada.
REST API
Namespace /wp-json/univercart/v1/. Todas as rotas administrativas exigem manage_woocommerce; rotas públicas requerem nonce.
Carrinho & checkout
GET /side-cart/cart-data— payload do side cartPOST /cart/mutate— add / remove / update itemPOST /clear-cart— limpar carrinho do clienteGET /saved-items·POST /saved-items·DELETE /saved-items/{id}
Builder
POST /builder/preview— validar items antes de criar linkPOST /builder/create-link— link descartávelPOST /builder/save-cart— carrinho salvo com slugGET /builder/saved-carts·PUT /builder/saved-carts/{id}·DELETE …GET /builder/check-slug?slug=…GET /builder/search-products?q=…— busca AI
Tracking & dispatch
GET /cart-tracking— listagem paginada com filtrosPOST /dispatch/send— disparar em massaGET /dispatch/{id}/sync— polling de statusPOST /dispatch/callback— webhook ZapGrup (auth via X-ZapGrup-Key)
Sistema
GET /settings·POST /settingsPOST /tools/purge-old·POST /tools/clear-cacheGET /wc-data/stats?period=30d
Developer hooks
Filters e actions seguindo o padrão univercart_*. Use no functions.php do tema ou em plugin filho.
Filters
| Setting | Default | Descrição |
|---|---|---|
univercart_trust_forwarded_for | — | Confiar em X-Forwarded-For (sites atrás de Cloudflare/ALB). Recebe (bool, $_SERVER) |
univercart_revenue_statuses | — | Status que contam como receita (default: completed, processing) |
univercart_trust_forwarded_forunivercart_revenue_statusesActions
| Setting | Default | Descrição |
|---|---|---|
univercart_cleanup | — | Cron diário. Marca abandonados + purga registros antigos + expira links |
univercart_cleanupTabelas no banco
| Setting | Default | Descrição |
|---|---|---|
uc_cart_tracking | — | Sessão do carrinho (status, totals, customer info, IP, UA) |
uc_cart_items | — | Itens snapshot por sessão |
uc_recovery_links | — | Links token + slug + cart_data JSON |
uc_save_for_later | — | Wishlist persistente |
uc_dispatches | — | Header dos disparos (status, counts, external_id ZapGrup) |
uc_dispatch_items | — | 1 row por destinatário (rendered_message, status, sent_at) |
uc_dispatch_templates | — | Templates salvos |
uc_cart_trackinguc_cart_itemsuc_recovery_linksuc_save_for_lateruc_dispatchesuc_dispatch_itemsuc_dispatch_templatesLicenciamento
Sistema de licença com Cloudflare Worker (Univer License Server). Tokens assinados Ed25519, domain-binding, grace period de 7 dias.
Verificação
O plugin chama o endpoint POST /v1/license/activate na primeira ativação e POST /v1/license/heartbeat diariamente. Recebe um signed_token com Ed25519 que é validado a cada read — qualquer adulteração no DB invalida.
Se o licensing server fica inalcançável, o plugin continua funcionando por 7 dias com base no último signed_token válido. Após esse prazo, modo restrito ativa.
LGPD / Uninstall
Quando você desinstala o plugin pelo wp-admin, o uninstall.php é LGPD-aware:
- Drop de todas as tabelas
uc_*+ tabelas de backupuc_bk_* - Delete de todas as options:
univercart_settings,univercart_db_version,univercart_last_version,univercart_zapgrup_url,univercart_zapgrup_api_key,univercart_reset_audit - Cancela cron
univercart_cleanup - Limpa transients
univercart_*euc_* - Remove capability
manage_univercartde administrator e shop_manager
Após desinstalar, nada do plugin permanece no banco. Zero footprint.
Problemas comuns
Side cart não abre
Verifique se o WooCommerce está ativo. Cheque se há outro plugin de side cart conflitando (Caddy, Cart Lift, FunnelKit). Em Ferramentas → Site Health, confirme que JS está sendo enqueueado.
Recovery link redireciona pro carrinho vazio
Indica que todos os items do link estão com estoque zerado ou foram despublicados. Veja a notice no carrinho e considere editar os items do link.
Disparar Carrinhos retorna 502
Confira zapgrup_url e zapgrup_api_key em Configurações → Disparos. Teste o endpoint {zapgrup_url}/api/dispatch/sessions manualmente com cURL.
Brinde não é adicionado
Cheque: (a) rewards_enabled = yes; (b) tier com enabled = yes e threshold ≤ subtotal; (c) produto do brinde tem estoque (se managing_stock); (d) produto não é variável-pai (use uma variação específica).
Settings não salvam
O sanitiser é per-key estrito desde 2.2.3. Se algo não salva, abra DevTools e cheque o payload do POST /settings — chaves precisam estar presentes pra serem gravadas.
FAQ
Funciona com gateway que não seja Mercado Pago?
Sim. UniverCart é agnóstico de gateway — ele só monta o carrinho. O pagamento usa o que você já tem configurado no Woo.
Suporta HPOS?
Sim. custom_order_tables declarado como compatível. Cart Blocks também são suportados.
Tem versão multilíngue?
Versão atual é PT-BR. Strings traduzíveis via load_plugin_textdomain. Roadmap inclui ES-AR/MX e EN-US.
Funciona com cache (WP Rocket, LiteSpeed)?
Sim, mas: (a) páginas do checkout/recovery devem estar na exclude list; (b) o JS do side cart precisa ser servido fresh (não combinar/minify agressivo). UniverCart já adiciona cache-busting por versão.
Posso desativar o Disparar Carrinhos?
Sim. É uma feature exclusiva do plano Ultra. Em planos menores ela simplesmente não aparece no menu.
Changelog
2.2.4 atual
- Cupom movido pra fora do scroll do body — sem gap visual
- Settings: SPA full UI com 11 abas + toggles, color picker, tier rows
- Settings: sanitiser per-key estrito (PATCH semantics)
- Settings: tabs verticais à esquerda, save bar pill flutuante
2.2.0
- Migração completa de Settings para SPA (fim do options.php)
- SettingsController REST + 3 ferramentas de manutenção
2.1.0
- Hardening pra venda comercial — 49 bugs corrigidos
- Sanitization REST endpoints (CSRF + nonce)
- Recovery flow com notice/redirect em vez de checkout vazio
- HPOS hook bootstrap fix
- Reset destrutivo com backup + audit log
2.0.0
- Disparar Carrinhos via ZapGrup
- Montador B2B com URL custom
- Override de preço por item
- Recompensas progressivas (níveis ilimitados)