Kategoria: Muzungu robi pluginy do WP

ChatGPT obsłużył mi “klienta” i klient jest zadowolony. A wszystko to, gdy spałem :)

Zupełnie przypadkiem mam o jedną robotę mniej.

Znalazłem jakiś ChatBot bazujący na ChatGPT, którego zadaniem jest pomaganie na Githubie przy PR: tworzysz pull request z proponowaną zmianą kodu, a chatbot podpowiada czy wszystko jest ok, co trzeba zmienić itp. Normalny code review.

Jako, że tworzę swoją wtyczkę WC Price History zupełnie sam pomyślałem, że przyda mi się taki mechaniczny pomocnik, więc zainstalowałem Chatbota w repozytorium tej wtyczki.

Nie byłem jednak świadomy, że chatbot odpowiada też w issues – ticketach jakie tworzę tam zanim zajmę się kodowaniem rozwiązania. Takie tickety tworzą też użytkownicy mojej wtyczki i dziś w nocy ktoś utworzył właśnie ticket z pytaniem jak rozwiązać pewien problem.

W tej samej minucie chatbot odpowiedział mu z proponowanym rozwiązaniem. Użytkownik nie zorientował się, że to nie ja mu odpowiadam, a maszyna, podziękował za szybką reakcję, potwierdził, że proponowane rozwiązanie jest sensowne i od razu zamknął zgłoszenie 🙂

Korzystam z ChatGPT od grudnia, ale mimo wszystko zrobiło to na mnie duże wrażenie 🙂

2

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

Corry Miller testuje Editor Box

Corry Miller z PostStatus.com testuje moją wtyczkę Editor Box.

Linkuję bo czemu nie: z Editor Box napisanie takie wpisu jak właśnie piszę jest super łatwe (a taki był plan bym dzięki temu częściej blogował).

I linkuję na wypadek gdybym kiedyś zbierał testimonials. Jego komentarz chyba nadawałby się idealnie 😉2

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

W pracy przy komputerze przeszedłem już 97 kilometrów

Dziś jest globalna akcja #WorkFromHomeDay gdzie podobno wszyscy pracujący z domu wrzucają na Instagrama swoje zdjęcie jak pracują. Nie mam instagrama, a ponadto chce wam opisać przy tej okazji coś innego.

Z domu – albo inaczej: nie z biura – pracuję już… od kiedy wróciłem z Rwandy, czyli będzie już ponad 10 lat. Przez ten czas wyprowadziłem się z pracą z faktycznego domu, gdy urodziły się dzieci, wynajmowałem lokal w którym wcześniej był fryzjer (co chwila ktoś wchodził z przyzwyczajenia by się ostrzyc i dziwił się widokiem, przepraszał i wychodził), potem bardziej formalne biuro, a jeszcze potem wróciłem do domu, ale domu rodziców.

Dodatkowo przez ten czas, siedząc 10 lat dzień w dzień 8 godzin przed laptopem, dorobiłem się potężnego bólu pleców.

Dodatkowo w ciągu ostatnich kilku miesięcy widziałem kilka razy informację, że podobno siedzący tryb życia jest bardziej niezdrowy niż palenie papierosów. A patrząc na siebie po tych dziesięciu latach, mogę to tylko potwierdzić.

Co więc robić? Już rok temu kupiłem biurko podnoszone do pozycji stojącej, ale nie sprawdza się. Chyba nie lubię stać więc i tak większość czasu po prostu siedzę przy nim i cierpię.

Od lat za to wiem, że na przykład Linus Torvalds (twórca Linuksa) w swoim domu ma “biurko do chodzenia”. Oto jak to wygląda:

https://www.youtube.com/watch?v=LE0JtUeyVJA&t=22s

Na jednym z naszych ostatnich WordUpów Sebastian opowiadał jak to fajnie jest pracować chodząc. Chodząc przyspieszamy krążenie krwii, mózg jest lepiej dotleniony i pracuje się nam efektywniej.

Też tak pewnie macie, że czasem w czasie spaceru wpadacie na genialne rozwiązanie problemu, co nie? Ja sam już tak robię od lat, że jak utknę z kodowaniem na jakimś problemie, biorę psa i idę na spacer. Albo do sklepu. Zawsze wtedy wpadam na rozwiązanie i aż się dziwie jakie ono jest proste.

Postanowiłem więc, że też będę miał takie biurko do chodzenia.

