namespace AngieSnippets\ImportarInvitadosBoda_1a229bb4; /** * Importación de invitados desde CSV * Ejecutar desde: * /?importar_invitados=1&clave=boda2026 */ add_action('init', function () { // Seguridad: solo ejecutar con los parámetros correctos. if ( !isset($_GET['importar_invitados']) || $_GET['importar_invitados'] !== '1' || !isset($_GET['clave']) || $_GET['clave'] !== 'boda2026' ) { return; } // Solo administradores. if (!current_user_can('manage_options')) { wp_die('No tienes permisos para ejecutar esta importación.'); } // Mensaje para confirmar que esta versión del código se está ejecutando. $version_importador = 'Importador v4'; // URL del CSV. $csv_url = 'https://ivanymarina.com/wp-content/uploads/2026/10/Invitados-boda-Hoja-1.csv'; // Descargar CSV. $response = wp_remote_get($csv_url, [ 'timeout' => 30, ]); if (is_wp_error($response)) { wp_die( '

' . esc_html($version_importador) . '

' . '

No se pudo descargar el CSV.

' . '

' . esc_html($response->get_error_message()) . '

' ); } $csv = wp_remote_retrieve_body($response); if (empty($csv)) { wp_die( '

' . esc_html($version_importador) . '

' . '

El CSV está vacío o no se pudo leer.

' ); } // Eliminar BOM UTF-8 si existe. $csv = preg_replace('/^\xEF\xBB\xBF/', '', $csv); // Separar las líneas. $lines = preg_split('/\r\n|\r|\n/', trim($csv)); if (count($lines) < 2) { wp_die( '

' . esc_html($version_importador) . '

' . '

El CSV no contiene registros suficientes.

' ); } /* * La primera línea es la cabecera. * No necesitamos interpretar sus nombres. * * El CSV tiene estas tres columnas: * * 0 = ID en URL * 1 = Nombre a mostrar * 2 = Singular o plural */ array_shift($lines); $index_id = 0; $index_nombre = 1; $index_plural = 2; $creados = 0; $actualizados = 0; $errores = 0; foreach ($lines as $line) { // Ignorar líneas vacías. if (trim($line) === '') { continue; } /* * Leer la fila. * El CSV que hemos comprobado utiliza comas. */ $row = str_getcsv($line, ','); // Si por algún motivo la fila no tiene 3 columnas, // intentar también con punto y coma. if (count($row) < 3) { $row = str_getcsv($line, ';'); } // Comprobar que tenemos al menos las 3 columnas. if (count($row) < 3) { $errores++; continue; } // Columna 0: URL completa. $url_completa = isset($row[$index_id]) ? trim($row[$index_id]) : ''; // Columna 1: nombre. $nombre = isset($row[$index_nombre]) ? trim($row[$index_nombre]) : ''; // Columna 2: singular/plural. $tipo = isset($row[$index_plural]) ? trim($row[$index_plural]) : ''; // Si falta URL o nombre, no podemos crear el invitado. if (!$url_completa || !$nombre) { $errores++; continue; } /* * Extraer el valor de ?invitado= * * Ejemplo: * https://ivanymarina.com/?invitado=fernando-y-marisol * * Resultado: * fernando-y-marisol */ $slug = ''; $query = wp_parse_url($url_completa, PHP_URL_QUERY); if ($query) { parse_str($query, $query_vars); if (!empty($query_vars['invitado'])) { $slug = sanitize_title($query_vars['invitado']); } } /* * Si no encontramos ?invitado=, intentamos utilizar * directamente el valor de la primera columna. */ if (!$slug) { $slug = sanitize_title($url_completa); } if (!$slug) { $errores++; continue; } /* * Normalizar singular/plural. */ $tipo_normalizado = strtolower( remove_accents(trim($tipo)) ); if ($tipo_normalizado === 'plural') { $tipo_guardar = 'plural'; } else { $tipo_guardar = 'singular'; } /* * Buscar si ya existe un invitado con este id_url. */ $existentes = get_posts([ 'post_type' => 'invitado', 'post_status' => 'any', 'posts_per_page' => 1, 'meta_key' => 'id_url', 'meta_value' => $slug, 'fields' => 'ids', ]); /* * SI YA EXISTE → actualizar. */ if (!empty($existentes)) { $post_id = $existentes[0]; wp_update_post([ 'ID' => $post_id, 'post_title' => $nombre, ]); /* * Guardar los campos ACF. */ if (function_exists('update_field')) { update_field( 'id_url', $slug, $post_id ); update_field( 'nombre_a_mostrar', $nombre, $post_id ); update_field( 'singular_o_plural', $tipo_guardar, $post_id ); } else { // Fallback por si ACF no estuviera disponible. update_post_meta( $post_id, 'id_url', $slug ); update_post_meta( $post_id, 'nombre_a_mostrar', $nombre ); update_post_meta( $post_id, 'singular_o_plural', $tipo_guardar ); } $actualizados++; /* * SI NO EXISTE → crear. */ } else { $post_id = wp_insert_post([ 'post_type' => 'invitado', 'post_status' => 'publish', 'post_title' => $nombre, ], true); if (is_wp_error($post_id)) { $errores++; continue; } /* * Guardar los campos ACF. */ if (function_exists('update_field')) { update_field( 'id_url', $slug, $post_id ); update_field( 'nombre_a_mostrar', $nombre, $post_id ); update_field( 'singular_o_plural', $tipo_guardar, $post_id ); } else { // Fallback por si ACF no estuviera disponible. update_post_meta( $post_id, 'id_url', $slug ); update_post_meta( $post_id, 'nombre_a_mostrar', $nombre ); update_post_meta( $post_id, 'singular_o_plural', $tipo_guardar ); } $creados++; } } /* * Resultado final. */ wp_die( '
' . '

Importación terminada

' . '

Versión: ' . esc_html($version_importador) . '

' . '
' . '

Creados: ' . intval($creados) . '

' . '

Actualizados: ' . intval($actualizados) . '

' . '

Errores: ' . intval($errores) . '

' . '
' . '

Ya puedes volver al escritorio de WordPress.

' . '
' ); }); https://ivanymarina.com/wp-sitemap-posts-post-1.xmlhttps://ivanymarina.com/wp-sitemap-posts-page-1.xmlhttps://ivanymarina.com/wp-sitemap-posts-invitado-1.xmlhttps://ivanymarina.com/wp-sitemap-taxonomies-category-1.xmlhttps://ivanymarina.com/wp-sitemap-users-1.xml