Mapa strony – jak stworzyć sitemap.xml

Czym jest mapa strony i do czego jest potrzebna? Jak wygenerować sitemap.xml? Odpowiedź na te i inne pytania znajdziecie w poniższym artykule.

Thank you for reading this post, don't forget to subscribe!

Minęło sporo czasu od ostatniego posta. Pół roku temu zrodziła mi się idea zagłębienia w temat jakim jest SEO. Niestety gdzieś po drodze zmieniłem kierunek i odszedłem od tego tematu. Dziś jednak chciałbym wrócić na tory do lepszego pozycjonowania swoich stron internetowych. Kolejny temat jaki “chciałbym” poruszyć to wspomniana już wyżej mapa strony. 🙂 Tak naprawdę wzięcie się za ten temat wymusza na mnie pewna linia projektu która sobie wpisałem do realizacji w swoim autorskim systemie zarządzania czasem jakim jest Jallean:)
Jako,że już grubo po terminie jaki sobie wyznaczyłem, zacząłem dziś przeszukiwać googla w poszukiwaniu informacji czym jest mapa strony. Oczywiście na pierwsze pozycje wyszukiwania wyskoczyły mi strony zajmujące sie profesjonalnie pozycjonowaniem.. (nic dziwnego).

Czym jest mapa strony i do czego jest potrzebna?

Mapa witryny to plik (pliki), w którym podajemy informacje o stronach, filmach, grafikach i innych danych w naszej witrynie. Budując mapę strony najlepiej wykorzystać do tego protokół sitemapy XML, który jest uznawany przez wiele wyszukiwarek internetowych (nie tylko Google, ale również np. Bing czy Yahoo). Czytając wiele artykułów na temat Map Stron internetowych wszyscy potwierdzają, iż mapy w dużym stopniu poprawiają kwestię pozycjonowania stron i ich indeksowania w wyszukiwarkach. Osobiście zapraszam do przeczytania artykułu z Googla, który w moim odczuciu najlepiej opisuje omawiany temat: Informacje o mapach witryn

Jak zbudowany jest plik sitemap.xml

Mapa strony w swojej strukturze musi mieć zawarte:

  • Informacje o rodzaju kodowania pliku
    <?xml version="1.0" encoding="UTF-8"?>
  • Informacje na temat użytego standardu protokołu
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • <url> – Znacznik nadrzędny dla każdego wpisu URL. Pozostałe znaczniki są elementami podrzędnymi tego znacznika.
  • <loc> – Adres URL strony. Ten adres URL musi rozpoczynać się od protokołu (np. Http)
  • oraz należy pamiętać o tagach zamykających </loc>, </url>, </urlset>

Dla podstawowej wersji mapy strony dostępne są również tagi opcjonalne, takie jak:

  • <lastmod> – Data ostatniej modyfikacji pliku (danych zawartych w pliku który wskazuje link).
  • <changefreq> – Częstotliwości możliwych aktualizacji/ zmian na danej stronie( możliwe wartości to always, hourly, daily, weekly, monthly, yearly, never
  • <priority> – Priorytet danego adresu względem innych (domyślnie ustawiony na 0.5) możliwe wartości to zakres od 0 do 1

Pewne obostrzenia dotyczące tworzenia map

Plik mapy strony nie może być większy niż 50MB(po zdekompresowaniu) oraz nie może zawierać więcej niż 50 tys adresów URL. W przypadku przekroczenia tych wartości możemy podzielić mapę na kilka osobnych plików – warto wtedy utworzyć dodatkowy plik z indeksem map witryn, który będzie wskazywał listę wszystkich dostępnych map dla danej strony. Na dole tego artykułu znajdziesz więcej na ten temat.

Adres URL zapisany w mapie nie może mieć więcej niż 2048 znaków – co raczej nikomu nie grozi:)

Poniżej przedstawiam przykładowe pliki sitemap.

Mapa strony – tylko linki do stron

Przykład pliku sitemap.xml – gdzie podany jest tylko jeden adres URL:

        

 
  
    http://www.example.com/foo.html
    2018-06-04
  
          
        

Mapa strony – linki do stron wraz z obrazami