Współpracownicy podpowiedzieli mi jednak bym się wstrzymał. Co jeśli podobnie jak biurko do stania, okaże się, że to nie dla mnie? Będę miał wielki grat zawalający pół pokoju.

Nie głupie przemyślenie. Do tego takie biurko kosztuje od 700 złotych (sama bieżnia wkładana pod biurko napędzana jedynie mechanicznie siłą naszych mięśni) po 700 dolarów (bieżnia elektryczna) czy nawet jeszcze drożej.

Więc trzeba było się przejść na siłownię. Problemem jest jednak to, że żadna siłownia nie ma bieżni z blatem, na którym można by postawić laptop. Wszystkie mają te mniej lub bardziej ustawne panele z przyciskami.

Trzeba się było więc przygotować. Kojarzycie z podstawówki takie woreczki z grochem do ćwiczeń? No więc ja uszyłem taki, tylko wymiarów ryzy papieru (4,5 kg grochou!), od góry z kupionej w sklepie budowlanym wycieraczki domowej nakleiłem butaprenem gumowe łaty by laptop się nie zsuwał. Worek taki idealnie się dopasowuje do nierówności blatu bieżni, na górę stawiam laptop i chodząc pracuję. Tak to wygląda:

Pracuję tak już od końca lutego i przeszedłem w ten sposób już 97 kilometrów. Wiem to, bo bardzo dokładnie sobie notuję dzień po dniu ile przeszedłem, z jaką prędkością.

Nawet żeby się zmobilizować do chodzenia, rysuję sobie trasę na mapce gdzie hipotetycznie bym doszedł (idę w kierunku pewnego celu, o którym może wspomnę przy okazji innego wpisu)

Jestem już na Białorusi

Nie chodzę tak codziennie ale staram się by to były co najmniej trzy dni w tygodniu. I nie chodzę tak cały dzień: rano zaczynam pracę normalnie przy biurku, potem lecę na siłownię, po 2-3 godzinach bateria spada do prawie do zera więc wracam do pracy za biurko. Ale to i tak jest lepiej niż cały dzień za biurkiem.

Plecy czują się już lepiej. Właśnie potwierdzam ten efekt w drugą stronę: od tygodnia jestem przeziębiony więc nie chodzę na bieżnię i ból pleców wraca. Więc faktycznie to przez bieżnię/ruszenie się zza biurka choć na trochę.

Jak się pracuje? O wiele lepiej niż siedząco. Raz, że jak wspomniałem wyżej, gdy się ruszamy na mózg pracuje inaczej, więc i nasza praca biegnie dynamiczniej. Dwa, że będąc wśród ludzi na siłowni trudniej jest mi sie obijać. Nie wchodzę więc wtedy na żadne strony rozpraszające uwagę i odrywające od pracy tylko koduję, odpowiadam na maile i robię wszystko to, za co mi płacą. Tak, na bieżni jestem bardziej wydajny niż w domu.

Czy ludzie się śmieją? To kolejne pytanie, które słyszę jak komuś mówię jak pracuję. Przede wszystkim założyłem sobie, że mam to gdzieś co ludzie powiedzą. Jednak odpowiadając na pytanie: nie. Idę sobie na bieżni z laptopem, a obok mnie idzie kilka osób, z których część idąc gapi się w ekrany swoich smartfonów. Widzę, że czasem zerkają na mnie, szczególnie jak układam się tym grochowym workiem i potem laptopem na nim, ale jest luzik. Nie wiem co o mnie myślą, bo ani mi tego nie mówią, ani ich nie pytam 🙂 Myślę, że prawdziwy WTF to by był jakby ktoś na taką bieżnie wbił ze swoim pecetem, monitorem, klawiaturą… 😉

Czy sobie kupię bieżnię do domu? Nie. Odkryłem, że na siłowni mam ten dodatkowy mobilizator do pracy – mniej chętnie wchodzę na portale ze śmiesznymi obrazkami i lubię tę wartość dodaną. Więc zostaję na siłowni.

9

Pisz Tu – moja nowa wtyczka do publikowania wpisów za opłatą

Branża SEO co chwila dopytywała się jak uruchomić katalog artykułów precell i pobierać opłatę za umieszczenie w nim takiego wpisu. Kolejna grupa wordpressowiczów co jakiś czas pytała o wtyczkę, dzięki której będą mogli zrobić na przykład serwis ogłoszeniowy, gdzie publikacja ogłoszenia jest płatna. No więc wtyczkę taką zrobiłem. Oto:

