WordPress - motywy, wtyczki, informacje, programowanie

Formaty wpisów

Formaty wpisów (Post Formats) – kontrowersyjny pomysł

Kiedy wychodził WordPress 3.1 niezwykłą popularność uzyskały serwisy mikroblogowe, wznosiła się wielka fala Facebooka, ogromną popularność uzyskał serwis Thumblr, który starał się łączyć blogowanie z mikroblogowaniem, a wszyscy przepowiadali (po raz kolejny) zbliżający się koniec blogowania w starym stylu.

Być może pod wpływem tego ciśnienia władcy WordPressa dodali w wersji 3.1 formaty postów. Od samego początku był to element kontrowersyjny i niezbyt dobrze rozumiany przez użytkowników.

Dobra idea

Pomysł na formaty wpisów zrodził się ze sposobu w jaki ludzie dzisiaj używają mediów społecznościowych. Kiedy wrzucamy dane na Thumblr, czy na Facebooka czasem jest to jakiś tekst (wypowiedź), czasem zdjęcie lub album ze zdjęciami, czasem cytat, czasem film. Nie trzymamy się jednej formuły, dzielimy się tym co mamy pod ręką, tym co nas zainteresowało, myślą, która nam przyszła do głowy, zdjęciem, które właśnie zrobiliśmy.

Serwisy te wykształciły przyzwyczajenia, które wpłynęły na to w jaki sposób niektórzy użytkownicy myślą dzisiaj o blogowaniu w ogóle. Okazało się, że ludzie nie zawsze chcą używać pełnej formuły wpisu – pisać dłuższe, zatytułowane teksty, w których ewentualnie mogą osadzić zdjęcia lub galerie, albo użyć cytatu. Często chcą blogować w taki sam sposób jak korzystają z Facebooka, od czasu do czasu mogą napisać coś dłuższego, jednak chcą mieć możliwość umieszczenia na blogu po prostu jednego zdania, jednego zdjęcia, oderwanej myśli.

Jednak, jeśli wpis jest pojedyńczym zdaniem lub pojedynczym zdjęciem nie będzie wyglądał dobrze jeśli zostanie wyświetlony w taki sam sposób, jak długa notka zajmująca kilka ekranów. Dlatego właśnie wprowadzono formaty wpisów.

Dostępne formaty

WordPress definiuje następujące formaty wpisów:

  • Notatka na marginesie (aside) – krótka forma tekstowa, oderwana myśl, jedno do kilku zdań
  • Galeria zdjęć
  • Odnośnik (link do strony)
  • Film (np. z YouTube)
  • Obrazek
  • Cytat
  • Status – krótka forma podobna do statusu na Twitterze. Teoretycznie moglibyśmy użyć tutaj formatu aside, ale jednak kontekst jest zupełnie inny (obwieszczenie światu co w tej chwili robię) zatem możemy chcieć to inaczej zwizualizować..
  • Audio – plik dźwiękowy
  • Chat – zapis rozmowy z komunikatora lub IRC.

Ta lista jest zamknięta i użytkownik nie ma możliwości dodawać swoich formatów wpisów. Dany motyw może obsługiwać wszystkie, tylko niektóre z nich, albo nie obsługiwać formatów wcale. Określa to twórca danego motywu.

Formaty wpisów (post formats)

Przykład różnych sposobów wyświetlania różnych formatów wpisów. Motyw Bugis.

Włączenie obsługi formatów wpisów

Aby włączyć obsługę formatów wpisów w motywie, trzeba dodać akcję dla haka after_setup_theme, w której umieścimy wywołanie funkcji add_theme_support() z odpowiednimi parametrami.

add_action( 'after_setup_theme', 'init_my_theme' );
function init_my_theme() {
    // … inne inicjalizcaje
    add_theme_support( 'post-formats', array( 'aside', 'gallery',
                              'link', 'video', 'image', 'quote' ) );
}

Najczęściej podobny fragment kodu znajdziemy w pliku functions.php motywu. W funkcji inicjującej motyw (analogicznej do funkcji init_my_theme() z powyższego przykładu)  dokonywane jest zawsze więcej ustawień, między innymi więcej razy wywoływana jest funkcja add_theme_support(). Na przykład:

