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.

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *