Cómo generar los sitemps en Vanilla Forums

Después de ver que el plugin Sitemaps de Vanilla sólo me generaba el index-sitemap y luego las categorías decidí echarme la manta a la cabeza y generar yo mismo el sitemap. La idea era tener un sitemap.xml con todas las categorías y todos los hilos. Las categorías era fácil de sacar ya que en la tabla de categorías hay una columna llamada "urlcode" con el slug. Sacar las urls de los hilos tenía más miga ya que no se almacena el slug en la tabla de hilos sino que se genera con el método url de la clase Gdn_Format. Yo he replicado casi todo su comportamiento en una select (el que me aplicaba en mi caso) y ya cuando tenga más tiempo, si es que lo tengo, intentaré hacer un plugin que lo genere automáticamente. La select es la siguiente:

select
       '<?xml version=\"1.0\" encoding="UTF-8"?>
       <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
       http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">' as line
from dual

UNION

select
       concat('<url><loc>https://www.devirtualize.com/categories/', UrlCode, '</loc><lastmod>', date(NOW()),
       '</lastmod><changefreq>weekly</changefreq><priority>0.5</priority></url>') as line
from devirtualize.GDN_Category
where CategoryID > 0 -- El 0 es la categoría raíz que hay por defecto

UNION

select
       -- Se pasa el nombre del hilo a minúsculas, luego se sustituyen las vocales con tilde por la propia sin tilde,
       -- acto seguido se sustituyen los espacios en blanco y los carácteres no alfanuméricos por -, del resultado se
       -- quitan los - repetidos y se deja un sólo - y finalmente se quitan los - del inicio y del final
       concat('<url><loc>https://www.devirtualize.com/discussion/', DiscussionID,'/',
           trim(both '-' from regexp_replace(regexp_replace(
               replace(replace(replace(replace(replace(lower(name), 'á', 'a'), 'é', 'e'), 'í', 'i'), 'ó', 'o'), 'ú', 'u')
           , '[[:space:]]|[^[:alpha:]]|_', '-'), '-+', '-')),
           '</loc><lastmod>', date(NOW()),
       '</lastmod><changefreq>weekly</changefreq><priority>0.5</priority></url>') as line
from devirtualize.GDN_Discussion

 UNION

select  '</urlset>' as line
from dual

El resultado de la select es tal cual el contenido del sitemap.xml así que generarlo es inmediato.


La verdad es que ha quedado un poco chapucilla pero lo dicho, cuando tenga más tiempo intentaré hacer algo más aseadito.


Saludos

Accede o Regístrate para comentar.