Migrate WordPress to Custom PHP Without Losing SEO – BuiltToWinWeb
EN ES FR DE IT PT ZH JA KO RU NL
← Back to all articles
?>

Migra de WordPress a PHP personalizado sin perder SEO – La guía completa de 7 pasos

Cambiar de WordPress a una base de código PHP personalizado puede reducir el TTFB en un 70%, eliminar vulnerabilidades de plugins y darte el 100% de propiedad. Pero si manejas mal las redirecciones y los metadatos, hundirás tus rankings. He migrado más de 30 sitios WordPress – aquí está el proceso exacto que preserva (y a menudo mejora) el SEO.

¿Por qué migrar de WordPress a PHP personalizado?

  • Rendimiento lento – Incluso con caché, WordPress carga más de 847KB de JavaScript.
  • Vulnerabilidades de plugins – El 96% de los sitios WordPress hackeados se deben a plugins desactualizados.
  • Cuotas mensuales – Los plugins premium, el alojamiento optimizado para WP y el mantenimiento se acumulan.
  • Dependencia – No eres dueño del código; eres dueño de una base de datos de entradas y un tema.

PHP personalizado te da control total, tiempos de carga inferiores a un segundo y cero cuotas mensuales de plataforma. Pero la migración debe ser impecable.

Antes de empezar: La auditoría previa a la migración

  • Exportar todas las URL – Usa Screaming Frog (gratis hasta 500 URL) o wget: wget --spider --force-html -r -l 3 https://tusitio.com 2>&1 | grep '^--' | awk '{ print $3 }' > urls.txt
  • Registrar rankings – Exporta las 100 palabras clave principales desde Google Search Console (informe de rendimiento).
  • Guardar metadatos – Screaming Frog puede exportar etiquetas de título, meta descripciones y H1 como CSV.
  • Documentar enlaces entrantes – Usa Search Console → Enlaces → Enlaces externos, o Ahrefs/SEMrush si está disponible.

Paso 1: Rastrear tu sitio antiguo (Análisis profundo con Screaming Frog)

Descarga Screaming Frog SEO Spider (gratis hasta 500 URL). Configúralo para extraer:

  1. Todas las URL internas.
  2. Etiquetas de título y meta descripciones.
  3. Etiquetas canónicas.
  4. Encabezados H1.
  5. Códigos de respuesta (200, 301, 404).

Exporta como CSV. Este archivo se convierte en tu mapa de migración. Lo usarás para verificar que cada página existente tenga un destino.

Paso 2: Mapear URL a la nueva estructura – Mantenla idéntica si es posible

El enfoque más seguro: mantener exactamente las mismas rutas de URL. Si tus URL de WordPress son limpias (ej. /servicios/diseno-web), puedes reutilizarlas. Solo cambia la estructura si:

  • Tus URL de WordPress incluyen /2023/01/nombre-post/ (fechas) – elimina las fechas.
  • Tienes contenido duplicado de archivos /categoria/ y /etiqueta/ – elimínalos.

Ejemplo de mapeo para un blog:

/2023/01/por-que-php-personalizado → /blog/por-que-php-personalizado
/categoria/rendimiento → /blog/categoria/rendimiento (opcional, puedes eliminar páginas de categoría)
/etiqueta/seo → (eliminar – las páginas de etiquetas a menudo diluyen la autoridad)

Crea un CSV con dos columnas: url_vieja, url_nueva. Para las páginas que no estás recreando (ej. archivos de etiquetas), redirige a la página relevante más cercana.

Paso 3: Exportar contenido desde WordPress

Método A – WP REST API (más fácil para sitios pequeños)

