Inteligência Artificial

Descrição em massa no WooCommerce: wp eval-file lendo a lista de SKUs

Importei 400 produtos do fornecedor por CSV e a aba Descrição veio vazia em todos. No admin, um a um, não dá. O que resolve é um arquivo PHP de trinta linhas rodado por wp eval-file: ele pega os IDs sem post_content, pede o texto pro endpoint que você já usa (minha_api_descricao() é função sua) e grava. Em modo seco na primeira passada.

O arquivo que varre os SKUs vazios

<?php
// gera-desc.php — roda por wp eval-file, que avalia o arquivo dentro de um
// método: variável global só existe aqui se você declarar global.
global $wpdb;

$seco = ($args[0] ?? '') === 'seco';

$ids = $wpdb->get_col(
  "SELECT ID FROM {$wpdb->posts}
   WHERE post_type = 'product' AND post_status = 'publish'
     AND TRIM(post_content) = '' LIMIT 400"
);

foreach ($ids as $id) {
  $p = wc_get_product($id);
  if (!$p) { continue; }

  $sku = $p->get_sku() ?: $id;
  $txt = minha_api_descricao($sku, $p->get_name());

  if ($seco) { WP_CLI::log("[seco] {$sku}: " . mb_substr($txt, 0, 70)); continue; }

  $p->set_description(wp_kses_post($txt));
  $p->save();
  WP_CLI::success("{$sku} gravado");
}

A chamada fica sudo -u www-data wp eval-file gera-desc.php seco. O sinalizador vai como argumento posicional, não como --dry-run: o eval-file só declara --skip-wordpress e --use-include no synopsis, e qualquer outra flag derruba tudo com erro de parâmetro desconhecido. Os posicionais caem em $args, que o WP-CLI deixa pronta dentro do arquivo.

A parte que morde depois

O global $wpdb da terceira linha não é firula. O eval-file avalia o conteúdo do arquivo dentro de um método do próprio comando, então nada de escopo global chega ali sozinho, e sem essa linha você toma Call to a member function get_col() on null. Gravar por $p->set_description() e $p->save() é de propósito: passando pelo CRUD do Woo os transients do produto caem junto. Se preferir wp_update_post(), chame wc_delete_product_transients($id) depois, senão a loja segue com a descrição velha.

Antes de soltar o comando sem o seco, exporte o banco: sudo -u www-data wp db export antes-desc.sql. Texto ruim gravado em 400 produtos você desfaz em um minuto com o dump e em duas horas na mão.

Post Recentes

Custom post type dando 404: flush_rewrite_rules na ativação do plugin

A listagem do custom post type abre e o single dá 404 no WordPress 6.9. Entenda o cache das rewrite…

4 horas atrás

systemd timer no lugar do cron: agendar script com log e sem execução dupla

Um par .service e .timer substitui a linha do crontab com log no journal, execução perdida recuperada no boot e…

13 horas atrás

Frete grátis no WooCommerce: esconder as outras opções de entrega

Some com PAC e SEDEX da lista quando o frete grátis está disponível, usando woocommerce_package_rates, e limpe o cache de…

1 dia atrás

Erro HTTP no WordPress ao enviar imagem para a biblioteca de mídia

A barra de upload chega no fim e o WordPress devolve só "Erro HTTP". Separe as três causas: Imagick barrado…

2 dias atrás

style amp-custom acima de 75KB: como cortar o CSS inline do AMP

The author stylesheet specified in tag 'style amp-custom' is too long? Meça o bloco com curl e tire da fila…

2 dias atrás

Creation of dynamic property: deprecated no PHP 8.3 com WordPress 6.9

debug.log crescendo em gigabytes com avisos de propriedade dinâmica. Veja como isolar o plugin culpado, corrigir a classe e silenciar…

3 dias atrás