Pisz Tu (pisztu.com)

Wtyczka robi, to co w temacie: osoba odwiedzająca może dodać wpis, ale tylko jeśli za to zapłaci. Autor strony zarabia na każdym wpisie, może też zarabiać na każdym URLu w treści wpisu i na przypisaniu wpisu do więcej niż jednej kategorii.

pisz tu - publikowanie wpisów za opłatąWtyczkę już podczas tworzenia przedyskutowałem z “grupą docelową”, dzięki czemu jest w niej kilka dodatkowych pomysłów już na starcie. Właściciel witryny sam decyduje co się dzieje po opłaceniu: wpis ma się pojawić od razu, czy jeszcze czekać na moderację. Można ustalić, by po x dniach wpis znikał. Można sprawić by autor wpisu na x dni przed takim zniknięciem dostał maila z propozycją przedłużenia. Wpis można publikować w WordPressie nie tylko jako ‘wpis’, ale na przykład stronę czy jakikolwiek inny samemu dodany własny typ wpisu (custom post type). Można dodać regulamin i wtedy przed publikacją wymagana jest jego akceptacja.

Słowem wypas. Wtyczka jest płatna, ale biorąc pod uwagę fakt, że służy zarabianiu na pewno szybko się zwróci.

P.s. Moja ważniejsza wtyczka, czyli TradeMatik doczekał się kilka dni temu aktualizacji do wersji 1.3.

0

+1 od Googla już dostępne także na stronach

Nie jest to na pewno żadne zaskoczenie, a naturalny ruch. +1 od Google (usługa działająca niemal tak samo jak “like” od Facebooka) po pojawieniu się przy wynikach wyszukiwania, pojawiła się teraz także w postaci przycisku na stronach www. Każdy może sobie dodać do swojego bloga czy witryny. Wystarczy skopiować kod z tej strony.

Czy warto? Myślę, że tak. Jeśli komuś zależy na lepszej pozycji w wynikach wyszukiwania Google, +1 jest dla niego. Zasada bowiem jest taka, że osoby wyszukujące treści przez Google, jako pierwsze wyniki będą widzieć te, które zostaną “zaplusowane” (rekomendowane) przez jego znajomych. Z przyciskiem na stronie szansa na taką rekomendację jest bezsprzecznie większa.

Na wordpress.org nie ma jeszcze wtyczki dodającej taki przycisk do naszych WordPressów, ale myślę, że to kwestia godzin 🙂 Przyznam, że  korciło mnie by na szybko napisać taką (tak jak to zrobiłem z Uznaj.pl). Tym razem pozwolę się wykazać innym 😉 Podpowiem tylko, że ten mój mały tutorial na pewno się przyda. Tam wyjaśniałem jak dodać przycisk Wykopu, na pewno uda Wam się to interpolować na nową usługę od G.0

Czy z WordPress 3.1 zniknęły Własne Pola (Custom Fields)?

Dzieje się w sieci, to czego się spodziewałem: od czasu wydania WordPressa w wersji 3.1 na różnych forach trafiam na pytanie “gdzie się podziały “Własne Pola”?”. Czy zostały usunięte?

Odpowiedź brzmi: nie, zostały jedynie ukryte. Oto szybka instrukcja jak je ponownie pokazać.

Będąc w trakcie edycji wpisu lub strony spójrz w prawy górny róg ekranu. Zobaczysz tam odnośnik “Opcje ekranu” (Screen Options). Kliknij w nią i zobaczysz specjalne menu, w którym można wybrać co chcemy aby wyświetlało się, a co nie. Włącz w tym miejscu “Własne pola”, a znów pojawią się pod polem dodawania treści wpisu.

Obrazkowo wygląda to tak:

Jak włączyć własne pola w WordPressie?

Jak włączyć własne pola w WordPressie?

Wraz z WordPressem 3.1 ekrany edycji wpisów zostały uproszczone. Zniknęły (zostały ukryte, bowiem tak naprawdę nadal istnieją i działają) nie tylko owe własne pola, ale i Wypis (Excerpt) i kilka innych rzeczy. Choć moje wtyczki silnie wykorzystują custom fields, to jednak jestem zwolennikiem ich ukrycia.