Obrazy możesz wymienić w osobnej mapie witryny lub dodać informacje o nich do istniejącej mapy. Przykład poniżej przedstawia wpis mapy witryny związany ze stroną http://www.hackwars.pl/diskpart-blad-uslugi-dyskow-wirtualnych-rozmiar-woluminu-jest-za-duzy/, na której znajdują się trzy obrazy.

        


  
	http://www.hackwars.pl/diskpart-blad-uslugi-dyskow-wirtualnych-rozmiar-woluminu-jest-za-duzy/
	2014-05-23T06:01:26+00:00
	
		http://www.hackwars.pl/wp-content/uploads/2014/05/diskpart-blad-woluminum.jpg
		
	
	
		http://www.hackwars.pl/wp-content/uploads/2014/05/diskpart-blad-woluminum.jpg
		
	
	
		http://www.hackwars.pl/wp-content/uploads/2014/05/diskpart-blad-woluminum2.jpg
		
	

          
        

Jak można zauważyć do znacznika <urlset> dodany został rozszerzony protokół sitemapy (obszar nazw XML) -> spersonalizowany dla odczytów obrazów przez Google : xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"

Dla mapy obrazów dostępne są również tagi opcjonalne, a mianowicie: <image:caption> – Podpis obrazu,<image:geo_location> – Geograficzna lokalizacja obrazu, <image:title> -Tytuł obrazu, <image:license> – Adres URL licencji obrazu.
Więcej na ten temat znajdziesz tu: Mapy witryn z obrazami

Mapa strony – Linki do stron wraz z filmami

Oto przykładowa mapa witryny wideo zawierająca jedną stronę z jednym filmem. Ten przykład obejmuje wszystkie tagi używane przez Google.
Dodatkowe informacje na temat budowy takiej mapy znajdziecie na stronach Googla Mapy witryn wideo i rozwiązania alternatywne

    
    

   
     http://www.example.com/filmy/strona_docelowa_z_filmem.html
     
       http://www.example.com/miniatury/123.jpg
       Letnie grillowanie steków
       Jak przyrządzić doskonałe steki za każdym razem – porady Patryka
         
       
           http://streamserver.example.com/film123.mp4
       
         http://www.example.com/odtwarzaczfilmow.php?video=123
       600
       2021-11-05T19:20:30+08:00
       4.2
       12345
       2007-11-05T19:20:30+08:00
       yes
       IE GB US CA
       1.99
       yes
       JaninaKowalska 
       
       no
     
   

Tak samo jak w przypadku zdjęć do obsługi video również należny dodać rozszerzony protokół sitemapy: xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"

Mapa strony – Wiadomości Google

Istnieje jeszcze możliwość wykonania mapy dla Wiadomości Google. Taka mapa rządzi się nieco innymi prawami. Zalecam przeczytanie tego artykułu Google zanim weźmiecie się za jej tworzenie: Tworzenie mapy witryny Wiadomości Google. Poniżej natomiast pokazuje przykład takiej mapy:

   

 
 
 
http://www.example.org/business/article55.html 
 
   
    The Example Times 
    en 
   
  2008-12-23 
  Companies A, B in Merger Talks 
 
 


Jak utworzyć mapę strony – plik sitemap.xml

Tworzenie mapy strony za pomocą darmowych lub płatnych generatorów online

Mapa witryny może być wygenerowana automatycznie w bardzo prosty sposób. Możemy wykorzystać do tego celu serwisy internetowe wyspecjalizowane w tym temacie. Poniżej kilka linków do takich stron:

Rozwiązanie takie często ma jednak 1 zasadniczą wadę.. Jeśli dodamy do naszej strony jakiś kolejny materiał -> wypadało by od początku wygenerować mapę strony i zaktualizować ją na serwerze.

Tworzenie mapy strony za pomocą darmowych lub płatnych programów instalowanych na komputerze

Poza serwisami specjalizującymi się w tworzeniu map stron mamy do dyspozycji również programy, które możemy zainstalować sobie na komputerze i w wygodny sposób generować naszą sitemape. Oto linki do kilku z nich:

Program g-mapper

Program g-mapper

Tworzenie dynamicznej mapy strony – Wtyczki do popularnych CMS’ów

W przypadku gdy nasza strona korzysta z gotowego CMS’a – często jest tak, iż taki CMS’ ma wbudowany w sobie mechanizm generujący mapę strony, lub przynajmniej pozwala na dodanie do niego odpowiedniej wtyczki, która będzie odpowiedzialna za realizację tego zadania. Dobrym przykładem jest wtyczka Yoast SEO dla WordPress’a. Yoast SEO – generuje dynamicznie mapę strony naszego serwisu. Polega to na tym, że wraz z opublikowaniem nowego adresu w serwisie plik sitemap ulega automatycznej aktualizacji (dopisywany zostaje do niego nowy adres).

