Woocommerce

Preço promocional em massa no WooCommerce: agendar a Black Friday pelo WP-CLI

A planilha da Black Friday chega com centenas de SKUs e preço novo. Pelo painel é uma tarde de produto em produto; pelo WP-CLI, um CSV com sku,preco e um script que usa a API de produto do WooCommerce e guarda antes o que estava lá.

O script que agenda e guarda o backup

<?php
// bf-agendar.php
[$arquivo, $inicio, $fim] = $args;
$entrada = fopen($arquivo, 'r');
$backup  = fopen('bf-backup.csv', 'x') ?: WP_CLI::error('bf-backup.csv já existe');

while (($linha = fgetcsv($entrada, escape: '')) !== false) {
    [$sku, $preco] = $linha;
    $p = wc_get_product(wc_get_product_id_by_sku($sku));
    if (!$p || $p->is_type('variable')) {
        WP_CLI::warning("SKU $sku ignorado");
        continue;
    }
    fputcsv($backup, [
        $p->get_id(),
        $p->get_sale_price('edit'),
        $p->get_date_on_sale_from('edit')?->format('Y-m-d H:i:s'),
        $p->get_date_on_sale_to('edit')?->format('Y-m-d H:i:s'),
    ], escape: '');
    $p->set_sale_price($preco);
    $p->set_date_on_sale_from($inicio);
    $p->set_date_on_sale_to($fim);
    $p->save();
}

Rode com o usuário dono dos arquivos, de uma pasta fora do docroot, com o CSV sem cabeçalho:

wp --path=/var/www/loja eval-file bf-agendar.php precos-bf.csv 
  "2026-11-27 00:00:00" "2026-11-30 23:59:59"

As datas valem no fuso de Configurações > Geral. Produto variável fica de fora porque o preço mora nas variações: a planilha leva o SKU de cada variação. E preço promocional maior ou igual ao normal some calado, porque o save() apaga o sale_price.

Testar no staging sem esperar o dia 27

No staging eu rodo com início daqui a dez minutos e fim daqui a vinte. Do WooCommerce 10.5 em diante cada produto ganha duas ações no Action Scheduler, uma que abre e outra que fecha a promoção:

wp action-scheduler action list --group=woocommerce-sales --status=pending --format=count

Tem que dar duas por SKU. Elas dependem do WP-Cron: com DISABLE_WP_CRON e sem cron no servidor, o preço vira atrasado.

Desfazer depois da Black Friday

<?php
// bf-desfazer.php: wp eval-file bf-desfazer.php bf-backup.csv
$backup = fopen($args[0], 'r');
while (($linha = fgetcsv($backup, escape: '')) !== false) {
    [$id, $preco, $de, $ate] = $linha;
    $p = wc_get_product((int) $id);
    $p->set_sale_price($preco);
    $p->set_date_on_sale_from($de);
    $p->set_date_on_sale_to($ate);
    $p->save();
}

Quando a data final passa, o WooCommerce volta sozinho ao preço normal, mas a promoção própria que o produto tinha antes foi sobrescrita, e só o backup devolve. Rode no dia 1º de dezembro, nunca no meio da campanha, e teste o desfazer no staging logo depois do agendar.

Post Recentes

Too many connections no MySQL: achar quem segura as conexões antes de subir o limite

O erro 1040 aparece quando todas as conexões estão ocupadas. Antes de subir o max_connections, veja quem está segurando cada…

15 horas atrás

WP_MEMORY_LIMIT no WordPress: resolver memória esgotada no PHP 8.3

Allowed memory size exhausted no painel: qual das duas constantes do wp-config.php mexer, onde conferir o valor real e por…

1 dia atrás

Converter data dd/mm/aaaa para o MySQL com DateTime::createFromFormat

strtotime com data brasileira devolve false e o INSERT quebra no MySQL 8. Use createFromFormat com getLastErrors antes de mandar…

3 dias atrás

Erro 500 no Magento 2: achar o relatório em var/report pelo ID da tela

O hash que o Magento mostra junto do erro é o nome de um arquivo em var/report. Veja como abrir,…

4 dias atrás

Campo extra no checkout em blocos do WooCommerce sem voltar pro shortcode

Seu snippet com woocommerce_checkout_fields parou de aparecer no checkout em blocos. Registre o campo pela API nova e leia o…

5 dias atrás

Fuso horário no PHP 8.3: log com 3 horas de diferença no servidor

O pedido entrou às 21h e o relatório mostra 00h do dia seguinte. Onde setar date.timezone no PHP 8.3 e…

6 dias atrás