Przeciętnemu użytkownikowi nie są do niczego potrzebne, a jedynie sprawiają wrażenie, że WP jest trudny. Dopiero dzięki wtyczkom je wykorzystujemy. Tu właśnie pojawia się zgrzyt w postaci coraz częstszych pytań jak mam sobie włączyć te pola / wtyczka nie działa bo ich nie ma. Jednak wierzę, że twórcy wtyczek z czasem dostosują się do nowych warunków.

Jak? Wykorzystując tak zwane ‘custom meta box’. Tu możecie sobie o tym poczytać, a ja się przygotowuję powoli do opisania jak to zrobić szybciej, wygodniej i ładniej.0

Nadszedł ten dzień: zostałem spiracony :)

Jak to było? “Naśladowanie jest najwyższą formą uznania”? Czy jakoś tak.

Wiecie wszyscy dobrze, że jestem autorem wtyczki WP-Sprzedawca, right? Wiecie o tym, że pomysł na wtyczkę narodził się na wordpressowym forum GoldenLine? Najwidoczniej przynajmniej jedna osoba o tym nie wiedziała. I teraz będzie miała problemy 😉

Wszedłem sobie dziś jak co dzień na owe forum, tam zajrzałem do jednego z wątków i oto co zobaczyłem:

Pomyślałem sobie: shit, mam konkurencję. Ktoś zrobił dokładnie taką samą wtyczkę jak ja, też można zablokować dostęp do treści. Też można kazać zapłacić za pobranie pliku. Też wykorzystuje Dotpay jako kanał płatności…

Zaraz, czy ten opis mi czegoś nie przypomina? Jakbym go gdzieś już czytał… Szybki rzut okiem na opis mojej wtyczki:

Przypadek? 🙂 Niby przecież “gdyby tysiąc małp przez tysiąc lat… i tak dalej”. Czy jednak nasz freelancer Artur jest małpą?

Teraz się zastanawiam co zrobić z panem Arturem. W komentarzach zbieram Wasze pomysły jakby tu pogratulować naszemu młodemu przedsiębiorcy. Najfajniejszy pomysł jeśli nie zastosuję, to na pewno jakoś nagrodzę 🙂 Wymyślcie coś z jajem.

Ja tymczasem idę sobie kupić na Allegro moją wtyczkę i postaram się wynegocjować od sprzedawcy obniżenie ceny do zera 😉

A jeśli ktoś z Was naprawdę chce mieć taką wtyczkę i to taniej (biznesman Artur sprzedaje ją za dwie dychy, podczas  gdy u mnie jest za 15 PLN) i do tego chce mieć do niej wsparcie techniczne (ciekaw jestem co zrobi Artur, syn Bębenkowskiego gdy ktoś zgłosi mu jakiś problem techniczny) to zapraszam do zakupu 🙂

Innych potencjalnych piratów informuję, że mam jeszcze jedną wtyczkę, którą można by opchnąć za jeszcze większą kwotę na Allegro. TradeMatik to bowiem taka wtyka, że pójdzie spokojnie za 100 złotych za sztukę, a na sam jej widok kobiety mdleją i rzucają się na szyję jej twórcy (true story)

 

P.S. Na początek pomóżcie zrobić szum i wykopcie to 🙂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

Czy Chrome OS przyda się dla programistów?

Wszelkie netbooki mają jedną wielką zaletę: są malutkie i aż się prosi by zabierać je ze sobą w świat. Jak do tej pory żadnego nie kupiłem, bo wiem, że nie uruchomię na nich mojego ulubionego netbeans (środowisko programistyczne, bardzo pomagające w tworzeniu kodu). Zawsze mógłbym ostatecznie zabrać się za edycję jakimś prostym notatnikiem, ale jednak mimo to na zakup się nie zdecydowałem. Po prostu netbooki z definicji nie nadają się do takich zadań. 

Tym samym w ogóle nie rozważam zakupu najnowszej zabawki (jeszcze nie dostępnej na rynku) z zainstalowanym systemem Chrome OS. Nie dość, że to kolejny netbook, to na dodatek bez żadnych aplikacji instalowanych na komputerze. Wszystkie programy muszą być uruchamiane z sieci. W tej chwili w sklepie z aplikacjami dla Chrome nie ma żadnego sensownego notatnika, a edycja kodu za pomocą Google Docs to chyba jednak nie to. To tak jakby pisać aplikację PHP za pomocą Microsoft Word 🙂 Niby można, ale…