Tworzenie dynamicznej mapy strony – skrypt napisany w PHP

Poniżej zamieszczam przykładową, działającą klasę Sitemap do tworzenia mapy strony.
Dzięki tej klasie można:

  1. Wygenerować cała mapę za 1 odpaleniem skryptu – pobierając dane o wszystkich postach z bazy MySQL
  2. “Dopisać” do mapy nowy link

Plik class_Sitemap.php


                            
                         ';

?> 2048)
            throw new Exception("Adres URL dodawany do mapy nie może mieć więcej niż 2048 znaków");
        $temp = array();
        $temp['loc'] = $url;
        if (isset($lastmod)) $temp['lastmod'] = $lastmod; 
        if (isset($changefreq))$temp['changefreq'] = $changefreq;
        if (isset($priority)) $temp['priority'] = $priority;
        $this->url[] = $temp;
    }
  

    public function create_sitemap() {
        if (!isset($this->url)){
            throw new Exception("Nie podano danych"); 
        }

        foreach(array_chunk($this->url,50000) as $sitemap) { //maksymalnie 50.000 adresów na mapę
            $xml_code= new SimpleXMLElement($this->sitemap_header);
            foreach($sitemap as $url) {
                $row = $xml_code->addChild('url');
                $row->addChild('loc',htmlspecialchars($url['loc'],ENT_QUOTES,'UTF-8'));
                if (isset($url['lastmod'])) $row->addChild('lastmod', $url['lastmod']);
                if (isset($url['changefreq'])) $row->addChild('changefreq',$url['changefreq']);
                if (isset($url['priority'])) $row->addChild('priority',$url['priority']);
            }
            if (strlen($xml_code->asXML()) > 10485760){
                throw new LengthException("Niestety rozmiar mapy został przekroczony (1)");
            }
               
            $this->sitemaps[] = $xml_code->asXML();
         
        }  

        if (count($this->sitemaps) > 1) { //jesli jest wiecej map niz 1 wyrzuc wyjątek
            throw new Exception("Niestety rozmiar mapy zostal przekroczony (2)");
        }

        $this->sitemaps = $this->sitemaps[0];

            
    }


    public function add_link_to_sitemap($site_xml) {
        if (!isset($this->url)){
            throw new Exception("Nie podano danych"); 
        }              
        $xml_code= new SimpleXMLElement($site_xml);
        $url=$this->url;

        $row = $xml_code->addChild('url');
        $row->addChild('loc',htmlspecialchars($url[0]['loc'],ENT_QUOTES,'UTF-8'));
        if (isset($url[0]['lastmod'])) $row->addChild('lastmod', $url[0]['lastmod']);
        if (isset($url[0]['changefreq'])) $row->addChild('changefreq',$url[0]['changefreq']);
        if (isset($url[0]['priority'])) $row->addChild('priority',$url[0]['priority']);
            
        if (strlen($xml_code->asXML()) > 10485760){
            throw new LengthException("Niestety rozmiar mapy został przekroczony (1)");
        }
            
        $this->sitemaps = $xml_code->asXML();
              
    }


    public function write_sitemap() {
        if (!isset($this->sitemaps)){
            throw new Exception("Brak danych do zapisu.");   
        }               
            $file = fopen($this->sitemap_name, 'w');
            fwrite($file, $this->sitemaps);
            return fclose($file);


    }


}
?>
  

Aby wygenerować mapę z wszystkimi postami z bazy:

 
  generujaca nam url do strony 
        $show = new Display(); 
        $sql="select * from object where type = 1 and publication_date > 0"; // przykładowe zapytanie do bazy
        $tablica = $get->get_everything_you_want($sql);
        
        //klasa Sitemap odpowiedzialna za generowanie mapy
        $sitemap = new Sitemap();
        $sitemap->sitemap_name="sitemap-posts.xml";
        
        foreach ($tablica as $row){
            $url = $show->the_url(1,$row);
            $sitemap->add_url($url,date('c',$row['modification_date']), 'yearly',  '0,8');

        }
        $sitemap->create_sitemap(); // generowanie do pamięci mapy
        $sitemap->write_sitemap(); // zapisywanie mapy w pliku sitemap-posts.xml 
?>

