Mapa witryny sitemap.xml w PHP i Laravel: generowanie pliku mapy

kursphp.com 2 lat temu

Czym jest mapa witryny?

Jest to mapa wszystkich linków Twojej witryny.

Przede wszystkim chodzi o to żeby dać robotowi Google całą zawartość Twojej strony, w momencie kiedy przegląda daną witrynę. jeżeli nie blokujesz go plikiem robots.txt, chcesz, aby robot miał łatwy dostęp do całej gamy adresów url. Prezentując mapę witryny na starcie jesteśmy w stanie przekazać od razu wszystkie adresy naszej strony, które chcielibyśmy, żeby robot znalazł i zaindeksował.

Finalnie chcemy, żeby wszystkie te linki pojawiły się w wyszukiwarce Google w momencie kiedy ktoś wpisuje interesujące nas hasło.

Narzędzia do generowania mapy witryn

O ile są gotowe narzędzia np. w WordPressie, które taką mapę witryn nam bardzo łatwo nam wygenerują (np. najbardziej popularna wtyczka do SEO: Yoast SEO) są też gotowe scrapery w internetach (np. xml-sitemaps.com), z których też możemy sobie skorzystać.

Działają one w ten sposób, iż po prostu wchodzą na naszą stronę i scrapują jej wszystkie podstrony. Czyli, działają jak każdy inny scraper – biorą po kolei wszystkie linki, które znajdą na stronie głównej. Następnie przechodzą przez te wszystkie linki szukają tam obecnych linków i tak aż wyczerpią wszystkie znalezione adresy.

W zależności od tego jakie ustawimy tam zagnieżdżenie to tak głęboko ten scraper będzie wchodził i szukał wszystkich dostępnych linków na stronie. Jako efekt finalny jego działania tworzy się na koniec plik XML. W tym pliku XML znajdują się wszystkie adresy teraz znajdujące się na naszej witrynie. Taki plik bardzo łatwo możemy sobie wtedy umieścić w Google Search Console i wgrać tam całą mapę witryny.

Przykład widoku dodawania mapy witryny w google search console

Generowanie mapy witryny w kodzie PHP

Dobrze, ale jak w takim razie uzyskać podobny efekt:

  1. Po pierwsze – bez scrapowania całej strony. Scraping bardzo obciąża system bo jest dużo zapytań wykonywanych w przeciągu dość krótkiego czasu.
  2. Po drugie – odzwierciedlając faktyczny stan linków witryny zaraz po pojawieniu się nowych linków. Taka mapa witryny zmienia się raz na jakiś czas. Na przykład, po dodaniu każdego nowego artykułu czy komentarza. Wtedy mapa witryny powinna zawrzeć nowopowstały link. Nie byłoby sensu scrapować za każdym razem całej dostępnej strony przechodząc przez wszystkie możliwe adresy tylko po to, żeby dodać jeden czy dwa nowe adresy które akurat nam się pojawiły.

Jest na to sprawdzony sposób.

Można generować mapę witryny bezpośrednio z poziomu kodu, bazując na danych, które mamy w aplikacji (np. trzymanych w bazie danych) + kilka statycznych plików które możemy sobie zahardkodować. Wtedy możemy taką mapę przygotowywać samodzielnie.

Gotowe biblioteki do generowania map witryn

Zarówno Laravel, jak i PHP, posiadają gotowe implementacje narzędzi do generowania map XML.

W tym artykule chciałbym ci pokazać jak się posłużyć jednym z nich do wygenerowania mapy witryny opartej na Laravelu.

Przy generowaniu mapy linków dużo zależy od tego jak wygląda struktura naszej strony. To, które adresy i jak wygenerujesz zależą mocno od tego, w jaki sposób prezentujesz treści na swojej stronie. Weźmy pierwszy przypadek – strona typu blog, analogiczna do systemu wordpress.

Skorzystajmy sobie z biblioteki o nazwie laravelium/sitemap do stworzenia mapy strony. Tutaj przejdziesz do oficjalnej dokumentacji biblioteki i instrukcji jej instalacji.

Instalacja biblioteki laravelium/sitemap

Tę bibliotekę instalujemy dokładnie w ten sam sposób, jak większość pozostałych. Mam tu na myśli composera.

Ustawiając się w terminalu na folderze głównym projektu, wywołaj:

composer require laravelium/sitemap

Następnie opublikuj zasoby dostarczane wraz z biblioteką:

php artisan vendor:publish --provider="Laravelium\Sitemap\SitemapServiceProvider"

Po wykonaniu tych dwóch instrukcji biblioteka jest gotowa do generowania mapy witryny.

Zróbmy sobie przykładowe ćwiczenie, generując mapę witryny xml dla witryny typu blog.

Mapa strony dla bloga