Okazuje się jednak, że Google  chce także pomóc programistom. Pojawiła się dziś informacja, że ich platforma do hostowania kodu jaką jest Google Code uzyskała nową funkcję, jaką jest edycja zamieszczonego tam kodu. Niby drobiazg, ale brzmi całkiem dobrze:  wrzucając kod na tę platformę mamy od razu dostępny z każdego miejsca na świecie katalog z naszym kodem, możemy go edytować i od razu nie musimy się martwić o syste kontroli wersji – w każdej chwili możemy wrócić do poprzednich zmian. 

Brakuje na pewno możliwości tworzenia projektów prywatnych (a może za słabo znam Google Code?). Większość kodu jaki piszę, wykonuję na zlecenie konkretnej osoby. Ten kod nie może być dostępny do przeglądania dla każdego. Brakuje mi też możliwości wysłania skończonego zadania na serwer klienta i zainstalowanie tam (ale to być może rozwiąże webowy klient FTP jakim jest net2ftp).

Czyżbym więc któregoś dnia kupił sobie zabawkę z Chrome OS? A jakie jest Wasze zdanie? Czy na takim komputerku będzie dało się wydajnie pracować także  jako programista lub twórca stron internetowych?

0

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

WP Sprzedawca i różne stawki za dostęp do płatnej treści

Tworząc wtyczkę WP Sprzedawca założyłem sobie, że będzie ona służyła ukryciu treści i pobieraniu za odblokowanie opłaty. Przy czym opłata ta będzie sztywna, taka sama dla wszystkich wpisów. Dlatego też, gdy ktoś mnie pytał czy można zablokować różne wpisy i za każdy żądać inną kwotę, odpowiadałem, że nie.

Traf chciał, że jeden z klientów zamiast mnie o to zapytać, postanowił po prostu wprowadzić taką możliwość. 🙂 I okazało się, że metoda jest bajecznie prosta i aż wstyd, że sam na nią wcześniej nie wpadłem.

Całość sprowadza się do zainstalowania wtyczki w kilku kopiach na serwerze. A jest to możliwe dzięki kilku prostym krokom.

Zakładamy, że masz już zainstalowanego WP Sprzedawcę i kilka wpisów zablokowałeś/łaś już za jego pomocą. Teraz chcesz wprowadzić kolejną stawkę i zablokować kolejne wpisy. Po kolei:

  1. W katalogu wtyczek kopiujemy katalog /wp-sprzedawca i wklejamy go ponownie w tej samej lokalizacji, ale pod inną nazwą (np /wp-sprzedawca-2)
  2. W katalogu /wp-sprzedawca-2 otwieramy do edycji plik wp-sprzedawca.php
  3. Modyfikujemy w nim linijkę ‘Plugin Name: WP Sprzedawca’ (na samym początku pliku) tak by brzmiała ‘Plugin Name: WP Sprzedawca 2’
  4. Wyszkujemy wszystkie definicje funkcji (zaczynają się od słowa function i spacji) i zmieniamy je dodając cyfrę dwa na końcu nazwy. Zmieniamy też owe nazwy w wywołaniach (i odwołaniach w add_action i add_filter) funkcji.
  5. Wyszukujemy w pliku wszystkie wystąpienia zwrotu ‘platny’ i zmieniamy je na ‘platny2’ (powinny to być trzy wystąpienia)
  6. Zapisujemy plik
  7. Konfigurujemy wtyczkę tak samo jak zrobiliśmy to przy pierwszej instalacji. Oczywiście teraz podajemy inne stawki za dostęp do wpisu
  8. Aktywujemy wtyczkę

Od tej pory możemy ukrywać już wpisy i pobierać za nie inną stawkę. Ważne jest aby dodając do nich pole custom field nazywać teraz ‘platny2’ (dla nowej stawki) lub po staremu ‘platny’ (dla stawki starej).

Prawda, że proste? 🙂 Jeśli chodzi o kwestie “prawne” nie mam nic przeciwko muliplikacji instalacji wtyczki na własnym serwerze, więc śmiało – jeśli kupiliście już wtyczkę ode mnie, nie trzeba kupować jej po raz kolejny, aby stworzyć nową stawkę.

Przy okazji warto się zastanowić jakie inne wtyczki możemy w ten sposób powielać by uzyskać dodatkowe możliwości…0

Wprawka do bycia ekspatą

Idea życia jako ekspat pociąga mnie od czasów, kiedy jeszcze nie miałem ku temu jakichkolwiek możliwości praktycznych. Móc sobie jeździć po całym świecie i nie przejmować się specjalnie zarobkami, bo pracować możemy tam gdzie akurat jesteśmy. Brzmi wspaniale, co nie? 🙂

