Crear un sitemap dinámico con PHP y MySQL (Corregido 29-07-2019)

PHP Tutoriales | | Comunidad: Crear un Post, Eventos Devs, Foro

Demo Github

Uno de los elementos indispensables para tener un buen SEO es colocar nuestras URLs en un archivo de mapa del sitio, específicamente el archivo sitemap.xml se sabe que con este archivo le decimos a los buscadores, por ejemplo al buscador Google cual es la estructura y el lugar de las páginas que contiene nuestro proyecto. Si estamos trabajando un proyecto con PHP y MySQL y estamos generando páginas dinámicas debemos de brindarle dinámicamente a los robots las paginas junto con su contenido interno alojados en nuestra base de datos, vamos con el tutorial.  

Si creas un archivo sitemap.xml este no te va mostrar las páginas, porque .xml no es un formato que interactúa con la base de datos, solo es un formato de lectura y envío de datos, debemos de crear un archivo PHP en el cual creare el código que conectará y hará la petición de las URLs dinámicamente. 

Configuración del Servidor (Apache)

Primer configuramos en nuestro servidor el entorno para hacer funcionar nuestro proyecto, este tutorial es para un servidor Apache el cual se configura sobre el archivo .htaccess en este archivo voy a crear un regla nueva, en esta regla le voy a decir a los buscadores que mi archivo sitemap.php es el archivo sitemap.xml ya que XML no es un lenguaje de programación que interactue con la Base de Datos, para eso usaremos PHP 

Base de Datos

En este tutorial no queremos salirnos del tema principal que es crear un Sitemap dinámicamente con PHP y MySQL, entonces debes de tener una tabla en tu base de datos con las urls de los registros que necesitas colocarlos en el archivo sitemap.xml

Yo he creado una tabla llamada postres en donde tengo una columna llamada url, en esta columna he insertado las url para cada registro, lo he separado con guiones en medio para hacerlo más amigable a los buscadores, es decir un ejemplo: mi-producto-delicioso

La base de datos que estoy usando es MySQL y le he asignado la codificación utf8mb4_unicode_ci

Código PHP

He colocado comentarios para explicar que hace cada porción de mi codigo:

En el código PHP estoy imprimiendo manualmente 4 URLs que serian la página Principal, Nosotros, Servicios y Contacto, asimismo en donde dice www.midominio.com debes de colocar el nombre de tu dominio

Luego imprimo dinámicamente la columna url de cada registro de mi tabla postres con $row[“url”]  

El nombre de la carpeta /postres/ la he escrito manualmente, tu puedes colocarle el nombre que desees

Puedes ver el resultado final en el Demo que esta al inicio de este tutorial, asimismo puedes clonar el código alojado en el repositorio GitHub para que puedas implementarlo en tus proyectos.

Notas

  • Si obviamos nuestras paginas dinámicas no las estaremos posicionando, es por eso que les comparto este algoritmo en PHP el cual les ayudará a trabajar mejor el SEO de su proyecto.
  • Las tecnologías usadas en este tutorial puede cambiar en sus futuras versiones, esto no depende de nosotros si no de los Desarrolladores o Empresas que dan soporte a PHP, MySQL y Apache. 

 

Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos. 

Newsletter

Suscríbete a Nuestro Boletín de Novedades:

(Luego de la suscripción no te va salir ningun mensaje. Solo revisa tu bandeja de Correo para confirmar tu suscripción)
* indicates required
Subscribirse
Notificar a
guest
15 Comments
antiguos
nuevos más votado
Inline Feedbacks
View all comments
Jorge Cavero Zarza
Jorge Cavero Zarza
4 años atrás

Muchas gracias por el tutorial pero tengo el siguiente error cuando lo realizo en mi web ..

Strict Standards
: mysqli::next_result(): There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method in

url de mi web

on line
78

vamos en la siguiente parte del código

}

}

$result->close();
}

if ($mysqli->more_results()) {
printf(“n”);
}
} while ($mysqli->next_result());

}

Collective Cloud Peru
Collective Cloud Peru
Reply to  Jorge Cavero Zarza
4 años atrás

Hola jorge, antes que nada gracias por visitar nuestro blog, intenta usar el codigo del repo github, bajatelo y úsalo, no olvides crear tu base de datos mysql con las tablas que necesites. Nos avisas como te fue.

Jorge Cavero Zarza
Jorge Cavero Zarza
Reply to  Collective Cloud Peru
4 años atrás