add_action( 'after_setup_theme', ' init_my_theme'' );

function init_my_theme' () {
    add_editor_style();
    add_theme_support( 'post-thumbnails' );
    add_theme_support( 'automatic-feed-links' );
    register_nav_menus( array(
                'primary' => __( 'Primary Navigation', 'my-text-domain' ),
    ) );
    add_theme_support( 'post-formats', array( 'aside', 'gallery', 'link',
                       'video', 'image', 'quote' ) );
 }

Wybór formatu wpisuJeśli w pokazany powyżej sposób włączymy obsługę formatów wpisów w motywie, na ekranie edycji Wpisu użytkownik będzie miał do dyspozycji wybór widoczny na ilustracji obok.

I to właściwie wszystko co zapewnia użytkownikowi WordPress jeśli chodzi o formaty wpisów. Cała reszta zależy od twórców motywów.

Wyświetlanie formatów wpisów

Większość współczesnych motywów WordPressa obsługuje formaty i robi to w bardzo podobny sposób (taka, jak rozumiem, była idea). Poza zwykłym wpisem i galerią, pozostałe formaty często nie są klikalne – nie mają własnej strony (a raczej – nie jest ona podlinkowana). Wpisy w tych formatach są z założenia krótkie i wyświetlone na samodzielnej stronie wyglądałyby niekorzystnie. Główna strona bloga, który intensywnie wykorzystuje formaty wpisów może faktycznie nieco przypominać strumień serwisu mikroblogowego.

Aby zróżnicować wygląd wpisów w zależności od ich formatu programista ma do dyspozycji dwa narzędzia: klasy CSS  i funkcje, dzięki którym możemy ustalić format danego wpisu i w zależności od tego wygenerować inny kod HTML.

Dodatkowe klasy CSS

Do listy klas CSS jakie są dodawane do widoku wpisu w WordPressie system dodaje klasę określającą format, postaci:

format-nazwaformatu

Na przykład:

  • format-aside
  • format-status
  • format-video

itd.

W prawidłowo skonstruowanym motywie WordPressowym każdy wpis (niezależnie od typu, formatu, strony, na której go wyświetlamy i sposobu wyświetlenia) powinien być zamknięty w tag <article> w formie

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

W motywach nie korzystających z HTML5 (zwykle starszych i od dawna nie aktualizowanych) zamiast tagu <article> może być zwykły <div>

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

Funkcja post_class()  dba o to, abyśmy mieli dostępne w formie class CSS wszystkie informacje dostępne o wpisie. Wynikowy HTML może wyglądać następująco:

<article id="post-104"
class="post-104 post type-post status-publish format-standard hentry category-ciekawostki">

Poszczególne klasy w tym przykładzie oznaczają:

  • post-104 – oznacza, że jest to wpis o identyfikatorze 104. Co prawda mamy już ustawione id=”post-104”, ale czasem możemy preferować użycie klasy.
  • post – oznacza że mamy do czynienia z wpisem. Dla stron będziemy mieli ustawione page, dla załączników attachment, itd. Tag <article> może być użyty w wielu innych miejscach, dla rzeczy, które nie są wpisami np. do komentarza.
  • type-post – oznacza, że mamy do czynienia z wpisem typu post, inne możliwe wartości to type-page, type-attachment itd. Jeśli zdefiniujemy swój typ wpisu, na przykład biografia to dla wpisów tego typu post_class() będzie zwracało type-biografia.

post i type-post dostarczają właściwie tej samej informacji. Pierwsza forma występuje dla  zachowana dla kompatybilności ze starymi wersjami WordPressa. Druga jest bardziej przydatna, bo dzięki niej możemy skorzystać w CSS z selektora postaci:

article[class~=type]

albo

article[class|=type-]

wybierając w ten sposób tylko te bloki <article>, które prezentują obiekty z bazy wpisów WordPressa, a nie na przykład komentarze czy użytkowników.

oraz
  • format-standard – klasa określająca format. Możemy tu otrzymać format-quote, format-aside, itd.

Warunkowy kod PHP dla formatów wpisów

Zaglądając do pliku index.php większości motywów obsługujących formaty wpisów możemy znaleźć charakterystyczny fragment kodu w rodzaju:

<?php while ( have_posts() ) : the_post(); ?>

<?php get_template_part( 'content', get_post_format() ); ?>

<?php endwhile; ?>

Ten akurat fragment został zaczerpnięty z motywu Twenty Eleven. W folderze motywu znajdziemy wówczas pliki PHP obsługujące poszczególne formaty:

  • content-standard.php
  • content-aside.php
  • content-gallery.php

itd.

Funkcja:

get_post_format( $post = null )

