95 lines
4.1 KiB
PHP
95 lines
4.1 KiB
PHP
<?php
|
|
/**
|
|
* fix_k2_authors.php (#143) — Corrige la autoría de artículos de origen K2 que
|
|
* quedaron atribuidos al usuario genérico «Fe Adulta» (post_author 1 / 890)
|
|
* porque el importador de delta (import_new_k2_items.py) no encontró un usuario
|
|
* WP para su `created_by` de Joomla y cayó al fallback admin.
|
|
*
|
|
* Qué hace, por cada artículo del TSV de entrada:
|
|
* 1. Crea (idempotente) un usuario WP rol 'subscriber' con el nombre real del
|
|
* autor (display_name), login = slug del nombre, email = slug@feadulta.com.
|
|
* 2. Reasigna post_author del/los post WP de ese K2 (los que sigan en 1/890).
|
|
*
|
|
* Entrada: un TSV «k2_id<TAB>created_by<TAB>nombre», generado desde Joomla:
|
|
* IDS=<lista de k2_id atribuidos a 1/890> # de wp: meta _fgj2wp_old_k2_id
|
|
* mysql --skip-ssl ... fejoomla3 -N -e \
|
|
* "SELECT i.id, i.created_by, COALESCE(u.name,'') \
|
|
* FROM ew4r_k2_items i LEFT JOIN ew4r_users u ON u.id=i.created_by \
|
|
* WHERE i.id IN ($IDS);" > /tmp/autores143.tsv
|
|
*
|
|
* Uso (en el servidor, dentro de /web/wp-nuevo):
|
|
* FEA_TSV=/tmp/autores143.tsv wp eval-file scripts/fix_k2_authors.php # dry-run
|
|
* APPLY=1 FEA_TSV=/tmp/autores143.tsv wp eval-file scripts/fix_k2_authors.php # aplica
|
|
*
|
|
* Notas:
|
|
* - Los autores con created_by cuyo usuario Joomla ya no existe llegan con
|
|
* nombre vacío en el TSV → se SALTAN (no recuperable; firma en el cuerpo).
|
|
* - El nombre literal «Fe Adulta» se salta (es legítimo).
|
|
* - Los nuevos usuarios quedan sin foto_perfil (avatar genérico). Si se quiere
|
|
* avatar propio, generarlo aparte (ver flujo de avatares #62).
|
|
*/
|
|
|
|
$APPLY = getenv('APPLY') === '1';
|
|
$TSV = getenv('FEA_TSV') ?: '/tmp/autores143.tsv';
|
|
if (!is_readable($TSV)) { fwrite(STDERR, "No puedo leer TSV: $TSV\n"); exit(1); }
|
|
|
|
global $wpdb;
|
|
$GENERIC = [1, 890];
|
|
$SKIP_NAMES = ['Fe Adulta'];
|
|
|
|
$byname = [];
|
|
foreach (file($TSV) as $line) {
|
|
$r = explode("\t", rtrim($line, "\n"));
|
|
if (count($r) < 3) continue;
|
|
$name = trim($r[2]);
|
|
if ($name === '' || in_array($name, $SKIP_NAMES, true)) continue;
|
|
$byname[$name][] = (int) $r[0];
|
|
}
|
|
|
|
$created = 0; $reassigned = 0; $log = [];
|
|
foreach ($byname as $name => $k2ids) {
|
|
$login = sanitize_user(sanitize_title($name), true);
|
|
$u = get_user_by('login', $login);
|
|
if (!$u) {
|
|
$email = $login . '@feadulta.com'; $i = 2;
|
|
while (email_exists($email)) { $email = $login . $i . '@feadulta.com'; $i++; }
|
|
if ($APPLY) {
|
|
$uid = wp_insert_user([
|
|
'user_login' => $login,
|
|
'user_pass' => wp_generate_password(20),
|
|
'user_email' => $email,
|
|
'display_name' => $name,
|
|
'nickname' => $name,
|
|
'role' => 'subscriber',
|
|
]);
|
|
if (is_wp_error($uid)) { $log[] = "ERROR crear '$name': " . $uid->get_error_message(); continue; }
|
|
$u = get_userdata($uid); $created++;
|
|
$log[] = "USER creado: '$name' -> id $uid ($login / $email)";
|
|
} else {
|
|
$log[] = "[dry] crearia USER '$name' ($login / $email)"; $created++;
|
|
}
|
|
} else {
|
|
$log[] = "USER ya existe: '$name' -> id {$u->ID} ($login)";
|
|
}
|
|
$uid = $u ? $u->ID : 0;
|
|
foreach ($k2ids as $k2) {
|
|
$pids = $wpdb->get_col($wpdb->prepare(
|
|
"SELECT DISTINCT post_id FROM {$wpdb->postmeta}
|
|
WHERE meta_key='_fgj2wp_old_k2_id' AND meta_value=%s", (string) $k2));
|
|
foreach ($pids as $pid) {
|
|
$a = (int) get_post_field('post_author', $pid);
|
|
if (!in_array($a, $GENERIC, true)) continue;
|
|
if ($APPLY && $uid) {
|
|
wp_update_post(['ID' => (int) $pid, 'post_author' => $uid]);
|
|
$reassigned++; $log[] = " post $pid (k2 $k2) author $a -> $uid";
|
|
} else {
|
|
$reassigned++; $log[] = " [dry] post $pid (k2 $k2) author $a -> '$name'";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
echo implode("\n", $log) . "\n";
|
|
echo "\nRESUMEN: usuarios " . ($APPLY ? 'creados' : 'a crear') . ": $created ; "
|
|
. "posts " . ($APPLY ? 'reasignados' : 'a reasignar') . ": $reassigned "
|
|
. "(modo " . ($APPLY ? 'APPLY' : 'DRY-RUN') . ")\n";
|