Importador XML

<?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: Tu Nombre
 */

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>";
}

Publicado por

Juan Pablo Fuentes

Formador de programación y bases de datos