# WooCommerce WP-CLI — Referência Completa (CWP) **Manual Hub:** `06-Operacoes/Documentacao/Manuais/WooCommerce com WP-CLI_ Guia Completo.md` --- ## Namespace e Entidades Disponíveis O WooCommerce CLI opera sob `wp wc`. Todas as operações mapeiam para REST API v3. | Entidade | Comando Base | |----------|-------------| | `customer` | Contas, moradas, métricas | | `product` | Inventário, preços, stock | | `product_cat` / `product_tag` | Categorias e tags | | `product_attribute` | Atributos globais | | `product_variation` | Variações de produto variável | | `shop_order` | Encomendas | | `order_note` | Notas de encomenda | | `shop_coupon` | Cupões de desconto | | `setting` | Settings WooCommerce | | `shipping_zone` | Zonas de envio | | `shipping_zone_location` | Localizações por zona | | `shipping_zone_method` | Métodos por zona | | `payment_gateway` | Gateways de pagamento | | `tax` | Taxas de imposto | | `tax_class` | Classes de imposto | | `tool` | Ferramentas de manutenção | | `webhook` | Webhooks server-to-server | --- ## Tipos de Produto — Exemplos Completos ### Produto Simples ```bash PATH_WP="/home/USER/public_html" /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ --user=1 \ --name="T-Shirt Premium Algodão Orgânico" \ --type=simple \ --regular_price="29.99" \ --sale_price="24.99" \ --sku="TSHIRT-PREM-001" \ --manage_stock=true \ --stock_quantity=150 \ --status=publish \ --description="Descrição completa do produto." \ --short_description="Descrição curta para listagens." \ --allow-root --path=$PATH_WP ``` ### Produto Virtual (sem envio) ```bash /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ --user=1 \ --name="Consulta Online 1h" \ --type=simple \ --virtual=true \ --regular_price="75.00" \ --sku="CONSULT-1H" \ --status=publish \ --allow-root --path=$PATH_WP ``` ### Produto Downloadable ```bash /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ --user=1 \ --name="eBook Guia SEO 2026" \ --type=simple \ --virtual=true \ --downloadable=true \ --regular_price="19.90" \ --sku="EBOOK-SEO-2026" \ --downloads='[{"name":"eBook SEO 2026","file":"https://site.pt/ficheiros/ebook-seo-2026.pdf"}]' \ --download_limit=3 \ --download_expiry=365 \ --allow-root --path=$PATH_WP ``` ### Produto Externo/Afiliado ```bash /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ --user=1 \ --name="Software Cloud Parceiro" \ --type=external \ --regular_price="99.00" \ --product_url="https://parceiro.com/checkout/123" \ --button_text="Comprar na Loja do Parceiro" \ --sku="EXT-SOFT-123" \ --allow-root --path=$PATH_WP ``` ### Produto Agrupado (Grouped) ```bash # 1. Criar produto pai agrupado GROUP_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ --user=1 --name="Pack Bundle Completo" --type=grouped --sku="PACK-BUNDLE-001" \ --porcelain --allow-root --path=$PATH_WP) # 2. Criar filho vinculado ao grupo /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ --user=1 \ --name="Item A do Pack" \ --type=simple \ --regular_price="15.00" \ --sku="PACK-ITEM-A" \ --parent_id=$GROUP_ID \ --allow-root --path=$PATH_WP ``` ### Produto Variável com Variações ```bash # 1. Criar produto pai variável PARENT_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ --user=1 \ --name="Sapatilhas Running" \ --type=variable \ --attributes='[{"name":"Tamanho","variation":true,"visible":true,"options":["39","40","41","42","43"]},{"name":"Cor","variation":true,"visible":true,"options":["Preto","Branco"]}]' \ --porcelain --allow-root --path=$PATH_WP) # 2. Criar variação (Tamanho 40, Cor Preto) /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product_variation create $PARENT_ID \ --user=1 \ --regular_price="89.99" \ --sku="RUN-40-PT" \ --attributes='[{"name":"Tamanho","option":"40"},{"name":"Cor","option":"Preto"}]' \ --manage_stock=true \ --stock_quantity=25 \ --allow-root --path=$PATH_WP ``` ### Produto com Categorias e Atributos Visíveis ```bash /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ --user=1 \ --name="Casaco Impermeável Inverno" \ --type=simple \ --regular_price="120.00" \ --categories='[{"id":15},{"id":22}]' \ --attributes='[{"name":"Material","visible":true,"options":["Poliéster","Gore-Tex"]},{"name":"Cor","visible":true,"options":["Preto","Azul Marinho"]}]' \ --allow-root --path=$PATH_WP ``` --- ## Gestão de Stock ```bash PATH_WP="/home/USER/public_html" # Actualizar stock de produto único /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product update 456 \ --user=1 \ --manage_stock=true \ --stock_quantity=75 \ --stock_status=instock \ --allow-root --path=$PATH_WP # Colocar produto fora de stock (sem alterar quantidade) /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product update 456 \ --user=1 --stock_status=outofstock \ --allow-root --path=$PATH_WP # Actualizar stock em massa por prefixo SKU WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" for ID in $($WP wc product list --user=1 --sku="TSHIRT-*" --format=ids); do $WP wc product update $ID --user=1 --stock_quantity=200 --porcelain done ``` --- ## Gestão de Encomendas ### Consulta e Filtros ```bash PATH_WP="/home/USER/public_html" # Encomendas por estado /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_order list \ --user=1 --status=processing \ --fields=id,total,currency,date_created \ --format=table \ --allow-root --path=$PATH_WP # Estados disponíveis: pending, processing, on-hold, completed, cancelled, refunded, failed ``` ### Actualizar Estado ```bash /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_order update 355 \ --user=1 --status=completed \ --allow-root --path=$PATH_WP ``` ### Adicionar Nota (Visível ao Cliente) ```bash /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc order_note create 355 \ --user=1 \ --note="Expedido via CTT. Rastreio: PT-99887766." \ --customer_note=true \ --allow-root --path=$PATH_WP ``` ### Conclusão Massiva com Relatório ```bash #!/bin/bash PATH_WP="/home/USER/public_html" WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" ORDER_IDS=$($WP wc shop_order list --user=1 --status=processing --format=ids) TOTAL=0 for ID in $ORDER_IDS; do $WP wc shop_order update $ID --user=1 --status=completed --porcelain TOTAL=$((TOTAL+1)) echo "[OK] Encomenda #$ID concluída." done echo "Total processado: $TOTAL encomendas." ``` --- ## Clientes ```bash PATH_WP="/home/USER/public_html" # Listar com métricas de lifetime value /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc customer list \ --user=1 \ --role=customer \ --fields=id,email,orders_count,total_spent \ --format=table \ --allow-root --path=$PATH_WP # Criar cliente completo (B2B) /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc customer create \ --user=1 \ --email="empresa@exemplo.pt" \ --first_name="Carlos" \ --last_name="Mendes" \ --username="carlosmendes_b2b" \ --password="SenhaForte!2026" \ --billing='{"first_name":"Carlos","last_name":"Mendes","company":"Empresa Lda","address_1":"Avenida da Liberdade 123","city":"Lisboa","postcode":"1250-140","country":"PT"}' \ --shipping='{"first_name":"Carlos","last_name":"Mendes","company":"Armazém Empresa","address_1":"Rua da Indústria 45","city":"Sintra","postcode":"2710-000","country":"PT"}' \ --allow-root --path=$PATH_WP ``` --- ## Shipping Zones — Configuração Completa ```bash PATH_WP="/home/USER/public_html" # 1. Criar zona geográfica ZONE_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone create \ --user=1 --name="Portugal Continental" \ --porcelain --allow-root --path=$PATH_WP) # 2. Adicionar países à zona /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_location create $ZONE_ID \ --user=1 --code="PT" --type=country \ --allow-root --path=$PATH_WP # 3. Adicionar método de portes fixos METHOD_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_method create $ZONE_ID \ --user=1 --method_id=flat_rate \ --porcelain --allow-root --path=$PATH_WP) # 4. Definir custo /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_method update $ZONE_ID $METHOD_ID \ --user=1 --settings='{"cost":"3.99","title":"Portes Padrão"}' \ --allow-root --path=$PATH_WP # 5. Adicionar envio gratuito acima de X€ FREE_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_method create $ZONE_ID \ --user=1 --method_id=free_shipping \ --porcelain --allow-root --path=$PATH_WP) /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_method update $ZONE_ID $FREE_ID \ --user=1 --settings='{"requires":"min_amount","min_amount":"50"}' \ --allow-root --path=$PATH_WP # Listar todas as zonas /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone list \ --user=1 --format=table --allow-root --path=$PATH_WP ``` --- ## Payment Gateways ```bash PATH_WP="/home/USER/public_html" # Listar todos os gateways /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway list \ --user=1 --fields=id,title,enabled --allow-root --path=$PATH_WP # Activar gateway /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway update bacs \ --user=1 --enabled=true --allow-root --path=$PATH_WP # Desactivar gateway (emergência) /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway update paypal \ --user=1 --enabled=false --allow-root --path=$PATH_WP # Configurar Stripe em modo teste /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway update stripe \ --user=1 \ --settings='{"testmode":"yes","test_publishable_key":"pk_test_XXXX","test_secret_key":"sk_test_XXXX"}' \ --allow-root --path=$PATH_WP ``` --- ## Tributação ```bash PATH_WP="/home/USER/public_html" # Criar taxa IVA 23% (Portugal) /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc tax create \ --user=1 \ --country=PT \ --rate="23" \ --name="IVA 23%" \ --class=standard \ --allow-root --path=$PATH_WP # Criar taxa reduzida 6% /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc tax create \ --user=1 --country=PT --rate="6" --name="IVA 6%" --class=reduced-rate \ --allow-root --path=$PATH_WP # Criar classe de taxa personalizada /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc tax_class create \ --user=1 --name="Taxa Super Reduzida" \ --allow-root --path=$PATH_WP # Activar cálculo de impostos /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_calc_taxes "yes" \ --allow-root --path=$PATH_WP ``` --- ## Cupões ```bash PATH_WP="/home/USER/public_html" # Criar cupão de desconto percentual /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_coupon create \ --user=1 \ --code="VERAO2026" \ --discount_type=percent \ --amount="15" \ --usage_limit=500 \ --expiry_date="2026-09-30" \ --allow-root --path=$PATH_WP # Criar cupão de desconto fixo /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_coupon create \ --user=1 \ --code="DESCONTO10" \ --discount_type=fixed_cart \ --amount="10" \ --minimum_amount="50" \ --allow-root --path=$PATH_WP # Listar cupões activos /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_coupon list \ --user=1 --fields=id,code,amount,discount_type,usage_count \ --format=table --allow-root --path=$PATH_WP ``` --- ## Ferramentas de Manutenção ```bash PATH_WP="/home/USER/public_html" WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" # Listar todas as ferramentas $WP wc tool list --user=1 --fields=id,name,description --format=table # Limpar transients $WP wc tool run clear_transients --user=1 # Recalcular contadores de taxonomias (categorias/tags) $WP wc tool run recount_terms --user=1 # Eliminar variações órfãs $WP wc tool run delete_orphaned_variations --user=1 # Limpar sessões e carrinhos abandonados $WP wc tool run clear_sessions --user=1 # Regenerar imagens de produto $WP wc tool run regenerate_thumbnails --user=1 # Regenerar dados de lookup (tabela de relatórios) $WP wc tool run clear_lookup_table --user=1 # Sequência completa de limpeza (recomendada após alterações massivas) $WP wc tool run delete_orphaned_variations --user=1 $WP wc tool run recount_terms --user=1 $WP wc tool run clear_sessions --user=1 $WP wc tool run clear_transients --user=1 $WP cache flush $WP rewrite flush echo "Limpeza concluída." ``` --- ## WP All Import — Importação Massiva ```bash PATH_WP="/home/USER/public_html" # Verificar se plugin está activo /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp plugin is-active wp-all-import-pro \ --allow-root --path=$PATH_WP && echo "Activo" || echo "Inactivo" # Executar perfil de importação pré-configurado (ID=5) # Configurar mapeamentos no painel WP All Import primeiro /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp all-import run 5 \ --force-run --disable-log \ --allow-root --path=$PATH_WP # Listar perfis de importação /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp all-import status \ --allow-root --path=$PATH_WP ``` --- ## Importação via CSV (Script) ```bash #!/bin/bash # Importar produtos a partir de CSV (colunas: SKU,TITULO,PRECO) PATH_WP="/home/USER/public_html" WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" CSV="/home/USER/produtos.csv" ERROS=0 OK=0 tail -n +2 "$CSV" | while IFS=, read -r SKU TITULO PRECO; do ID=$($WP wc product create \ --user=1 \ --sku="$SKU" \ --name="$TITULO" \ --regular_price="$PRECO" \ --type=simple \ --status=publish \ --porcelain 2>/dev/null) if [ -n "$ID" ] && [ "$ID" -gt 0 ] 2>/dev/null; then echo "[OK] $SKU → ID $ID" OK=$((OK+1)) else echo "[ERRO] $SKU — falhou" ERROS=$((ERROS+1)) fi done echo "Importação concluída. OK: $OK | Erros: $ERROS" ``` --- ## Scripts de Manutenção ### Normalização Preventiva de Dados ```bash #!/bin/bash PATH_WP="/home/USER/public_html" WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" echo "=== LIMPEZA WOOCOMMERCE ===" echo "Site: $PATH_WP | $(date)" $WP wc tool run delete_orphaned_variations --user=1 --quiet && echo "[OK] Variações órfãs" $WP wc tool run recount_terms --user=1 --quiet && echo "[OK] Contadores taxonomias" $WP wc tool run clear_sessions --user=1 --quiet && echo "[OK] Sessões" $WP wc tool run clear_transients --user=1 --quiet && echo "[OK] Transients" $WP cache flush && echo "[OK] Object cache" $WP rewrite flush && echo "[OK] Rewrite rules" $WP db optimize --quiet && echo "[OK] BD optimizada" echo "=== CONCLUÍDO ===" ``` ### Manutenção WooCommerce em Todos os Sites CWP ```bash #!/bin/bash find /home -name wp-config.php -not -path "*/backup*" 2>/dev/null | while read config; do dir=$(dirname "$config") user=$(stat -c '%U' "$dir") php_fpm=$(ps aux | grep "php-fpm: pool ${user}" | grep -v grep | head -1 | grep -o 'php-fpm[0-9][0-9]' | head -1) php_ver=${php_fpm:-php-fpm82} php_bin="/opt/alt/${php_ver}/usr/bin/php" WP="$php_bin /usr/local/bin/wp --allow-root --path=$dir" echo "=== $user ($dir) ===" # Verificar se WooCommerce está activo if $WP plugin is-active woocommerce 2>/dev/null; then $WP wc tool run clear_transients --user=1 --quiet 2>/dev/null $WP wc tool run recount_terms --user=1 --quiet 2>/dev/null echo " [WC] Limpeza WooCommerce concluída." else echo " [--] WooCommerce não activo." fi done ``` --- ## Limitações e Bugs Conhecidos ### Memory Exhaustion — Override CWP ```bash # -d memory_limit antes de /usr/local/bin/wp /opt/alt/php-fpm83/usr/bin/php -d memory_limit=2G /usr/local/bin/wp wc product list \ --user=1 --per_page=100 --format=ids \ --allow-root --path=/home/USER/public_html # Para catálogos muito grandes: iterar com --per_page=100 e --page=N for PAGE in 1 2 3 4 5; do /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product list \ --user=1 --per_page=100 --page=$PAGE --format=ids \ --allow-root --path=/home/USER/public_html done ``` ### Bug `wp wc update` — Versão BD não actualiza ```bash # Verificar versão instalada /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp plugin get woocommerce \ --field=version --allow-root --path=/home/USER/public_html # Forçar actualização manual do registo BD /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_db_version "9.X.X" \ --allow-root --path=/home/USER/public_html ``` ### Bypass Wizard de Onboarding ```bash /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_onboarding_opt_in "yes" \ --allow-root --path=/home/USER/public_html /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_task_list_hidden "yes" \ --allow-root --path=/home/USER/public_html /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_setup_wizard_data \ '{"setup_wizard":"completed"}' --allow-root --path=/home/USER/public_html ``` --- ## Settings via wp_options Algumas configurações WooCommerce não têm endpoint CLI nativo. Usar `wp option update` directamente: ```bash PATH_WP="/home/USER/public_html" # Moeda /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_currency "EUR" \ --allow-root --path=$PATH_WP # Posição do símbolo de moeda /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_currency_pos "right_space" \ --allow-root --path=$PATH_WP # Separadores de preço (PT-PT) /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_price_thousand_sep "." \ --allow-root --path=$PATH_WP /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_price_decimal_sep "," \ --allow-root --path=$PATH_WP # País de base da loja /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_default_country "PT" \ --allow-root --path=$PATH_WP # Activar impostos /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_calc_taxes "yes" \ --allow-root --path=$PATH_WP ``` --- *Referência WooCommerce CLI CWP | Descomplicar® | v1.0.0 | 18-02-2026*