Migrar contenido de WordPress a MongoDB

WordPress usa MySQL como base de datos principal para almacenar su contenido que incluye publicaciones, categorías, etiquetas, usuarios, medios y otros meta detalles. WordPress también tiene una función de importación / exportación bastante impresionante que genera un archivo XML genérico que contiene la información del contenido.

Este artículo es parte de la serie de rediseños de Codeforgeek.

Cuando elegimos desacoplar WordPress y servir el contenido usando nuestro servidor Node.js personalizado, tuvimos que tomar una importante decisión de diseño:

  1. Utilice la API de WordPress para obtener información sobre el contenido siempre que lo solicite el usuario.
  2. Migre el contenido de WordPress en la base de datos local.

Seleccionamos la segunda opción. De acuerdo con nuestro plan y objetivo, el uso de la API JSON de WordPress para cada visitante no puede escalar.

El plan

Queríamos un enfoque simple con el que pudiéramos realizar la migración de manera efectiva. Cuando investigamos un poco, no había una solución simple plug and play, especialmente para bases de datos NoSQL como MongoDB .

Uno de los enfoques populares es exportar el contenido de WordPress y alimentarlo al programa personalizado que a su vez lee, analiza e inyecta los datos analizados en MongoDB.

Eso parece demasiado trabajo. Así que probamos un nuevo enfoque.

WordPress proporciona la información del contenido en forma de API, también llamada API WPJSON. Esto es perfecto para el caso de uso como nosotros. Todo lo que teníamos que hacer era llamar a la API de WordPress, preparar los datos para MongoDB e inyectarlos. Simple y eficaz.

API de WordPress

La API de WordPress es increíble. Puede ver la información relacionada con publicaciones, usuarios, categorías, etiquetas, medios, etc.en la carga útil JSON. Echa un vistazo por ti mismo.

Puede utilizar el ID de cada objeto para obtener detalles específicos de la recuperación. Es simple y realmente útil.

Su cesta esta API oficial de WordPress documentación.

Migrando contenido

Para migrar contenido, escribimos un programa simple en Node.js que llama a la API de WordPress, formatea el contenido y lo inserta en la colección MongoDB. Tenemos a partir de ahora 5 colecciones en nuestra base de datos MongoDB. Son:

* categorías

* cursos


* lecciones


* publicaciones


* etiquetas


* usuarios

Primero migramos usuarios, etiquetas y categorías, luego publicaciones y cursos.

Déjame mostrarte nuestro código que empuja las publicaciones en la colección MongoDB.

const mongo = require ( ‘mongodb’ ) ; tiza
const = require ( ‘tiza’ ) ;
const url = “mongodb: // localhost: 27017 / codeforgeek” ;
const async = require ( ‘async’ ) ;
const request = require ( ‘solicitud’ ) ;

// iniciar el trabajo

