created_bynombre», generado desde Joomla: * IDS= # 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";