Tag: wordpress

WooCommerce i Omnibus – moja wtyczka

Najnowsza dyrektywa Unii Europejskiej wymaga od sklepów internetowych wyświetlania najniższej ceny jaką produkt miał w ostatnich 30 dniach przed rozpoczęciem promocji. Osobiście uważam ten przepis za bardzo dobry (dlaczego, możecie dowiedzieć się z mojego już ponad 10-letniego wpisu jak Media Markt oszukiwał swoich klientów sztucznie zawyżając ceny tuż przed pseudo-promocją).

Przepis uważam za tak dobry, że aż postanowiłem ułatwić jego przestrzeganie właścicielom sklepów zbudowanych na bazie WooCommerce i opublikowałem wtyczkę, która z automatu konfiguruje sklep by był zgodny z dyrektywą popularnie nazywaną Omnibus.

Wtyczkę znajdziecie w oficjalnym repozytorium WordPressa (a więc także i w Kokpicie WordPressa po wpisaniu “wc price history” czy po prostu “omnibus” w pole wyszkiwania wtyczek), ale także rozwijam ją publicznie na GitHubie więc każdy może coś zaproponować od siebie, czy zgłosić błąd.

P.S. wtyczka stała się tak popularna, że poczułem się zmotywowany do tworzenia nowych pluginów i udostępniania ich za darmo w repozytorium 🙂 Jeśli więc ktoś z Was ma pomysł na kolejną, która przydałaby się wielu osobom, dajcie znać w komentarzu, a zobaczę co się da zrobić 😉

2

Najlepszy lep na klientów

W swoim życiu usłyszałem to pytanie na tyle dużo razy, że wielokrotnie zastanawiałem się jak powinna wyglądać na nie odpowiedź. Kilka razy podchodziłem do napisania wpisu o tym i za każdym razem wpis ten kończył co najwyżej jako szkic.

Pytania “Jak zostać dobrym programistą?”, “Skąd znajdować zlecenia na strony?” i różne ich wariacje.

Bo kimże ja jestem bym wypowiadał się na ten temat jak jakiś autorytet? 🙂 To prawda: jakoś tak się ułożyło że od momentu zrobienia pierwszej strony “za pieniądze” – a było to już z 14 lat temu – ani razu nie miałem momentu bym musiał szukać kolejnego zlecenia. Odwrotnie: to zleceniodawcy ustawiali się w kolejkę, czasem tak długą, że wpadłem na pomysł zrobienia strony wpzlecenia.pl – początkowo miejsca gdzie chciałem odsyłać część z nich z mniej ciekawymi propozycjami, a z czasem dobrze rozpoznawalnej marki w WordPressowym świecie.

Choć już od ośmiu lat nie zajmuję się przyjmowaniem zleceń – pracuję na etat w firmie wykonującej WordPressowe wtyczki – to wciąż raz na jakiś czas dostaję zapytanie o wycenę zlecenia i czy się jego podejmę.

Więc jak mi się to wszystko udaje i to mimo tego, że programistą jestem co najwyżej średnim?

Na szczęście nie muszę się rozpisywać. Zobaczcie ten wpis: Do Things, Tell People. Serio, idźcie tam przeczytajcie (nie jest długi, ale idealnie mówi to, co chciałem napisać wiele razy ale mi się nie udawało) i potem tu wróćcie (lub nie).

Poza robieniem ludziom stron, pisaniem wtyczek, poprawianiem już istniejących wyprysków internetowych, to co robiłem i sprawiło, że klienci ustawiali się w kolejki to fakt, że pisałem i mówiłem o tym.

Gdy zrobiłem pierwszą stronę, napisałem o tym na tym blogu i zaraz miałem kolejnego klienta, bo przeczytał mój wpis. O jego stronie też napisałem i napisałem nie tylko tu, ale i na flakerze (już nie istnieje, taki trochę twitter z Polski) i miałem kolejnych klientów.

Występowałem na WordCampach przez co stałem się widoczny w kolejnych miejscach i stamtąd też przychodzili klienci.

(Współ)napisałem książkę od WordPressie! Organizowałem WordCampy i WordUpy! Prowadziłem stronę z poradnikami jak coś zrobić w WordPressie!

Gdy podesłałem poprawkę do samego WordPressa i została ona zaakceptowana i włączona do niego, napisałem o tym gdzie tylko się dało.

Stworzyłem swoją własną wtyczkę do tworzenia sklepów internetowych na bazie WordPressa. I kilka innych wtyczek.

Z ręką na sercu, przyznajcie, że właśnie macie wrażenie, że czytacie wpis kogoś, kto się na WordPressie zna, co nie? Wiem, że tak. Bo tak to właśnie działa.

Co więcej, ilu z Was się zorientowało, że macie taką właśnie opinię o mnie, choć nigdy nie widzieliście ani jednej linijki mojego kodu?* A może mój kod jest brzydki i w ogóle działa tylko w środy albo jeszcze rzadziej? 😉

To powyżej na tym etapie nie ma znaczenia. By znaleźć klienta, musisz być rozpoznawalny. By być rozpoznawalny, musisz być widoczny. By być widoczny, musisz zacząć mówić i pisać o sobie. Łuhu, właśnie odkryliśmy marketing (i branding).

Ciekawostka: napisałem kiedyś wpis, że mam zamiar się uczyć Drupala. I tyle. Nic jeszcze nie umiałem i nawet nie było wiadomo jak mi ta nauka pójdzie (nie poszła). To nie przeszkodziło w tym, że w dwa tygodnie po wpisie w mojej skrzynce pojawiła się propozycja pracy przy stronie opartej na Drupalu.

Mówienie o tym, co się robi zawodowo to najlepszy lep na klientów.

___
*) Jedna linijka kodu to dokładnie tyle, ile dodałem do samego WordPressa i zostało to zaakceptowane. Ale bez wspominania o tym, moja kontrybucja brzmi o wiele poważniej.1

Dlaczego po latach opublikowałem nową wtyczkę do WordPressa?

Blog przez lata podupadał (ale teraz się odradza) z wielu powodów. Nie będę teraz omawiał wszystkich, ale wspomnę o tym, który skutkował stworzeniem przeze mnie wtyczki do WordPressa.

Era blogów trochę minęła i chyba wszyscy się zgodzą, że głównym tego powodem był wybuch popularności sieci społecznościowych: kiedyś Naszej klasy, Flakera czy Blipa, a teraz głównie Facebooka i Twittera. Każdy, kto blogował coraz rzadziej wrzucał coś na swój pamiętnik, a coraz częściej do którejś ze społecznościówek.

Powodów tej zmiany też jest wiele, ale teraz wspomnę tylko o jednej, która skutkowała stworzeniem wordpressowej wtyczki.

To proste: serwisy społecznościowe doprowadziły prostotę dodawania wpisów do ekstremum.

Podczas gdy na swoim blogu – załóżmy, że właśnie WordPressowym – aby coś opublikować trzeba wejść nie na stronę główną, a podstronę /wp-admin (i tu często się zalogować po automatycznym wylogowaniu co jakiś czas), potem kliknąć znaczek plus na górnym pasku (lub wybrać jakiś inny sposób do przejścia do ekranu dodawania nowego wpisu), to na Facebooku czy Twitterze nie ma tych wszystkich kroków: jesteśmy zawsze zalogowani, a publikować możemy od razu ze strony głównej.

I wiele razy tak miałem, że choć wolałbym coś napisać na swoim blogu, to jednak wygrywało lenistwo i umiłowanie do prostoty. “F” w pasku adresu przeglądarki, enter, klik w pole publikowania, szybki wpis i klik w przycisk “Opublikuj”.

Pomyślałem: co gdyby zrobić publikowanie na blogu tak samo łatwe jak na Facebooku?

I tak oto narodził się pomysł na wtyczkę Editor Box.

Po jej zainstalowaniu na stronie głównej swojego bloga będziecie mieć pole dodawania wpisu podobne do tego znanego z Facebooka czy Twittera. Zresztą zobaczcie sami jak to działa w praktyce:

“Muz” w pasek adresu przeglądarki, enter, szybki wpis i klik w “Publikuj”. Nie da się prościej, prawda?

Dodawanie tagów, kategorii i tytułu jest opcjonalne (bo na Facebooku/Twitterze tych pól też nie ma). Do tego w najnowszym wydaniu doszła opcja nie publikowania, a zapisywania wpisu jak szkic, by dokończyć go w pełnym edytorze wpisów (wystarczy wcisnąć przycisk Ctrl nad przyciskiem publikacji, wsparcie na telefonach komórkowych dodam wkrótce):

Wtyczkę stworzyłem dwa lata temu dla siebie, teraz zrobiłem ją publicznie dostępną

Wtyczka jest dostępna w wordpressowym repozytorium wtyczek od niecałego miesiąca, ale jej pierwsza wersja powstała chyba ponad dwa lata temu. Zrobiłem ją najpierw dla siebie, ale myślę, że jest wiele innych osób, które czują sentyment do blogowania, ale nie mogą przemóc się i zrezygnować z wygody, jaką daje Facebook/Twitter. Dlatego też postanowiłem uczynić ją publiczną i zachęcam wszystkich do instalacji.

Wtyczka oczywiście rozwiązuje tylko jeden problem będący powodem schyłku blogowania. Zdaję sobie z tego sprawę i nie mam zamiaru udawać, że jest szwajcarskim zegarkiem rozwiązującym wszystkie niewygody.

Ale mam dobrą wiadomość: widzę, także inne aspekty i mam zamiar je także pokryć kolejnymi wtyczkami 🙂 Najpierw dla siebie, a potem dla reszty jeśli będzie taka potrzeba z Waszej strony. Co nowego planuję, nie będę jeszcze zdradzał, ale… zachęcam do kliknięcia serduszka po tym wpisem. Oj, trochę się wygadałem 😉

