Contents
Introducción
Un sitemap XML le dice a los buscadores qué URLs debe rastrear y con qué frecuencia. WordPress no siempre incluye un sitemap personalizado por defecto (aunque versiones recientes ya traen uno básico), y a veces es útil generar uno propio con PHP para controlar qué se publica, la frecuencia, prioridad y la fecha de última modificación. Este artículo explica en detalle cómo crear un sitemap XML básico con PHP para WordPress: opciones dinámicas (generado al vuelo), generación a fichero estático, integración sencilla en tema o plugin, y buenas prácticas.
Requisitos y consideraciones
- Conocimientos básicos de PHP y WordPress (hooks, funciones como get_posts, get_permalink, get_post_modified_time).
- Acceso para editar el tema (functions.php) o crear un plugin simple.
- Permisos de escritura en el servidor si quieres generar un fichero estático (por ejemplo en la carpeta de uploads).
- Atención al rendimiento: para sitios grandes conviene paginar o usar un archivo índice de sitemaps y/o cachear el resultado.
Estructura mínima de un sitemap XML
Un sitemap básico contiene un encabezado XML y múltiples etiquetas lturlgt, cada una con:
- ltlocgt (obligatorio): la URL canónica.
- ltlastmodgt (recomendado): fecha de última modificación en formato ISO 8601 (ej. 2025-09-24T12:34:56 00:00). En WordPress puedes obtenerla con get_post_modified_time(c).
- ltchangefreqgt (opcional): frecuencia de cambio sugerida (always, hourly, daily, weekly, monthly, yearly, never).
- ltprioritygt (opcional): prioridad relativa entre 0.0 y 1.0.
Ejemplo mínimo de cabecera XML
La cabecera y el namespace obligatorio:
... aquí van las entradas ...
Ejemplo 1 — Sitemap dinámico simple (plantilla PHP)
Este ejemplo crea un archivo PHP que puede colocarse en la raíz de tu tema (ej. sitemap.php) y puede ser solicitado directamente (p. ej. https://midominio.com/wp-content/themes/mi-tema/sitemap.php). Si deseas que esté en /sitemap.xml tendrás que redirigir o crear una regla de reescritura más adelante muestro cómo.
Características del ejemplo:
- Recorre posts públicos (post_type post).
- Imprime ltlocgt y ltlastmodgt en formato ISO 8601.
- Encabezado Content-Type XML.
echo// Obtener posts publicados args = array( post_type => post, post_status => publish, posts_per_page => -1, ) posts = get_posts( args ) foreach ( posts as post ) { setup_postdata( post ) loc = esc_url( get_permalink( post ) ) // Fecha en formato ISO 8601 lastmod = get_post_modified_time( c, true, post ) echo exit ?>echo } wp_reset_postdata() echo. loc . echo. lastmod . echomonthly echo0.6 echo
Notas sobre el ejemplo
- Usar esc_url() al imprimir loc para evitar caracteres problemáticos.
- get_post_modified_time(c) devuelve la fecha en formato ISO 8601 ajustada a la zona horaria de WP.
- Para tipos de contenido adicionales (pages, custom post types), ampliar el array o ejecutar múltiples queries.
- Esta aproximación genera el sitemap al vuelo: útil para sitios pequeños, pero costosa en sitios grandes.
Ejemplo 2 — Generar un sitemap estático en uploads (archivo físico)
Para mejorar rendimiento puedes generar un fichero XML (p. ej. sitemap.xml en la carpeta de uploads) periódicamente (mediante cron o wp-cron) y servirlo directamente desde el servidor.
array(post,page), // añadir CPT si procede post_status => publish, posts_per_page => -1, ) posts = get_posts( args ) sitemap = . n sitemap .=. n foreach ( posts as post ) { setup_postdata( post ) loc = esc_url( get_permalink( post ) ) lastmod = get_post_modified_time( c, true, post ) sitemap .= // Ruta de uploads para guardar el fichero upload_dir = wp_upload_dir() file = trailingslashit( upload_dir[basedir] ) . sitemap.xml file_put_contents( file, sitemap ) // Opcional: controlar permisos y realizar logging } // Ejemplo: ejecutar al activar plugin o mediante cron // mi_generar_sitemap_estatico() ?>n sitemap .= n } wp_reset_postdata() sitemap .={loc} n sitemap .={lastmod} n sitemap .=monthly n sitemap .=0.6 n sitemap .=
Ventajas y precauciones
- Archivo estático: rápido para servir, reduce carga de PHP en cada visita.
- Necesitas regenerarlo cuando el contenido cambia (hook en save_post para actualizar o programar regeneración periódica con wp_cron).
- Asegúrate de permisos de escritura en uploads y seguridad (no exponer rutas sensibles).
Cómo exponer /sitemap.xml en la raíz (rewrite template_redirect)
Si quieres que el sitemap esté accesible vía https://midominio.com/sitemap.xml, añade una regla de reescritura que capture esa URL y devuelva tu salida XML desde WordPress.
|
Acepto donaciones de BAT's mediante el navegador Brave :) |