W 2005 roku Google opublikowało protokół pozwalający twórcom stron przygotowywać mapy stron. Są to pliki XML zawierające linki do wszystkich podstron witryny, datę ostatniej ich modyfikacji, ważność oraz częstotliwość z jaką roboty indeksujące mają ją odwiedzać. W ten sposób autorzy witryn mają wpływ na to, jakie treści ze strony znajdą się w wyszukiwarce. Wyszukiwarkom pozwala to na inteligentniejsze i szybsze indeksowanie. Tak przygotowane mapy można zgłaszać, nie czekając aż robot odwiedzi naszą stroną kolejny raz. Dzięki temu, nasz nowy artykuł na blogu, czy post na forum będą szybciej widoczne w wynikach wyszukiwania.
Ręczne tworzenie plików map w przypadku dynamicznych stron jest praktycznie niemożliwe i mija się z celem. Jakiś czas temu stanąłem przed takim problemem. Ponieważ nie mogłem znaleźć gotowego rozwiązania które spełniałoby moje oczekiwania, napisałem klasę realizującą to zadanie.
Przedstawię dwa przykłady użycia klasy. Przykład pierwszy będzie odpowiedni dla większości zastosowań. Drugi, bardziej zaawansowany, pokaże wszystkie możliwości klasy. Kod opiszę linia po linii.
Przykład pierwszy:
// podlączenie klasy include 'SitemapGenerator.php'; // tworzenie obiektu // pierwszy parametr: pełny adres strony // drugi parametr: relatywna ścieżka, gdzie mają znaleźć się pliki map $sitemap = new SitemapGenerator("http://mojastrona.pl/", "../"); // funkcja addUrl dodaje do mapy pojedynczy adres, // musi posiadać minimum jeden parametr, pozostałe są opcjonalne // pierwszy parametr: adres strony, // drugi parametr: data modyfikacji w formacie ISO 8601 // trzeci parametr: częstotliwość z jaką robot powinien odwiedzać stronę // czwarty parametr: ważność storny, dozwolone wartości: 0..1 $sitemap->addUrl("http://mojastrona.pl", '2009-12-03', 'always', 1); $sitemap->addUrl("http://mojastrona.pl/strona1", '2009-12-03', 'hourly', 0.5); $sitemap->addUrl("http://mojastrona.pl/strona2", '2009-12-03', 'daily'); $sitemap->addUrl("http://mojastrona.pl/strona3", '2009-12-03'); $sitemap->addUrl("http://mojastrona.pl/strona4"); $sitemap->addUrl("http://mojastrona.pl/strona/podstrona1", '2009-12-01', 'weekly', 0.4); $sitemap->addUrl("http://mojastrona.pl/strona/podstrona2", '2009-12-02', 'monthly'); $sitemap->addUrl("http://mojastrona.pl/strona/podstrona3", '2009-12-03'); $sitemap->addUrl("http://mojastrona.pl/strona/podstrona4"); // wywołanie powoduje stworzenie mapy w pamięci $sitemap->createSitemap(); // wywołanie powoduje zapisanie mapy do pliku lub plików $sitemap->writeSitemap(); // wywołanie powoduje dopisanie do pliku robots.txt informacji o mapie // jeśli plik nie istnieje, zostanie utworzony $sitemap->updateRobots(); // wywołanie powoduje wysłanie mapy do wyszukiwarek // Google, Yahoo, Bing i Ask $sitemap->submitSitemap();
Drugi przykład:
include 'SitemapGenerator.php'; $sitemap = new SitemapGenerator("http://mojastrona.pl/", "../"); // standardowo false, // true powoduje wygenerowanie także skompresowanej wersji mapy $sitemap->createGZipFile = true; // standardowo 50,000 (maksymalna wartość) // decyduje o tym, ile linków będzie zawierała jedna mapa. // przydać się może gdy linki są bardzo długie i // jeden plik mapy przekaracza wielkość 10MB $sitemap->maxURLsPerSitemap = 10000; // standardowo sitemap.xml // nazwa pliku mapy $sitemap->sitemapFileName = "sitemap.xml"; // standardowo sitemap-index.xml // nazwa pliku indeksu map $sitemap->sitemapIndexFileName = "sitemap-index.xml"; // standardowo robots.txt // nazwa pliku dla robotów indeksujących $sitemap->robotsFileName = "robots.txt"; // tablica z pojedynczymi linkami $urls = array( array("http://mojastrona.pl", date('c'), 'daily', '1'), array("http://mojastrona.pl/strona1", date('c'), 'daily', '0.5'), array("http://mojastrona.pl/strona2", date('c'), 'daily'), array("http://mojastrona.pl/strona3", date('c')), array("http://mojastrona.pl/strona4") ); // dodaje wiele linków, // argument musi być tablicą $sitemap->addUrls($urls); // dodaje pojedynczy link $sitemap->addUrl("http://mojastrona.pl/strona5", '2009-12-04', 'daily','0.5'); $sitemap->addUrl("http://mojastrona.pl/strona6", '2009-12-04 09:20Z', 'daily'); $sitemap->addUrl("http://mojastrona.pl/strona7", '2009-12-04T09:20Z'); $sitemap->addUrl("http://mojastrona.pl/strona8", '2009-W49-5'); $sitemap->addUrl("http://mojastrona.pl/strona9", '2009-338'); try { $sitemap->createSitemap(); $sitemap->writeSitemap(); $sitemap->updateRobots(); // wywołanie powoduje wysłanie mapy do wyszukiwarek // argument to Yahoo! App ID, jeśli brak, // strona zostanie wysłana do Yahoo anonimowo. // zwraca tablicę z wynikami, wiadomość od wyszukiwarki // oraz kod odpowiedzi http $result = $sitemap->submitSitemap("yahooAppId"); // wyświetlenie odpowiedzi wyszukiwarek echo "<pre>"; print_r($result); echo "</pre>"; } catch (Exception $exc) { echo $exc->getTraceAsString(); }
Więcej o klasie: http://antczak.org/projekty/php-sitemap-generator/
Pliki oraz przykłady do pobrania: http://www.phpclasses.org/browse/package/5838.html
Mam pytanie, nigdy nie korzystałem z takich generatów… a Twoja klasa podoba mi się ze względu na prostę działania i proste wyłumaczenie (nakłoniłeś mnie w ten sposób na test).
Zanim wróce do domu i wypróbuję to mam pytanie…
Czy Twoją klase i skrypt mam wgrać na serwer czy mogę to uruchomić z dysku (a strona jest na np. nazwa.pl)?
Ogólnie super pomysł i super realizację – pochwalę się jak przetestuję w domu.
Możesz to oczywiście uruchamiać lokalnie. Jale adresy podaj rzeczywiste.
Polecam także dodanie swojej strony do https://www.google.com/webmasters/tools/home?hl=pl Można tam podejrzeć czy Google odebrało mapę, czy nie ma w niej błędów itp.
Już zarejestrowłem stronę na tej stronie https://www.google.com/webmasters/tools/home?hl=pl, ale google zaindeksowało moją stronę, po czym po ok. 2 dniach wywaliło z indeksu (i nie znam powodu).
Dlatego chcę spróbować z sitemap.xml..
Może to być spowodowane małą ilością treści. Dla Google treść na najważniejsza.
Bardzo dobra klasa. Z ogólnych uwag kosmetycznych to:
– warto dodać opcjonalne formatowanie xmla ($dom = new domDocument;)
– uwzględnić jakąś tablice z sitemapami generowanymi w innych miejscach (np przez WordPress’a) tak, aby były one także uwzględniane w sitemap-index.xml
– wcięcia w plikach php zamienić na tabulatory.
Zainstalowałem skrypt ale dostaję komunikat :
#0 /sitemap/tworzymy_mape.php(54): SitemapGenerator->createSitemap() #1 {main}Memory peak usage: 0.15MB
Execution time: 0s
Co może być przyczyną?
Pokaż jak wygląda plik tworzymy_mape.php.
Pozdrawiam.
Możesz to oczywiście uruchamiać lokalnie. Jale adresy podaj rzeczywiste.
Polecam także dodanie swojej strony do https://www.google.com/webmasters/tools/home?hl=pl Można tam podejrzeć czy Google odebrało mapę, czy nie ma w niej błędów itp.
Witam i proszę o pomoc.
Zainstalowałem wszystkie 3 pliki : generator,simple i advanced. Bardzo ładnie wygenerowało mi mapę w xml , utworzył się plik mapy na serwerze i na tym koniec. Mapa została wygenerowana , ale zawiera tylko adresy takie jak w wierszach 14 do 22 w pierwszym przykładzie/powyżej/ Co należy zrobić zeby generowało faktyczne adresy jakie znajdują się na stronie? Co robię źle ? Wiem ze jestem cieniutki , ale jakoś chciałbym to uruchomić.
Witam.
To przykład, jak dodać do mapy swoje autentyczne linki. Zamiast „mojastrona.pl” dodaj własne linki.
@Paweł Antczak
Wiem. Zmieniłem przykłady na prawdziwe adresy.
sitemap.xml jest wygenerowane z prawdziwymi adresami , ale tylko tymi wprowadzonymi ręcznie do skryptu. Przy zmianie zawartości witryny, czyli po dodaniu nowych wpisów nie zmienia się treść sitemap.xml , Skąd pobierane są dane powodujące aktualizację mapy i samoczynne dopisywanie kolejnych pozycji w treści mapy? Wygląda na to że aktualizacje nie są pobierane z witryny wpisanej w postaci pełnego adresu strony „$ sitemap=new ”
Już zupełnie nie rozumiem zasady działania . Pawle – poooomocy.
Ta klasa nie analizuje Twojej strony. W sitemapie są tylko te adresy, które wprowadzisz. Tu chodzi o dodawanie adresów np. z bazy danych. Jeśli masz statyczną stronę, to ona nie potrzebuje sitemapy.
No właśnie- i tu jest problem. Szukam „czegoś” co samoczynnie analizowało by treść witryny i zapisywało wszystkie ( bardzo częste ) zmiany w formacie xml , ale bez pobierania danych z „bazy danych”.
Albo może jeszcze inaczej – są różne witryny korzystające z jednej bazy danych i wyświetlające tą samą treść ale na stronach www i domenach o różnych adresach. Czy jest możliwość zainstalowania skryptu w różnych domenach/witrynach – ale tak żeby pobierały adresy z jednej bazy danych i generowały sitemapy w docelowych witrynach oczywiście z odpowiednimi przedrostkami np. w witrynie http://www abc.pl sitemapa bedzie generowała linki http://www.abc.pl/……….. a w witrynie http://www.123.pl w mapie będa linki http://www.123.pl/……… Jakie ścieżki dostępu należy wpisać w pliki sample.php żeby pobierało adresy z bazy danych?
Ale namieszałem 🙁
Mam fajny spolszczony skrypt generatora mapy witryn internetowych sitemap.
Wygenerowane sitemap jest zgodne ze standardem.
Po zeskanowaniu witryny skrypt automatycznie zapisuje sitemap xml i txt na serwerze.
Może być uruchamiany ręcznie lub dodany do zadań cron.
Ważniejsze ustawienia:
– Pingowanie po wygenerowaniu sitemap
– Automatyczne kompresowanie wygenerowanego pliku jeżeli jest większy niż 10 MB
– Ustawianie limitu czasu wykonywania
– Wykluczanie katalogów i/lub plików które będą pominięte w mapie witryny
Do wersji polskojęzycznej którą samodzielnie tłumaczyłem dodaję oryginalne pliki które są udostępnione do ogólnego użytku na licencji GPL
Jest to idealne rozwiązanie dla dużych serwisów które są często aktualizowane i rozbudowywane.
Skrypt doskonale sobie radzi ze skanowaniem rozbudowanych serwisów.
Mogę zainstalować skrypt na Twoim serwerze i skonfigurować. Zainteresowanych zapraszam do kontaktu Fipcio GG 12293255