A czemu w ogóle znów robię darmowe wtyczki?

Lepsze pytanie powinno brzmieć: czemu w ogóle przestałem je robić.

Choć ostatnie osiem lat, a może nawet więcej to było niemal kompletnie komercyjne eksploatowanie wordpressowego ekosystemu (ok, nie było aż tak źle, bo dawałem jednak coś w zamian społeczności, jak choćby moje prelekcje na WordCampach i organizacja lokalnych WordUpów w Białymstoku i wciąż darmowy serwis WPzlecenia), to jednak właśnie za wolność i otwartość kocham tę platformę najbardziej.

Gdy pracujesz na etat po osiem godzin dziennie i w ciągu tych ośmiu godzin wszystko co musisz robić to tworzenie wtyczek, nie ważne jak dużą frajdę ci to sprawia, to jednak po pracy nie masz już chęci by robić cokolwiek innego związanego z programowaniem. Tym bardziej jak masz rodzinę.

Ostatnie tygodnie z powodu rezygnacji z pracy w firmie dały my więcej czasu dla siebie. Dlatego też zacząłem intensywnie poprawiać mój niepublicznie dostępny Editor Box by w końcu pod koniec grudnia wypuścić go do repozytorium.

I czuję się z tym wspaniale! Fajne jest te uczucie, że robisz coś fajnego za darmo i fajnie jest wiedzieć, że tu sam jestem sobie szefem i decydentem. Mam wielkie doświadczenie odnośnie programowania wyniesione z firmy i staram się je stosować przy tej wtyczce, a równocześnie wiem, że robię to wszystko bo chcę, a nie muszę.

6

Opuszczam WPML, przechodzę do WPforms

Właśnie mam kilka chwil czekając na rozmowę z HRką w naszej firmie, więc poświęcę je na napisanie wpisu o tym, że będzie to rozmowa pożegnalna i od przyszłego tygodnia będę już pracował gdzie indziej.

“Przez osiem ostatnich lat” (skojarzenie przypadkowe) pracowałem w OnTheGoSystems rozwijając wordpressową wtyczkę WPML. To jest niewyobrażalny szmat czasu, tym bardziej, że dołączając do tej firmy zakładałem, że pobędę w niej co najwyżej kilka miesięcy i wrócę do pracy freelancera. Nie widziałem siebie pracującego na stałym etacie. Teraz nie wyobrażam sobie bym wracał do freelancingu.

Te osiem lat to przede wszystkim olbrzymia lekcja. Nowych umiejętności, ale i pokory.

Wszystkim freelancerom chciałbym doradzić by jeśli nawet nie chcą się zatrudnić na stały etat, próbowali w mniejszym lub większym stopniu pracy z innymi ludźmi. Freelancer w ogromnej większości przypadków pracuje zupełnie sam. Bardzo łatwo jest wtedy uwierzyć w swoją wielkość i nieomylność.

Gdy pracujesz z innymi, bardzo szybko nauczysz się, że there’s always a bigger fish. W pracy “na własne” ego rośnie do olbrzymich rozmiarów, gdy trafisz do teamu, opublikujesz swój pierwszy kod po czym w trakcie code review w twoich 20 linijkach zostanie wytknięte 6 błędów (lub po prostu rzeczy, które można zrobić lepiej) nabierzesz pokory i zrozumiesz, że nigdy nie powinieneś przestawać się uczyć.

To jest najważniejsza i najlepsza rzecz jaka mnie spotkała, gdy dołączyłem do OnTheGoSystems. Bolesna, ale potrzebna lekcja. Zacząłem znów czytać książki, eksplorować także inne języki programowania, używać narzędzi poprawiających jakość twojego kodu, pokrywać go testami (coś, co absolutnie nie istnieje, gdy tworzysz kolejną skórkę na stronę sklepu jakiejś firmy), doceniać ważność code review i zastanawiać się trzy razy zanim zdecyduję się przesłać swoją zmianę kodu do repozytorium. Może kiedyś napiszę serię osobnych wpisów o każdej z tych zmian w podejściu do programowania, bo każda z nich osobno jest ogromnie ważna. Ach! Jeszcze debugger! Moje największe odkrycie, na które nigdy nie było czasu by je poznać gdy czekała do mnie kolejka klientów, a tu gdy odkryto, że go nie znam, mój przełożony zostawił swoje zadania i zaczął mnie go uczyć. Najlepsza inwestycja w przyszłość moją, teamu i firmy. Jeśli jeszcze nie używacie debuggerów, zacznijcie, serio. Nawet jako “klepacze skórek” sprawi, że zaczniecie pracować szybciej, a więc i więcej zarabiać.

Patrzyłem jak OnTheGoSystems rośnie: dołączyłem jako mniej więcej dwudziesty pracownik, a odchodzę gdy OTGS zatrudnia około 100 ludzi.

Dlaczego odchodzę? Przez te powody, które wymieniłem wyżej. Od mniej więcej roku zdałem sobie sprawę, że nie uczę się nowych rzeczy (albo rzeczy, które w firmie uważa się, że powinienem się nauczyć, mnie nie interesują). Stagnacja. Zacząłem pracować coraz mniej wydajniej, z coraz mniejszą chęcią siadać do pracy. Przyszedł nawet taki moment, że zdałem sobie sprawę, że nie czuję się z tym komfortowo, że właściwie mój szef marnuje na mnie pieniądze. Czas więc coś zmienić.

Tak oto od przyszłego tygodnia dołączam do AwesomeMotive gdzie będę rozwijał inną wtyczkę – WPforms. Z jednej strony to właściwie to samo (inna firma, inna wtyczka do WordPressa, ale to nadal ten sam rodzaj pracy), więc nie mam żadnych obaw związanych z tą zmianą, na pewno szybko wdrożę się w nowe zadania. Z drugiej wiem od ludzi, którzy tam pracują – a szczególnie od ludzi, którzy pracowali w OTGS a teraz tam przeszli – że zmiana taka to bardzo dobra decyzja. Mówią, że jeśli czuli wypalenie zawodowe, to bardzo szybko odzyskali chęć programowania. To na pewno terapia, której potrzebuję.

Zatem pamiętajcie, że to już nie jest “ten Konrad od WPML” tylko to będzie “ten Konrad od WPforms” 😉 I dajcie znać w komentarzach czy chcecie bym trochę pomętorzył dzieląc się w kolejnych wpisach doświadczeniem jakie zdobyłem pracując na etat, a jakie przyda się też freelancerom. Mogę też poopowiadać o blaskach i cieniach pracy zdalnej (zarówno OTGS jak i AM to firmy zatrudniające wszystkich kompletnie zdalnie).

11

Yo Dawg, słyszałem, że szukasz systemu komentarzy do CMSa, który ma już system komentarzy

WordPress ma wbudowany mechanizm komentowania wpisów (i tu zachęcam do wypróbowania go pod tym wpisem 😉 ). Tymczasem ludzie, jak ślepe stado owiec instalują zewnętrzne systemy komentarzy – czy to z Disqus-a czy (jeszcze gorzej) Facebooka. “Inni zainstalowali, więc i ja zainstaluję”. Bez analizowania czy są z tego jakieś korzyści.

Korzyści nie ma. Disqus nie daje nic, czego nie miałby WordPress + wtyczki. Za to gdy używasz Disqusa:

– sprzedajesz swoich czytelników jakiejś zewnętrznej firmie, która przetwarza ich jako wkład do big data. Kiedy to się stało gdy “dziękuję za skomentowanie mojego wpisu” zamieniliśmy na “skomentowałeś, więc zapraszam do sprofilowania cię w dziesiątkach sieci reklamowych”?

dokładasz 1,5-2 MB oraz aż 140-180 requestów do każdej podstrony na twoim blogu. Nie będę pokazywał palcami, ale znam takie osoby, które dość ostro wypowiadają się o innych stronach, że mają słaby performance (np przez site buildery, z czym się zgadzam), a jednocześnie na swoich blogach odwalają Disqusa 🙂

– nigdy nie otrzymasz komentarza ode mnie i innych osób nie godzących się na udostępnianie swoich danych komukolwiek tylko temu, że “pozwoliłeś” mi na skomentowanie. No dzięki, ale nie. W przeglądarce mam blockery skryptów śledzących i ja formularzy Disqusa i tym podobnych nie widzę. I prawdę mówiąc jak widzę, że nie mogę komentować, na taki blog już nie wracam (albo wracam rzadziej).1

Setny raz o Asanie

I będę o niej pisał jeszcze milion razy. Do momentu aż wszyscy zaczną jej używać, lub innego narzędzia do panowania nad zadaniami. Po prostu jest genialna, co udowodnia mi właśnie kolejny raz i udowodni na pewno jeszcze w wielu przypadkach.

Uwaga, to nie będzie wpis o tworzeniu stron. OK, jako przykład podam swój własny przypadek, a że ten polega na realizacji wordpressowego zlecenia, to nie ma znaczenia. Asanę używam i każdy może używać do zapanowania nad dowolnym problemem. Przygotowujesz się do wyjazdu na wakacje i nagle zdajesz sobie sprawę jak wiele jeszcze rzeczy musisz załatwić zanim stawisz się na lotnisku? Wróciłeś właśnie z urlopu i na biurku masz milion notatek od współpracowników z zadaniami, przez co jedyny pomysł jaki przychodzi ci do głowy, to rozłożyć ręce i płakać? W najbliższym tygodniu masz dwie klasówki, każda z czterech działów, do tego jeszcze wypracowanie do napisania, i kilka prac domowych? Oto jak ja to rozwiązuję.

Pod koniec czerwca dostałem zlecenie na całkiem sporą stronę dla pewnego znanego zespołu muzycznego (szczegóły wkrótce). Termin wykonania to koniec lipca. Prawie niemożliwe do wykonania (strona naprawdę spora), ale się zgodziłem.

