INDEVELOPMENTbeta






Subskrybuj m1chu.eu – another devblog
 
  •  m1chu: Gdyby ktoś miał kiedyś problem z nieprawidłową wielkością pobieranego pliku, chociażby w moich, wyżej...
  •  m1chu: Jeżeli chodzi o szybką konwersję z Flash na HTML to szczerze nie wiem. Nigdy nie potrzebowałem żadnej...
  •  m1chu: @Michal: wrzuć linki w jakieś kontenery (listę ul -> li, dl -> dt/dd, czy chociażby w divy). Ustaw ich...
  •  Józek: Wszystko pięknie opisane, ja mam małe pytanko. Od jakiegoś czasu staram się dowiedzieć jak zmienić...
  •  Michal: a co jesli chciałbym umiescic kilka takich linkow obok siebie ?jesli zmienie wartość display na inline...
  •  mano: Co należy zrobić aby podmiane przycisku zastasowac kilka razy na stronie z różnymi grafikami ? Trzeba...
  •  michauu: Ale na twojej stronce nie ma nifty corners:) http://www.html.it/articoli/ni fty/index.html

Dołącz do fanów!

Ankieta!

  • Jak oceniasz poziom artykułów? (dokładną opinię umieść w komentarzu)

    View Results

    Loading ... Loading ...




Jak wyizolować liczbę subskrybentów RSS korzystając z FeedBurner’a?


Pobieramy liczbę subskrybentów RSS poprzez FeedBurner

W niezbędniku prawie każdego blogera leży możliwość menadżerowania swoimi kanałami RSS, bądź Atom. Któż z nas nie zna FeedBurner’a?. Zestawu narzędzi ułatwiających nam, czy to udostępnianie użytkownikom możliwości subskrypcji treści naszej strony, czy po prostu możliwość przejrzenia lub zamieszczenia statystyk w naszym serwisie. Pomimo dostarczonego API nie znajdziemy jednak bezpośrednio w panelu FeedBurner’a kodu pozwalającego na umieszczenie samej liczby subskrybentów bloga. I rozwiązanie tego, pozornie błahego problemu postaram się Wam dziś przedstawić…

Stary, dobry FeedBurner.com…

Niespełna dwa lata temu słynny serwis zajmujący się obsługą kanałów RSS został przejęty za sto milionów dolarów przez Google. Pomimo tego, że minęło aż tyle czasu wielu blogerów nadal korzysta z zasobów starego, wysłużonego, pierwotnego FeedBurner’a. I co może wydawać się dziwne, to właśnie oni mają najbardziej ułatwioną sytuację.

Zarówno stara, jak i nowa odsłona serwisu oferują usługę FeedCount dostępną z poziomu menu Publicize. Pozwala ona na dobranie typu wbudowanego tła wyświetlającego ilość subskrybentów (statyczne, bądź animowane) oraz na dobranie jego barwy i koloru tekstu. Wraz z ustawieniem tych parametrów otrzymujemy kod HTML do wstawienia na naszą stronę. I tu rodzi się problem. Prócz kilku stylistycznych zmian wygląd tychże „chickletów” jest zawsze taki sam i najczęściej nijak pasuje do designu naszego bloga. Co zrobić jeżeli np. chcemy wraz z tekstem przycisku odnoszącego użytkowników do wygenerowanego kanału wstawić także ilość osób śledzących naszą stronę?

Rozwiązanie zaprezentuje na podstawie użytkowania platformy WordPress (oczywiście ilość subskrybentów – opierając się na dalszym tekście – można zamieścić w każdym innym systemie zarządzania treścią, bądź nawet na własnej, prywatnej stronie). W takim wypadku wystarczy zainteresować się wtyczkami FeedSmith 2.3 (polska wersja) (wg. developerów WordPress’a kompatybilną ze wszystkimi wersjami 2.x) i Feed Count 1.2 (polska wersja). Pierwsza z nich niezbędna jest do obsługi kanału RSS przez serwis FeedBurner.

Jej instalacja oraz rejestracja w serwisie jest niezbędna do działania drugiej z nich. Jak wykonuje się instalacje wtyczek? Wystarczy wyodrębnić z archiwum odpowiednie pliki (w naszym pierwszym przypadku będzie to FeedBurner_FeedSmith_Plugin.php, w drugim feedcount.php) i umieścić je w katalogu wp-content/plugins/ systemu WordPress. Następnie wtyczki należy zaktywować w panelu administratora (Wtyczki / Nazwa wtyczki / Włącz).

