Postanowiłem choć trochę i przez chwilę nie być psem ogrodnika i podzielę się z Wami informacjami, gdzie w sieci są dedykowane miejsca, w których każdy, kto zna WordPressa choć trochę bardziej niż na poziomie dodawania do niego wpisów i zmieniania opcji w Kokpicie, może zarobić trochę grosza. Niestety miejsc takich nie jest dużo (a może po prostu ja nie znam więcej?)
To chyba najpopularniejsze miejsce. Codziennie pojawia się około 10 ogłoszeń ze zleceniami, których charakter jest naprawdę różny. Od prostych próśb o modyfikację stylów, po zlecenia stworzenia zaawansowanych serwisów społecznościowych w oparciu o BuddyPress. Przy ogłoszeniach nie są publikowane budżety, jakie zleceniodawcy są w stanie nam zaoferować, więc odpisując na ogłoszenie sami musimy napisać ile sobie za naszą pracę liczymy (ja także dodaje termin wykonania prac). Dodatkowym plusem jest to, że w serwisie nie musimy sie rejestrować. To zwyczajna tablica ogłoszeń, na którą każdy może wysłać ogłoszenie podając dane kontaktowe (email) i my te dane widzimy od razu.
Mniej więcej rok temu dość intensywnie korzystałem z tego serwisu i przyznam, że niektóre ogłoszenia udało mi się przechwycić. Dużym utrapieniem jest jednak spora liczba ogłoszeń od ludzi – pośredników. Wiele bowiem osób wyłapuje lepiej płatne zlecenia odnośnie wordpressa w serwisach ogólno-freelancerskich (jak np elance.com) udając, że się zna na WordPressie, a gdy takie ogłoszenie mu się dostanie, wtedy szuka podwykonawcy na jobs.wordpress. Komunikacja w takim wypadku jest fatalna, ostatecznie zlecenie okazuje się dotyczyć czegoś zupełnie innego niż pierwotnie i szczerze nigdy nie udało mi się go sfinalizować. Tak więc z miejsca odradzam przyjmować zlecenia z jobs.wordpress od osób, których nazwisko lub email wskazują, że są hindusami (przepraszam za ten nacjonalizm, ale każda lepiej zorientowana osoba, wie jaka jest rola hindusów w informatycznym outsourcingu: to zleceniobiorcy, a nie zleceniodawcy).
Obecnie ze strony nie korzystam już w ogóle, bo jestem w tej komfortowej sytuacji, że (odpukać) nie muszę szukać klientów, a to klienci sami mnie znajdują.
Strona mniej popularna, ale musze przyznać, że ogłoszeń jest tam już coraz więcej. Kiedyś jak startowała było jedno ogłoszenie na kilka dni, obecnie jest już nawet kilka dziennie.
Strona działa zupełnie inaczej niż poprzednia. Trzeba się zarejestrować (zarówno zleceniodawcy jak i -biorcy), zleceniodawca dodając pytanie od razu wyznacza ile chce zapłacić temu, kto mu pomoże. Następnie wszyscy mogą w określonym czasie zamieszczać (jawnie w postaci komentarzy) swoje odpowiedzi na pytanie i na koniec zleceniodawca decyduje komu zapłaci (a zapłacić komuś musi, bo zadając pytanie dokonuje przedpłaty na konto WP Questions, serwis ten zresztą pobiera swoją prowizję).
Czy jest to skuteczne, nie wiem
Zawsze gdy tam zajrzę jest już tyle odpowiedzi na pytanie, że nie chce mi się dopisywać kolejnej. Widziałem, że Wojtek czasem udziela tam odpowiedzi, więc może wypowie się czy udało mu się coś w ten sposób zarobić
* * *
To wszystkie mi znane serwisy. Bierzcie i korzystajcie, albowiem jak napisałem, ja już z nich nie korzystam, nie muszę.
A może ktoś zna inne miejsca gdzie wordpressową wiedzę można realnie spieniężyć? Oczywiście wszystkie większe strony freelancerskie mają dział odnośnie wordpressa (jak wspomniany przeze mnie wyżej Elance), ale jeśli ktoś ma jeszcze coś do dodania, zapraszam do podzielenia się tym w komentarzach!
Pluginów do cache’owania stron stworzonych w WordPress jest wiele. I całe szczęście, bo niestety są sytuacje, w których WordPress ma spore problemy z prędkością. Niestety jak do tej pory nie udało mi się znaleźć rozwiązania idealnego. Dlatego też chcę przedstawić własne rozwiązanie, pomagające przyspieszyć generowanie stron unikając zbytniego mielenia funkcjami php i odpytywania bazy danych.
Podstawowym problemem wszystkich pluginów jest fakt, że cache’owania jest fakt, że strony są przechowywane w całości. Plugin raz na jakiś czas generuje całe strony i dopiero po określonym odstępie czasu generowanie się powtarza. To sprawia sporo problemów z choćby obsługą ciasteczek: nie można rozpoznawać użytkownika po ciasteczku i wysyłać mu spersonalizowanej strony, bo WordPress z takim pluginem do wszystkich wysyła takie same strony.
Oczywiście są metody na obejście tego, jednak każda ma jakieś wady. Można w ustawieniach pluginu zarządać aby nie cache’ował poszczególnych stron, nie działał gdy użytkownik jest zalogowany, można też w WP Super Cache użyć odpowiednich hacków. Jednak zawsze oznacza to całkowite wyłączenie cache’owania. Cała strona jest cache’owana lub niecache’owana.
A co jeśli by podejść do zagadnienia pregenerowania zawartości nieco inaczej? Czy na pewno musimy pregenerować całe strony od <html> do </html> ?
Odpowiedź brzmi: oczywiście nie. Skoro szablony i tak mamy rozbite na najczęściej 5 plików – header.php, index.php, sidebar.php, footer.php i style.css, index.php włącza w siebie pozostałe pliki wcześniej je generując (za wyjątkiem oczywiście pliku stylów, ten jest statyczny), czy na pewno na przykład header.php musi być generowany za każdym razem? Nawet jeśli musi (bo na przykład ma odwołania do plików JS zależnych od zawartości konkretnej strony): czy każdy fragment takiego pliku musi być generowany za każdym razem? Jestem niemal pewien, że obecny w chyba każdym pliku nagłówka kod bloginfo(‘charset’) generuje zawsze to samo od powstania blogu, aż do jego „śmierci”.
Można też znaleźć i dłuższe, bardziej złożone fragmenty kodu php, który tak naprawdę generuje zawsze to samo, a przynajmniej nic nie stoi na przeszkodzie aby wygenerowana zawartość odświeżała się powiedzmy raz na godzinę. Czy masz w sidebarze swojego bloga jakiś widget wstawiający zawsze te same reklamy? Dlaczego więc WP miałby przy każdej odsłonie strony odpytywać bazę danych co ma do tego widgetu wstawić?
Mam nadzieję, że już rozumiecie na czym polega problem. A rozwiązaniem jest: cache’owanie fragmentów strony, a nie całości.
Jak to zrobić?
1.
Do swojego pliku functions.php w katalogu skórki dodaj następujący kod:
function mincache($whatto, $howlong = '15', $work = TRUE) {
if ($whatto == '') {
exit ('Please specify name of cached code');
}
if ($howlong == '') $howlong = '15';
$folder = trim(parse_url(get_bloginfo('template_directory'), PHP_URL_PATH), '/');
$cachefile = $folder.'/mincache/'.$whatto.'-cached.html';
$cachetime = $howlong * 60;
if ($work == TRUE && file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
include($cachefile);
echo "\n";
}
else {
$includedFile = 'inc.'.$whatto.'.php';
ob_start();
include_once($includedFile);
$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
}
}
2.
W katalogu skórki utwórz katalog o nazwie mincache i nadaj mu uprawnienia do odczytu i zapisu.
3.
Kod, jaki chcesz aby był cache’owany wytnij z pliku php i wklej do nowego pliku i nazwie stworzonej według struktury inc.nazwa.php. Pod nazwa wpisz co chcesz.
4.
W miejsce skąd wyciąłeś ów kod wklej:
mincache('nazwa')
I to wszystko. Teraz zawartość przeniesionego kodu do pliku inc.*.php będzie generowana tylko raz na 15 minut.
* * *
Nieco więcej o stworzonej właśnie funkcji mincache():
mincache($whatto, $howlong, $work)
Jak widać funkcja może przyjmować trzy parametry:
$whatto – nazwa fragmentu kodu który ma być szukany w pliku inc.*.php. Musi więc istnieć plik inc.{$whatto}.php, parametr ten jest bowiem obowiązkowy (inaczej funkcja nie będzie wiedziała co cache’uje.
$howlong – jak długie powinny być odstępy między kolejnymi generowaniami kodu statycznego, w minutach. Domyślnie: 15 minut.
$work – wartość logiczna true/false czy ma próbować pobrać kod z pliku statycznego (true, domyślnie ustawione) czy też za każdym razem generować go od nowa (false). Parametr ten dodałem abyście mogli w czasie prac nad stroną chwilowo wyłączać działanie cache (wartość FALSE).
* * *
I na koniec jeszcze raz konkretny przykład. Załóżmy, że chcemy aby sidebar generował się jedynie raz na pół godziny.
Wykonaj punkty 1 – 2 opisane powyżej.
Otwórz plik sidebar.php, wytnij jego całą zawartość i zastąp:
<?php mincache('sidebar', '30') ?>
Utwórz plik inc.sidebar.php w katalogu skórki i wklej do niego całą zawartość wyciętą przed chwilą z sidebar.php.
I to wszystko. Od teraz sidebar będzie się generował jedynie raz na pół godziny, co na pewno skróci czas ładowania strony.
Nie, nie
Na pewno nie umarł
Nie po to poświęciłem cały rok na dogłębne poznawanie WordPressa abym teraz o nim zapomniał. WordPress znam już bardzo dobrze, tak dobrze, że kilka tygodni temu zacząłem się zastanawiać czy mógłbym go poznać bliżej. Doszedłem do wniosku, że w sferze tworzenia skórek, pisania pluginów wiem lub potrafię wygooglać już wszystko. Kolejny krok to zaangażowanie się w prace nad plikami rdzenia wordpressa, a to mnie z praktycznych powodów nie interesuje. Zatem z zawodowego punktu widzenia „wiem” już wszystko, co jest mi potrzebne do tworzenia strona na WordPressie.
Co więc dalej? Jeśli chodzi o WordPressa, nadal będę wszem i wobec krzyczał, że jeśli ktoś potrzebuje jakiejś z nim związanej pomocy, niech nie waha się do mnie pisać na maila. W wolnych chwilach będę rozwijał WP Sprzedawcę, myślę też nad stworzeniem alternatywnego panelu administracyjnego dla WordPressa. WordPress jest już dość dojrzały, jeśli chodzi o zastosowania jako CMS, ale kuleje jego Kokpit, który dla zwykłego użytkownika jest zwyczajnie trudny. Jeśli klient nigdy dotąd nie używał WP do skończonej pracy muszę dołączać obrazkowy tutorial jak się w nim poruszać.
Dlatego myślę nad stworzeniem czegoś co miałoby zastąpić katalog /wp-admin (a właściwie byłby to kolejny katalog dogrywany do WordPressa) zawierającego w sobie uproszczoną wersję Kokpitu. Fajnie jakby w ogóle to nie przypominało Kokpitu, a było stroną z aktualnie używaną skórką, tyle, że z jakimś menu na górze, a każdy element strony można by kliknąć i edytować on the fly. Co o tym myślicie?
* * *
Ale nie samym WordPressem człowiek żyje. Postanowiłem też przyjrzeć się bliżej jakiemuś CMSowi z prawdziwego zdarzenia. Obecnie chyba najpopularniejszy to Joomla, jednak tak często widzę w sieci jego krytykę, że nawet nie chcę się za niego brać.
Coraz częściej do moich uszu zaczęła dochodzić nazwa Drupal. A to ktoś gdzieś napisał (chyba na flakerze), że WordPress w końcu ma coś, co Drupal ma od dawna i bardzo tego w WP brakowało. Ostatecznie do mojej wizyty na stronie Drupala przyczyniła się publikacja jakichś wyników konkursu na najbardziej innowacyjne strony zeszłego roku i większość z nich – choć w ogóle do siebie nie były podobne – działała właśnie na Drupalu.
I rzeczywście. Kończę już czytać jego dokumentacje i były momenty gdy szczęka mi opadała. Nie bez powodu Drupala nazywa się nie tylko Content Management System, ale także CM Framework. Jakiż on jest elastyczny i modularny. Zupełnie inna filozofia niż WordPress, dająca możliwość tworzenia stron bardzo interreagujących z użytkownikiem. Nie mogę się doczekać kiedy pierwszy raz użyję Drupala przy pracy
* * *
Tak więc rok 2009 należał do WordPressa. Rok 2010 będzie należał do… nadal WordPressa, bo na pewno stworzę jeszcze wiele stron opartych o niego i do Drupala, któremu poświęcę cały rok na naukę (tak jak to zrobiłem z WordPressem rok temu).
Ten wpis jest kolejnym moim chwaleniem się jaką stronę wykonałem na bazie WordPressa, a zarazem chcę tutaj pokazać jak bardzo można zmodyfikować WordPressa (na pierwszy rzut oka nie widać, że to właśnie WordPress) i pokazać praktyczne zastosowanie dziedziczenia szablonów. Powiem szczerze, że jestem dumny z tego, co mi tutaj wyszło
Tutaj czyli na stronie Młodzi Twórcy wykonanej dla Urzędu Miejskiego w Białymstoku. Białystok ma program stypendialny dla ludzi uzdolnionych w różnych dziedzinach (ma zapewne jak i inne miasta, ale tylko Białystok jak widać chce się tym chwalić). Program działa już od jakiegoś czasu, ale teraz przyszła pora na stworzenie dla niego strony internetowej. I tutaj pojawiam się ja (jako podwykonawca dla Man With The Plan).
Powyżej obrazek przedstawiający stronę główną. Wszystkie zrzuty ekranu w tym wpisie są klikalne więc jeśli chcecie, śmiało przechodźcie aby zobaczyć jak to wygląda u Was
Jak widać nie ma tutaj typowo blogowego układu. Mnie to nie dziwi, bo WordPress coraz bardziej staje się zwykłym CMSem zdolnym do tworzenia każdego rodzaju stron (choć blogi się w nim robi najłatwiej). Mechanizm bloga wykorzystałem tutaj w dziale Aktualności. Reszta to coś, co w panelu administracyjnym WordPressa nazywa się po prostu Strony.
Ale jakie strony! Poklikajcie na odnośniki w górnym panelu, a przekonacie się, że praktycznie każda z nich wygląda inaczej. Było to nie lada wyzwaniem ale się udało. Inny układ kolumn na poszczególnych podstronach, co innego w sidebarach w zależności od tego na jakiej stronie się właśnie znajdujemy, „podświetlenie” dla pozycji w górnym menu nie tylko gdy jesteśmy na tej właśnie stronie, ale także na stronie potomnej danej podstrony.
Nie było to łatwe, bo musiałem zrobić to jak najbardziej user friendly. Założyliśmy, że osoby w urzędzie nie znają WordPressa, więc sztuczki z Custom Fields, zastosowanie widget logic, custom themes trzeba unikać jak najbardziej. Osoba dodająca treści ma po prostu dodać kolejną stronę, określić, że jest ona „dzieckiem” takiej czy innej strony, a WordPress i jego funkcje same mają rozpoznać jaką właśnie stronę internauta chce wyświetlić i pokazać ją jak na obrazku powyżej (tak, to jest zwykła strona w WordPressie, stworzona we wbudwanym w nim edytorze stron; to ja, a nie osoba wprowadzająca tekst zadbałem by nagłówki miały inny wygląd, by każdy akapit był właściwie oddzielnym divem, a zawarty w nim odnośnik do pliku stał się przyciskiem wyrównanym do prawej) lub na przykład jak ta strona:
Jak widać wyżej mamy trzy sekcje: opis stypendysty, jego (czy w tym wypadku – jej) program stypendium i jego/jej zdjęcia. Tu także całość została zrobiona tak, aby pracownik urzędu nie musiał niczym się martwić: musi jedynie dodać treść, dodać zdjęcia (działa także dodawanie filmów), a to ja musiałem rozpoznać gdzie zaczyna się program stypendium czy właśnie zdjęcia lub filmy (i sprawić by miały inne tło). Co więcej powstały strony grupujące: gdy pracownik urzędu doda stronę konkretnego stypendysty, automatycznie pojawi się ona na stronie ich grupującej rocznikami:
Udało się? Przy „odrobinie” znajomości WordPressa i umiejętności pisania dla niego funkcji, zabawy w dziedziczenie tematów graficznych, efekt jest chyba całkiem niezły, nie prawda?
* * *
A może Ty też chcesz mieć taką stronę, szukasz kogoś kto zajmie się Twoim blogiem, albo znasz kogoś z takimi potrzebami? Zajrzyj na stronę O mnie i odezwij się do mnie w jeden z podanych tam sposobów, a na pewno uda nam sie razem wyczarować coś fajnego
Dziś rano w telewizorni widziałem reklamę społecznej akcji ratowania fok szarych organizowaną przez WWF Polska. Może więc się kolejny raz pochwalę zrobioną już jakiś czas temu stroną. Choć „pochwalę” to za duże słowo, bo nic Wam raczej pokazać nie mogę
Musicie mi wierzyć na słowo, że to co tu piszę, to prawda.
Jakoś we wrześniu ktoś szukał kogoś, kto by znał się co nieco na WordPressie, więc się zgłosiłem. Okazało się, że trzeba uruchomić blog towarzyszący społecznej akcji ratowania fok w Polsce. Coś w rodzaju małego serwisu społecznościowego, w której osoby biorące udział w ratowaniu fok będą mogli się zarejestrować, blogować (stąd więc od razu przyszedł pomysł WordPressa), dodać swoje zdjęcia z pracy i wrzucić filmy. Napisać kilka słów o sobie, zaznaczyć swoją pozycję na mapie Google Maps tak aby, gdy ktoś szuka pomocy przy fokach w okolicy Helu mógł szybko odnaleźć patrolowiczów w pobliżu.
Strona jest już wykonana, działa od dawna (i z tego co widzę działa bez zarzutu, bo nikt nie zgłasza mi żadnych problemów). Niestety linka do strony podawać nie będę, bo tylko zalogowani ludzie w WWF mogą ją zobaczyć. Ale i tak się chwalę
Powyżej znajduje się design na bazie jakiego miałem wykonać stronę. Praca na początku była prosta: pociąć wszystko do HTML zgodnego z jak największą ilością przeglądarek, zrobić z tego szablon do WordPressa. Potem zaczęły się schody.
Zleceniodawca wymagał bardzo precyzyjnego dopasowania się do zaleceń. Wskutek tego najpierw sporo czasu spędziłem na poszukiwaniu odpowiednich pluginów, by ostatecznie przegonać się, że każdemu coś brakuje lub robi to w nie taki sposób, jak było to opisane w zleceniu. I wtedy rozpisałem się podczas pisania kodu nowych pluginów, ściśle dopasowanych do wymagań. (Pamiętacie moje wpisy dotyczące publikacji nowych wtyczek i tutoriale jak wtyczki się pisze? To wtedy mniej więcej robiłem tą stronę).
Pluginów napisanych było kilka. Wspomnę o dwóch.
Jeden z nich to Youtube Add Video, który zamieściłem publicznie w internecie, tak by i inni mogli z niego skorzystać i przy okazji opisałem jak powstawał. W dostępnych pluginach brakowało możliwości określenia kto dodał film (nic dziwnego, przeważnie blog prowadzi jedna osoba, a tutaj WordPress działał niemal jako platforma blogowa) i możliwości wyciągnięcia informacji o ostatnio dodanym filmie i umieszczenia jej w sidebarze. Napisanie takiego pluginu okazało się wykonalne
Drugi plugin aż szkoda, że nie udostępniłem go nigdzie bo jestem z niego dumny (teraz nie mam już niestety dostępu do jego kodu). Plugin bazował na Google Maps API i pozwałał:
- wyświetlić mapę w sidebarze
- pokazać zaznaczonych na niej wszystkich wolontariuszy lub konkretnego (jeśli akurat przeglądaliśmy stronę użytkownika)
- w panelu administracyjnym pozwalał użytkownikowi dodać swoją pozycję na mapie.
Plugin działa wyśmienicie, a przynajmniej działał w momencie oddawania strony zleceniodawcy
Ale jak wspomniałem, żadnych reklamacji nie dostałem.
* * *
Było jeszcze kilka innych wtyczek, ale zdecydowanie mniejszych i mniej ciekawych. Z projektu jestem dość zadowolony bo rozruszał mnie po długien przerwie, od czasu gdy wykonałem stronę WildPoland. Obecnie zleceń mam całkiem sporo, w poprzednim tygodniu kilku osobom musiałem odmówić podjęcia się zadania, bo zwyczajnie nie wyrabiałem się w 24 godzinach na dobę
I teraz gdy to piszę, jestem właśnie w czasie krótkiej przerwy w programowaniu kolejnego wordpressowego wdrożenia.
Nie zmienia to faktu, że jeśli ktoś z Was właśnie potrzebuje uruchomić jakąś stronę i wierzy, że WordPress jako CMS sprawdzi się tutaj bardzo dobrze (w tym tygodniu to właśnie WordPress zwyciężył w konkursie na najlepszy system CMS open source), może śmiało do mnie pisać. Obecnie wykonywane przeze mnie zadania prędzej czy później będą musiały się skończyć i chętnie podejmę się kolejnych wyzwań.
Plugin jest tak mały (plik readme jest dluzszy niż sam kod pluginu), że nie zasługuje na więcej niż kilka zdań. Zrobiłem go w czasie pracy nad jedną ze stron, a że problem przewija się wiele razy w Google bez rozwiązań, postanowiłem wydać plugin dla wszystkich.
Strona pluginu. Niedługo będzie też na WordPress.org tutaj.
Oook… Powiedzmy, że mam wolną chwilę, więc wrócę do niesłychanie fantastycznego zajęcia, jakim jest uczenie Was jak stać się moją konkurencją i tworzyć bombowe pluginy do WordPressa
Ups, po napisaniu tego zdania nieco przeszła mi ochota na pisanie dalszej części, ale mówi się trudno. Lecimy.
Wszystkim nowicjuszom na naszym kursie przypominam, że jest to już trzecia lekcja. Więc jeśli ktoś wagarował, niech szybko leci najpierw przeczytać notatki z lekcji pierwszej i lekcji drugiej. Niestety znajomość lekcji poprzednich jest raczej bardzo wskazana, gdyż założyłem sobie, że każda kolejna część nie będzie omawiać dokładnie rzeczy już wcześniej omówionych. Założenie chyba logiczne?
Zaczynamy
Co dzisiaj mamy? Może zajmijmy się moim ulubionym darmowym pluginem (bo oczywiście najbardziej ulubiony jest płatny WP Sprzedawca), jakim jest Upgrade Notification by Email. Plugin jest bardzo króciutki ale nie dajcie się zwieść jego mikroskopijnym rozmiarom.
Przede wszystkim jego mikroskopijność to oznaka dość zaawansowanego programowania. W pierwszej wersji plugin był o wiele (wiele) dłuższy. Jednak z biegiem czasu nauczyłem się jak unikać tworzenia funkcji, które robią to samo co już robi jakaś ukryta funkcja WordPressa. I dlatego coś, co wcześniej potrzebowało napisania kilkunastolinijkowej funkcji, teraz zostało zastąpione prze odwołanie się do już istniejących funkcji w silniku tego systemu blogowego.
Założenia
Plugin w założeniach jest bardzo prosty: ma wysyłać na maila informację do administratora strony gdy pojawiła się nowsza wersja WordPressa. Ma tą informację wysyłać tylko i wyłącznie jeśli admin nie dokonał jeszcze aktualizacji. I tyle.
Proste? Proste. Zatem…
Zaczynamy (ponownie)
Czynność jest tutaj tylko jedna: wysłanie maila do administratora, więc i funkcja będzie tylko jedna. Funkcja ta ma się wykonać tylko i wyłącznie, jeśli zainstalowana wersja WordPressa jest starsza niż najnowsza, zatem funkcja na pewno jakoś sprawdzi instrukcją if czy ten warunek jest spełniony.
Pojawia się też kolejna zagadka: kiedy funkcja ma zostać uruchomiona? Do tej pory poznaliśmy dwa sposoby odwoływania się do naszych pluginowych funkcji:
- poprzez hak filtrujący wypluwaną treść
- poprzez hak reagujący na jakąś akcję na blogu
Od razu mówię, że nie zastosujemy tu żadnego z nich. Choć moglibyśmy. Na przykład hakiem filtrującym moglibyśmy w momencie wyświetlania użytkownikowi treści wpisu po kryjomu wywołać naszą funkcję i wysłać adminowi maila z powiadomieniem o konieczności instalacji nowszej wersji. Albo hakiem reagującym na jakąś akcję (na przykład dodanie komentarza do wpisu) zrobić to samo.
Da się, ale ma to w naszym wypadku dość sporą wadę: admin miałby na swojej skrzynce kilkadziesiąt maili (jeśli nie tysiące w przypadku gdy admin administruje popularnym blogiem) z upomnieniem o aktualizacje. Co prawda moglibyśmy dalej się upierać przy taki zastosowaniu, dodając do kodu rodzaj łatki, który by sprawdzał czy admin już dostał maila, ale… ale nie brnijmy w tym kierunku. Po pierwsze, że nie będzie to wydajne (tak czy owak nasza funkcja wywoływała by się setki razy dziennie), a po drugie jest gotowe rozwiązanie w samym wordpressie przygotowane specjalnie na takie okazje, a nazywa się ono
wp-cron
Tak. WordPress ma wbudowany mechanizm pseudo cronu czyli narzędzie do planowania wykonywania funkcji. Dzięki niemu możemy sobie zaplanować by dana funkcja wykonywała się raz na godzinę, raz na dzień itd.
Dobra, koniec z tymi teoretycznymi rozważaniami. Wszystko co chciałem wyjaśnić do tej pory, już wyjaśniłem. Czas zobaczyć kawałek kodu i krok po kroku zobaczyć jak nasz plugin działa.
(tradycyjnie pomijam nagłówek pliku plugina – to już poznaliście dawno)
register_activation_hook(__FILE__, 'wpu_my_activation');
function wpu_my_activation() {
wp_schedule_event(time(), 'daily', 'wpu_my_daily_event');
}
add_action('wpu_my_daily_event', 'wpu_do_this_daily');
Część rzeczy już znacie, część dopiero poznacie.
Linijka 28 jest już Wam znana z poprzedniej lekcji: tworzymy tutaj hak, jaki ma się wykonać w czasie instalacji pluginu. Informujemy tutaj aby w czasie instalacji została wykonana funkcja wpu_my_activation().
Owa funkcja znajduje się w linijce 30 i zawiera w sobie dwie funkcje wbudowane w WordPressa.
Pierwsza funkcja – wp_schedule_event() – służy do zanotowania przez WordPress funkcji, jaka ma się wykonywać cyklicznie (to ten właśnie pseudo-cron). Jako pierwszy argument pobiera czas w postaci uniksowego znacznika kiedy rejestrowana funkcja ma zostać wykonana po raz pierwszy (użyłem tu funkcji time() gdyż chciałem aby pierwsze wykonanie wysłania – lub nie wysłania – maila do admina nastąpiło od razu przy instalacji plugina). Drugi argument informuje wordpressa co ile czasu funkcja ma być powtarzana (niestety na razie może przyjmować tylko dwie wartości: daily i hourly). Trzeci argument to nazwa haka jaki ma zostać zarejestrowany.
W linii 34. widzimy dobrze nam znane już add_action(). Tutaj wiąże ono właśnie zarejestrowanego co dobowego haka wpu_my_daily_event z funkcją właściwą wpu_do_this_daily().
Do funkcji jeszcze dojdziemy, zobaczmy co teraz mamy:
register_deactivation_hook(__FILE__, 'wpu_my_deactivation');
function wpu_my_deactivation() {
wp_clear_scheduled_hook('wpu_my_daily_event');
}
Oho, tego chyba jeszcze nie było. Poznaliśmy już rejestrowanie haka aktywacyjnego, który się wykonuje gdy plugin jest aktywowany przez admina, czasem jednak trzeba też wykonać jakieś funkcje podczas odinstalowywania plugina. Służy do tego hak deaktywacyjny register_deactivation_hook, który podobnie do haka aktywacyjnego ma dwie zmienne: nazwę odinstalowywanego pliku z pluginem oraz nazwę funkcji, która ma się wykonać w czasie odinstalowywania.
Akurat tutaj trzeba coś wykonać w czasie deaktywacji plugina. Musimy wyłączyć codzienne zadanie sprawdzania aktualizacji i wysyłania maila. Służy do tego funkcja wp_clear_scheduled_hook() przyjmująca jako argument nazwę haka, który ma przestać działać.
Co by się stało gdybyśmy nie deaktywowali naszego haka? WordPress nadal by miał w swojej bazie zadań polecenie uruchomienia raz na dobę zadania wpu_my_daily_event. Zadanie to znajduje się w naszym pliku z pluginem, a plugin jest przecież odinstalowany… oj byłby problem.
Wyślij w końcu tego maila!
Ok, wszystko jest już porejestrowane i plugin jest już gotowy na ewentualne odrejestrowanie zadania. Czas napisać naszą ostateczną funkcję czyli wpu_do_this_daily()
function wpu_do_this_daily() {
$taken_transient = get_transient('update_core');
$za = $taken_transient->updates;
$zb = $za[0];
$zm = $zb->response;
if ($zm == "upgrade") {
$wpsender = get_option('admin_email');
$forwhom = get_option('admin_email');
$subject = "Your blog " . wp_specialchars( get_option('blogname') ) . " should be upgraded";
$headers = "From: " . wp_specialchars( get_option('blogname') ) . " <$wpsender>\n";
$headers .= "Content-Type: text/html\n";
$headers .= "Content-Transfer-Encoding: 8bit\n";
$mailtext = "The plugin Upgrade Notification by Email noticed that at WordPress server is available newer version of blogging software than this, which is installed at " . wp_specialchars( get_option('blogname') ) . ". Please upgrade it in your admin panel. You have ".$taken_transient->version_checked." and newest is " . $zb->current . ". You can download WordPress directly from " . $zb->package;
wp_mail($forwhom, $subject, $mailtext, $headers);
}
}
?>
Długie? Bywało dłuższe. Zobaczmy, może od końca, co ta funkcja robi.
Wysyłanie maila następuje po pozytywnym wykonaniu instrukcji if w linijce 47. Jeśli if zostanie spełniony (o nim za chwilę), to zostaną przygotowane dane do maila i zostanie wysłany ów mail. Dane do maila to:
Linijka 48.: adres email jaki ma się pojawić w polu ‘From:’ maila. Jest on wyciągany jak widać z mechanizmu opcji wordpressa (czy ja już o tym pisałem? Chyba coś było na ten temat w części drugiej).
Linijka 49.: w podobny sposób pobierany jest adres email pod jaki mail ma zostać wysłany (tak, adres jest ten sam).
Linijka 50. to temat listu, linijki 51-53 to niezbędne nagłówki listu, a linijka 54. to jego treść.
I w linijce 51. mamy wordpressową funkcję do wysyłania maili – wp_mail(). Składnia jej jest taka sama jak wbudowanej w PHP funkcji mail().
Wróćmy do naszego if-a, który ma powstrzymać wordpress przed wysłaniem maila lub kazać go wysłać. If musi sprawdzić czy wersja zainstalowana jest starsza niż aktualnie dostępna na serwerze.
Wcześniej w tym celu napisałem własną funkcję, która pobierała z $wp_version informację o zainstalowanej wersji wordpressa, łączyła się za pomocą curl z serwerem wordpressa, sprawdzała jaka jest nazwa najnowszej wersji pliku z wordpressem, wynajdowała w tej nazwie ciąg zawierający w sumie numer wersji i porównywała ze sobą. Działało to dość dobrze, ale coś mi nie grało.
Po pierwsze WordPress przecież sam w panelu admina wyświetla na górze informację o konieczności aktualizacji, zatem musi mieć gdzieś wbudowaną funkcję robiącą to samo co ja właśnie chcę zrobić. Po drugie takie korzystanie z curl i wyciąganie fragmentów urla może być zawodne, jeśli na przykład zmieni się schemat nazywania pliku z instalką wordpressa.
Oczywiście okazało się, że funkcja sprawdzająca wersję wordpressa faktycznie istnieje i nazywa się dość intuicyjnie bo wp_version_check().
Nie możemy się jednak do niej odwołać bezpośrednio, bo funkcja ta nie zwraca żadnej wartości, a jedynie wywołuje funkcje kolejne (tutaj akurat interesuje nas funkcja tworząca wartość ulotną (ang. transient) o nazwie ‘update_core’). Nie wgłębiajmy się za bardzo w te krwiste bebechy, najważniejsze jest, że musimy:
- pobrać do zmiennej obiektowej wartość przelotną ‘update_core’ za pomocą fukcji get_transient() (linijka 43.)
- z owej zmiennej obiektowej wyciągnąć wartość pola ‘updates’ (linijka 44.)
- i w kolejnych linijkach dojść do tego co odpowiedział serwer na pytanie o konieczność aktualizacji.
I teraz jeśli odpowiedział słowem ‘upgrade’, posłuchajmy go i wyślijmy wyżej opisany list do administratora.
Skomplikowane? Przyznaję, że tak. Na tyle skomplikowane, że nie chcę wnikać dokładnie w powyższy kod. Jak dokładnie przebiegło wyłuskiwanie słowa ‘upgrade’, jakie inne słowa zostałyby wysłuskane, może się przekonać każdy z Was po wnikliwej analizie kodu funkcji wp_version_check(). (przy okazji zwróćcie też uwagę, że w samej treści maila są odwołania do obiektu $zb przechowującego nieco informacji o aktualnej weresji WordPressa)
W każdym razie zapewniam Was, że to działa, o czym każdy może się przekonać pobierając opisany wyżej plugin ze strony WordPressa
Tekst nie jest w żaden sposób sponsorowany, choć będę się w nim pewnie rozpływał w komplementach nad stroną GoldenLine.pl. Po prostu już od dłuższego czasu chodziły mi po głowie przemyślenia, którymi chcę się z Wami podzielić.
Jest jedna strona internetowa, która znacząco wpłynęła na moje życie (i jak się można domyśleć po tytule, jest to strona GL). Nawet bardzo znacząco. Z wszystkich portali społecznościowych tylko tam faktycznie widzę, że korzystanie z jego usług ma dla mnie jakieś znaczenie także w realnym świecie. Nasza-Klasa to serwis gdzie pokazujesz swoim znajomym zdjęcia z wydarzeń, które już się zdarzyły i przeważnie na tym się kończy. Na Wykop wchodzisz po to aby bezproduktywnie zabić wolny czas. Na GoldenLine zarejestrowałem się lata temu za namową mojego kolegi Adasia. Ot, Adaś (tak naprawdę Adam, ale od lat mówimy na niego zdrobniale, choć jest ode mnie o co najmniej głowę i szyję wyższy
) był wtedy nauczycielem i ja byłem nauczycielem. GoldenLine miało być miejscem, gdzie łatwo znaleźć pracę czy kontakty zawodowe, więc obaj mieliśmy nadzieję, że do czegoś nam się przyda: akurat ofert pracy dla nauczycieli wiele nie ma, więc każde dodatkowe miejsce do szukania takowych powinno być dobre.
I potem powoli się zaczęło.
#1
Już po kilku tygodniach szwędania się po tym serwisie (co ciekawe na GoldenLine wcale nie trzeba często zaglądać; szczerze to na pierwszy rzut oka nie ma tam nic zachęcającego do częstych wizyt) trafiłem na ogłoszenie, że jedna z białostockich organizacji szuka wolontariuszy. Zgłosiłem się i tak wszystko się zaczęło
#2
Kolejny moment kiedy przydał się GL to wyjazd do Afryki. Paweł, szef białostockiego wolontariatu miał wznajomych na GL dziewczyny z CWR, skontaktowałem się z nimi za pośrednictwem GL, pomęczyłem i zgodziły się mnei wysłać.
Także za pośrednictwem GL znalazłem sponsorów wyjazdu. Zamieściłem tam ogłoszenia, że jadę do Rwandy i potrzebuję pożyczyć od kogoś laptopa i aparat fotograficzny. Nie wierzyłem że się uda, a tymczasem zgłosiło się kilka firm, z których wybrałem IMPAQ (byli najszybsi).
#3
Także w moich działaniach wordpressowych GoldenLine miał spory udział. To na forum dotyczącym blogów udzielałem się odpowiadając na wordpressowe pytania, to tam pojawił się pomysł na WP Sprzedawcę, to tam informowałem o innych moich pluginach.
W efekcie nieskromnie powiem, że zdobyłem jako taką renomę jako wp-hacker co już przełożyło się na korzyści zawodowe.
Zgłosiło się do mnie kilka osób z pytaniem czy nie pomógłbym przy tworzeniu stron z użyciem wordpressa. Jako, że postanowiłem sobie nie być za bardzo tani większość po napisaniu ile sobie liczę za dany projekt już nie odpowiedziała. Udało mi się jednak nawiązać kontakt z kilkoma poważnymi osobami: jedna strona już jest zrobiona, dwie kolejne się robią i mam już ustawione co najmniej dwa – trzy (cztery?) kolejne zlecenia. I obietnicę stałego dopływu zleceń kolejnych od kilku osób, którym ufam, że jest to obietnica pewna.
Tu dodam, że tak Flaker w podobny sposób wpływa na moje „kontakty zawodowe”. Jednej osobie właśnie skończyłem już drugie zlecenie, inna osoba właśnie dziś zleciła mi coś nowego. (przy okazji pozdrawiam owe osoby, nie wymienione z imienia, ale na pewno to czytają i wiedzą o kogo chodzi
)
#4
I wreszcie 12 października jadę do Sopotu na szkolenie wstępne przed nową pracą (szkolenie będzie połączone z rozmową kwalifikacyjną więc nie chcę zapeszać, ale jak wiadomo jestem genialny i idealny, więc pracę tą dostanę na 100%
). To także historia z GoldenLine w roli co najmniej drugoplanowej. Tu znów wspomniany na początku Adaś miał swój udział: na początku tego roku podesłał mi link do ogłoszenia na GoldenLine: praca dla szkoleniowca z podstaw obsługi komputerów, wykształcenie pedagogiczne. Jakby nie było wypisz wymaluj ja. W międzyczasie całość się nieco rozlazła czasowo, szkolenia już mają dotyczyć nieco innych rzeczy, ale jak najbardziej niedługo ruszają.
Lista powyżej jest niepełna: wymieniłem tylko te aspekty GL, które miały jakieś większe znaczenie (bo kogo by interesowało, że np jestem tam moderatorem grupy dyskusyjnej o pomocy międzynarodowej i dzięki tej grupie przynajmniej jedną osobę udało mi się wysłać już do Afryki) lub o których chciałem napisać.
***
A w tym samym czasie w innych serwisach? Na naszej klasie dodałem stu kolejnych znajomych do listy i tyle. Żadnych nowych, bo to osoby które znam od lat. W życiu nic mi to nie zmieniło. Tymczasem na GL mam na liście znajomych chyba niecałe 20 osób (nawet nie wiem), w tym tylko niewielką część znam (bądź znałem kiedy dodawałem do listy) w realnym świecie, a serwis ten sprawił że zwiedziłem kawał świata i zarobiłem jako takie pieniądze. Na Wykopie obejrzałem milion głupich obrazków i filmików – dzięki GL zrobiłem już jedną i robię drugą stronę, na którą użytkownicy mogą wrzucać głupie obrazki i filmiki
I co ciekawe wszystko to bez większego wysiłku. Nie szperałem tam godzinami w poszukiwaniu pracy, nie reklamowałem się jako twórca stron, nie grzebałem w poszukiwaniu opcji wyjazdu do Afryki. Wszystko się potoczyło samo z siebie. Być może i bez GL zdarzyło by się wiele w moim życiu, ale tego już się nie dowiem
…a wielki plugin dla ludzkości.
Oczywiście przesadzam. Ale faktem jest, że mój napisany w pół godziny plugin do powiadamiania na email o konieczności aktualizacji WordPressa do nowszej wersji wywołał nieco dyskusji. Co więcej dyskusje wywołane zostały też na blogach twórców WordPressa i na liście mailingowej ‘wp-hackers’.
Dyskusje opierają się na pytaniu „dlaczego tej funkcji nie ma jeszcze w samym WordPressie” i raczej nikt nie neguje konieczności wbudowania takich powiadomień w silnik, a wszyscy zastanawiają się jak to zrobić. Tzn jak to ma dokładnie funkcjonować: czy ma sprawdzać tylko rdzeń, czy też pluginy. Czy ma być obligatoryjne, czy fakultatywne itp itd. Jest już nawet wątek na trac-u.
No cóż… być może niedługo mój plugin umrze tak samo szybko jak powstał. Ale nie miałbym nic przeciwko temu
Fajnie by było mieć świadomość, że się przyczyniło do rozwoju WordPressa
Kurde, właśnie szukałem inspiracji do zrobienia sobie nowego motywu graficznego na bloga. Miało być coś w stylu kartki papieru, bazgrołów na niej.
I szukanie inspiracji skończyło się znalezieniem dokładnie tego, czego szukałem
Zainstalowałem więc gotowca od Amandy Hawkins.
Jak Wam się podoba?
Uprzedzam, że są małe szanse bym posłuchał głosów typu „brzydko, zmień to”
btw. jak coś to widzę, że jest pare rzeczy do poprawienia i pewnie to poprawie