W ostatnią środę – 17 lipca – wpadłem w panikę. Końca prac nie widać, a zostały niecałe dwa tygodnie.

Wziąłem kartkę A4, narysowałem na niej kalendarz pozostałych dni. W każde pole wpisałem kolejne elementy, które trzeba jeszcze wykonać, zaznaczyłem w jakim dniu zacznę, w jakim skończę. Prawdę mówiąc wyszła mi tragedia, bo upchałem wszystko na styk wykorzystując nawet weekendy na pracę. Ponad dwadzieścia elementów do wykonania, z czego 1/3 to elementy duże, zajmujące więcej niż dzień pracy. A dni trzynaście.

Zacząłem pisać maila do zespołu, że niestety nie uda się dotrzymać terminu. Przerwałem jednak i postanowiłem wrzucić wszystko w Asanę. Pooznaczać daty, przypisać wszystkie zadania dla mnie (tak bym rano na maila dostawał powiadomienia co dziś mam zrobić). I co ważne otagowałem każde zadanie: duże, wielodniowe dostały tag ‘big’, średnie, kilkugodzinne to ‘medium’, a zadanka do zrobienia w parę chwil – ‘small’.

Efekt? Od środy minęły 4 dni, a na liście zadań, z ponad 20tu zostały… cztery!

todo

(Powyższy zrzut ekranu wykonałem 22 lipca, zobaczcie jak wiele zadań zrobiłem przed czasem)

Nie, to nie Asana wykonała za mnie te zadania, ale to ona zmobilizowała mnie do pracy. Przez cztery dni co rano dostawałem listę rzeczy, które muszę jeszcze zrobić.

Nikomu nie chce się z rana brać do pracy (bo oczywiście najpierw kwejk, potem facebook, kawka, albo w innej kolejności…). Ale rzut oka na listę zadań, przefiltrowanie by pokazało tylko te najmniejsze – przecież jeśli mam zrobić coś, co zajmie mi góra pół godziny, mogę się przemóc i zrobić to przed facebookiem.

Piętnaście minut i zrobione! Odhaczam zadanie w Asanie, ono się ładnie przesuwa i robi szare. Teraz, skoro już mam otwarty edytor i wszystko inne, można śmiało zrobić coś ‘medium’. Co tam medium, spróbujmy ‘big’.

I tak dzień po dniu, w cztery dni siedemnaście problemów, które jeszcze w środę wydawały mi się niemożliwe do pokonania po prostu zniknęło.

Niekoniecznie namawiam Was na Asanę; po prostu namawiam Was na jakikolwiek system GTD. Takie coś naprawdę pomaga i sprawia, że coś, co wydaje się niemożliwe do zrobienia w wyznaczonym czasie, kończymy na długo przed terminem. Nawet jeśli nie chcecie korzystać z narzędzi online, wystarczy poczciwa stara metoda: kartka, długopis i robimy listę.

0

Mam do rozdania wejściówki na tegoroczny WordCamp

Przyjąłem sobie, że na tym blogu o WordPressie już nie piszę, wszelkie moje  WordPressowe  porady znajdziecie teraz na dev.wpzlecenia.pl. Tyle, że to nie jest porada.

W tym roku WordCamp odbędzie się w Gdańsku w dniach 11-12 października. Jeśli ktoś chce się na nim zjawić, wejściówki może kupić na tej stronie.

Jeśli ktoś chce wejściówkę za darmo, może ją wygrać na tej stronie –  spieszcie się, bo rozdajemy je do piątku, do południa.

Ja oczywiście na WordCampie będę. Raczej nie jako prelegent, bo nie potrafię znaleźć tematu, o którym mógłbym mówić, który byłby ciekawy dla  słuchaczy i który sam bym bardzo dobrze znał. Ale się jeszcze zobaczy 😉

p.s. Termin i miejsce WordCampa specjalnie zostały tak dobrane, by wydarzenie to przylegało do odbywającego się w weekend Blog  Forum Gdańsk, także miejcie to na uwadze i zastanówcie się czy nie warto zaliczyć obu spotkań na raz.0

Proszę państwa, oto Biebrza

Dawno już nie chwaliłem się jaką to nową stronę wykonałem, część z Was pewnie już zapomniała, że to właśnie robieniem wordpressowych stron zarabiam na życie. Jako, że jedno z moich ostatnich dzieł zapiera dech w piersiach, to jest chyba dobra okazja by Wam o mojej działalności przypomnieć 😉

Uwaga (vel reklama): jeśli ktoś też chce mieć taką stronę, a może nawet jeszcze lepszą, zapraszam do kontaktu!

Rozsiądźcie się wygodnie i podziwiajcie widoki, zarówno te programistyczne, te CSS-owe jak i te jak najbardziej naturalne, przyrodnicze. Bowiem zapraszam Was na stronę internetową o Biebrzy i Biebrzańskim Parku Narodowym.

Biebrzański Park Narodowy - wygląd strony głównej

Powyżej widzicie fragment strony głównej new.biebrza.com, ale do podziwiania jest tam o wiele więcej.

Strona pełni funkcję biznesową: ma sprzedawać wycieczki po Biebrzy i jej okolicach, oferować noclegi i reklamować wiele innych rzeczy, ludzi i instytucji, które z Biebrzą mają coś wspólnego. Jeśli ktoś szuka na przykład gdzie można nad Biebrzą dobrze zjeść, gdzie wypożyczyć kajak, samochód lub nawet przelecieć się balonem – wszystko to na pewno tam znajdzie. Jest nawet sklep internetowy z pamiątkami z nad Biebrzy (oparty na mojej wtyczce TradeMatik).

Pieniądze to oczywiście nie wszystko. Strona na pewno przyda się także innym, którzy Biebrzę wolą zwiedzać sprzed ekranów komputerowych. W szczególności polecam podstronę z informacjami o tej rzece i naprawdę imponującą galerię fotografii (poważnie, zajrzyjcie, bo niektóre zdjęcia zapierają dech w piersiach, aż się nie chce wierzyć, że to nasza rodzima rzeka, a nie Amazonka).

OK, dość marketingu, przejdźmy do tego, co najczęściej opisuję w takich przypadkach, czyli jak przebiegało tworzenie strony i co strona ma w bebechach 🙂 A mam się czym chwalić bo chyba nigdy dotąd nie wyciskałem aż tyle z WordPressa. Ba, nie zdziwię się, jeśli ktoś z Was nie będzie mógł uwierzyć, że to jest nadal WordPress i że nie musiałem tutaj w ogóle modyfikować jego źródeł (dzięki czemu klient może śmiało korzystać z nowszych wydań WordPressa nie bojąc się, że coś się przy aktualizacji popsuje).

Strona nie była tworzona z niczego. Firma Biebrza Eco-Travel posiadała witrynę od dawna (uchowała się jej stara wersja angielska więc każdy może porównać stan przed i po) i patrząc na ów stary design, zakładam, że był projektowany z 13 lat temu. Przynajmniej tak wtedy wyglądały moje strony internetowe 😉 Strona zarabiała na siebie. Właściwie to mało powiedziane: była chyba głównym źródłem dochodów, bo to w internecie klienci znajdowali ofertę firmy i przez formularz na stronie składali zamówienia na wycieczki.

Dlaczego więc zmieniono silnik strony na WordPressa? Z dwóch powodów: stara strona trąciła już myszką, a co ważniejsze: nie  było tam żadnego silnika strony. Gdy w ofercie firmy pojawiała się nowa wycieczka, informatyk (w ostatnim okresie działania starej strony to byłem ja) otrzymywał na maila plik Worda z opisem imprezy, zdjęcia z aparatu ( w rozdzielczości 2500×1200 pikseli i wadze po 3 MB) z prośbą o umieszczenie wycieczki na stronie. Wtedy łączyłem się przez FTP ze stroną, tworzyłem nowy dokument html, przekopiowywałem treść, przeskalowywałem w Gimpie zdjęcia, dodawałem “znak wodny”, dodawałem do opisu, otwierałem kilkadziesiąt już istniejących podstron zbiorczych (także w notatniku) i edytując ich kod html dodawałem odnośnik do nowej imprezy.To samo z wszelkimi innymi typami treści.

Całość zajmowała godziny, była żmudna i kosztowała firmę sporo pieniędzy. Analizując kod strony widać było wyraźnie, że przede mną było wielu innych informatyków, którzy nie wytrzymywali takiego trybu pracy (moje wprawne oko wyłapało tam naleciałości z różnych programów od windowsowego notatnika przez DreamWeaver po Front Page i mnóstwo kodu wskazującego na wybieranie w MS Word opcji “zapisz jako stronę web”).  To była tragedia do rozczytania, a żeby choćby poprawić jakąś literówkę musiałem spędzić sporo czasu na rozgrzebywaniu tych html-owych śmieci. To zniechęca do pracy, a co ważniejsze dla klienta: kosztuje dużo ze względu na czas potrzebny na to. Nie mówiąc już o zapewne kolejnych problemach z kolejnymi informatykami, którzy rezygnowali z tej żmudnej pracy i konieczności szukania następnego.

Po przejściu na WordPressa założenie było takie, że strona dostanie nowy wygląd (nawiązujący jednak do starego), nowe możliwości i typy treści, a co najważniejsze to już sam właściciel strony bez wymogu znajomości HTML sam będzie te treści dodawał, aktualizował i układał w sposób jaki będzie tego chciał. To niewątpliwe zalety, ale pojawiła się spora obawa:

