SimplePie + WordPress – nowe możliwości przed Twoim blogiem Grzegorz Wójcik

Logo SimplePie, Logo WordPress

Jak w łatwy sposób zintegrować bloga opartego o WP z zewnętrznymi źródłami informacji udostępnianymi w formacie RSS? W niniejszym artykule postaram się zaproponować w miarę proste rozwiązanie tego problemu.

W dzisiejszych czasach prawie każdy szanujący się serwis udostępnia przynajmniej jakąś część swoich zasobów jako RSS – przykładowo lista ostatnich linków dodanych do konta w serwisie del.icio.us znajduje się pod adresem:

http://feeds.delicious.com/rss/nazwakonta

Co ciekawe, do niedawna nawet popularny Pudelek udostępniał jako RSS listę najnowszych plotek, jednak funkcjonalność ta została wyłączona – zapewne w celu zwiększenia liczy odsłon samej strony (to ważne dla reklamodawców).

My na tą chwilę zostawimy świat gwiazd i plotek w spokoju i dla przykładu spróbujemy zintegrować naszego bloga z serwisem pogodowym Yahoo! Weather – wyświetlimy na stronie głównej aktualną pogodę w naszym mieście. Oczywiście to tylko przykład i mam nadzieję, że dzięki wskazówkom w tekście będziecie mogli dokonać integracji z danymi z innych źródeł.

Parser SimplePie

Kluczowym elementem w procesie integracji będzie SimplePie. SimplePie to napisana w PHP klasa odpowiedzialna za przetwarzanie plików RSS (obsługuje też wiele innych popularnych formatów np. Atom). SimplePie znacząco ułatwia sprawę i załatwia za nas przysłowiową „czarna robotę” – pobiera plik z zewnętrznego serwera, parsuje go i zwraca łatwą w użyciu tablicę wynikową. Dodatkowo posiada wbudowany mechanizm buforowania (ang. caching) pobranych plików – co ma kluczowe znaczenie w przypadku dużej liczby odsłon naszego boga.

Zacznijmy więc od pobrania najnowszej wersji biblioteki ze strony simplepie.org i wypakowania zawartości archiwum do katalogu simplepie w głównym katalogu serwera www. Kolejnym krokiem jest uruchomienie specjalnego skryptu testującego konfigurację serwera, na którym stoi nasza strona pod kątem zainstalowanych komponentów wykorzystywanych przez SimplePie.

Zakładając, że nasz blog dostępny jest pod adresem http://jakasstrona.pl/, plik testujący konfigurację powinien być dostępny pod adresem:

http://jakasstrona.pl/simplepie/compatibility_test/sp_compatibility_test.php

Jeżeli po odpaleniu skryptu testującego konfigurację zobaczymy komunikat Yes, sou can! oznacza to, że bez obaw możemy przejść do dalszej części artykułu.

SimplePie podany w plug-inie

Aby móc korzystać z dobrodziejstw SP w szablonach WP (ang. templates) najlepiej jest dołączyć tę klasę do jakiegoś aktywnego plug-ina lub do pliku functions.php, który znajduje się w katalogu z danym tematem (ang. theme). Zaletą pierwszego wariantu jest to, że z metod SP będziemy mogli korzystać niezależnie od wybranego tematu.

Dobrą praktyką w pracy z WP jest stworzenie własnego plug-ina właśnie do takich rzeczy – czyli np. dołączania zewnętrznych bibliotek, itp. W katalogu /wp-content/plugins/ stwórzmy nowy katalog o nazwie moj_plugin i przenieśmy do niego wgrany wcześniej katalog simplepie. Dodatkowo w katalogu moj_plugin utworzmy plik moj_plugin.php (będzie to właściwy plik naszego plug-ina). Aby plug-in został prawidłowo wykryty przez WP, musimy na początku pliku moj_plugin.php umieścić odpowiednio sformatowany komentarz:

  1. <?php
  2. /*
  3. Plugin Name: Moj Plugin
  4. Plugin URI: http://jakasstrona.pl/
  5. Description: Globalne bibliotek i poprawki
  6. Author: Jan Kowalski
  7. Version: 1.0
  8. Author URI: http://jakastrona.pl/
  9. */
  10. ?>

Dalej wystarczy już napisać właściwy kod wtyczki. W pierwszej kolejności dołączamy bibliotekę SP:

  1. include_once('simplepie/simplepie.inc');

