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.