Od ponad roku wszystko czego potrzebuję do pracy to miejsce, gdzie mogę posadzić tyłek, laptop na swoich kolanach i połączenie z internetem. Od przynajmniej pół roku intensywnie macam sobie palcem mapę i wyobrażam, że wyjeżdżam do Nepalu, gdzie do Afryki czy Argentyny. Odwagi by to zrobić jednak wciąż nie mam.

To co teraz napisze zabrzmi śmiesznie w zestawieniu do miejsc, które wymieniłem, ale dziś w nocy wyjeżdżam do Poznania 😉 Mam możliwość zatrzymać się tam na tydzień w hotelu z internetem, nic za to nie płacić i zabieram laptop. Czemu więc by nie sprawdzić w mikroskali jak to jest? Czy faktycznie będę umiał się zorganizować, by zamiast zwiedzać całymi dniami, siedzieć po kilka godzin i 'wordpressić'? W domu znajduję setki powodów by nie brać się do pracy. I zawsze sobie mówię, że jakbym wyjechał, to na pewno będzie inaczej. A więc zobaczymy. Ten tydzień wydaje się nieco luźniejszy, więc wiele nie ryzykuję.

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

Moja prezentacja na temat tworzenia wtyczek

Niedługo na stronie WordCampu pojawią się wszystkie prezentacje, ale postanowiłem, że już teraz na swoim blogu zamieszczę tę, którą używałem podczas tłumaczenia w jaki sposób tworzy się wtyczki do WordPressa.
0

To ja też napiszę, że wróciłem z WordCampu

Dopiero o 23:00 ale wróciłem.

"Straciliśmy dwa z trzech silników" – takie słowa padły całkiem na poważnie w czasie mojego powrotu z WordCampa. Całe szczęście, że wypowiedział je konduktor w pociągu, a nie pilot w samolocie i całe nieszczęście, że prze to jechaliśmy żółwim tempem.

Ale dojechaliśmy.

Wrażenia?

WordCamp uważam za udany. Największe rozczarowanie to chyba ilość uczestników – na 200 zarejestrowanych zjawiło się około 60 osób. Nie dotarł także jeden prelegent, ale za to w ostatniej chwili zgłosił się nowy.

Byliśmy chwaleni jako organizatorzy za ogarnięcie wszystkiego, więc chyba tu było ok 🙂 Uczestnicy, czego nie zapowiadaliśmy, dostali po kubku i koszulce, identyfikator, który właśnie wszyscy chwalą i torbę z castoramy 😉 Chciałem ogłosić, że casto nie było sponsorem campa.

Przeglądam wpisy innych uczestników, rozmawiałem z wieloma osobiście i co chwila pojawia się kwestia mniejszego lub większego rozczarowania poziomem prezentacji. Muszę przyznać rację; nie do końca się zrozumieliśmy kto na campie się zjawi. Praktycznie nie było treści do zupełnych nowicjuszy, przez to kilka osób wyszła już pierwszego dnia. Za to na sali byli praktycznie sami developerzy stron opartych o WordPress. Moja prezentacja o tworzeniu wtyczek okazała sie przez to dość niepotrzebna – tłumaczyłem oczywiste oczywistości dla ludzi, którzy dawno ten etap mają za sobą. Śledziłem komentarze na blipie (flaker tu kompletnie nawalił; choć było wiele osób, które z flakera znam, na stronie wiało pustkami) i najlepszym przykładem złego dobrania treści do uczestników było zdziwienie oglądających, że we wtyczce nie użyłem MVC 🙂 To ja może skorzystam z okazji i wyjaśnię:

Celem prezentacji było wyjaśnienie jak zrobić prostą wtyczkę pzez osobę, która dopiero raczkuje. Jeśli bym tam wplótł MVC rozmyłbym tylko główny przekaz (cały czas pamiętajcie, że zakładałem, że na sali są nowicjusze). A po drugie…: MVC dla jednego formularza? 😉 Poważnie? Jeśli poważnie w ten sposób piszecie swoje rzeczy, to ja się zastanawiam, gdzie tu jest miejsce na myślenie o wydajności 🙂

Onet

Dzięki onetowi mieliśmy na prezentacji swojego własnego Steve'a Jobsa prezentującego nowy gadżet 🙂 Onet bowiem właśnie nasz camp wybrał na premierę swojego nowego pomysłu, jakim jest blogujacy.pl. To platforma blogowa dla zwykłych użytkowników oparta właśnie o WordPressa. Wypas 🙂

Ludzie

Fajnie było zobaczyć te wszystkie twarze, które znaliśmy do tej pory tylko z avatarów. I dobrym tu pomysłem było zamieszczenie owych avatarów na identyfikatorach, dzięki czemu szybko poznawało się kto jest kto. 

Dobra kończę. O WordCampie będę jeszcze pewnie pisał. Teraz tylko na szybko melduję się wróciłem i idę spać 🙂

0

Zapomniałem powiedzieć, będzie pierwszy polski WordCamp

No tak, to się jakoś mieści w ramach powiedzeń typu szewc bez butów chodzi.

11 i 12 grudnia 2010 w Łodzi odbędzie się WordCamp – spotkanie osób, które w jakiś sposób mają coś wspólnego z WordPressem. Jeśli masz bloga opartego o tę platformę, jeśli tworzysz takie blogi czy strony, jeśli chcesz poznać inne osoby zainteresowane WordPressem a przy okazji dowiedzieć się czegoś nowego, zapraszam 🙂

Tak się składa, że jestem współorganizatorem tego wydarzenia, udzielę także dwóch krótkich wykładów. Tym bardziej wstyd, że choć całość się już organizuje od dawna, to nadal o tym nie napisałem na swoim blogu 🙂

Zatem: widzimy się w Łodzi? 😉0

Jak dodać widgety do WordPressa z klasą

Pisałem już o tym – nic tak nie wstrzykuje do żył dopaminy jak znalezienie po wielu godzinach szukania rozwiązania jakiegoś problemu 🙂 Zatem właśnie znów jestem pełen dopaminy 😉

Tworząc kolejny WordPressowy plugin postanowiłem zrobić tym razem coś nieco inaczej niż zazwyczaj. Zamiast do tworzenia widgetów użyć wyraźnie oznaczonej jako przestarzała funkcji register_sidebar_widget, postanowiłem zrobić to obecnie polecanym sposobem, czyli przez rozszerzenie klasy WP_Widget.

Znalazłem na sieci tutorial, który niestety jak się okazało nie działa. Dodanie wywołania funkcji register_widget powodowało czystą stronę w oknie przeglądarki. Co ciekawe strona na kodeksie też podaje błędne (jak się okazuje rozwiązanie).

A jakie jest rozwiązanie prawidłowe? Banalne, ale musiałem nieźle się naszukać 🙂 Zamiast wywoływać register_widget() bezpośrednio pakujemy ją w haka akcyjnego ‘widgets_init’. Czyli – zakladając, że nasza klasa widgeta nazywa się ‘NaszWidget’, aktywujemy ją w ten sposób:

add_action('widgets_init', 'NaszInit');
function NaszInit() {
register_widget('NaszWidget');
}

0

Wykluczenie strony z menu – WordPress

Chyba będę raz na jakiś czas wrzucał tutaj tip&tricks do zastosowania przy zabawach z api WordPressa. Blogów na ten temat jest wiele i nie mam zamiaru z nimi konkurować. Dlatego kryterium wrzucania będzie takie: jeśli długo szukałem jakiegoś rozwiązania i nie mogłem znaleźć, jeśli znalazłem, czuję, że mi się jeszcze przyda, a boję się, że szybko to zapomnę – wyląduje to tutaj. Taki publiczny notes ze snippetami, który być może pomoże i części z Was.

Pracuję obecnie nad pluginem do tworzenia sklepów internetowych. Wiem, że mam już WP Sprzedawcę. Ten plugin będzie sobie istniał, ale jako właśnie taki skromny, do szczególnych zastosowań. Równolegle mam zamiar wydać duży plugin, który pozwoli tworzyć sklepy internetowe na bazie WordPressa, dostosowany do polskich realiów. Ale do rzeczy.

Plugin instalując się tworzy specjalne strony: na koszyk, na wprowadzenie danych odnośnie wysyłki przez klienta… Tej ostatniej lepiej, żeby nie było w menu na stronie. Jak tego dokonać?

Domyślnie menu jest produkowane przez funkcje wp_list_pages() umieszczoną w skórce. Można do niej przekazać parametr exclude=3 co wykluczy z menu stronę o ID równym ‘3’. Czy jest jednak sposób by wp_list_pages() zawsze wykluczało jakąś stronę, tak byśmy w instrukcji instalacji naszego plugina nie musieli pisać “po zainstalowaniu otwórz wszystkie pliki skórki i zamień każde wystąpienie funkcji wp_list_pages() na …”? Takie podejście trzeba przyznać nie byłoby rzeczą wspaniałą, nie zmuszajmy użytkownika systemu CMS do grzebania w jego kodzie!

