<?php
/**
* Plugin Name: Importador XML Avanzado
* Description: Permite subir un archivo XML desde el panel de administración y genera entradas evitando duplicados.
* Version: 1.1
* Author: Juan Pablo
*/
if ( ! defined( 'ABSPATH' ) ) exit; // seguridad
// Menú en administración
add_action('admin_menu', 'importador_xml_menu');
function importador_xml_menu() {
add_menu_page(
'Importador XML',
'Importador XML',
'manage_options',
'importador-xml',
'importador_xml_page',
'dashicons-database-import'
);
}
// Página del plugin
function importador_xml_page() {
?>
<div class="wrap">
<h1>Importador de Entradas desde XML</h1>
<h2>Subir XML</h2>
<form method="post" enctype="multipart/form-data">
<?php wp_nonce_field('importador_xml_nonce','importador_xml_nonce_field'); ?>
<input type="file" name="archivo_xml" accept=".xml" required>
<input type="submit" name="subir_xml" class="button button-secondary" value="Subir XML">
</form>
<h2>Importar entradas</h2>
<form method="post">
<?php wp_nonce_field('importador_xml_nonce','importador_xml_nonce_field'); ?>
<input type="submit" name="importar_xml" class="button button-primary" value="Importar desde XML">
</form>
</div>
<?php
// Procesar subida
if (isset($_POST['subir_xml']) && check_admin_referer('importador_xml_nonce','importador_xml_nonce_field')) {
importador_xml_subir();
}
// Procesar importación
if (isset($_POST['importar_xml']) && check_admin_referer('importador_xml_nonce','importador_xml_nonce_field')) {
importador_xml_procesar();
}
}
// Subir archivo XML a /uploads/importador-xml/
function importador_xml_subir() {
if (!empty($_FILES['archivo_xml']['tmp_name'])) {
$upload_dir = wp_upload_dir();
$destino_dir = $upload_dir['basedir'] . '/importador-xml/';
if (!file_exists($destino_dir)) {
wp_mkdir_p($destino_dir);
}
$destino = $destino_dir . 'datos.xml';
if (move_uploaded_file($_FILES['archivo_xml']['tmp_name'], $destino)) {
echo "<div class='updated'><p>Archivo subido correctamente: " . esc_html($destino) . "</p></div>";
} else {
echo "<div class='error'><p>Error al subir el archivo.</p></div>";
}
}
}
// Procesar archivo XML y crear posts
function importador_xml_procesar() {
$upload_dir = wp_upload_dir();
$ruta = $upload_dir['basedir'] . '/importador-xml/datos.xml';
if (!file_exists($ruta)) {
echo "<div class='error'><p>No se encontró ningún archivo XML en: $ruta</p></div>";
return;
}
$xml = simplexml_load_file($ruta);
if (!$xml) {
echo "<div class='error'><p>Error al leer el archivo XML.</p></div>";
return;
}
$contador = 0;
foreach ($xml->item as $item) {
$titulo = sanitize_text_field((string) $item->title);
$contenido = wp_kses_post((string) $item->body);
// Comprobar si ya existe un post con este título
$existe = get_page_by_title($titulo, OBJECT, 'post');
if (!$existe) {
$nuevo_post = array(
'post_title' => $titulo,
'post_content' => $contenido,
'post_status' => 'publish',
'post_author' => get_current_user_id(),
'post_type' => 'post'
);
wp_insert_post($nuevo_post);
$contador++;
}
}
echo "<div class='updated'><p>Se importaron $contador nuevas entradas desde el XML.</p></div>";
}