Stara strona była bardzo dobrze zaindeksowana w wyszukiwarkach, a to z Google przychodziła większość klientów. Czy kompletna przebudowa strony, zmiana treści i zmiana odnośników do poszczególnych podstron nie sprawi, że nagle w jeden dzień firma przestanie zarabiać? Nie będę Was trzymał w niepewności: dzięki sztuczkom z .htaccess i naturalnej miłości pomiędzy WordPressem a zagadnieniami SEO (na stronie nie ma nawet zainstalowanej żadnej wtyczki do pozycjonowania witryny!) wszystko poszło wyśmienicie. Sprawdźcie sami wpisując w google słowo “biebrza”. Stara wersja strony znajdowała się na 3. pozycji w wynikach wyszukiwania (po oficjalnej stronie parku i artykule w wikipedii). Nowa znajduje się na tej samej. Podobnie jest z innymi frazami związanymi z tą branżą i okolicą.

Przy budowie strony silnie wykorzystałem rewelacyjną nowość wordpressa jaką są własne typy treści. Jeszcze dwa lata temu wszystko publikowane na stronie musiało by być zapewne albo “stroną” albo “wpisem blogowym” przyporządkowanymi do kategorii “wycieczki”, “noclegi”, “baza żywieniowa”… Biorąc pod uwagę, że każdy z tych typów danych powinien mieć różne pola je opisujące (na przykład wycieczki mają określony termin startu i zakończenia, czego na przykład nie ma restauracja, która z kolei może zostać przyporządkowana do kategorii “restauracje”, “bary” lub kolejnej, która ni jak nie odnosi się do wycieczek czy noclegów), byłby to koszmar.

Dzięki wykorzystaniu własnych typów treści, każda opcja na stronie ma swój własny formularz dodawania. Przy imprezie (wycieczce) można określić tak podstawowe rzeczy jak “termin”, “program”, “miejsce startu” czy “przewodnik”, po te bardziej wyszukane jak na przykład “noclegi w okolicy” (i tu klient może od razu metodą przeciągnij i upuść stworzyć dowiązania do elementów o typie treści “baza noclegowa”), “współrzędne geograficzne” (jak zapewne zobaczycie każda wycieczka ukazana jest też na automatycznie generowanej mapie). Podobnie przy “bazie noclegowej” można określić cenę za noc, ilość miejsc noclegowych, wybrać do jakiej kategorii należy dany obiekt lub na przykład ile metrów/kilometrów jest do plaży.

Możliwości jest tak wiele (sama strona to obecnie aż 18 custom post types i każdy ma od kilkunastu do nawet kilkudziesięciu różnych pól formularza do uzupełnienia podczas edycji), że czasami ich edycja staje się szczerze mówiąc  trudna. Z tego powodu wiele edycji wizualnych przenieśliśmy do front-endu – zalogowany właściciel strony może sam układać sobie pewne elementy na stronie od razu widząc jak to będzie wyglądało po edycji (nie musi nawet klikać przycisku zapisz).

Oto przykład jak układane są zdjęcia w galerii:

Wystarczy złapać myszką za zdjęcie i przemieścić je w nową pozycję. Po opuszczeniu zmiana zostanie zapamiętana.

Nie tylko zdjęcia można w ten sposób nosić. Przykładowo, pod każdą stroną jest sekcja “Sprawdź także”. Ją też można porządkować metodą przeciągnij i upuść i co najważniejsze – każda podstrona może mieć tu różne elementy i w różnej kolejności!

Taka wizualna wersja znanego zapewne części z Was pluginu widget logic 🙂 Tyle, że całość napisałem sam zgodnie z wytycznymi klienta.

Inne ciekawe rozwiązanie to wspomniane już wyżej terminy imprez. Każda wycieczka może być zorganizowana wiele razy w roku w różnych datach. Pierwotnie chciałem by klient musiał dla każdego terminu dodać kolejną wycieczkę, którą od poprzedniej różniła by się tylko datą, ale okazało się, że w takim wypadku pracy byłoby więcej niż przy starej wersji strony. Przykładowo “Fotosafari” organizowane jest kilkadziesiąt razy w roku. Dodanie kilkudziesięciu wpisów różniących się jednym polem nie wygląda zbyt wydajnie. Kolejnym utrudnieniem tutaj był fakt, że firma chciała móc przy każdym terminie danej imprezy zaznaczyć, że wszystkie miejsca już zostały wykupione, a nawet nie określać terminu w ogóle – w takim wypadku przy zamawianiu klient sam określał kiedy chce przyjechać na wycieczkę. Cały ten miks miał być trzymany w jakiś sposób w WordPressie i dawać się łatwo zarządzać i porządkować. Udało się, co na przykład możecie zobaczyć na stronie wszystkich wycieczek – imprezy uporządkowane są datami (a gdyby ktoś chciał zmienić sposób porządkowania po długości trwania, nie ma problemu). Jeśli jakiś termin jest już niedostępny informuje o tym odpowiednia ikona. Tabela uwzględnia też imprezy bez określonego terminu i właściciel strony sam decyduje w której części tabeli umieścić taką wycieczkę. Sortować można także po grupie docelowej wycieczki i sposobie jej organizacji. Wypas 😉 (btw. po części jak to zrobiłem opisałem w artykule na dev.wpzlecenia).

Powyższy opis jest długi, ale uwierzcie mi, że tylko poruszył malutki skrawek zadań programistycznych jakie przede mną stały. Dość powiedzieć, że całość prac trwała niemal 12 miesięcy! Przeniesienie 1800 subskrybentów newslettera do nowego – a jakże napisanego od podstaw przeze mnie  – systemu opartego na wordpressie, sposoby wybierania elementów do zamieszczenia na stronie głównej, sposoby do wybierania i układania elementów na każdej podstronie (w tym i podstronach generowanych automatycznie jak na przykład na stronach kategorii), umieszczanie elementów na mapach google z podziałem na kategorie tych elementów i możliwością wyświetlania na mapie tylko części z nich, możliwość wyskalowania zdjęć do 12 predefiniowanych kadrów, różnych dla różnych fotografii, także różne atrybuty title dla każdego zdjęcia w zależności gdzie ono jest wyświetlane (inny podpis pojawia się na zdjęciu w galerii i jeszcze inny na tym samym zdjęciu ale przy wycieczce), ukłądanie zdjęć w różnej kolejności, automatyczne menu zakładkowe na górze strony generowane na podstawie kategorii do jakich mogą być przypisane wycieczki… uff. Nadal nie wymieniłem nawet połowy rzeczy 🙂

Ale chyba się udało, prawda? 🙂

 0

Z pisaniem o WordPressie przenoszę się gdzie indziej

Muzungu.pl stanie się z powrotem blogiem prywatnym, o tym co u mnie słychać i co ja sobie myślę na różne tematy. Do tej pory mieszałem tu właśnie takie wpisy z moimi poradami odnośnie WordPressa. Z rozmów z Wami wiem, że nie wszystkich ten drugi temat interesuje.

Na szczęście będzie lepiej, a wszystko za sprawą nowego serwisu, jaki uruchomiłem 🙂 Dziś w nocy oficjalnie wystartował dev.wpzlecenia – wortal w którym będziemy pisać o WordPressie, wszelkiego rodzaju poradniki, nieco aktualności…

Zatem wszystkich tych, którzy interesują się WP (a może chcieliby zacząć się interesować) zapraszam pod nowy adres. Zapraszam też do pisania! Nie chcę by ta strona była tylko moja, ale wszystkich, którzy mają coś wordpressowego do powiedzenia.

Na Muzungu czasem jednak wrzucę informacje o skończonych stronach, nadal tu też będą moje wtyczki. Jednak nie będzie już żadnych porad, a co więcej – te które już są wkrótce przeniosę właśnie na dev.wpzlecenia.

WordPressowcy – wspomnijcie na swoich blogach, facebookach, twitterach czy gdzie tam jeszcze bywacie o starcie nowego serwisu 🙂 Będę bardzo wdzięczny!0

Jestem już chyba w księgarniach :)

Na Flakerze pojawiło się takie oto zdjęcie:

KS Ekspert

KS Ekspert

Ale fajnie 🙂 Nie wiem skąd ono, czy z redakcji, czy już z półki w księgarni. Jeśli z półki to lecę zobaczyć 🙂 Najpierw się jednak dopytam, bo jestem przeziębiony i wolę niepotrzebnie z domu nie wychodzić 🙂0

Wszystko, co chcecie wiedzieć o tłumaczeniu wtyczek w WordPressie

Ile razy nie przysiadam do internacjonalizacji wtyczek zrobionych przeze mnie, zawsze musze grzebać w zakładkach jak to się robiło. Część rzeczy pamiętam, część muszę przeczytać jeszcze raz. Jak na złość nie ma strony, która gromadzi te wszystkie informacje w jednym miejscu. O poEdit gdzie indziej, o load_plugin_textdomain gdzie indziej…

Już dawno chciałem spisać to sobie wszystko w jedną całość i tak właśnie zrobiłem. Przygotowałem PDF z wszystkimi wskazówkami dotyczącymi tłumaczenia. I od razu pomyślałem, dlaczego by się tym z innymi nie podzielić? 🙂

Zapraszam do chyżego ściągania.

[download id=”1″]

Plik PDF jest za darmo. Myślę, że można go potraktować jako kolejną część mojego tutorialu o tworzeniu wtyczek w WordPress0

Uznaj.pl – rewelacyjny pomysł na serwis. Tak rewelacyjny, że zrobiłem do niego wtyczkę :)

Kolejne odkrycie, którym chcę się podzielić: serwis Uznaj.pl. Ile razy zdarzyło się Wam przeczytać naprawdę wartościowy wpis w sieci, jakiś poradnik za który aż się z miejsca chce "kopsnąć" autorowi kilka złotych na piwko w ramach podziękowania? Serwis Uznaj.pl właśnie ma za zadanie wypełnić tę lukę. Po zarejestrowaniu się w nim możemy wygenerować kod ikonki, którą osadzamy na swojej witrynie i odwiedzający mogą kliknąć i przesłać nam małą darowiznę. 

Pomysł fajny. Sam myślałem od jakiegoś czasu o takiej usłudze i tym bardziej się cieszę, że ktoś zdecydował się to zrobić. 