Obydwa pluginy należy dodatkowo skonfigurować w zakładce Ustawienia. Pierwszy z nich swoje opcje ukrywa w podmenu FeedBurner. Zobaczycie tam dwa pola do uzupełnienia, jedno wymagane, drugie opcjonalne. Pierwsze z nich to pełny odnośnik do feedu strony w serwisie FeedBurner (i dla starej odsłony, i dla nowej na serwerach Google), a drugi to link do kanału RSS komentarzy.

Konfiguracja wtyczki FeedSmith w panelu
Konfiguracja wtyczki FeedSmith w panelu.

Co do drugiego rozszerzenia to działa ono dla wersji 2.x WordPress’a, z tymże przy najnowszej 2.7x może sprawiać problemy natury zwracania wyniku w postaci N/A zamiast poprawnej wartości.

Konfiguracja wtyczki Feed Count w panelu
Konfiguracja wtyczki Feed Count w panelu.

Rozszerzenie to także należy dodatkowo skonfigurować. Robimy to w panelu poprzez menu Ustawienia / Feed Count. W jej opcjach trzeba podać co najmniej adres kanału (Feed Url) w postaci nazwy kanału na FeedBurner’ze, częstość aktualizowania ilości subskrybentów (Update interval) oraz częstość aktualizacji po wystąpieniu błędu (Update interval (recovery)). Pozostałe pola nie są wymagane. Link url to adres odnośnika pojawiającego się na zwróconej przez skrypt ilości osób śledzących stronę. Before za to jest treścią pojawiającą się przed liczbą w.w. użytkowników, a After to treść po.

Po wykonaniu konfiguracji należy jeszcze w strukturze szablonu strony dodać odpowiedni kod.

<?php if (function_exists('fc_feedcount')) fc_feedcount(); ?>

Wstawić go musimy w miejscu w którym chcemy wyświetlać wystylizowaną liczbę użytkowników RSS (plugin ten nie zwraca tylko liczby otaczając ją poprzez dodatkowe tagi HTML). Oczywiście możemy go modyfikować. Jeżeli chcielibyście np. wyświetlić go w odnośniku (w header.php) o nazwie RSS w dodatkowych nawiasach to możecie to zrobić w następujący sposób:

<?php
if (function_exists('fc_feedcount'))
{
	print ' (' . fc_feedcount() . ')';
}
?>

No i ostatecznie musicie w panelu FeedBurner’a (nie wtyczki, a profilu w serwisie w którym zakładaliście konto) zezwolić wtyczce na działanie z API tegoż serwisu. Wystarczy wejść do zakładki Publicize, a następnie do menu Awareness API i zaktywować tą funkcjonalność.

Wtyczka Feed Count 1.2 dla Google FeedBurner!

Jeżeli zdecydowaliście się jednak na migracje z starych serwerów serwisu, na ultraszybkie i megafajne klastry Google, a wcześniej trafnie stosowaliście w.w. metodę do wyodrębniania liczby użytkowników to prawdopodobnie będzie ona także działać po przejściu na feedburner.google.com.

Trzeba jednak w takim wypadku dokonać pewnych, małych zmian w kodzie wyżej opisywanej wtyczki Feed Count. W tym celu edytujemy plik feedcount.php (np. poprzez Notepad++ lub ZendStudio). Przechodzimy w okolice 41 linii w celu odnalezienia następującego kodu.

		  'map_fc_queryurl' =>'http://api.feedburner.com/awareness/1.0/GetFeedData?uri=',

Co można zauważyć element tablicy o nazwie przed => wskazuje na adres dostępowy do API, ale feedburner.com. A my przecież chcemy korzystać już z API Google. W tym celu należy tą linijkę zmienić niżej wymienionym kodem, po czym zapisać plik i ponownie wysłać go na serwer.

		  'map_fc_queryurl' =>'https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=',

C… bombki strzelił! Jedyne co otrzymuje w wyniku to ten niewdzięczny „N/A”…

Po pierwsze musicie sprawdzić czy biblioteka cURL (Client URL Library Functions) jest dostępna w konfiguracjach Waszych serwerów (jako pakiet PHP). W tym celu wystarczy stworzyć jakikolwiek plik o rozszerzeniu .php, wypełnić go poniższym kodem i wywołać na hipotetycznie problematycznym serwerze.

<?php
phpinfo();
?>

W wylistowanych wynikach wystarczy poszukać wpisu cURL support i sprawdzić, czy jego flaga ustawiona jest na enabled. Jeżeli nie, to właśnie znaleźliście przyczynę problemu. Powyższa, kluczowa dla nas wtyczka oparta jest na tym libie, a co za tym idzie jego brak powoduje niemożność poprawnego wykonania kodu tego rozszerzenia.

