Como generar un sitemap XML básico con PHP en WordPress

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 
    echo  . loc . 
    echo  . lastmod . 
    echo monthly
    echo 0.6
    echo 
}

wp_reset_postdata()

echo 
exit
?>

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 .=   n
        sitemap .=     {loc}n
        sitemap .=     {lastmod}n
        sitemap .=     monthlyn
        sitemap .=     0.6n
        sitemap .=   n
    }

    wp_reset_postdata()
    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()
?>

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 :)



Deja una respuesta

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