Ma jednak pewne wady:

  • "darczyńca" musi posiadać konto w uznaj.pl i złożyć tam depozyt aby przelać nam pieniądze. Na pewno wiele osób to zniechęci do wpłaty.
  • trzeba ręcznie dodawać kod ikonki do wpisów, stron…
  • kod się gryzie sam ze sobą – na jednej stronie może być tylko jedna ikonka. Jeśli jest ich więcej (na przykład na głównej stronie bloga wyświetlającej kilka wpisów z kilkoma ikonkami), wyświetlana jest tylko ikonka przy pierwszym wpisie.

Co robi Muzungu jak zachwyci go jakiś serwis i dostrzeże w nim błędy? 🙂 Oczywiście siada i pisze plugin do WordPressa, który ułatwi korzystanie z serwisu. Plugin już jest napisany i możecie go pobrać tutaj.

Po instalacji i szybkiej konfiguracji (polegającej na wklejeniu kodu ikonki i zdecydowaniu czy ikonka ma się pojawiać na początku czy końcu wpisu) zapominamy o wszystkim innym. Od tej pory ikonka będzie się wyświetlać przy każdym wpisie i tylko wtedy, jeśli wyświetlamy pojedynczy wpis. Przykład macie na moim blogu, bo oczywiście wtyczkę już uruchomiłem (musicie wyświetlić wpis pojedynczy a nie główną stronę bloga by zobaczyć ikonę). 

Podoba się? To śmiało pobierać i klikać w Uznaj na moim blogu 😉

0

Trochę więcej bezpieczeństwa w WordPress

Każda co bardziej rozgarnięta osoba, wie, że pobieranie wtyczek i skórek do WordPressa z nieznanego źródła prędzej czy później skończy się zainfekowaniem naszej witryny kodem, który będzie nam w jakiś sposób szkodził. Najczęściej dodatek taki wstawi na naszą stronę spamerkie linki, w najciekawszych przypadkach ktoś zdalnie przejmie kontrolę nad naszym blogiem i będzie z nim robił, co chce.

Trafiłem właśnie na informację o dwóch ciekawych wtyczkach, które wyłapią na anszym blogu takie niebezpieczne dodatki. Jedna z nich to Theme Authenticity Checker, a druga to Exploit Scanner. Choć zapewne nie działają idealnie, ale można je traktować jak coś w rodzaju oprogramowania antywirusowe dla naszej witryny. 

Informajcę wrzucam także ku pamięci swojej. A skąd o tych wtyczkach wiem? A stąd. Polecam ten ciekawy artykuł o tym, dlaczego nie powinniśmy szukać w Google darmowych skórek do WordPressa (ale także i do innych systemów CMS)

0

Już można tworzyć polskie sklepy internetowe na bazie WordPressa!

Czyż to nie wspaniale? Aż się chce powiedzieć ‘wow’! 😉

Oczywiście przesadzam z tą radością, ale nowość jest. Do tej pory wszyscy miłośnicy WordPressa mieli tylko możliwość skorzystania z jednej z licznych wtyczek do robienia sklepów, ale jedynie z obsługą płatności PayPal lub też w ogóle bez płatności online. Na polskim rynku nie było nic, co by umożliwiało klientom zapłacić na przykład za pomocą mTransferu, czy automatycznej płatności z innych banków. Teraz się to zmieniło!

Jest już wtyczka, dzięki której można zrobić z WordPressa sklep internetowy z prawdziwego zdarzenia. Dodajemy ile chcemy produktów, definiujemy dla nich ile chcemy sposobów dostawy różniących się rodzajem i kosztem. Odwiedzający klika sobie po naszym WordPressie, przegląda produkty, które na nim umieściliśmy, wrzuca do koszyka i idzie płacić.

Wtedy łączy się z Dotpay.pl. Płaci i wraca na naszą blogo-stronę. A my wszystko to widzimy w panelu administracyjnym strony i co więcej dostajemy jeszcze email z informacją o nowym zakupie. Klient też dostaje email, że zostaliśmy poinformowani o zakupie i już bierzemy się do wysyłki. A to wszystko w dużej mierze konfigurowalne!

Dlaczego ja się tym tak zachwycam i stawiam tyle wykrzykników? Cóż, nie będę ukrywał. Taa dam! To ja jestem autorem tej wtyczki 😉

Tym razem nie jest to jakiś taki mini pluginek, a wtyka z prawdziwego zdarzenia. Szesnaście plików jak do tej pory, tysiące linii kodu, pięć czy sześć stron konfiguracyjnych. Kilka miesięcy pisania i testowania.

Pomyślałem, że to wszystko nie zasługuje na wrzucenie gdzieś jako podstrona na moim blogu. Pomyślałem, że taka wtyczka do sklepu internetowego zasługuje na swoją własną stronę internetową. Już nie trzymam dłużej w napięciu: ta strona to tradematik.pl.

A sama wtyczka nazywa się oczywiście TradeMatik 🙂

Na stronie możecie o niej poczytać więcej, możecie się o niej pouczyć albo nawet zajrzeć na forum wtyczki. I co więcej, a nawet przede wszystkim ją tam kupić. Kupić – uznałem bowiem, że wtyczka i tak da Wam miliony złotych zarobku, więc nie jest grzechem pobieranie za nią opłaty, o ileż to niższej niż owe miliony 😉

Ale wiecie co? Ja Was nawet lubię, więc przygotowałem dla Was sztuczkę: każdy, kto wejdzie na stronę wtyczki i dopisze po jej adresie /promo/muzungu będzie mógł kupić ją w promocyjnej cenie 🙂 Żeby nie było zbyt pięknie, promocja taka trwa do niedzieli do północy. Super, nie? 🙂

I tylko nie mówcie nikomu, bo wszystkie paczki wykupią! 😉0

WPzlecenia.pl idzie w komercję ;)

Pisałem już Wam o moim serwisie wpzlecenia.pl, w którym każdy będzie mógł dodać za darmo zlecenie związane z WordPressem i każdy za darmo takie zlecenie będzie mógł przeczytać? Serwis działa, moje podejście do darmowości w nim się nie zmienia, jednak chce spróbować zarobić w nim przynajmniej na utrzymanie i motywację do dalszego rozwoju 🙂

Przygotowałem ofertę reklamową na WPzlecenia. Każdy kto chce wesprzeć tę stronę, a przy okazji wypromować się nieco może kupić jedno z trzech miejsc reklamowych (jedno z nich już zostało sprzedane). Zapraszam 🙂0

O kurczaki, mój blog nie jest mój!

To będzie wpis o tym, że jak instalujesz mnóstwo pluginów i skórek do WordPressa, któregoś dnia może się okazać, że zostałeś zhakowany.

Niewiele osób wie jak wiele może zrobić twórca skórek czy pluginów do WordPressa (ale od razu mówię – ten tekst mógłby być o dowolnym systemie CMS), w tym także jak wiele złych rzeczy może zrobić.

Wyobraź sobie, że znajdujesz w sieci rewelacyjny plugin, który sprawi, że – wymyślam na poczekaniu – pod twoimi wpisami będą pojawiać się wpisy z nim powiązane. Instalujesz go i faktycznie – pod każdym wpisem pojawiają się odnośniki do innych wpisów z Twojego bloga. Plugin więc spełnia swoje działanie.

Tymczasem jednak twoja strona z dnia na dzień zostaje wyrzucona z indeksu Googla. Osoby, które zamieściły kiedykolwiek komentarz na Twoim blogu (a więc także podały swój adres email) codziennie z Twojej domeny dostają dziesiątki spamów. Któregoś dnia nie możesz zalogować się do panelu administracyjnego, a za kilka kolejnych dni znikają Twoje wszystkie wpisy, a zamiast nich blog jest pełen reklam viagry i podrabianych roleksów. Twój blog nie jest już twój.

Brzmi nieprawdopodobnie? Uwierzcie mi, że jest to jak najbardziej możliwe, a co więcej właściciel sam jest sobie winien doprowadzenia do takiej sytuacji. I to niezależnie od tego czy korzystamy z WordPressa, Joomli, Drupala czy czegokolwiek innego. Ja akurat piszę o WordPressie, bo nim się zajmuję.

Częścią z moich zadań jest właśnie ratowanie blogów z podobnych opresji jak te opisane wyżej. Widziałem już w kodach pluginów, skórek (skórka to tak naprawdę z grubsza także plugin) czy też innych dodatków wiele mniej lub bardziej zaevalowanych instrukcji, które mają za zadanie po cichu zrobić krzywdę właścicielowi strony (a właściwie raczej przynieść korzyść twórcy dodatku kosztem właściciela strony).

Dowolny plugin czy skórka poza robieniem tego, do czego zostały stworzone według opisu na stronie dodatku może w ukryciu robić dosłownie wszystko z Twoją stroną. Najczęściej ogranicza to się do z pozoru niewinnego dodawania odnośników pozycjonujących w stopce strony, jednak i takie działanie czasami może dla nas źle się skończyć – Google potrafi wyrzucić ze swojego indeksu takie strony, zwłaszcza jeśli inne odnośniki w  stopce są serwowane dla czytelników strony, a inne dla robota google. Czy tak się właśnie dzieje, przeciętny użytkownik wordpressa jednak wiedzieć nie może.