Aby maksymalnie ułatwić korzystanie z SP w szablonach warto napisać funkcję, która ustawi wszystkie zmienne konfiguracyjne SP (np. katalog na cache) i zwróci nam gotową tablicę wynikową. Taka funkcja może przybrać następującą formę:

  1. function pobierz_rss($feedurl, $limit=5) {
  2.        
  3.         $feed = new SimplePie();
  4.         $feed->set_feed_url($feedurl);
  5.         $feed->set_cache_location(dirname(__FILE__).'/simplepie/cache');
  6.         $feed->set_cache_duration(3600);
  7.         $feed->init();
  8.         $feed->handle_content_type();
  9.         return $feed->get_items(0,$limit);
  10.        
  11. }

Warto upewnić się, że w katalogu simplepie jest katalog cache, w którym PHP może zapisywać pliki. Najczęściej wiąże się to z ustawieniem praw dostępu do takiego katalogu na poziomie 755 lub 777.

Właściwie w tym momencie nasz plug-in jest już gotowy – jego kod w całości można zobaczyć tutaj.

SimplePie w akcji

Typowym elementem blogów opartych o WP są tzw. ostatnie komentarze, czyli wyświetlana w pasku bocznym lista ostatnich komentarzy do postów. Jest około tuzina plugin-ów, które realizują tę funkcjonalność – najczęściej poprzez bezpośrednie zapytania do bazy. My, uzbrojeni w nasz własny plug-in możemy podejść do tematu z innej perspektywy. WP udostępnia przecież jako RSS listę ostatnich komentarzy pod następującym adresem:

http://jakasstrona.pl/comments/feed/

Możemy „przeczytać” ostatnie komentarze z pomocą SP i wyświetlić ich listę w pasku bocznym bloga. Otwórzmy plik sidebar.php w katalogu z aktywnym tematem i dodajmy następujący fragment:

  1. <?php
  2. $komentarze = pobierz_rss('http://jakasstrona.pl/comments/feed/');
  3.  
  4. echo '<ul>';
  5. foreach($komentarze as $komentarz) {
  6.  echo '<li>'.$komentarz->get_title().'<br>'.$komentarz->get_description().'</li>';
  7. }
  8. echo '</ul>';
  9. ?>

Integracja z Yahoo! Weather

Tak jak wspominałem na początku artykułu, przystąpmy teraz do „konsumpcji” danych w formacie RSS z serwisu Yahoo! Weather. Przykładowo aktualną i prognozowaną pogodę dla Warszawy w formacie RSS odnajdziemy pod następującym adresem:

http://xml.weather.yahoo.com/forecastrss?p=PLXX0028&u=c

Pogodowy feed od Yahoo! ma charakterystyczną budowę – zawiera tylko jeden element item, wewnątrz którego w elemencie description zawarte są wszystkie interesujące nas informacje:

  1. <item>
  2. <title>Conditions for Warsaw, PL at 8:00 pm CEST</title>
  3. <geo:lat>52.17</geo:lat>
  4. <geo:long>20.97</geo:long>
  5. <link>
  6. http://us.rd.yahoo.com/dailynews/rss/weather/Warsaw__PL/*
  7. http://weather.yahoo.com/forecast/PLXX0028_c.html
  8. </link>
  9. <pubDate>Sun, 01 Jun 2008 8:00 pm CEST</pubDate>
  10. <yweather:condition  text="Fair"  code="34"  temp="22"  date="Sun, 01 Jun 2008 8:00 pm CEST" />
  11. <description><![CDATA[
  12. <img src="http://l.yimg.com/us.yimg.com/i/us/we/52/34.gif"/><br />
  13. <b>Current Conditions:</b><br />
  14. Fair, 22 C<BR />
  15. <BR /><b>Forecast:</b><BR />
  16. Sun - Clear. High: 26 Low: 13<br />
  17. Mon - Sunny. High: 25 Low: 14<br />
  18. <br />
  19. <a href="http://us.rd.yahoo.com/dailynews/rss/weather/Warsaw__PL/
  20. *http://weather.yahoo.com/forecast/PLXX0028_c.html">Full Forecast at Yahoo! Weather</a><BR/>
  21. (provided by The Weather Channel)<br/>
  22. ]]></description>
  23. <yweather:forecast day="Sun" date="1 Jun 2008" low="13" high="26" text="Clear" code="31" />
  24. <yweather:forecast day="Mon" date="2 Jun 2008" low="14" high="25" text="Sunny" code="32" />
  25. <guid isPermaLink="false">PLXX0028_2008_06_01_20_00_CEST</guid>
  26. </item>

