Exportar los comentarios de WordPress a JSON con Node.js y MySQL
Hoy vamos a hacer algo bastante práctico: exportar los comentarios de un sitio WordPress a un archivo JSON para poder trabajar posteriormente con ellos desde Node.js.
¿Para qué puede servirnos?
Podemos necesitar los comentarios para realizar una migración, crear una copia de seguridad independiente, analizarlos, procesarlos con otro sistema o simplemente trabajar con ellos fuera de WordPress.
En este caso vamos a utilizar Node.js para conectarnos directamente a MySQL y obtener los registros de la tabla de comentarios de WordPress.
¿Por qué no utilizar directamente la REST API?
La REST API de WordPress es una opción perfectamente válida cuando queremos trabajar con los datos desde fuera de WordPress. Sin embargo, si tenemos acceso directo a la base de datos, podemos consultar MySQL directamente y obtener los registros almacenados allí, sin depender de los endpoints de la API ni de las restricciones relacionadas con los estados de los comentarios.
¿Qué vamos a utilizar?
Para este pequeño proyecto necesitaremos:
- Node.js.
- MySQL o MariaDB.
- El paquete
mysql2para realizar la conexión. dotenvpara mantener las credenciales fuera del código.
La idea será muy sencilla:
MySQL ↓ Node.js ↓ Consulta SQL ↓ comments.json
Es decir, Node.js se conectará a nuestra base de datos, ejecutará una consulta sobre la tabla de comentarios de WordPress y guardará el resultado en un archivo JSON.
Preparando el proyecto
Primero crearemos un directorio para nuestro proyecto:
mkdir wordpress-comments-export cd wordpress-comments-export
Inicializamos el proyecto de Node:
npm init -y
Y ahora instalamos las dependencias que necesitamos:
npm install mysql2 dotenv
En el artículo original había un pequeño error tipográfico en el segundo comando: era npm instal dotenv. El comando correcto es:
npm install dotenv
La estructura del proyecto
Podemos mantener una estructura muy sencilla:
wordpress-comments-export/ │ ├── node_modules/ ├── .env ├── .gitignore ├── main.js ├── package.json └── comments.json
El archivo comments.json será generado automáticamente por nuestro script, por lo que no necesitamos crearlo previamente.
Guardando las credenciales en .env
Una de las cosas que no deberíamos hacer es escribir las credenciales de nuestra base de datos directamente dentro del código.
Para ello utilizaremos dotenv.
Crearemos un archivo llamado:
.env
Y dentro tendremos algo parecido a esto:
DB_HOST=localhost DB_USER=usuario DB_PASSWORD=contraseña DB_NAME=nombre_base_datos DB_PORT=3306
Los valores evidentemente dependerán de nuestra instalación.
Importante
El archivo .env contiene información sensible. Si utilizamos Git, debemos añadirlo a .gitignore para evitar subir nuestras credenciales a un repositorio.
Nuestro .gitignore podría contener:
node_modules/ .env comments.json
Conectándonos a MySQL
Ahora llega la parte interesante.
Crearemos nuestro archivo:
main.js
Y empezaremos importando las dependencias:
const mysql = require('mysql2/promise');
const fs = require('fs').promises;
require('dotenv').config();
Estamos utilizando la versión basada en Promises de mysql2, lo que nos permite trabajar cómodamente con async/await.
Obteniendo los comentarios
Ahora podemos crear nuestra función para conectarnos a MySQL y obtener los registros.
async function getComments() {
let connection;
try {
connection = await mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
port: Number(process.env.DB_PORT) || 3306
});
const sqlQuery = `
SELECT *
FROM wp_comments
ORDER BY comment_ID ASC
`;
const [results] = await connection.execute(sqlQuery);
await fs.writeFile(
'comments.json',
JSON.stringify(results, null, 2),
'utf8'
);
console.log(`Comentarios exportados: ${results.length}`);
} catch (error) {
console.error(
'No se han podido exportar los comentarios:',
error.message
);
} finally {
if (connection) {
await connection.end();
}
}
}
getComments();
Con esto ya tenemos prácticamente todo lo necesario.
¿Qué estamos consultando?
La consulta que estamos ejecutando es:
SELECT * FROM wp_comments ORDER BY comment_ID ASC;
La tabla wp_comments es la tabla estándar donde WordPress almacena los comentarios.
Pero hay un detalle que debemos tener en cuenta.
El prefijo puede ser diferente
No debemos asumir que nuestra tabla se llama siempre wp_comments.
WordPress permite utilizar un prefijo diferente al instalarse. Por ejemplo:
wp_comments blog_comments site_comments wp7x_comments
Por tanto, debemos comprobar el prefijo utilizado por nuestra instalación.
Podemos verlo en el archivo:
wp-config.php
Buscaremos:
$table_prefix = 'wp_';
Si nuestra instalación utiliza, por ejemplo, blog_, la consulta sería:
SELECT * FROM blog_comments ORDER BY comment_ID ASC;
¿Qué información contiene wp_comments?
La tabla de comentarios contiene bastante más información de la que podemos ver a simple vista en WordPress.
Entre otros campos podemos encontrarnos:
comment_ID: identificador del comentario.comment_post_ID: publicación a la que pertenece.comment_author: nombre del autor.comment_author_email: correo electrónico.comment_author_url: URL indicada por el autor.comment_content: contenido del comentario.comment_date: fecha del comentario.comment_approved: estado de aprobación.comment_parent: comentario padre, si existe.user_id: usuario de WordPress asociado, si existe.
Al utilizar:
SELECT *
estamos solicitando todas las columnas disponibles.
Esto puede resultar muy cómodo para una exportación general, aunque si nuestro objetivo es trabajar únicamente con determinados campos, es mejor especificarlos explícitamente.
Exportando únicamente determinados campos
Por ejemplo, si solamente queremos obtener el identificador, autor, contenido y fecha:
SELECT
comment_ID,
comment_author,
comment_content,
comment_date
FROM wp_comments
ORDER BY comment_ID ASC;
De esta forma nuestro JSON será más pequeño y contendrá únicamente la información que necesitamos.
Es una buena práctica especialmente cuando vamos a procesar posteriormente los datos.
¿Y qué ocurre con los comentarios aprobados, pendientes o spam?
Aquí está precisamente una de las diferencias importantes respecto al enfoque mediante la REST API.
Los comentarios almacenados en MySQL tienen un estado determinado mediante el campo:
comment_approved
Por ejemplo, podemos consultar todos los comentarios independientemente de su estado:
SELECT * FROM wp_comments ORDER BY comment_ID ASC;
O solamente aquellos que estén aprobados:
SELECT * FROM wp_comments WHERE comment_approved = '1' ORDER BY comment_ID ASC;
También podemos buscar los que estén pendientes:
SELECT * FROM wp_comments WHERE comment_approved = '0' ORDER BY comment_ID ASC;
Por tanto, si tenemos acceso directo a la base de datos, podemos decidir exactamente qué registros queremos exportar.
Generando el archivo JSON
La parte encargada de convertir los resultados en JSON es:
await fs.writeFile(
'comments.json',
JSON.stringify(results, null, 2),
'utf8'
);
JSON.stringify() convierte el array de resultados obtenido de MySQL en una cadena JSON.
El segundo parámetro, null, indica que no vamos a utilizar una función de transformación.
Y el tercer parámetro, 2, añade indentación para que el archivo sea mucho más fácil de leer.
El resultado tendrá una estructura similar a:
[
{
"comment_ID": 1,
"comment_post_ID": 25,
"comment_author": "Juan",
"comment_content": "Un comentario de ejemplo",
"comment_date": "2024-01-01 12:30:00",
"comment_approved": "1"
},
{
"comment_ID": 2,
"comment_post_ID": 30,
"comment_author": "María",
"comment_content": "Otro comentario",
"comment_date": "2024-01-02 18:45:00",
"comment_approved": "1"
}
]
Ejecutando nuestro script
Ya tenemos nuestro proyecto preparado.
Simplemente ejecutaremos:
node main.js
Si todo ha ido correctamente veremos algo parecido a:
Comentarios exportados: 1527
Y en nuestro directorio aparecerá:
comments.json
Ahí tendremos todos los comentarios que haya devuelto nuestra consulta SQL.
Una pequeña mejora: no utilizar SELECT *
Para una prueba rápida, SELECT * está perfectamente bien.
Sin embargo, si vamos a convertir esto en una herramienta que utilizaremos habitualmente, prefiero especificar las columnas que realmente necesito.
Por ejemplo:
SELECT
comment_ID,
comment_post_ID,
comment_author,
comment_author_email,
comment_content,
comment_date,
comment_approved,
comment_parent,
user_id
FROM wp_comments
ORDER BY comment_ID ASC;
Así tenemos mucho más control sobre la información que estamos exportando.
Una cuestión importante: datos personales
Hay algo que merece la pena mencionar.
Los comentarios de WordPress pueden contener datos personales, como nombres, direcciones de correo electrónico, URLs o incluso información introducida por los propios usuarios dentro del comentario.
Por tanto, si este JSON se va a mover a otro servidor, subir a un repositorio o compartir con terceros, debemos tratarlo como lo que es: un archivo que puede contener información privada.
No deberíamos subir alegremente comments.json a un repositorio público.
¿Y si tenemos muchos comentarios?
Para una instalación pequeña o mediana, este enfoque funcionará perfectamente.
Pero si estamos hablando de una base de datos con cientos de miles o millones de comentarios, cargar todos los registros en memoria de una sola vez puede no ser la mejor estrategia.
En ese caso podemos plantear la exportación por bloques utilizando LIMIT y un identificador incremental, procesando los resultados progresivamente.
Por ejemplo:
SELECT
comment_ID,
comment_author,
comment_content,
comment_date
FROM wp_comments
WHERE comment_ID > ?
ORDER BY comment_ID ASC
LIMIT 1000;
De esta manera podemos ir procesando los comentarios en lotes de 1.000 registros en lugar de intentar cargar toda la tabla en memoria.
Conclusión
Con unas pocas líneas de Node.js podemos sacar los comentarios almacenados en WordPress directamente desde MySQL y convertirlos en un archivo JSON.
El proceso es bastante sencillo:
- Instalamos
mysql2ydotenv. - Guardamos las credenciales en
.env. - Nos conectamos a MySQL desde Node.js.
- Consultamos la tabla de comentarios de WordPress.
- Convertimos los resultados a JSON.
- Guardamos el resultado en
comments.json.
Y a partir de aquí tenemos nuestros comentarios completamente fuera de WordPress y podemos hacer con ellos lo que necesitemos: analizarlos, migrarlos, transformarlos, procesarlos con otro script o utilizarlos como fuente para otra aplicación.
Lo interesante de este tipo de pequeños scripts es precisamente eso: no necesitamos complicar una tarea sencilla. Si tenemos acceso a MySQL, podemos ir directamente a los datos y trabajar con ellos desde Node.js.
Eso sí: backup antes de tocar nada y cuidado con los datos que exportamos. Que una consulta sea sencilla no significa que los datos que devuelve no sean importantes.
Visitas: 17
Automation & Data Specialist | Web Development | Data Processing & Integration