<code>&lt;?php<br>$posts = json_decode(file_get_contents('https://tusitio.com/wp-json/wp/v2/posts?per_page=100&page=1'));<br>foreach ($posts as $post) {<br>    $data = [<br>        'title' => $post->title->rendered,<br>        'slug' => $post->slug,<br>        'content' => $post->content->rendered,<br>        'excerpt' => $post->excerpt->rendered,<br>        'date' => $post->date,<br>        'meta' => [<br>            'title' => get_post_meta($post->id, '_yoast_wpseo_title', true),<br>            'description' => get_post_meta($post->id, '_yoast_wpseo_metadesc', true)<br>        ]<br>    ];<br>    // Insertar en tabla MySQL personalizada<br>}<br>?&gt;</code>

Método B – WP CLI (más rápido para sitios grandes)

<code>wp export --dir=/tmp --post_type=post,page --with_attachments</code>

Método C – MySQL directo (para control total)

<code>SELECT ID, post_title, post_name, post_content, post_date FROM wp_posts WHERE post_status = 'publish' AND post_type IN ('post', 'page');</code>

Luego obtén los metadatos de Yoast SEO desde wp_postmeta donde meta_key IN ('_yoast_wpseo_title','_yoast_wpseo_metadesc').

Paso 4: Reconstruir tu sitio PHP personalizado con los mismos metadatos

  • La misma etiqueta <title> exacta (de Yoast o All in One SEO).
  • La misma <meta name="description">.
  • El mismo <h1> (aunque un cambio menor suele ser aceptable).

Almacena los metadatos en tu base de datos (ej. una tabla page_meta) o en un array PHP. Para sitios dinámicos, incluso puedes mantener la base de datos de WordPress como fuente de solo lectura durante la transición – pero eso añade complejidad.

Paso 5: Implementar redirecciones 301 (El paso más crítico)

Una redirección 301 le dice a Google: “Esta página se movió permanentemente”. Google transfiere casi el 100% del poder de ranking de la página antigua a la nueva URL.

Para Apache (.htaccess) – Mejor para menos de 200 redirecciones

<code>Redirect 301 /url-vieja /url-nueva<br>Redirect 301 /2023/01/por-que-php-personalizado /blog/por-que-php-personalizado</code>

Para miles de redirecciones – Usa un mapa PHP (evita inflar .htaccess)

<code>&lt;?php<br>$redirects = json_decode(file_get_contents(__DIR__ . '/redirects.json'), true);<br>$request = $_SERVER['REQUEST_URI'];<br>if (isset($redirects[$request])) {<br>    header('HTTP/1.1 301 Moved Permanently');<br>    header('Location: ' . $redirects[$request]);<br>    exit;<br>}<br>?&gt;</code>

Para Nginx – Usa la directiva map

<code>map $request_uri $new_uri {<br>    /url-vieja /url-nueva;<br>    /2023/01/por-que-php-personalizado /blog/por-que-php-personalizado;<br>}<br>server {<br>    if ($new_uri) {<br>        return 301 $new_uri;<br>    }<br>}</code>

Consejo profesional: Nunca encadenes redirecciones (A → B → C). Cada salto pierde una pequeña cantidad de valor de enlace. Siempre redirige directamente A → C.

Paso 6: Generar un sitemap XML dinámico

No uses un sitemap estático – se quedará obsoleto. En su lugar, crea sitemap.php que genere XML dinámicamente:

<code>&lt;?php<br>header('Content-Type: application/xml');<br>echo '&lt;?xml version="1.0" encoding="UTF-8"?&gt;';<br>echo '&lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&gt;';<br>$pages = getAllPageUrlsFromDatabase(); // tu función personalizada<br>foreach ($pages as $url) {<br>    echo '&lt;url&gt;&lt;loc&gt;' . htmlspecialchars($url) . '&lt;/loc&gt;&lt;lastmod&gt;' . date('Y-m-d') . '&lt;/lastmod&gt;&lt;/url&gt;';<br>}<br>echo '&lt;/urlset&gt;';<br>?&gt;</code>

Luego agrega una regla de reescritura en .htaccess:

<code>RewriteRule ^sitemap\.xml$ sitemap.php [L]</code>

Envía el sitemap a Google Search Console inmediatamente después del lanzamiento.

Paso 7: Lanzar y monitorear durante 30 días

  1. Verificar todas las redirecciones – Usa un rastreador (Screaming Frog) para visitar cada URL antigua y verificar que devuelva un 301 a la nueva URL.
  2. Monitorear el informe “Cobertura” de Google Search Console a diario – Busca errores 404. Para cada 404, agrega una redirección faltante o corrige el enlace roto.
  3. Enviar el nuevo sitemap – En Search Console, ve a Sitemaps → Agregar un nuevo sitemap (sitemap.xml).
  4. Observar Core Web Vitals – En una semana, deberías ver mejoras. Si no, depura imágenes, CSS o la configuración del servidor.
  5. Comparar rankings después de 4 semanas – Exporta los datos de GSC nuevamente. La mayoría de los clientes ven ningún cambio o una ligera mejora debido a tiempos de carga más rápidos.

Errores comunes y cómo evitarlos

Error 1: Cambiar URL sin redirecciones

Síntoma: Errores 404 en Search Console.

Solución: Implementa el mapa PHP de redirecciones antes de salir al aire.

Error 2: Olvidar migrar las meta descripciones

Síntoma: Google reescribe tu snippet con texto aleatorio.

Solución: Usa la misma exportación de metadatos del Paso 1.

Error 3: Perder imágenes (archivos multimedia)

Síntoma: Imágenes rotas en el sitio personalizado.

Solución: Copia toda la carpeta /wp-content/uploads/ al directorio público de tu nuevo sitio. Configura una redirección de /wp-content/uploads/... a /uploads/... si moviste la carpeta.

Error 4: Advertencias de contenido mixto (imágenes HTTP)

Síntoma: El navegador muestra “contenido no seguro” en HTTPS.

Solución: Busca y reemplaza las URL de imágenes antiguas en tu base de datos de http://sitioantiguo.com a https://sitio-nuevo.com.

Caso de estudio real: Migración de un sitio empresarial de 500 páginas

Una red de franquicias nacional tenía un sitio WordPress con más de 500 páginas de ubicaciones, cada una con contenido único. El tiempo de carga era de 2.8s (móvil), y pagaban $300/mes por alojamiento y plugins.

Proceso:

  • Exportaron todos los datos de ubicaciones usando WP CLI.
  • Reconstruyeron un sitio PHP personalizado con una sola plantilla PHP que extraía datos de ubicaciones de MySQL.
  • Mantuvieron la estructura de URL idéntica (/ubicaciones/ciudad-estado/).
  • Usaron un mapa PHP para redirecciones 301 (aunque las URL no cambiaron, mantuvieron el mapa por seguridad).

Resultados después de 60 días:

  • TTFB: 800ms → 180ms.
  • Rendimiento Lighthouse: 58 → 96.
  • Costo de alojamiento: $300/mes → $30/mes (VPS estándar).
  • Rankings: Mejoraron para el 87% de las páginas de ubicación (debido a la velocidad).
  • Tráfico orgánico: +23% en 3 meses.

El cliente ahora es dueño absoluto del código, no paga tarifas de plugins y puede agregar nuevas ubicaciones al instante mediante una simple carga CSV.

¿Deberías migrar? Un marco de decisión

Migra a PHP personalizado si:

  • Tu sitio es mayormente estático o tiene contenido predecible (blog + servicios).
  • Estás cansado del mantenimiento de plugins y las actualizaciones de seguridad.
  • Quieres el 100% de propiedad del código y sin cuotas mensuales de plataforma.

Quédate en WordPress si:

  • Necesitas comercio electrónico avanzado (aunque PHP personalizado puede manejarlo).
  • Dependes en gran medida de las extensiones de WooCommerce.
  • Tu equipo no es técnico y está acostumbrado al administrador de WP.

¿Listo para hacer el cambio?

He migrado más de 30 sitios WordPress a PHP personalizado – desde pequeños blogs hasta tiendas de comercio electrónico de 2,000 páginas. Me encargo de todo: exportación de contenido, mapeo de URL, redirecciones 301, preservación de metadatos y monitoreo posterior al lanzamiento.

Tu sitio PHP personalizado cargará en menos de 0.8s, obtendrá 100 en Lighthouse y nunca volverás a pagar otra tarifa de plugin.

Permíteme migrar tu sitio WordPress →

Todos los datos provienen de migraciones reales de clientes realizadas por BuiltToWinWeb. Los resultados individuales pueden variar según la complejidad y el contenido del sitio.