Na szczęście jest kilka mniej lub bardziej prostych sposobów aby ustrzec się przed zhakowaniem naszej strony w ten sposób. Oto one.

  • Nie instaluj wszystkiego co znajdziesz w sieci! Jeśli tak robisz, aż się prosisz o kłopoty. Ja jeśli znajduję jakiś nowy plugin najczęściej czytam jego kod aby zobaczyć co mniej więcej robi, potem instaluje na wordpressie testowym i dopiero wtedy – jeśli zdecyduje, że jego funkcjonalności są mi przydatne – ląduje on na muzungu.pl
  • Jeśli szukasz pluginów lub skórek, szukaj ich w pierwszej kolejności w repozytorium WordPressa. Teoretycznie zanim autor wtyczki/pluginu doda go do owego repozytorium, administrator serwera przegląda jego kod w poszukiwaniu niebezpiecznych jego fragmentów, a zatem jesteśmy nieco bezpieczniejsi. (Niestety nie jest to zabezpieczenie doskonałe, bo złośliwy kod i w takiej sytuacji da się przemycić)
  • Jeśli już musisz zainstalować coś spoza repozytorium, wybieraj skórki i pluginy bardziej popularne, których autor jawnie podpisuje się pod swoim dziełem. Taka osoba raczej nie odważy się na próbę wstrzyknięcia złośliwego kodu i utratę reputacji.
  • Przynajmniej pobieżnie obejrzyj kod wszystkich plików składających się na skórkę lub plugin. Otwórz je przed instalacją choćby zwykłym notatnikiem i wyszukaj frazy ‘eval’ i ‘base64_decode’. Jeśli je znajdziesz, zrezygnuj z instalacji (jednak ich obecność nie musi oczywiście od razu oznaczać złych intencji twórcy).

Nie byłbym sobą, jeśli nie pozwoliłbym bym sobie na małą reklamę 🙂 Jeśli nie jesteś pewien czy twoja skórka i zainstalowane już pluginy są bezpieczne, napisz do mnie a za opłatą zajmę się takim audytem. Jeśli nie chcesz mi tego zlecać, proponuję dodać takie ogłoszenie na WPzlecenia.pl – na pewno ktoś się tym zajmie.

W jednym z kolejnych wpisów opiszę w jaki sposób ratować wordpressa gdy został już zarażony. Nie  jest to zadanie proste, jednak wykonalne. Nie zapomnij dodać do swojego czytnika mojego kanału RSS aby nie przegapić tego zapowiadanego wpisu 🙂0

Przypadkiem uruchomiłem WPzlecenia.pl

Dwie rzeczy sprawiły, że wystartował w poniedziałek serwisik (a przyszłości – ogromny portal freelancerski) pod zdradzającym funkcję tytułem Wpzlecenia.pl.

Pierwsza rzecz to mój wpis sprzed tygodnia, w którym radziłem Wam, gdzie freelancer może szukać zleceń związanych z WordPressem. Zacząłem się po nim zastanawiać dlaczego nie ma jeszcze takiego serwisu jak Wpquestions.com, ale dla osób, które wolą wszystko robić w granicach Polski; przynajmniej w językowych granicach.

Druga rzecz to coponiedziałkowy natłok maili na skrzynce. Powoli wychodzę już z fazy freelancingu, w której freelancer rzuca się na każde zlecenie, robi ich 4-5 równocześnie i w efekcie zawala terminy i część zleceń – co tu ukrywać – jednak robi tak, że potem poprawki zajmują więcej czasu niż samo zlecenie. Dlatego postanowiłem sobie, że nie więcej niż jedno duże zlecenie na raz. Szkoda nerwów.

W poniedziałek więc odpisywałem ludziom, że jeśli chcą to i owszem, mogę się zająć ich zleceniem ale najwcześniej gdzieś w okolicach końca czerwca. Wtedy właśnie przyszła mi myśl: może czas na polski serwis wp-lancerski? (właśnie wymyśliłem to słówko, fajne, nie?)

I tak oto po kilku godzinach (najwięcej zajęło dodanie formularza dodawania zleceń) działa: wpzlecenia.pl. Zapraszam, oczywiście całość za darmo i nie planuję zarabiać na tym póki co. Jest już nawet pierwsze zlecenie (prawdę mówiąc myślałem, że z 2 tygodnie będzie tam pusto), ale z tego co wiem, wykonawca już się znalazł po kilku godzinach.

Aha, mam do Was prośbę. Czy możecie mi pomóc w wypromowaniu tego serwisu? Jak wspomniałem całość działa za free dla użytkowników, więc fajnie by było jakby ktoś to docenił. Jak możecie pomóc?

Jeśli masz stronę wu wu wu: wklej proszę gdzieś ten krótki kod html:

<a href=”http://wpzlecenia.pl” title=”Wordpress zlecenia”>WPzlecenia.pl – płatne wsparcie dla WordPress</a>

Jeśli macie jakiegoś bloga, szczególnie na WordPressie, może choć krótko wspomnicie, że jest taka strona jak Wpzlecenia.pl? Nie zapomnijcie w tekst wpleść takich zwrotów “jak rewolucja w polskim internecie”, “najlepszy startup 2010 roku”, “miażdżący pomysł” itp itd 😉 A tak poważnie, napiszcie cokolwiek.

Jeśli macie konto na facebooku, można zostać lubisiem tej strony. Tutaj.

I przede wszystkim: dodawajcie tam zlecenia lub zaglądajcie sprawdzając czy są nowe 🙂0

Gdzie freelancer może znaleźć zlecenia związane z WordPressem?

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?)

Jobs.Wordpress.net

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ą.

WP Questions

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!0

Zrób sobie własny cache w WordPressie

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. 0

Umarł WordPress, narodził się Drupal?

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).0

Zaawansowana zabawa z szablonami podstron w WordPressie

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 🙂0

WWF używa WordPressa, musicie mi wierzyć na słowo

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.

Blog wolontariuszy WWF, tak wyglądał projekt graficzny

Blog wolontariuszy WWF, tak wyglądał projekt graficzny

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ń. 🙂0

Plugin do WordPressa – dodawanie pustych linii do wpisów

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.0

Tworzenie pluginów do WordPressa – cz. 3 – zabawa z pseudo-cronem i grzebanie w krwistych bebechach

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 🙂0

GoldenLine wpływa na moje życie

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 🙂0

To był mały plugin dla mnie…

…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 😉0

Wyglądam inaczej

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 poprawie0

Tworzenie pluginów do WordPressa – cz. 2 – instalator, bazy danych i Custom Fields

To jest druga część mojego nibykursu tworzenia pluginów do WordPressa. Część poprzednia znajduje się tutaj.

W ostatnim tygodniu zrobiłem chyba z cztery pluginy, nie wszystkie opublikowałem, ale jak obiecałem, drugą część kursu oprę na moim małym pluginie do dodawania filmów z YouTube do naszych wpisów. Nawiasem mówić zdziwiłem się, że jest tak popularny. Bo jakby nie było podobnych pluginów jest całkiem sporo. Ale nic, sukces mnie cieszy (prawie 700 pobrań w niecały tydzień) i właśnie wczoraj opublikowałem jego drugą wersję.

* * *

Wtrącenie reklamowe: być może na ten wpis trafią osoby, które potrzebują jakiegoś plugina, chcą go zrobić, ale się poddadzą, bo uznają, że jest to dla nich za trudne. W takim wypadku uprzejmie zawiadamiam, że za opłatą chętnie zrobię taki plugin 😉 Jak się ze mną można skontaktować opisane jest tutaj.

* * *

No to lecimy. Najpierw założęnia:

  • Plugin ma umożliwiać dodanie filmu z YT do wpisu. W tym celu osoba pisząca wpis będzie musiała dodać pod wpisem Custem Field (Pole Własne) o nazwie video i w pole wartości mające wpisane odnośnik do filmu na YouTube
  • Plugin ma wyświetlać pod wpisem film, jeśli w pole Custom Field wpisane są powyższe wartości.
  • Plugin ma umożliwiać wyświetlenie w dowolnym miejscu ostatnio dodany film. Ma też umożliwiać wyświetlenie ostatnio dodany film konkretnego użytkownika WordPressa. W tym celu stworzymy odpowiednią funkcję ( u mnie będzie się nazywać show_LastYT() ) która jako parametr może przyjąć ID użytkownika, którego film chcemy zobaczyć.
  • Plugin ma do wpisów zawierających film dodawać automatycznie tag video.

I tyle. Informację o filmie będziemy trzymać w polu Custom Field. Dzięki temu silnik WordPressa w odpowiednim momencie sam włoży i sam wyjmie z bazy danych potrzebne nam informacje.

Natomiast aby przyspieszyć działanie, sami stworzymy tabelę w bazie MySQL przechowującą informację o ostatnim filmie. Można to oczywiście zrobić inaczej: wystarczy tak stworzyć funkcje show_LastYT(), że przy jej wywołaniu będzie przeglądać wszystkie wpisy, szukać tych zawierających odpowiednie Custom Field, sortować by najnowsze były na górze, wybierać ID usera… Uh, będzie to pewnie trwało długo, jeśli wpisów będziemy mieli setki lub tysiące. Lepiej jednak faktycznie stwórzmy osobną tabelę zawierającą tylko dwie kolumny: ID pozycji w tabeli (po tym będziemy sortować) i ciąg składający się z ID usera, który dodał film do bazy, dwukropka (jako rozdzielnika) i kodu filmu po nim. (przykładowo: 6:vxsz0fgds).

Co musimy umieścić w naszym pluginie?

  • Nagłówek opisujący plugin – nie będę tego już opisywał, bo opisałem w poprzedniej części.
  • Funkcję instalującą plugin (i odpowiedni do niej hook), która zostanie wywołana tylko raz, jak plugin będzie instalowany i stworzy odpowiednią tabelę w bazie danych.
  • Funkcję dodającą pozycję do bazy danych i tag video do wpisu, w momencie gdy user publikuje lub aktualizuje wpis zawierający odnośnik do filmu (tu zatem też będzie potrzebny odpowiedni hook)
  • Wreszcie funkcję wyświetlającą film na końcu wpisu, jeśli film jest w Custom Field (i znowu będzie potrzebny odpowiedni hook).
  • Na końcu funkcję show_LastYT() bez hooka wyświetlającą kod ostatnio dodanego filmu. Hook nie jest potrzebny bo to autor bloga sam w skórce graficznej zdecyduje gdzie ta funkcja ma być wywołana (np w sidebarze).