Diagnoza problemu: cURL…

Kiedy zawodzą dostępne już rozwiązania najlepszym sposobem na pozbycie się własnego problemu jest… napisanie indywidualnej solucji. Niestety to wiążę się najczęściej z jedną z dwóch rzeczy. Albo z posiadaniem konkretnej wiedzy odnośnie danego problemu, albo z wydatkiem związanym z opłaceniem osoby która rozwiąże Waszą dolegliwość.

Jeżeli dotarliście do tego punktu tzn. że nadal nie uzyskaliście pożądanego efektu. Pora więc właśnie na w.w. sposób, z tymże ja dla Was przygotuję go w stu procentach… za friko :] Mógłbym Wam zaprezentować kilkulinijkowy sposób, bo praktycznie do tego ogranicza się rozwiązanie – pytanie po co? Blog ten ma uczyć, dlatego postaram się Wam przedstawić dwie metody pobierania potrzebnych nam danych które po lekkim tuningu złożą się w jedną, w pełni funkcjonalną wtyczkę napisaną specjalnie na potrzeby tego artykułu. I w gruncie rzeczy będzie to najbardziej optymalne rozwiązanie ze wszystkich tutaj przedstawionych…

Przypadek numer jeden: brak możności użytkowania cURL’a. Jak to w życiu bywa, jak nie da wejść się jednym oknem, trzeba próbować drugim. Sposobów jest wiele, ja wybiorę użycie funkcji file_get_contents. Zaimplementowana jest ona w PHP od wersji 4.3 i dodatkowo do jej działania konfiguracja serwera musi zezwalać na zdalne (z zewnętrznych źródeł) pobieranie plików. Trik który zastosujemy ogranicza się kolejno do:

  • pobrania danych z adresu FeedBurner’a korzystając z udostępnionego przez niego API,
  • sprawdzenia czy odebrane dane są poprawne (pod kątem poprawności adresu i ewentualnych wyjątków),
  • wyszukanie frazy circulation=" w posiadanym buforze. Kod który pobraliśmy wcześniej musi być w formacie XML, a co za tym idzie składa się on ze znaczników i parametrów. Właśnie parametr circulation zawiera w sobie wartość będącą ilością subskrybentów,
  • jeżeli fraza nie zostanie znaleziona, zwrócenie błędu,
  • w przeciwnym razie pobranie ciągu od pozycji wyszukiwanej wyżej frazy + 13 znaków (długość szukanego słowa), aż do znalezienia następnego cudzysłowia (bez niego).
<?php
$buffer = file_get_contents(ADRES_SERWER . NAZWA_KANALU); // pobranie pliku
if ( $buffer === false ) // zwrócenie błędu
{
	print 'n/d';
}

$pre_position = strpos($buffer, 'circulation="'); // wyszukanie pozycji frazy z drugiego argumentu
if ( $pre_position === false ) // w wypadku nieodnalezienia zwrócenie błędu (niepoprawny plik)
{
	print 'n/d';
}
else {
	print substr($buffer, ($pre_position+13), strpos($buffer, '"', ($pre_position+14)) - ($pre_position+13)); // "wypisanie na ekran" zawartości parametru "circulation" z pobranego pliku XML
}
?>

Kiedy problemem nie jest jednak cURL…

SimpleXMLElement – klasa rozszerzenia SimpleXML dostarczająca prosty zestaw narzędzi do konwersji XML na obiekt na którym można operować poprzez użycie selektorów.

Przykład:

<parent>
	<children>raz</children>
	<children>dwa</children>
</parent>
$xml = new SimpleXMLElement(XML);
$found = $xml->xpath('parent/children'); // wyszukiwanie potomka w drzewie dokumentu XML (argument w postaci np. rodzic/potomek/potomek_potomka/itp.)
print_r($found); // wypisanie tablicy wyników

Plugin FeedCount nie zawsze działa na WordPress’ie 2.7x. Nie pytajcie dlaczego. Szczerze? Nie wiem i nie chciało mi się dociekać co jest tego powodem. Postanowiłem jakiś czas temu spotykając się z tą przypadłością po prostu stworzyć bardziej uproszczony kod, niż ten z popularnej wtyczki. Jak wygląda jego schemat krokowy? Po kolei:

  • inicjalizacja cURL,
  • ustawienie opcji transferu biblioteki (zwracanie zawartości bez wypisywania jej na ekran oraz wprowadzenie adresu docelowego),
  • wykonanie zadania, po czym zniszczenie sesji połączenia,
  • sprawdzenie, czy nie występuje znacznik nadrzędny err z parametrem code o wartości 1 (oznaka zwrócenia błędu, najczęściej nieodnalezienia pliku),
  • jeżeli powyższy punkt nie okaże się prawdą to utworzenie obiektu SimpleXMLElement i wyszukanie zawartości wyżej już wspomnianego atrybutu circulation.
