Como exportar datos de WordPress a CSV o Excel

Como exportar datos de WordPress a CSV o Excel

Última verificación: 20 de septiembre de 2026
9 min de lectura
Guía
Desarrollador full-stack

Exportar datos de WordPress no siempre requiere un plugin. Si necesitas posts, usuarios, envíos de formularios o pedidos de WooCommerce en una hoja de cálculo, el método correcto depende del tamaño del dataset, de quién consume el archivo y de con qué frecuencia corre el trabajo.

Usa CSV plano para la mayoría de las exportaciones, transmite filas con fputcsv() para descargas en el navegador, procesa por lotes con WP_Query y pasa a WP-CLI cuando una petición de admin chocaría con límites de memoria o timeout. Usa la REST API cuando otro sistema necesita datos estructurados en lugar de un archivo.

#Elige el método de exportación correcto

Tres enfoques cubren casi todos los trabajos de exportación en WordPress:

  • PHP dentro de WordPress para descargas de admin con comprobación de capacidades
  • WP-CLI para datasets grandes y trabajos programados en el servidor
  • REST API para dashboards, warehouses, CRMs y consumidores headless

Las exportaciones ocasionales y pequeñas encajan bien en una descarga PHP. Tablas recurrentes o muy grandes pertenecen a la CLI. Los sistemas externos deberían tirar JSON por REST y dar forma al CSV fuera de WordPress cuando aún necesiten una hoja.

Empareja el método con el modo de fallo. Las descargas en el navegador fallan por timeout. Los plugins fallan cuando intentan construir un objeto de hoja completo en una sola petición. Los dumps SQL ad hoc fallan cuando los nombres de columna cambian tras actualizar un plugin. Elige el camino que mantenga la exportación reproducible el mes que viene, no solo hoy.

En tiendas españolas que cruzan informes con ContaPlus o con un Excel de finanzas, el patrón que más veces evita el caos del viernes es WP-CLI por la noche y CSV diurno solo para muestras. ¿Necesitas un exportador cableado a tu stack? Habla con un desarrollador WordPress que ya haya enviado exportaciones en producción, o contáctanos.

#CSV vs XLSX

Empieza por CSV salvo que un stakeholder tenga un requisito duro de .xlsx.

Fortalezas del CSV

  • Fácil de generar con PHP o WP-CLI
  • Fácil de inspeccionar y depurar en un editor de texto
  • Se abre en Excel, Numbers y Google Sheets
  • Evita librerías XLSX y su coste de memoria

Compromisos del XLSX

  • Formato binario con hojas, estilos y cadenas compartidas
  • Necesita una librería como PhpSpreadsheet o un paso de conversión post-exportación
  • Construye más estado en memoria antes de que el archivo esté completo
  • Más difícil de transmitir con seguridad durante una petición HTTP larga

Patrón práctico: exporta CSV desde WordPress y convierte después con Excel, LibreOffice o un script offline pequeño si alguien insiste en XLSX. Así la petición de WordPress se mantiene ligera.

Tip Excel: los CSV UTF-8 a veces necesitan un BOM (\xEF\xBB\xBF) para que Excel en Windows abra bien tildes y eñes. Escribe el BOM antes de la fila de encabezado cuando tu audiencia vive en Excel.

#Exportar CSV con PHP

En herramientas de admin personalizadas, transmite el CSV al navegador. Primero las comprobaciones de capacidad. Luego define encabezados, abre php://output, escribe la fila de encabezado y transmite las filas de datos.

function wppoland_export_users_csv() {
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( 'Access denied.' );
    }

    header( 'Content-Type: text/csv; charset=utf-8' );
    header( 'Content-Disposition: attachment; filename=users-export.csv' );

    $output = fopen( 'php://output', 'w' );
    // BOM opcional para Excel en Windows:
    // fwrite( $output, "\xEF\xBB\xBF" );
    fputcsv( $output, array( 'ID', 'Email', 'Registered' ) );

    $users = get_users(
        array(
            'fields' => array( 'ID', 'user_email', 'user_registered' ),
            'number' => 500,
        )
    );

    foreach ( $users as $user ) {
        fputcsv(
            $output,
            array(
                $user->ID,
                $user->user_email,
                $user->user_registered,
            )
        );
    }

    fclose( $output );
    exit;
}

Este patrón funciona para exportaciones más pequeñas y herramientas internas de admin. No recopiles todas las filas en un array PHP gigante para luego hacer implode. Transmite cada fila a medida que la obtienes.