Na start – mamy stronę główną, więc muszę dodać najpierw adres strony głównej.

// stwórz nowy obiekt typu sitemap $sitemap = App::make("sitemap"); // dodaj do niego pierwszy link do strony głównej $sitemap->add(Url::to('/'));

Później mam adresy wszystkich kategorii więc szukam wszystkich wpisów typu kategoria w bazie danych, które dodatku są aktywne. Kategoria może być nieaktywna, a o ile tak jest, to oczywiście nie chcę prezentować linku do tej kategorii w mapie witryny.

$categories = Category::where('is_active', 1)->get(); foreach ($categories as $category) { $sitemap->add($category->getUrl()); }

Następnie, mając się wszystkie kategorie, przychodzę do postów. Wszystkie moje posty znajdują się w tabeli posts. Tutaj również szukam wszystkich postów, które są aktywne (czyli są w statusie opublikowane).

$posts = Post::where('is_active', 1)->get(); foreach ($posts as $post) { $sitemap->add($post->getUrl()); }

Nie wszystkie adresy url trafią do mapy

Wszystkie drafty czy wpisy prywatne, oczywiście, pomijam. Są one widoczne tylko dla administratora po zalogowaniu, także nie chcę, by robot je odwiedzał. Bez utworzonej sesji administratora i tak zobaczyłby jedynie błąd 403 NOT AUTHORIZED.

Następnie możesz się zastanowić, czy w Twojej stronie np. posiadasz osobne podstrony do wyświetlania komentarzy bądź osobne podstrony do wyświetlania listy tagów. jeżeli tak, możesz je uwzględnić w Twojej mapie witryny.

Uwzględnienie adresów url ze stronicowania

Dodatkowym przypadkiem użycia, które musisz wziąć pod uwagę, jest stronicowanie. jeżeli strona kategorii posiada dużo postów, a na jednej stronie umieszczasz ich 20, to musisz w mapie witryny uwzględnić wszystkie adresy kolejnych stron wyników. jeżeli faktycznie znajdują się na Twojej stronie w postaci żywych odnośników.

Mapa strony bez wyników wyszukiwania

Kolejnym typem adresów, których nie chcesz umieścić w Twojej mapie witryny xml, są strony generowane na podstawie filtrów. Np. masz wyszukiwarkę (wyobraźmy sobie OtoMoto.pl) gdzie ustawiasz wiele różnych parametrów (np. marka i model, rodzaj paliwa, pojemność, moc, rocznik itd.).

Możliwych kombinacji jest tak wiele, iż ciężko byłoby umieścić wszystkie te linki w mapie witryny. Do tego, z punktu widzenia SEO, parametry przekazywane w query stringu (po znaku zapytania) nie są dobrze odbierane. Dodatkowo, wiele z tych zapytań może generowań niemal identyczne wyniki (co w rezultacie zaowocuje wielokrotnie zduplikowanym contentem – kolejnym błędem SEO).

Także, dobrą regułą jest w ogóle nie umieszczać tego typu wyników w mapie witryny.

Publikacja mapy witryny

Gdy już masz kod generujący poprawnie mapę witryny, masz tak naprawdę dwie możliwości:

  1. Auto-generować mapę witryny za każdym razem kiedy robot Google (lub dowolny inny) próbuje odczytać zawartość sitemap.xml. Wtedy nie masz jednego statycznego pliku, tylko za każdym razem kiedy ktoś odwiedza ten adres, kod tworzy mapę na świeżo. o ile twoja witryna jest tak dynamiczna, iż zmienia się bardzo często (pojawiają się nowe wpisy, nowe artykuły, nowe podstrony z komentarzami) to jest to dobre podejście. Wtedy plik jest zawsze aktualny.
  2. Zapisać wygenerowaną zawartość XML z linkami do pliku sitemap.xml. o ile masz stronę, gdzie opublikujesz sobie jeden post na tydzień, do tego pojawi się jakaś jedna nowa kategoria raz na trzy tygodnie, to nie ma sensu za każdym razem generować nowej mapy. Jest to niepotrzebne obciążenie serwera, które nie daje Ci żadnych korzyści. Im strona jest bardziej popularna, tym plik sitemap będzie odwiedzany częściej.

Zobacz w kodzie, jak wykorzystać obie te metody:

// zapisz wynik do pliku (format, filename) $sitemap->store('xml', 'sitemap'); // lub // zwróć wynik z metody return $sitemap->render('xml');

Już wiesz w jaki sposób możesz generować mapy witryny i publikować je na swojej stronie. Następnie, gdy mapa witryny jest gotowa, pozostaje dodać jej adres do Google Search Console i śledzić stan indeksowania Twoich adresów url.

Tym sposobem masz pełną kontrolę nad widocznością linków Twojej witryny.

Idź do oryginalnego materiału