zwraca identyfikator format dla danego wpisu (domyślnie dla aktualnie wyświetlanego, albo możemy podać identyfikator).

Jak widać bardzo łatwo dodać obsługę formatów wpisów do motywu potomnego (child theme) jeśli motyw macierzysty ich nie obsługuje.

Mamy też do dyspozycji funkcje:

has_post_format( $format, $post = null )

Zwraca true jeśli $post jest formatu $format

set_post_format( $post = null, $format )

Przypisuje format $format do wpisu $post

get_post_format_link( $format )

Zwraca link do archiwum wpisów w danym formacie. Jeśli nie ma wpisów danego formatu funkcja zwraca false. Co ciekawe (i świadczy o pewnym bałaganie koncepcyjnym) zwrócony link ma domyślnie postać na przykład dla formatu aside:

http:/example.com/type/aside

Można to zmienić, definiując filtr dla haka post_format_rewrite_base. Jeśli używamy formatów wpisów, dla zachowania pewnego porządku w nazewnictwie powinniśmy gdzieś w functions.php umieścić fragment kodu:

function better_format_slug ($slug) {
    return 'format';
}
add_filter('post_format_rewrite_base','better_format_slug');

get_post_format_string($format)

Zwraca ładnie przetłumaczoną nazwę formatu , czyli, jeśli mamy ustawiony język polski w wp-config.php dla

get_post_format_string(‘aside’);

otrzymamy:

Notatka na marginesie

get_post_format_slugs()

Zwraca tablicę identyfikatorów wszystkich formatów wpisów (niestety wszystkich, nie tylko tych obsługiwanych)

get_post_format_strings()

Zwraca tablicę identyfikatorów przetłumaczonych nazw wszystkich formatów wpisów

Kontrowersje

Wraz z formatami wpisów nie dostajemy żadnych użytecznych narzędzi, ani z perspektywy programisty ani użytkownika. Oznaczenie że wpis jest danego formatu znaczy niewiele więcej niż przypisanie go do podobnie brzmiącej kategorii.

Byłoby znacznie lepiej, gdyby w edytorze wpisów, po zmianie formatu, zmieniał się interface. Po wybraniu formatu aside czy quote mógłby zniknąć tytuł, w wypadku cytatu mogłoby się pojawić pole dla autora, w wypadku formatu gallery mógłby się pojawić wygodny interface do komponowania i opisania galerii. Ale tak się nie dzieje. Tak naprawdę nie wiemy więc, co na koniec wyświetli twórca motywu.

Ktoś może powiedzieć, że nie szkodzi, w końcu możemy nie używać formatów i już, ale niestety to nie jest dobre podejście. Początkujący użytkownik WordPressa startuje zwykle z motywu Twenty Eleven i na dzień dobry, w poczesnym miejscu, dostaje do wyboru bardzo kuszące możliwości (dostępne domyślnie). Tylko, że ich wybranie nic nie zmienia. Sam byłem tym skonfudowany kiedy zobaczyłem formaty po raz pierwszy i widziałem ten problem u innych użytkowników.

Cały pomysł, nawet gdyby był świetnie wykonany, adresowany jest do stosunkowo wąskiego grona bloggerów i rodzaju blogów, których popularność jest umiarkowana. Można dodać do core WordPressa  wiele innych wąsko adresowanych możliwości tylko, że powoli stanie się on śmietnikiem i utraci swój największy atut, czyli względną prostotę. To nie jest tak, że można bez końca dodawać do systemu nowe rzeczy nic nie tracąc.

Lista formatów wpisów jest zamknięta, zawsze taka sama. Nie można dodać swoich formatów. Teoretycznie jest to atut, taka standardyzacja miała sprawić, że przenosząc bloga na inny motyw nie musimy się martwić o to czy nasze wpisy będą wyświetlone dobrze. Teoretycznie wystarczy, że sprawdzimy czy motyw obsługuje formaty wpisów i jeśli tak, to wszystko będzie dobrze.

Niestety tylko teoretycznie. W praktyce twórca motywu może obsłużyć tylko niektóre formaty, a ponieważ interface edycyjny wpisu nic nie narzuca ani nie sugeruje (nie zmienia się pod wpływem zmiany formatu) to tak naprawdę nie ma żadnej gwarancji, że poszczególne formaty będą wyświetlone z sensem.