Aby wyświetlić zawartość elementu description na blogu wystarczy do pliku szablonu (np. sidebar.php) dodać następujący kod:

  1. <?php
  2. $pogoda = pobierz_rss('http://xml.weather.yahoo.com/forecastrss?p=PLXX0028&u=c');
  3.  
  4. $pogoda_txt = $pogoda[0]->get_description(); // $pogoda ma tylko jeden element
  5.  
  6. echo $pogoda_txt;
  7. ?>

Pogoda z serwisu Yahoo! Weather w pasku bocznym bloga
Rysunek 1

W tym momencie pogoda powinna być już dostępna dla osób odwiedzających naszego bloga (Rysunek 1). Pewną niedogodnością jest fakt, że informacje pogodowe prezentowane są w języku angielskim – możemy stosunkowo prosto przezwyciężyć ten problem dokonując zamiany angielskich fraz w zmiennej $pogoda_txt na ich polskie odpowiedniki za pomocą standardowej funkcji str_replace() w PHP:

  1. <?php
  2. $pogoda = pobierz_rss('http://xml.weather.yahoo.com/forecastrss?p=PLXX0028&u=c');
  3.  
  4. $pogoda_txt = $pogoda[0]->get_description();
  5.  
  6. $tlumaczenia = array(
  7.  'Current Conditions:' => 'Aktualna pogoda:',
  8.  'Forecast:' => 'Prognoza:'
  9.  //tutaj dodajemy kolejne frazy do tłumaczenia
  10. );
  11.  
  12. foreach($tlumaczenia as $klucz => $wartosc) {
  13.  $pogoda_txt = str_replace($klucz, $wartosc, $pogoda_txt);
  14. }
  15.  
  16. echo $pogoda_txt;
  17. ?>

Podsumowanie

Mimo, że zaprezentowane podejście wydawać się może złożone, to jednak zapewnia większą elastyczność i kontrolę prezentacji wyświetlanych danych niż ma to miejsce w przypadku wielu popularnych RSS-owych plugin-ów do WP. Warto więc przyjrzeć się bliżej możliwościom oferowanym przez parser SimplePie i wykorzystać je do uatrakcyjnienia swojego bloga.

Czytaj więcej:
Artykuły » PHP, WordPress
Tagi:
, , ,

Grzegorz Wójcik

Grzegorz Wójcik jest założycielem internetowego magazynu kminek.pl. Pasjonat i twórca lekkich, dostępnych i użytecznych stron internetowych budowanych w oparciu o standardy sieciowe i najlepsze praktyki. Prywatnie wielki miłośnik rocka z lat 90.

Zobacz wszystkie artykuły tego autora (14)

  1. gry 1

    niezly artykul, dzieki

  2. Robert 2

    Artykuł faktycznie napisany dość fajnie.
    osobiście mam cały czas problem z instalacja SimplePie wraz z Core z wordpressem 2.6. Sciagnalem z wordpress.org i proba instalacji konczy sie niepowodzeniem.
    Mam w zwiazku z tym pyatnie aby pojawiło mi sie po instalacji oryginalnej wersji plugina na sidebarze coś tam (na przykład pogoda) to gdzie mam wpisac adres ten powyzszy z yahoo.com
    Nie widze w ustawieniach pluginy, czy trzeba edytować plik?
    dzieki

  3. Bravo7 4

    SimplePie to fajny i prosty skrypt.

  4. użyłem ten moduł pogodowy na 2 stronach i fantastycznie chodzi no i .. wygląda profesjonalnie

Dodaj komentarz | * pola obowiązkowe

 
 
 
 

Dozwolone tagi HTML: <a href="" title=""> <blockquote cite=""> <code> <em> <strong> <pre lang="" line="" escaped="">

Komentarze są moderowane. Mile widziane wpisy wnoszące nowe, ciekawe informacje do omawianego tematu
lub sygnalizujące ewentualne błędy merytoryczne. Wszelkie przejawy spamu lub nieetycznego zachowania bedą
karane blokadą adresu IP/domeny.