Aby dodać do mapy kolejny wpis:

 
 sitemap_name="sitemap-posts.xml";
        $sitemap->add_url("http://link-1.pl",date('c'), 'monthly',  '0,6');

        //sprawdzam czy istnieje plik mapy 
        //jeśli tak: odczytuje jej zawartość i dopisuje link
        //jeśli nie: tworzę nową mapę z 1 likiem na poczatek
        if(file_exists($sitemap->sitemap_name)==false){         
            $sitemap->add_link_to_sitemap($sitemap->sitemap_header);
        }else{
            $site_xml=file_get_contents($sitemap->sitemap_name);
            $sitemap->add_link_to_sitemap($site_xml); 
           
        }                       
       $sitemap->write_sitemap(); // zapisywanie mapy w pliku sitemap-posts.xml 
?>

Wybaczcie, ze nie opisuje dokładnie działania tych skryptów.. Czas mi już na to nie pozwala:(

Dzielenie dużych map stron na mniejsze – czyli index map stron

Tak jak wcześniej już pisałem. W przypadku gdy nasza mapa jest zbyt duża (waży ponad 50 MB) musimy naszą mapę podzielić na mniejsze pliki, taki podział możemy również zrobić gdy chcemy w przejrzysty dla siebie sposób, skategoryzować udostępniane linki (np. 1 plik mapy zawierać ma tylko adresy stron z artykułami, 2 plik mapy – adresy z kategoriami).

Plik indeksu map jest bardzo podobnie wykonany jak plik mapy witryny. Korzysta on z podstawowych tagów XML:

  • sitemapindex – tag nadrzędny obejmujący całą zawartość pliku
  • sitemap – tag nadrzędny każdej mapy witryny wymienionej w pliku
  • loc – lokalizacja mapy witryny
  • lastmod – data ostatniej zmiany mapy witryny

Więcej informacji na temat konstrukcji tego pliku znajdziecie w tym miejscu: Sample XML Sitemap Index. Oraz w tym Walidacja

Poniższy przykład pokazuje dodanie do indeksu map, dwóch map witryny

    

   
   
      http://www.example.com/article-sitemap.xml
      2019-02-15T18:23:17+00:00
   
   
      http://www.example.com/category-sitemap.xml
      2019-01-01
   
   

Indeks map witryn udostępnia się dla wyszukiwarek w analogiczny sposób jak mapy stron. Dzięki temu rozwiązaniu możemy zgłosić dla jednej strony do 500 map.

Jak udostępnić mapę witryny dla wyszukiwarek

Ok jeśli już mamy przygotowany nasz plik sitemap wypadało by go teraz udostępnić dla wyszukiwarek. Aby tego dokonać należy oczywiście w pierwszym kroku załadować plik z mapą / mapami na nasz serwer. Z reguły powinniśmy go umieścić bezpośrednio w folderze public_html na serwerze, tak adres mapy dostępny był bezpośrednio na w ścieżce: http://nasza_strona.pl/sitemap.xml. Kolejnym krokiem jest zgłoszenie go do wyszukiwarek. Tu mamy kilka metod do wyboru:

  1. Metoda najbardziej uniwersalna: dzięki której każda wyszukiwarka bez problemu znajdzie naszą stronę. Do pliku robots.txt wpisujemy w dowolnym miejscu linijkę z kodem:
    Sitemap: http://example.com/lokalizacja_mapy_witryny.xml
    Nie wiesz co to jest plik robots.txt -> poczytaj ten artykuł od Googla: Tworzenie pliku robots.txt
  2. Użyj funkcji „ping”, by poprosić wyszukiwarki o zindeksowanie mapy witryny.
    dla Google:
    http://www.google.com/ping?sitemap=pełny_url_mapy_witryny
    dla Bing:
    https://www.bing.com/webmaster/ping.aspx?siteMap=pełny_url_mapy_witryny
    Na przykład:
    http://www.google.com/ping?sitemap=http://www.hackwars.pl/post-sitemap.xml
  3. Przesłanie mapy do Google za pomocą Google Search Console – musisz się zalogować na swoje konto Google (dodatkowe informację jak dodać mapę w ten sposób znajdziesz w tym miejscu: https://support.google.com/webmasters/answer/7451001

Na koniec

Uff.. no cóż to chyba było by wszystko.. mam nadzieję, że komuś ten artykuł się przyda.. Jeśli popełniłem jakąś gafe czy coś w tym rodzaju to z góry przepraszam.. pisząc artykuły tak naprawdę pisze pod siebie.. bo często sam wracam do swoich “notatek”, a przez to nie zagłębiam się czy merytorycznie, ortograficznie, stylistycznie jest wszystko ok.