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