
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.
<?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.
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.
A listagem do custom post type abre e o single dá 404 no WordPress 6.9. Entenda o cache das rewrite…
Um par .service e .timer substitui a linha do crontab com log no journal, execução perdida recuperada no boot e…
Some com PAC e SEDEX da lista quando o frete grátis está disponível, usando woocommerce_package_rates, e limpe o cache de…
A barra de upload chega no fim e o WordPress devolve só "Erro HTTP". Separe as três causas: Imagick barrado…
The author stylesheet specified in tag 'style amp-custom' is too long? Meça o bloco com curl e tire da fila…
debug.log crescendo em gigabytes com avisos de propriedade dinâmica. Veja como isolar o plugin culpado, corrigir a classe e silenciar…