Protege el endpoint con nonce y comprobación de capacidad. Las exportaciones de usuarios y pedidos suelen contener datos personales, así que trátalas como cualquier otra acción privilegiada de admin bajo reglas al estilo RGPD: registra quién ejecutó la exportación y mantén el archivo fuera de URLs públicas.

#Procesar por lotes con WP_Query y evitar límites de memoria

El modo de fallo habitual es cargar demasiado de una vez. Los límites de memoria de PHP, max_execution_time y los timeouts de reverse proxy matan exportaciones largas en el admin. Procesa por lotes con WP_Query usando posts_per_page y offset, o mejor, pagina con un cursor estable cuando el offset se vuelve caro en tablas grandes.

$offset = 0;
$limit  = 500;

do {
    $query = new WP_Query(
        array(
            'post_type'              => 'post',
            'post_status'            => 'publish',
            'posts_per_page'         => $limit,
            'offset'                 => $offset,
            'fields'                 => 'ids',
            'no_found_rows'          => true,
            'update_post_meta_cache' => false,
            'update_post_term_cache' => false,
        )
    );

    foreach ( $query->posts as $post_id ) {
        fputcsv( $output, array( $post_id, get_the_title( $post_id ) ) );
    }

    $offset += $limit;
    wp_cache_flush(); // opcional en bucles muy largos en CLI/herramientas de admin
} while ( ! empty( $query->posts ) );

Por qué ayuda:

  • fields => 'ids' mantiene ligera la hidratación de objetos
  • Desactivar caches de meta y términos evita que el object cache crezca sin límite
  • Tamaños de lote fijos mantienen el pico de memoria cerca de una página de filas
  • Transmitir con fputcsv() evita guardar la cadena CSV completa en RAM

En tablas muy grandes, el propio offset se vuelve lento porque MySQL aún recorre las filas descartadas. Prefiere keyset pagination: WHERE ID > last_id ORDER BY ID ASC LIMIT N. En trabajos CLI, ese patrón vale el código extra.

Referencia oficial de los argumentos de consulta: la clase WP_Query en developer.wordpress.org.

#Usar WP-CLI para exportaciones pesadas

Cuando exportas decenas de miles de filas, WP-CLI evita el navegador y la cadena de timeouts del servidor web.

wp post list --post_type=post --fields=ID,post_title,post_date --format=csv > posts.csv

Útil para:

  • catálogos grandes de posts o productos
  • dumps de pedidos WooCommerce que provocarían timeout en wp-admin
  • exportaciones nocturnas vía cron a object storage o una carpeta compartida
  • entregas de migración y reporting

Documentación del comando: wp post list.

También puedes escribir un comando WP-CLI personalizado que abra un fichero, pagine con WC_Order_Query o WP_Query y escriba CSV a disco. Eso mantiene la memoria predecible y permite reanudar desde un checkpoint si el trabajo se interrumpe.

#Usar la REST API cuando otro sistema necesita los datos

Si el consumidor es software, no una persona con Excel, la REST API suele ser más limpia que generar CSV dentro de WordPress.

Casos típicos:

  • sincronizar contenido a un warehouse o herramienta de BI
  • alimentar un CRM desde usuarios o leads
  • front ends headless que necesitan payloads estructurados de posts

Referencia de la colección de posts: endpoint de Posts.

La REST devuelve JSON. Pagina con page y per_page, autentica con Application Passwords o flujos OAuth que tu hosting soporte, y respeta rate limits. Construye el CSV aguas abajo si aún hace falta una hoja. Esa división mantiene a WordPress responsable del acceso autorizado y deja el formato del archivo al consumidor.

No expongas rutas privilegiadas de exportación sin autenticación. Trata los endpoints de exportación como cualquier otra superficie de admin adyacente a escritura, aunque solo lean.

#Trampas al exportar pedidos de WooCommerce

Las exportaciones de pedidos parecen simples hasta que las líneas de ítem, los reembolsos y HPOS cambian el cuadro.

Las líneas de ítem no son una sola fila. Un pedido puede tener varios productos, tasas, envíos e impuestos. Decide de antemano si una fila CSV significa un pedido o una línea de ítem. Mezclar ambos sin un esquema claro produce hojas inutilizables.

Meta y campos personalizados explotan el ancho. IDs de pasarela de pago, números de tracking y meta de plugins crean columnas anchas y dispersas. Exporta solo los campos que el informe necesita. Añade un segundo archivo para líneas de ítem si debes mantener ambas formas.