Kod będzie wyglądał następująco (pomijając nagłówek).

Funkcja instalująca:

function yt_install () {
	global $wpdb;
	$prefix = $wpdb->prefix;
	$yt_tablename = $prefix."yt_videos";
	
	$yt_db_version = "1.0";
	
	if ($wpdb->get_var("SHOW TABLES LIKE '".$yt_tablename."'") != $yt_tablename) {
		$zapytanie = "CREATE TABLE ".$yt_tablename." (
		id mediumint(9) NOT NULL AUTO_INCREMENT,
		video_id varchar(120) NOT NULL,
		PRIMARY KEY  (id)
		);";
		
		$wpdb->query($zapytanie);
		
		add_option("yt_db_version", $yt_db_version);
		
		}
	}

Co się stało się? Najpierw globalizujemy zmienną klasową $wpdb. Klasa ta dostarcza bardzo wiele funkcji służących do obsługi bazy danych.

W kolejnej linijce widzimy sposób jej wykorzystania: $wpdb->prefix pobiera przedrostek jakim są poprzedzone nazwy tabel w bazie danych. Domyślnie przedrostek ten to “wp_”, ale każdy może sobie go przecież zmienić (ja na przykład tak robię, dzięki czemu w jednej bazie danych mogę trzymać kilka instalacji WordPressa), więc odwołujmy się do niego właśnie w ten sposób jak powyżej.

Następnie tworzymy nazwę naszej tabeli, w której będziemy trzymać informacje o ostatnio dodanym filmie. Nazwa ta to ma być przedrostek_yt_videos zatem tworzymy ją jako $prefix.”yt_videos”.

Dalej definiujemy numer wersji naszej tabeli. Nie jest to konieczne, ale wyobraź sobie sytuację, gdy w przyszłych wersjach pluginu będziesz chciał przekonstruować tabelę, by zawierała więcej informacji (np nowe kolumny). Dlatego warto teraz podać informację, że obecna tabela została przez Ciebie oznaczona jako wersja 1.0, a jeśli w przyszłości będziesz zmieniać strukturę tej tabeli, nadamy jej kolejny numer i odpowiednio to obsłużymy (na razie nie będę pisał jak to się robi).

Okej, teraz przyszła kolej na dodanie tabeli do bazy danych. Ale uwaga, najpierw musimy sprawdzić czy tabela już nie istnieje. Bo co jeśli ktoś poużywa naszego pluginu, odinstaluje go i zainstaluje jeszcze raz? Ponowne tworzenie tabeli o tej samej nazwie na pewno nie skończy się niczym dobrym.

Dlatego tworzenie tabeli zaczynamy od sprawdzenia (warunek if) czy nie ma już takiej tabeli. W tym celu wykorzystujemy kolejną metodę $wpdb->get_var(). get_var() pobiera z bazy jedną konkretną wartość i jako parametr przyjmuj zapytanie. Pytamy więc bazę czy potrafi nam pokazać tabelę, której nazwa jest taka sama jak nasza tabela, którą chcemy utworzyć. Jeśli jest już, get_var() zwróci nam w tym przypadku nazwę naszej tabeli, jeśli nie ma, zwróci pusty string (albo NULL, dokładnie nie wiem). Porównujemy zwróconą wartość ze zdefiniowaną nazwą tabeli i jeśli są różne, możemy dodać naszą tabelę bez obaw.

Konstruujemy więc zapytanie (jako $zapytanie) i w metodzie $wpdb->query() przekazujemy je do bazy danych. Zapytanie utworzy nam tabelę.

Nie zapomnijmy też przy instalacji pluginu poinformować WordPressa co mamy w zmiennej $yt_db_version. W tym celu korzystamy z mechanizmu opcji, konkretnie z funkcji dodającej opcję do bazy danych add_option(), która jako pierwszy parametr przyjmuje nazwę opcji pod jaką nasza dodana wartość ma się znaleźć w mechanizmie WordPressa, a jako drugi ową wartość. Krócej można więc to było zapisać add_option(“yt_db_version”, “1.0”).

Funkcja jest już gotowa. Musimy teraz nauczyć WordPressa kiedy jej ma używać. Użyć ma jej tylko raz, tylko przy instalacji pluginu. W tym celu wpisujemy hooka:

register_activation_hook(__FILE__, 'yt_install');

Na ludzki język hak ten mówi: “zarejestruj hak aktywacyjny, który przy instalacji pliku z tym pluginem (__FILE__) wywoła funkcję “yt_install”. Zwróć uwagę na podwójne znaki podkreślenia przed i po FILE.

OK, tabelę w bazie mamy już stworzoną, możemy więc zająć się napisaniem funkcji dodającej odpowiedni wpis do bazy, gdy ktoś zamieści nowy wpis z Custom Field. Funkcję taką nazwijmy yt_database() i będzie ona wyglądała tak:

function yt_database ($post_id) {
	global $post;
	$czy_maVideo = get_post_meta($post_id, "video", true);
	
	if ($czy_maVideo != "") {
		global $wpdb;
		$prefix = $wpdb->prefix;
		$yt_tablename = $prefix."yt_videos";
		
		/* $url = explode("?", $czy_maVideo);
		$url = $url[1];
		$url = explode("&", $url);
		$url = $url[0];
		$url = explode("=", $url);
		$video_id = $url[1]; */
		
		$url = parse_url($czy_maVideo, PHP_URL_QUERY);
		$url = explode("&", $url);
		foreach ($url as $parka) {
			if (substr($parka, 0, 2) == "v=") {
				$konkretnaParka = explode("=", $parka);
				$video_id = $konkretnaParka[1];
				break;
				}
			}
		
		
		$poscik = get_post($post_id);
		
		$ktododal = $poscik->post_author;
		
		$wstawka = $ktododal.":".$video_id;
		
		$zapisz_video = "INSERT INTO ".$yt_tablename." (video_id) VALUES ('".$wstawka."');";
		
		$rezultat = $wpdb->query($zapisz_video);
		
		wp_add_post_tags($post_id, 'video');
		
		}
	
	}

Całkiem długa, więc zobaczmy co takiego robi. Jak widać funkcja pobiera argument, którym jest ID wpisu, na którym ma być wykonana. Zglobalizujmy więc najpierw zmienną $post, którą poznaliśmy już w poprzedniej części kursu, by móc do niej się odnieść.

W następnej linijce sprawdzamy czy wpis, który jest właśnie publikowany zawiera pole Custom Field o wartości “video”. Odpowiada za to funkcja $get_post_meta(), która jako pierwszy argument pobiera ID wpisu, który ma sprawdzić, w drugim argumencie wpisujemy jak ma się nazywać pole Custom Field, którego szukamy i trzeci argument ustawiamy na TRUE jeśli chcemy aby funkcja zwróciła nam zawartość tego pola Custom Field. Może i skomplikowane, ale teraz mamy już w zmiennej $czy_maVideo zapamiętany URL do YouTube jaki autor wpisu wpisał w pole Custom Field. Zaraz będziemy go obrabiać.

O właśnie teraz. Sprawdźmy czy zmienna z URLem nie jest przypadkiem pusta i jeśli nie jest wyciągnijmy z niej identyfikator filmu w serwisie youtube. Pierwsze trzy linijki if-a już znamy – ponownie dobieramy się do $wpdb i ustawiamy nazwę tabeli, bo przecież w naszej tabeli będziemy chcieli zapisać wartość “id_usera:_id_filmu”.

Następnie musimy wyciągnąć z wpisanego URL-a fragment zawierający identyfikator filmu. Przypominam, że cały url do filmu w YT wygląda mniej więcej tak:

http://www.youtube.com/?v=id_filmu&kolejny=parametr&…

Czyli musimy wygrzebać co jest po “v=”

Specjalnie w kodzie zostawiłem zakomentowaną sekcję. Zawiera ona fragment kodu, którym wyciągałem id filmu na początku. Działało, pod warunkiem, że parametr v pojawiał się jako pierwszy parametr w URLu. Tak jest chyba zawsze, no ale właśnie: “chyba”. Jakby ktoś wkleił jakiś przekonstruowany URL, mogłoby to nie zadziałać.

Zatem napisałem całość od nowa, oparte o funkcje parse_url i dwie eksplozje. Mam nadzieję, że jest to dla Was zrozumiałe, bo to zwykły kod produkujący zmienną $video_id korzystając z podstawowych funkcji języka PHP. A zakładam, że kurs czytają osoby, które przynajmniej podstawy PHP znają 🙂

OK, mamy już identyfikator filmu, potrzeba nam jeszcze ID autora, który właśnie dodał ten film. W tym celu pobieramy zaczep do postu, który właśnie obrabiamy (funkcja get_post() przyjmująca jako parametr id owego postu). Mając już utworzony obiekt postu możemy dobrać się do jego zawartości. Zawiera on między innymi ID autora zapisany pod zmienną $post_author.

No i wyciągania danych już koniec. Mamy id filmu i mamy id autora wpisu. Sklejamy to w zmiennej $wstawka i następnie wstawiamy do naszej tabeli. Tu oczywiście korzystamy z $wpdb i jego poznanej już metody query().

Ostatnia linijka to automatyczne dodawanie tagu “video” do wpisu. Odpowiada za to kolejna wordpressowa funkcja wp_add_post_tags() pobierająca jako argumenty id postu, do którego ma dokleić tag oraz tagi (można wpisać kilka rozdzielonych przecinkami) jakie mają do posta zostać dodane. Warto tu nadmienić, że jak większość funkcji wordpressa i ta jest w miarę inteligentna: jeśli wpis już zawiera dany tag, funkcja go nie doda ponownie.

Koniec funkcji. Teraz musimy powiedzieć wordpressowi kiedy funkcja ma zostać wykonana. Oczywiście funkcja musi zostać wykonana gdy WordPress będzie wykonywał akcję polegającą na publikacji nowo utworzonego wpisu. Odpowiada za to hook add_action o następującej treści:

