Crear un sitemap dinámico con PHP y MySQL

Tutoriales

Demo Github

Uno de los elementos indispensables para tener un buen SEO es alojar en nuestro proyecto un mapa del sitio, hablo del 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. 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 para ello.

Primer configuramos en nuestro servidor el entorno para hacer funcionar nuestro proyecto:

.htaccess

Creamos una tabla llamada postresperuanos con la siguiente estructura:

c

Insertamos un registro, en este caso un postre llamado Arroz con leche:

aLo que vamos hacer es que cuando el usuario inserte un postre nuevo en una tabla llamada postresperuanos, el titulo sea una URL amigable por ejemplo si agregamos el postre llamado Arroz con Leche, luego que se imprima la url en el navegador:

b

Ahora con PHP vamos a generar un sitemap con todas los postres que tenemos almacenados en nuestra Base de datos:

sitemap.php

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

Primero defino mis paginas estáticas como, servicios, contáctenos, las cuales no las inserte en la base de datos, pero si deseas lo puedes hacer, terminando esta parte del codigo recién declaro las url dinámicas para los postres:

Hago un Select a las tablas de mi base de datos:

En esta parte de mi codigo coloco comentarios mencionando que hace cada linea:

Acá cierro mi archivo sitemap, así mismo la Base de datos y reemplazo caracteres especiales dentro de mi sitemap:

Podemos crear un archivo mostrar.php en donde imprimiremos las fotos, los precios, detalles, etc. del producto y se mostrará en la barra de direcciones del navegador la URL generada con el titulo o nombre del postre.

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.

A tus Proyectos hechos Laravel, Codeigniter, etc. les puedes implementar esta funcionalidad y así posicionar tu marca.

Espero que les sirva de mucho el articulo

Gracias por su atención.

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
  • Jorge Cavero Zarza

    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());

    }

    • 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

        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 jc_peliculas;”;
        /* Ejecuto el multi query */
        if ($mysqli->multi_query($query)) {
        do {
        /* Almaceno el primer resultado */
        if ($result = $mysqli->store_result()) {
        while ($row = $result->fetch_row()) {
        /* Defino las url que mostrare en mi archivo sitemap */
        $loc_genero = “http://www.tuxpeliculas.com/peliculas/” . $row[0];
        $loc_pelicula = “http://www.tuxpeliculas.com/pelicula/” . $row[0].”-online”;
        /* Imprimo la estructura de cada URL en mi archivo sitemap */
        if($row[1]==”genero”) {
        echo
        “”.
        “”.xmlentities($loc_genero).””.
        “daily”.
        “”.”0.8″.”
        “;
        }
        else if ($row[1] == “seo” ) {
        echo
        “”.
        “”.xmlentities($loc_pelicula).”” .
        “daily”.
        “”.”0.8″.”
        “;
        }
        }
        $result->close();
        }
        if ($mysqli->more_results()) {
        printf(“n”);
        }
        } while ($mysqli->next_result());
        }
        echo “”;
        /* Reemplazo caracteres especiales */
        function xmlentities($text) {
        $search = array(‘&’, ”, ‘”‘, ”’, ‘ ‘);
        $replace = array(‘&’, ‘<‘, ‘>’, ‘"’, ‘'’, ‘-‘);
        return str_replace($search, $replace, $text);
        }
        /* Cierro la Conexión a la base de datos */
        $mysqli->close();

        el error me lo muestra en esta parte
        else if ($row[1] == “seo” ) {
        echo
        “”.
        “”.xmlentities($loc_pelicula).”” .
        “daily”.
        “”.”0.8″.”
        “;
        }
        }
        $result->close();
        }
        if ($mysqli->more_results()) {
        printf(“n”);
        }
        } while ($mysqli->next_result());
        }
        echo “”;
        /* Reemplazo caracteres especiales */
        function xmlentities($text) {
        $search = array(‘&’, ”, ‘”‘, ”’, ‘ ‘);
        $replace = array(‘&’, ‘<‘, ‘>’, ‘"’, ‘'’, ‘-‘);
        return str_replace($search, $replace, $text);
        }
        /* Cierro la Conexión a la base de datos */
        $mysqli->close();

        • ok, Que error te sale en la pantalla ?

          • Jorge Cavero Zarza

            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

          • 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.

          • 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

      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”;
      }

      $lang=$arr_idioma;

      Como ves, ese encabezado está en todos los archivos de la web. Cada archivo tiene los textos en cada idioma (por ejemplo idioma_es.php tiene los textos en español, idioma_fr.php en francés y así……) y se carga el archivo correspondiente según el idioma seleccionado.
      Ahora te facilito un trozo de código para que veas cómo está planteado el sitemap:

      http://www.midominio.com/idioma_es.php
      weekly
      “.”0.8″.”
      ;

      Y así con los cinco idiomas….

      Mi DUDA concreta es: ¿¿está bien planteado el sitemap, este sitemap sirve para el SEO?? En caso de que NO esté bien planteado, ¿podrías decirme cómo cambiar la estructura de la web para mejorar el SEO?

      De antemano, te agradezco mucho y felicitaciones por tu Blog.

      Daniel

    • Daniel Serratore

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

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

        • Daniel Serratore

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

          • 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

            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 !!!!

          • A buena hora amigo 🙂

        • Daniel Serratore

          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 archivo tiene los textos en cada idioma (por ejemplo idioma_es.php tiene los textos en español, idioma_fr.php en francés y así……) y se carga el archivo correspondiente según el idioma seleccionado.

          Ahora te facilito un trozo de código para que veas cómo está planteado el sitemap:

          http://www.midominio.com/idioma_es.php

          weekly

          “.”0.8″.”

          ;

          Y así con los cinco idiomas….

          Mi DUDA concreta es: ¿¿está bien planteado el sitemap, este sitemap sirve para el SEO?? En caso de que NO esté bien planteado, ¿podrías decirme cómo cambiar la estructura de la web para mejorar el SEO?

          De antemano, te agradezco mucho y felicitaciones por tu Blog.

          Daniel