Hola, tengo la tabla creada, lee el contenido de dos de ellas, este es mi código por si me pudieran ayudar <?php $mysqli = new mysqli("localhost", "tabla", "pass", "user"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %sn", mysqli_connect_error()); exit(); } /* Defino mi archivo como XML */ header("Content-Type: text/xml"); /* Inicio la estrucutra de mi archivo XML */ echo "” . “”; echo ” urlweb daily “.”0.8″.” “; /* Hago un Multi Query para desde la tabla correspondiente del postre */ $query = “SELECT genero, ‘genero’ AS tipo FROM jc_genero;”; $query .= “SELECT seo, ‘seo’ AS tipo FROM… Leer más »

Collective Cloud Peru
Collective Cloud Peru
Reply to  Jorge Cavero Zarza
4 años atrás

ok, Que error te sale en la pantalla ?

Jorge Cavero Zarza
Jorge Cavero Zarza
Reply to  Collective Cloud Peru
4 años atrás

Strict Standards
: mysqli::next_result(): There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method in

url de mi web

on line
78

Collective Cloud Peru
Collective Cloud Peru
Reply to  Jorge Cavero Zarza
4 años atrás

Parece que te falta un caracter en el codigo, puedes pegar todo tu codigo completo para ver donde esta el error y dartelo limpio por favor.

Collective Cloud Peru
Collective Cloud Peru
Reply to  Jorge Cavero Zarza
4 años atrás

Bien estuvimos analizando y si nos da un error en nuestro archivo error_log, lo solucionamos reemplazando el while por este:
while(mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); y ya no nos da error 🙂

Daniel Serratore
Daniel Serratore
Reply to  Jorge Cavero Zarza
4 años atrás

Hola Juan Ricardo, tengo una duda que resolver de SEO y te agradecería infinitamente que puedas darme una ayudita. Verás, resulta que tenemos una web, la cual tiene un array de idiomas en php. Es decir, cada pestaña es la MISMA URL sólo que según el idioma seleccionado por el usuario, muestra un idioma u otro. Te paso un trozo de código para ser más claro: $idioma=$_GET[“idioma”]; // recoge la variable según idioma escogido switch ($idioma) { case “es”: include(“idioma_es.php”); break; case “en”: include(“idioma_en.php”); break; case “al”: include(“idioma_al.php”); break; case “fr”: include(“idioma_fr.php”); break; case “ca”: include(“idioma_ca.php”); break; default: include(“idioma_es.php”); $idioma=”es”;… Leer más »

Daniel Serratore
Daniel Serratore
Reply to  Jorge Cavero Zarza
4 años atrás

Perdón Jorge, escribí el mensaje anterior en tu conversación por error. Mil disculpas

Collective Cloud Peru
Collective Cloud Peru
Reply to  Daniel Serratore
4 años atrás

No hay problema, somos humanos, nos equivocamos también.

Daniel Serratore
Daniel Serratore
Reply to  Collective Cloud Peru
4 años atrás

GRACIAS! ¿Has podido ver la consulta que les envié?

Collective Cloud Peru
Collective Cloud Peru
Reply to  Daniel Serratore
4 años atrás

Hola Daniel gracias por visitar el blog, si esta bien prueba si funciona y revisa en Google Search Console si te indexo las paginas tal como deseas con el idioma. Ve a la sección Sitemaps.

Daniel Serratore
Daniel Serratore
Reply to  Collective Cloud Peru
4 años atrás

Hola sí, está indexado el Sitemap y funcionando. Mi duda era si realmente Google verificaba un archivo tipo idioma_es.php. Te agradezco muchísimo tu ayuda. Seguiré vuestro blog, saludos !!!!

Collective Cloud Peru
Collective Cloud Peru
Reply to  Daniel Serratore
4 años atrás

A buena hora amigo 🙂

Daniel Serratore
Daniel Serratore
Reply to  Collective Cloud Peru
4 años atrás

POR LAS dudas vuelvo a escribir la consulta : Tenemos una web, la cual tiene un array de idiomas en php. Es decir, cada pestaña es la MISMA URL sólo que según el idioma seleccionado por el usuario, muestra un idioma u otro. Te paso un trozo de código para ser más claro: $idioma=$_GET[“idioma”]; // recoge la variable según idioma escogido switch ($idioma) { case “es”: include(“idioma_es.php”); break; case “en”: include(“idioma_en.php”); break; case “al”: include(“idioma_al.php”); break; case “fr”: include(“idioma_fr.php”); break; case “ca”: include(“idioma_ca.php”); break; default: include(“idioma_es.php”); $idioma=”es”; } $lang=$arr_idioma; Ese encabezado está en todos los archivos de la web. Cada… Leer más »