add_action('publish_post', 'yt_database');

Mówi on: WordPressie – gdy wykonujesz akcję polegającą na publikacji wpisu, wykonaj funkcję yt_database(). Warto tu nadmienić, że akcja “publish_post” oznacza nie tylko publikację posta, ale także jego aktualizację.

(Tu od razu wychodzi niedociągnięcie mojego pluginu, polegające na tym, że jak ktoś zaktualizuje wpis, to plugin ponownie zapisze w bazie danych id_usera:id_filmu. Ale uznałem, że skoro to wersja 0.2, poprawię to w przyszłości dodając funkcje sprawdzające czy już dany wpis w bazie nie istnieje)

OK, co nam jeszcze zostało? Dwie rzeczy: wyświetlanie filmu we wpisie (do tej pory nie poinformowaliśmy wordpressa, że ma to robić, a sam z siebie nie jest na tyle inteligentny by wiedzieć, że jak post ma Custom Field wpisany url do YT to na pewno ten film trzeba wyświetlić) oraz wyświetlanie ostatnio dodanego filmu.

Niepotrzebnie rozbiłem to na dwie funkcje, ale skoro już tak jest, to na razie o zostawmy. Lecimy z pierwszą funkcją, czyli doklejaniem filmu na końcu wpisu.

function add_ytVideo ($content) {
	global $post;
	$czy_maVideo = get_post_meta($post->ID, "video", true);
	
	if ($czy_maVideo != "") {
		
		/* $url = explode("?", $czy_maVideo);
		$url = $url[1];
		$url = explode("&", $url);
		$url = $url[0];
		$url = explode("=", $url);
		$video_id = $url[1]; */
		
		$url = parse_url($czy_maVideo, PHP_URL_QUERY);
		$url = explode("&", $url);
		foreach ($url as $parka) {
			if (substr($parka, 0, 2) == "v=") {
				$konkretnaParka = explode("=", $parka);
				$video_id = $konkretnaParka[1];
				break;
				}
			}

	
			return $content.'
			<object width="425" height="344">
			 <param name="movie" 
			  value="http://www.youtube.com/v/'.$video_id.'&hl=pl&fs=1&">
			 </param>
			 <param name="allowFullScreen" 
			  value="true"></param>
			 <param name="allowscriptaccess" value="always"></param>
			 <embed 
			  src="http://www.youtube.com/v/'.$video_id.'&hl=pl&fs=1&" 
			  type="application/x-shockwave-flash" 
			  allowscriptaccess="always" allowfullscreen="true" 
			  width="425" height="344"></embed>
			</object>';
		
		}
	
	
	else return $content;
	
	}

Funkcja ta jest bardzo podobna do poprzedniej. Szczerze, to aż za podobna. Różni się tylko tym, że jako parametr pobiera $content w którym będzie przekazana standardowa zawartość wpisu, a na końcu zwróci albo samą zawartość wpisu (jeśli wpis nie zawiera odpowiedniego Custom Field) albo zawartość wpisu z doklejonym kodem youtubowej flashki, wcześniej w odpowiednie miejsca podstawiając $video_id filmu.

Jak widać reszta jest bardzo podobna, a nawet – jak się spojrzy na powtórne parsowanie URLa – od razu przychodzi na myśl, że nigdy nie słyszałem o osuszaniu kodu 😉 Oj słyszalem, tyle, że jestem bardziej guerilla developerem niż kimś poukładanym 🙂 Najpierw tworzę kod, a potem biorę się za jego optymalizację i czyszczenie.

OK, dość tego filozofowania. Powiedzmy wordpressowi by naszą funkcję wykonał w momencie wyświetlania wpisu. Za to odpowiada znany już nam z poprzedniej części hook polegający na przefiltrowaniu wypluwanej zawartości wpisu:

add_filter('the_content', 'add_ytVideo');

No i końcówka: tworzymy funkcję show_LastYT() pokazującą ostatni film dodany do bazy.

function show_LastYT ($user='')  {
	
	// shows last YT video added to post
	global $wpdb;
	$prefix = $wpdb->prefix;
	$yt_tablename = $prefix."yt_videos";
	
	if ($user == '') {
	
	$zapytanie = "SELECT video_id FROM  ".$yt_tablename." ORDER BY id DESC LIMIT 0, 1;";
	
	$wynik = $wpdb->get_var($zapytanie);
	
	if ($wynik != "") {
		
	$wynik = explode(":", $wynik);
	
	$wynik = $wynik[1];
	
	}
	}
	
	else {
		$zapytanie = "SELECT video_id FROM  ".$yt_tablename." ORDER BY id DESC;";
		$wyniki = $wpdb->get_results($zapytanie, ARRAY_A);
		
		foreach ($wyniki as $wynik) {
			$wynik = explode(":", $wynik['video_id']);
			$czyTenUser = $wynik[0];
			$wynik = $wynik[1];
			if ($czyTenUser == $user) {
				break;
				}
			}
		
		}
	
	
	
	echo '
	<object width="378" height="305">
	 <param name="movie" value="http://www.youtube.com/v/'.$wynik.'&hl=pl&fs=1&">
	 </param>
	 <param name="allowFullScreen" value="true">
	 </param>
	 <param name="allowscriptaccess" value="always">
	 </param>
	 <embed src="http://www.youtube.com/v/'.$wynik.'&hl=pl&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="378" height="305">
	 </embed>
	</object>
	';
	
		}

Funkcji tej nie będę tłumaczył, bo nie zawiera nic nowego odnośnie API wordpressa. W skrócie: pobiera parametr w postaci ID usera, którego chcemy przeszukać (domyślnie szuka we wszystkich filmach) i wypluwa kod odpowiedzialny za wyświetlenie flashki ze znalezionym ostatnim filmem.

Funkcji nie hookujemy, bo to autor bloga ma sam zdecydować gdzie chce aby była wykonana. Np jeśli chce aby filmik pokazywał się w sidebarze, musi w temacie graficznym w pliku sidebar.php wpisać:

<?php show_LastYT(); ?>

Ewentualnie podając jako parametr ID usera, którego chce wyświetlić.

No i tyle. Plugin już powinien działać. A jeśli ktoś nie wierzy, zapraszam do pobierania 🙂

Ciąg dalszy

Zobacz trzecią część kursu0

Kolejny mój plugin: Upgrade Notification by Email

Spłodziłem kolejny mały (płodzenie zajęło mniej niż godzinę) plugin do WordPressa. Właściwie napisałem go dla siebie, ale podejrzewam, że wielu z Was się przyda.

Plugin po zainstalowaniu raz na dobę będzie sprawdzał czy jest na stronie WordPressa nowsza wersja tego oprogramowania niż mamy zainstalowana i jeśli tak, wyśle nam maila z informacją o tym.

Banał, wiem. Wiem też, że takie info mamy przecież w panelu admina. Dlatego plugin nie jest dla wszystkich. Jest dla tych, którzy albo nie logują się do swojego panelu zbyt często, albo mają dużą ilość instalacji WordPressa pod kontrolą.

Strona pluginu jest tutaj. Po angielsku (a może angielskawu, jeśli ktoś widzi tam błędy językowe, proszę o cynk) bo mam zamiar wypłynąć tym pluginem na wody międzynarodowe. Niedługo plug będzie dostępny prez stronę WordPressa (fiu, fiu).

Aha, ten plugin jest za darmo. Jest lekki (wywoływany jest raz na dobę i nie przetwarza zbyt wiele danych), więc można śmiało instalować. Chciałoby się powiedzieć: będzie to jeden z najpopularniejszych pluginów wśród osób intensywnie wykorzystujących oprogramowanie WordPressa 😉

Update: plugin jest już w repozytoriach WordPressa 🙂

http://wordpress.org/extend/plugins/upgrade-notification-by-email/0

WP Sprzedawca 0.3 – ostatnia wersja rozwojowa – wprowadza dostęp do wpisów za opłatą

Wersja 0.3 wydana i jest to zarazem ostatnia wersja przed wydaniem 1.0.

Od tej pory do wersji 1.0 będę tylko wprowadzał zmiany kosmetyczne (przeniesienie konfiguracji z edytowania pliku do menu admina, inne poprawki). Niemal na pewno nie będę wprowadzał nowych funkcjonalności; te pojawią się jako przygotowanie do wersji 2.0.

Plugin jest darmowy dla osób, które pobrały wersję 0.2. Te osoby proszę o kontakt na priv podając nr telefonu (jeśli pobierały smsem) lub adres email jaki wpisały (jeśli pobierały płacąc przelewem). Osoby, które pobrały smsem proszę o podanie też emaila na który wyślę paczkę z pluginem 🙂

Pozostałe osoby – te które mają jeszcze wersję 0.1 lub nie mają żadnej – muszą przygotować się na potężny wydatek kilku złotych! 😉

Uwaga: osoby, które kupią wersję 0.3 kolejne aktualizacje aż do 1.0 będą otrzymywać za darmo.

CO NOWEGO?

* Dodano możliwość ukrycia treści wpisów tak aby były dostępne za opłatą. Bez wprowadzenia opłaty wyświetla się tylko tytuł wpisu, elementy opisowe (tagi, nazwa kategorii, data publikacji itp), komentarze pod nim oraz zdefiniowana przez autora ilość akapitów (domyślnie = 0).
* Możliwość konfiguracji przez ile dni (liczone w sekundach) po wykupieniu płatnego dostępu wpisy będą widoczne czytelnikowi.
* Rozpoczęto przenoszenie konfiguracji z edytowania pliku .php do panelu administracyjnego. Obecnie w panelu w sekcji WP Sprzedawca > Ustawienia Dotpay należy podać swój nr ID w serwisie Dotpay

Plugin WP Sprzedawca 0.3 możesz pobrać stąd.0