mongo.
connect ( url , { useNewUrlParser : true} , ( err , db ) => {
    if ( err ) {

       consola.
log ( err ) ;

       proceso.
salir ( 0 ) ;
    }
    var dbo = db. db ( ‘codeforgeek’ ) ; colección
    var = dbo. colección ( ‘publicaciones’ ) ;
    // agarrar la

    solicitud de
publicaciones
(‘https://codeforgeek.com/wp-json/wp/v2/posts?per_page=100&page=1’ , ( err , respuesta , cuerpo ) => {

        dejar datos
= JSON. analizar ( cuerpo ) ;
        //console.log(data);

        let userData
= [ ] ;

        datos.
forEach ( singleData => {

            asíncrono.
cascada ( [
                ( devolución de llamada ) => {
                    // obtener la imagen ofrecida

                    solicitud
( `https : //yourdomain.com/wp-json/wp/v2/media/${singleData.featured_media}`,(err, res, body) => {
                        if ( err ) {

                            console.
log ( err ) ;
                            return callback ( null , null ) ;
                        }

                        let data
= JSON. parse ( body ) ;

                        console.
log ( ‘imagen destacada =’ , data. source_url ) ;
                        returndevolución de llamada ( nulo , datos. url_origen ) ;
                    } ) ;
                } ,
                ( featueredImage , callback ) => {
                    // obtener el nombre de las categorías

                    dbo.
colección ( ‘categorías’ ) . buscar ( { id : { $ in : singleData. categorías } } ) . toArray ( ( err , result ) => {

                        let catname
= [ ] ;

                        resultado.
forEach ( ( singleResult ) => {

                            catname.
push ( {

                                nombre
: singleResult. nombre ,

                                slug
: singleResult. slug ,
                            } ) ;
                        } ) ;

                        consola.
log ( ‘categorías =’ , nombre de gato ) ;
                        return callback ( null , featueredImage , catname ) ;
                    } ) ;
                } ,
                ( featueredImage , catNames , callback ) => {
                    // obtener el nombre de las etiquetas

                    dbo.
colección ( ‘etiquetas’ ) . buscar ( { id : { $ in : singleData. tags } } ) . toArray ( ( err ,resultado ) => {

                        dejar nombre de etiqueta
= [ ] ;

                        resultado.
forEach ( ( singleResult ) => {

                            tagname.
push ( {

                                nombre
: singleResult. nombre ,

                                slug
: singleResult. slug ,
                            } ) ;
                        } ) ;

                        consola.
log ( ‘etiquetas =’, nombre de etiqueta ) ;
                        return callback ( null , featueredImage , catNames , tagname ) ;
                    } ) ;
                }
            ] , ( err , imagen , gatos , etiquetas ) => {

                let parseContent
= JSON. analizar ( JSON. stringify ( singleData. content ) ) ;

                dejar formatContent
=parseContent. prestados . dividir ( n) . unirse ( ) ;

                let formatContentspaces
= formatContent. dividir ( t) . unirse ( ) ;

                let postData
= {

                    id
: singleData. id ,

                    título
: singleData. título . prestados ,

                    fecha
: singleData. fecha ,

                    url
: singleData. enlace ,            

                    slug
: singleData. slug ,

                    estado
: singleData. estado ,

                    tipo
: singleData. tipo ,                

                    extracto
: singleData. extracto . renderizado ,

                    content
: formatContentspaces ,

                    autor
:singleData. autor ,

                    categorías
: gatos ,

                    etiquetas
: etiquetas , imagen

                    destacada
: imagen
                } ;

                colección.
insert ( postData , ( err , result ) => {
                    if ( err ) {

                        console.
log ( err ) ;

                        process.
exit ( 0 );
                    }

                    consola.
log ( resultado ) ;
                } ) ;
            } ) ;
        } ) ;  
    } ) ;
} ) ;

Como puede ver en el código, primero llamamos a la API de WordPress para darnos 100 registros y recorrimos esos 100 registros para obtener la identificación de la etiqueta, la identificación de la categoría y el enlace de la imagen destacada. Una vez que se recupera todo, preparamos el JSON para MongoDB y lo agregamos a la colección.

Una vez que se ejecuta el script, cambié el número de página en la URL a 2 y ejecuté el script nuevamente hasta que todas las publicaciones se agreguen a la base de datos. También podemos automatizar eso.

Se ha adoptado un enfoque similar para las etiquetas, las categorías y los usuarios. Quizás se pregunte dónde están los detalles de los medios. No está en la base de datos, almacenamos imágenes en el bucket de Amazon S3 y las servimos mediante Cloudfront CDN, por lo que no hubo necesidad de almacenar esa información.

Resumen

Espero que nuestro enfoque le resulte interesante y fácil de usar. Es mucho mejor que analizar XML desde un archivo con seguridad. Si esto te interesa y te gustaría crear un proyecto de código abierto para eso, dale algunos me gusta al artículo y seguramente lo tomaré en consideración.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *