Modyfikacja kodu wynikowego w shortcode [gallery]

WordPress umożliwia nam stworzenie własnego kodu wynikowego shortcode gallery poprzez filtr post_gallery. Niestety filtr ten jest umieszczony przed właściwym kodem generującym galerię, zatem najcześciej proponowanym rozwiązaniem jest stworzenie własnej funkcji obsługi tego shortcode i wykorzystanie atrybutów, które otrzymujemy jako argument funkcji filtrującej. Takie rozwiązanie ma pewne wady:

  • musimy pilnować ewentualnych zmian w kodzie WordPressa aby zapewnić pełną kompatybilność,
  • w wypadku gdy chcemy tylko dodać jakieś atrybuty do zdjęć to rozwiązanie wydaje się być mocno na wyrost,
  • trzeba wygenerować sporo kodu, który często duplikuje to co już robi WordPress.

Czytaj dalej Modyfikacja kodu wynikowego w shortcode

Jak w prosty sposób stworzyć cache dla shortcode’ów?

Czasami zdarza się, że shortcode przed zwróceniem efektów swojego działania musi wykonać dużo czasochłonnych operacji – np. jeżeli robimy shortcode, który zwraca statusy z Twittera dla określonego zapytania. W takim wypadku powinniśmy stworzyć cache z dwóch powodów:

  • pobranie informacji o statusach z Twittera wymaga pobrania tych danych z zewnętrznego serwera co może zająć sporo czasu
  • Twitter nakłada limity zapytań do swojego API

Na szczęście stworzenie prostego mechanizmu cache dla shortcode’ów jest w WordPressie bardzo proste.

Przyjmijmy, że nasz shortcode pobiera 3 różne parametry z wartościami domyślnymi i zamieniane na zmienne o odpowiednich nazwach w poniższy sposób:

$atts = shortcode_atts(array(
'param1' => 'lorem',
'param2' => 'ipsum',
'param3' => 'dolor'
), $atts);

extract($atts);

Zatem nasz shortcode ma poniższą składnię:

[txt][shortcode param1=”x” param2=”y” param3=”z”][/txt]

Pierwsza istotna obserwacja – nasz shortcode zwróci te same rezultaty dla takich samych wartości parametrów, zatem ciąg złożony z wartości tych parametów może śmiało posłużyć za identyfikator rezultatów danego shortcode’a. Do przechowania zawartości cache wykorzystamy Transients API.

Zatem nasz mechanizm cache będzie potrzebował dwóch kluczowych fragmentów kodu – zapisu i odczytu zawartości cache.

Zacznijmy od odczytu zawartości cache, gdyż ta operacja jest wykonywana przez rozpoczęciem operacji przez nasz shortcode:

$cache = get_transient(md5('PREFIX'.serialize($atts)));

if($cache) {
    return $cache;
}

Jak wspominałem – wykorzystujemy ciąg wartości parametrów jako identyfikator, do tego sugeruję dodać też jakiś własny prefix – dzięki temu zabezpieczymy się przed sytuacją gdy wszystkie parametry będą puste. Jeżeli cache dla danej konfiguracji istnieje to po prostu funkcja zwróci od razu zawartość cache, bez wykonywania dodatkowych operacji.

Następnie cały kod wyjściowy generowany przez shortcode umieszczamy w zmiennej np. $cache_output – jeżeli dobrze tworzycie swoje shortcode’y to zapewne taką zmienną z zawartością rezultatów już posiadacie (nie używacie w shortcode’ach echo, prawda?). Na koniec działania naszego shortcode’u możemy umieścić zawartość tej zmiennej w bazie danych:

set_transient(md5('PREFIX'.serialize($atts)) , $cache_output, 10 * 60);

Jak widać dzięki stworzeniu 6 dodatkowych linijek kodu mały gotowy mechanizm cache.

Osobiscie polecam do listy parametrów takiego shortcode’a dodać też parametr cache_time – dzięki temu będzie można określić czas przechowywania cache, a ostatnia linijka związana z cache zmieni się na:

set_transient(md5('PREFIX'.serialize($atts)) , $cache_output, $cache_time * 60);

Powyższe rozwiązanie ma tą zaletę, że w wypadku shortcode’ów w których istnieje niewielkie zróżnicowanie wartości parametrów do przechowywania rezultatów nawet z kilku tysięcy wpisów, będzie potrzeba kilku-kilkunastu rekordów w bazie danych. Natomiast sugeruję ostrożność w wypadku gdy przy podobnej liczbie wpisów mamy unikalne konfiguracje shortcode’ów – wtedy istnieje ryzyko, że ilość rekordów w bazie danych będzie zbliżona do liczby wpisów.

WordPressowe Linki #20

WordPress 3.9 beta 1

Ukazała się pierwsza wersja beta, zaplanowanego na kwiecień wydania WordPress 3.9.

6 ciekawych funkcjonalności zawartych w kokpicie opisano tutaj.

Warto też rzucić okiem na zmiany Audio/Video 2.0 – jeżeli zarządzacie stronami z dużą ilością materiałów multimedialnych, to z pewnością nowe funkcjonalności Was ucieszą.

WordPress wykorzystywany do DDoS-ów

Ktoś w końcu postanowił w niecny sposób wykorzystać funkcjonalność Pingback WordPressa i użyć jej do wykonywania ataków DDoS – liczba wykorzystywanych instalacji jest ogromna i będzie zapewne rosnąć. Obecnie jednym z rozwiązań jest zdefiniowanie poniższego filtra:

add_filter( ‘xmlrpc_methods’, function( $methods ) {
unset( $methods['pingback.ping'] );
return $methods;
} );

Niestety jak można się domyślić – wyłącza on funkcjonalność Pingback. Jeżeli chcecie sprawdzić czy Wasz blog jest wykorzystywany w atakach DDoS, możecie to zrobić na stronie przygotowanej przez Sucuri.

Jeżeli używasz postów chronionych hasłem to koniecznie to przeczytaj

Powyższy artykuł dobrze punktuje słabości postów chronionych hasłem, główne z nich to fakt, że jeżeli ustawimy to samo hasło dla wielu postów to użytkownik automatycznie uzyska dostęp do każdego z nich (ze względu na sposób przechowywania danych dostępowych do posta chronionego hasłem) oraz brak ochrony hasłem załączników i komentarzy do takiego posta.

Wykrywacz motywów

Jeżeli ktoś ciągle Was nęka pytaniami typu „Jakiego motywu używa strona X?” to od dzisiaj możecie mu po prostu dać link do tego przydatnego narzędzia 🙂

Dostępne shortcode’y jako lista wyboru w edytorze postów

Kiedyś opisywałem podobne rozwiązanie, tylko bazujące na podpowiedziach – powyższe wyświetla od razu kompletną listę.

Jak rozszerzyć funkcjonalność WordPressowej wyszukiwarki?

Powyższy artykuł opisuje jak dodać podświetlenia szukanej frazy w wynikach wyszukiwania, ograniczyć wyszukiwanie do konkretnych kategorii czy zmienić sposób wyszukiwania tak by bazowało na całych frazach a nie słowach kluczowych.

WordCamp Europe 2014 – znamy termin i miejsce

Ogłoszono oficjalny termin i miejsce drugiego europejskiego WordCampa – odbędzie się on 27-29 września w stolicy Bułgarii – Sofii.