Los backends de almacenamiento diferencian. Posts clásicos shop_order y tablas High-Performance Order Storage (HPOS) no se consultan igual. Prefiere el CRUD de WooCommerce (wc_get_orders() / WC_Order_Query) frente a WP_Query crudo sobre shop_order para que el exportador sobreviva a cambios de storage.

Los filtros de estado importan. Borradores, pagos fallidos, reembolsados y papelera inflan o sesgan informes de ingresos. Documenta qué estados incluyes.

PII y acceso. Los pedidos incluyen nombres, emails y direcciones. Comprobaciones de capacidad (manage_woocommerce o una capacidad personalizada), nonces y logs de auditoría pertenecen a todo exportador de admin. Prefiere WP-CLI para dumps masivos para que el archivo nunca quede en una ruta de uploads alcanzable públicamente.

Rendimiento. Unir todas las claves meta de pedido en un solo SQL parece rápido hasta que la tabla crece. Pagina pedidos, hidrata cada uno con wc_get_order(), escribe la fila y descarta el objeto. Ese patrón es más lento por pedido que un JOIN gigante y mucho más estable bajo límites de memoria.

Moneda y formato. Guarda totales como números simples. Deja que Excel formatee la moneda. Separadores de miles específicos del locale dentro de campos CSV rompen importaciones en otras herramientas.

Campos de fecha. Guarda ISO-8601 o timestamps Unix en el CSV y formatea en la hoja. Cadenas de fecha locales mezcladas (03/04/2026 vs 04/03/2026) causan bugs silenciosos de reordenación cuando el archivo cruza regiones - habitual entre equipos en Madrid y clientes en Latinoamérica.

Reembolsos y reembolsos parciales. Decide si los totales reembolsados aparecen como filas negativas, IDs de reembolso separados o totales netos del pedido. Documenta la elección en un README junto al cron de exportación para que finanzas e ingeniería coincidan en la misma hoja.

#Juntarlo todo

  1. Prefiere CSV a XLSX dentro de WordPress.
  2. Transmite con fputcsv() y comprobaciones de capacidad para descargas pequeñas de admin.
  3. Procesa por lotes con WP_Query o consultas WooCommerce; desactiva caches innecesarios.
  4. Mueve trabajos grandes o programados a WP-CLI.
  5. Usa la REST API cuando otro sistema tira datos estructurados.
  6. En WooCommerce, define el grano de la fila (pedido vs línea de ítem) y usa APIs CRUD para que HPOS no rompa el exportador.

Bien hecho, las exportaciones de WordPress se quedan aburridas: columnas predecibles, memoria acotada y sin timeouts sorpresa durante un informe de pico de tráfico.

Siguiente paso

Transforma el artículo en una implementación real

Este bloque refuerza el enlazado interno y lleva al lector al siguiente paso más útil dentro de la arquitectura del sitio.

¿Quieres implementar esto en tu sitio?

Si quieres transformar el artículo en mejoras concretas, rediseño o un plan de implementación, puedo cerrar el alcance y ejecutar.

¿Cuál es la forma más segura de exportar datasets grandes de WordPress?#
Para exportaciones muy grandes, WP-CLI suele ser la opción más segura porque evita los límites de ejecución del navegador y te da mejor control sobre memoria y lotes.
¿Debo exportar a CSV o XLSX desde WordPress?#
CSV suele ser el formato más simple y portable. Si alguien necesita Excel de forma específica, exporta CSV primero y ábrelo o conviértelo después.
¿Puedo exportar pedidos de WooCommerce sin un plugin?#
Sí. Puedes exportar pedidos con PHP, WP-CLI, consultas conscientes de WooCommerce o la REST API, según el tamaño del dataset y el control que necesites sobre líneas de ítem y meta.
¿Cómo evito problemas de memoria y timeout durante la exportación?#
Transmite filas en lugar de construir todo en memoria, obtén registros en lotes y mueve exportaciones muy grandes a WP-CLI o trabajos programados en segundo plano.
¿Cuándo debo usar la REST API en lugar de una descarga CSV?#
Usa la REST API cuando otro sistema necesite JSON estructurado bajo demanda o en horario. Usa CSV cuando una persona necesite una hoja de cálculo.

¿Necesitas un FAQ adaptado a tu sector y mercado? Preparamos una versión alineada con tus objetivos de negocio.

Hablemos

Artículos Relacionados