Długo szukałem i znalazłem. Niestety nie ma żadnego filter haka czy action haka na tę funkcję. wp_list_pages korzysta jednak do pobrania listy stron z funkcji get_pages(), którą już z kolei filtrować możemy.

Zatem wszystko co musimy zrobić to przefiltrować funkcję get_pages() i ze zwracanej przez nią tablicy wyciąć ten element, który zawiera obiekt o ID równym ‘3’ (brzmi złożonie, ale przeczytajcie opis funkcji, aby zrozumieć jaki rodzaj danych zwraca; jest to tablica obiektów, każdy obiekt ma pola odpowiadające nazwom kolumn z tabeli stron w bazie danych).

Na nasze nieszczęście (ale niewielkie) funkcja get_pages() używana jest nie tylko przy tworzeniu menu stron, ale na przykład także w panelu admina. Szkoda by było jakby także tam zniknęła nam nasza strona. Zatem musimy do naszej funkcji, zanim jeszcze tablica pozbawiana wykluczanej strony, dodać warunek aby pozbawianie to nie odbywało się, jeśli funkcja wywoływana jest w panelu administracyjnym WordPressa.

OK, wiemy już wszystko.

Najpierw dodajemy filtr.

add_filter('get_pages', 'usun_strone');

Następnie tworzymy naszą funkcję usun_strone(), która jako parametr otrzymuje tablice stron.

function usun_strone($pages) {

}

W bloku funkcji wstawiamy najpierw warunek sprawdzający czy to panel administracyjny i jeśli tak – przerywamy działanie funkcji zwracając tablicę stron z powrotem w niezmienionej postaci.

$to_wp_admin = ( ( defined( 'WP_ADMIN' ) && WP_ADMIN == true ) 
|| ( strpos( $_SERVER[ 'PHP_SELF' ], 'wp-admin' ) !== false ) );
if ( $to_wp_admin ) return $pages;

Jeśli jednak nie jest to Kokpit, zróbmy pętle na tablicy stron, sprawdźmy czy ID jest równe trzy i jeśli nie, dodajmy element tablicy do nowej tablicy, a potem ją zwróćmy.

$new_pages = array();
foreach ($pages as $page) {
 if ($page->ID == '3') {
  continue;
  }
 else {
  $new_pages[] = $page;
  }
 }

return $new_pages;

To wszystko.

Przy okazji mam pytanie do Was: czy jest jakiś sposób aby w bloku funkcji sprawdzić przez jaką funkcję jest dana funkcja wywołana? Ja niestety nie znam takiego, ale pomyślałem, że fajnie by było, gdyby taka możliwość była. W powyższym kodzie nie musielibyśmy sprawdzać czy get_pages() jest wywoływane w panelu admina, czy jeszcze jakoś inaczej, a zrobilibyśmy warunek “jeśli funkcja ta jest wywoływana przez wp_list_pages(), tylko wtedy usuń stronę o ID równym 3”.

Zna ktoś taki sposób? Czekam na Wasze komentarze.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

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

Instalacja WP Sprzedawca 1.0 – The movie ;)

Stosując się do sugestii aby wziąć się też za marketing, a nie tylko programowanie zrobiłem filmik pokazujący jak zainstalować WP Sprzedawcę.

Film dotyczy wersjji 1.0, której jeszcze oficjalnie nie ma 🙂 Niech będzie delikatną zachętą do zakupu jak już się pojawi (przy czym przypominam,  że każdy kto kupi wersje 0.x aktualizacje do 1.0 będzie miał za darmo), przy okazji widać pewne nowości, między innymi forum użytkowników i to, że nie trzeba już będzie ręcznie edytować plików konfiguracyjnych, a wszystko będzie dało się ładnie ustawić w sekcji administracyjnej WordPressa. 🙂

Film jest tutaj. Zatem kubeł pop-cornu w garść i zapraszam na seans 😉0

Jedna rzecz, o której powinien wiedzieć każdy programista

Jedna rzecz, o której powinien wiedzieć każdy programista

Heh, niedługo moją podstronę WP Sprzedawcy chyba czeka redesign 😉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

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