chevron-left chevron-right

Piotr Nalepa Frontend, architektura i AI

[JS] Pobieranie postów typu własnego za pomocą WordPress REST API

Ta wersja
blog.piotrnalepa.pl/2017/03/15/js-pobieranie-postow-typu-wlasnego-za-pomoca-wordpress-rest-api
Opublikowano
Autor
, Staff Software Engineer
Kategorie
DSP2017, JavaScript, PHP
Uwagi
Napisz do mnie · Napisz na X

Ten wpis ma 9 lat. Od tego czasu przeglądarki i narzędzia mogły się zmienić, więc zanim użyjesz kodu, sprawdź go z aktualną dokumentacją.

W swoim projekcie który realizuję w ramach akcji Daj Się Poznać 2017 wykorzystuję WordPress'a jako źródło danych do swojego systemu. Aby pobrać dane z tego systemu korzystam z REST API, dzięki któremu mam dostęp do niestandardowych typów postów - custom post types.

Zakładam, że posiadasz już przygotowane definicje typów postów. Jeśli jeszcze nie masz, to nie martw się. Możesz wykorzystać generator własnych typów postów dostępny tutaj.

Sekcja 1WordPress REST API - jak zacząć?

W najnowszych wersjach WordPress'a, REST API jest domyślnie dołączane do systemu. Aby móc z niego korzystać za pomocą kodu JavaScript należy pobrać klienta JS ze strony repozytorium bądź też uruchomić następujące polecenie w linii komend (przy założeniu, że masz zainstalowane środowisko node.js):

npm install --save wpapi

Następnie, w miejscu gdzie chcemy skorzystać z klienta REST należy dodać następujący kawałek kodu:

Przykład 1JavaScript
1
2
3
4
5
6
7
8
9
import WPAPI from 'wpapi';
 
// tworzymy nową instancję obiektu WPAPI
// gdzie przekazujemy informacje jak dostać się do systemu
const wpapi = new WPAPI({
    endpoint: '<twoja-domena>/wp-json',
    username: '<login-wordpress>',
    password: '<haslo-wordpress>',
});

Dodatkowo, na WordPressie warto zainstalować plugin JSON Basic Authentication, który zapewni nam podstawy mechanizm logowania z poziomu kodu JS. Musisz jednak wiedzieć, że o ile ten sposób logowania się jest dobry podczas wstępnych prac nad projektem, to o tyle nie jest zalecany jako mechanizm stosowany na produkcji. Wtedy warto skorzystać z innych rozwiązań, chociaż z OAuth.

Sekcja 2Definiujemy nowy endpoint REST

Gdy już mamy przygotowaną instancję obiektu WPAPI to możemy zająć się definiowaniem punktów dostępowych do naszych postów. W tym celu w pliku functions.php dodajemy następujący kawałek kodu:

Przykład 2PHP
1
2
3
4
5
6
7
8
9
10
11
12
function expose_rest_post_types() {
    global $wp_post_types;
 
    // włączamy widoczność postów w REST API
    $wp_post_types['sp_twoj_post']->show_in_rest = true;
    // określamy jak ma wyglądać nazwa punktu dostępowego w REST API
    $wp_post_types['sp_twoj_post']->rest_base = 'twoj_post';
    // określamy z którego kontrolera REST będziemy korzystać przy realizacji zapytań;
    // domyślnie powinien to być WP_REST_Posts_Controller
    $wp_post_types['sp_twoj_post']->rest_controller_class = 'WP_REST_Posts_Controller';
}
add_action('init', 'expose_rest_post_types', 30);

Kolejnym krokiem będzie wrócenie do pliku JS gdzie utworzyliśmy instancję obiektu WPAPI. Tam będziemy musieli poinformować klienta JS o dostępnych, niestandardowych endpointach. Aby tego dokonać musimy dodać następującą linijkę kodu:

Przykład 3JavaScript
1
wpapi.twojpost = wpapi.registerRoute('wp/v2', '/twoj_post/(?P<id>)');

Funkcja registerRoute przyjmuje dwa parametry:

  • wp/v2 - przestrzeń nazw w jakiej ma działać dany endpoint; domyślnie jest to wp/v2,
  • '/twoj_post/(?P)' - struktura URL zapytania REST-owego. Kawałek (?P) mówi, że id danego posta jest opcjonalne.

W ten sposób udało się nam przygotować kod do pobierania danych z WordPress'a. Zanim jednak do tego przejdziemy, to musisz wiedzieć, że WPAPI zwraca dane w postaci Promises. Czym są Promises wspomniałem w artykule dotyczącym Fetch API.

Teraz możemy przejść do sedna, czyli wywołania zapytania zwracającego posty typu, który zdefiniowaliśmy w pierwszej części artykułu:

Przykład 4JavaScript
1
2
3
4
5
6
7
8
9
wpapi
    // pobieramy nasze posty
    .twojpost()
    // w ilości 5 sztuk na stronę
    .perPage(5)
    // wyświetlamy informacje o postach w konsoli narzędzi webdeveloperskich
    .then(result => console.log('twoj_post', result))
    // jeśli wystapi błąd, to w konsoli wyświetlamy informację o błędzie
    .catch(error => console.log('%cWystąpił błąd', 'background:red;color:white;', error));

Nasze posty pobieramy za pomocą specjalnej metody wpapi.twojpost(), którą zdefiniowaliśmy przy dodawaniu informacji o endpoincie REST-owym. Więcej informacji o tym jak korzystać z klienta REST-owego w kodzie JS możesz znaleźć na stronie dokumentacji klienta JS. Tylko uprzedzam, że bywa niekompletna (co spowodowało moje frustracje wyrażone w raporcie z drugiego tygodnia prac).

Sekcja 3Podsumowanie

WordPress REST API jest przydatnym narzędziem do tworzenia aplikacji webowych. Do prostych i mało skomplikowanych zadań przyda się całkiem dobrze, ale jeśli planujesz tworzyć bardziej rozbudowane rozwiązania to warto się przyjrzeć eZ Platform REST API, które zapewnia więcej możliwości.

Dodatkowo, przy korzystaniu z WordPress REST API warto zadbać o cache'owanie zapytań. Bez tego trzeba czasem dość długo czekać na odpowiedź z serwera. Można tego dokonać korzystać z Transient dostępnego w WordPress. Postaram się na ten temat przygotować wpis na blogu.

Udostępnij
Uwagi

O autorze

Staff Software Engineer

Piszę na tym blogu od 2009 roku, a strony i aplikacje webowe tworzę zawodowo od 14 lat. Obecnie w Bishop Fox prowadzę frontend platformy Cosmos, od samego początku projektu. Wcześniej pracowałem m.in. w OLX, KUDO, Auto1 i eZ Systems. Piszę tu o tym, czego nauczyłem się w praktyce: o JavaScripcie, TypeScripcie, Reakcie, CSS-ie i architekturze frontendu. Występowałem też jako prelegent na konferencjach w Polsce i Europie. Masz pytanie albo pomysł na wpis? Daj znać!