Ponadto wielu autorów stron na WordPressie, którzy mimo wszystkich kontrowersji chcieli by używać formatów, narzeka na te ograniczenia. Ostatecznie, podobny problem rozwiązano znakomicie w przypadku typów wpisów (Custom Post Types). Domyślnie dostępne typy: post, page, attachment, menu-item i revision, są oznaczone jako _builtin czyli wbudowane. Podobnie mogłoby być z formatami. Twórcy motywów czuliby się zobligowani obsłużyć formaty wbudowane, ale mogliby definiować własne.

Łatwo zauważyć, że formaty wpisów właściwie dobrze pasują tylko do standardowego typu post. Użycie ich dla innych typów wpisów, które moglibyśmy zdefiniować (np. osoba, film, wydarzenie, książka, itp.) choć możliwe, jest w najlepszym wypadku naciągane. Po prostu blogowanie ma to do siebie, że stosujemy różne formy wypowiedzi, ale już jeśli tworzymy bazę biografii czy bazę filmów, czy książek, chcemy raczej dostarczyć jednorodnej informacji, w miarę pełnej o każdym obiekcie.

Formaty wpisów i typy wpisów – nie mylić!

Formaty wpisów są bardzo często mylone przed mniej doświadczonych programistów WordPressowych z typami wpisów. Teoria głosi, że typy wpisów są jak rzeczowniki, określają rzecz, którą reprezentuje wpis (notka blogowa, strona, książka, samochód, biografia, wydarzenie), a formaty wpisów określają formę wizualizacji. Całe to tłumaczenie traci jednak urok kiedy zauważmy, że formaty raczej nie nadają się do opisywania sposobu wyświetlania niczego, poza zwykłymi wpisami blogowymi.

W dodatku takie rozgraniczenie gdzie kryterium jest aspekt wizualny nie zawsze ma sens i jest mylące.

Wyobraźmy sobie na przykład serwis filmowy, w którym mamy bazę filmów, ludzi filmu (aktorów, reżyserów ,itp.) oraz różnego rodzaju artykułów (recenzji, zapowiedzi, wywiadów, itp.). Bez trudu posługując się typami wpisów możemy zdefiniować takie struktury danych i zrobić w WordPressie fajny serwis tego typu.

Jeśli będziemy chcieli teraz stworzyć bazę trailerów raczej na pewno nie użyjemy formatu wpisu Film. Zamiast tego powinniśmy zdefiniować typ wpisu trailer. Dzięki temu, posługując się na przykład wtyczką Posts2posts możemy przywiązywać trailery do innych wpisów i wyświetlać je przy nich kontekstowo. Trailer może być przywiązany do filmu, którego dotyczy, do aktorów, którzy w nim występują, do artykułów o danym filmie, wywiadów, plotek, itd.

W dodatku trailery chcemy pewnie wyświetlać w oddzielnych modułach, chcemy żeby miały oddzielne archiwa i nie chcemy żeby same pojawiały się w kanałach RSS. Po prostu plik video nie jest w tym wypadku formą wypowiedzi blogowej, jest pełnoprawnym typem obiektu, semantycznie czym innym niż zwykły wpis (rzeczownikiem, jeśli podążać za kanonicznym wykładem o formatach i typach wpisów).

Normalne wpisy będziemy chcieli sobie zostawić na różne kategorie materiałów tekstowych: wiadomości, plotki, recenzje, artykuły, wywiady. Ładny podział, prawda? Jeśli wpakujemy do tej samej listy trailery, zrobi się bałagan.

Podobne przykłady możemy dać dla galerii, plików dźwiękowych i innych. Galeria, film, czy plik dźwiękowy czasem mogą być tylko formą wypowiedzi blogowej i wtedy możemy do nich użyć formatów wpisów, ale często są semantycznie innymi obiektami i wtedy powinniśmy użyć do nich typów wpisów.

Podsumowanie

Formaty wpisów są moim zdaniem kontrowersyjnym elementem WordPressa. Wprowadzone, jak się wydaje, pod wpływem mody, nie są tak użyteczne jak mogłyby być, a zamieszanie, które wprowadzają na pewno nie pomaga. Wszystko co oferują można osiągnąć wieloma innymi metodami, niewiele tracąc, a wiele zyskując. Osobiście jestem pewien, że pewnego dnia wylecą z core WordPressa, albo zostaną domyślnie wyłączone. Jestem wielkim fanem WordPressa i jego pragmatyzmu, ale nie znaczy to, że bezkrytycznym. Poza tym wydaje mi się, że historia Post Formatów jest dość pouczająca.