<?php
$resource = curl_init(); // inicjalizacja
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1); // bez wypisania na ekran
curl_setopt($resource, CURLOPT_URL, ADRES_SERWER . NAZWA_KANALU); // przekazanie adresu do pobrania
$buffer = curl_exec($resource); // wykonanie
curl_close($resource); // zamknięcie sesji

$xml = new SimpleXMLElement($buffer); // obiekt analizy składni XML
if ( $xml->err['code'] == '1' ) // sprawdzenie wystąpienia błędu
{
	print 'n/d';
}
print $xml->feed->entry['circulation']; // pobranie ilości subskrybentów
?>

Aby bardziej wyjaśnić działanie powyższej partii kodu posłużę się przykładowymi danymi, jakie mogą zostać pobrane.

<rsp stat="ok">
  <!--This information is part of the FeedBurner Awareness API. If you want to hide this information, you may do so via your FeedBurner Account.-->
  <feed id="0ua2berteje16lsipgq0b8uk74" uri="worldclub-pl">
    <entry date="2009-02-13" circulation="1" hits="2" downloads="0" reach="0" />
  </feed>
</rsp>

Można z niego wywnioskować, że odpowiednio operując na klasie SimpleXMLElement moglibyśmy uzyskać identyfikator konta, jego część adresu zwaną w tym artykule po prostu nazwą, datę utworzenia, ilość osób śledzących RSS’a, liczbę kliknięć oraz ściągnięć. Działanie powyższej klasy jest proste. Z kodu XML tworzymy obiekt po którym możemy przesuwać się za pomocą zwyczajnych selektorów. Przykładowo jeżeli chcielibyśmy wyłuskać z powyższego przykładu identyfikator (id) zrobilibyśmy to w następujący sposób:

print $xml->feed['id'];

Pierwszy, główny element rsp jest pomijany w instancji obiektu.

Zasada działania SimpleXMLElement na podstawie kodu pobierania liczby subskrybentów
Zasada działania SimpleXMLElement na podstawie kodu pobierania liczby subskrybentów.

Autorska wtyczka finalnym rozwiązaniem naszego problemu!

I tak oto dochodząc do meritum przedstawiam Wam rozszerzenie uproszczone, ale za to bardziej wzbogacone o trzy, moim zdaniem niezbędne funkcjonalności. Easy Feed Counter posiada możliwość łatwej instalacji i konfiguracji poprzez panel administratora. Proces wdrażania tego pluginu jest adekwatny do dodawania opisywanego wcześniej FeedCount (jest także dokładnie opisany w linku powyżej w repozytorium modyfikacji). Pozwala on na ustawienie serwera feedów, metody pobierania statystyk oraz wpisanie nazwy konta kanału RSS na FeedBurner’ze. Opcjonalnie możecie także dodać konto komentarzy na tym serwisie, o ile takowe posiadacie.

Rezultaty działania wtyczki
Rezultaty działania wtyczki.

Rozwiązanie to ma także jeden wielki, dodatkowy atut. Nie formatuje jak inne pluginy zwracanej treści, a ogranicza się do podania wartości (liczby użytkowników), bądź kodu błędu (n/d). To pozwala na szersze modyfikacje położenia bądź wyglądu wyników po wywołaniu funkcji easyfeedcounter_get([opcjonalny: parametr]) bez dodatkowej ingerencji w sam kod rozszerzenia.

<?php
if (function_exists('easyfeedcounter_get'))
{
	$subscribers = easyfeedcounter_get(1); // argument o wartości 1 wskazuje wtyczce, że ma zwrócić dane dotyczące komentarzy
	if ( is_numeric($subscribers) !== false ) // brak błędów
	{
		print $subscribers . ' osób subskrybuje aktualnie Twoje komentarze!';
	}
}
?>

Bardziej skrupulatne objaśnienie, opisane krok po kroku znajdziecie w moim repozytorium. W przypadku wątpliwości dotyczących tematu, bądź instalacji tego tworu proszę śmiało pytać :]


1 komentarz

Dodaj własny komentarz

Możesz użyć następujących tagów XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>