Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Wprowadzenie do WP-API

4,588 views

Published on

Prezentacja opisująca teoretyczne i praktyczne podstawy REST API w WordPressie.

Published in: Technology
  • Be the first to comment

Wprowadzenie do WP-API

  1. 1. Wprowadzenie do WP-API Tomasz Dziuda
  2. 2. Tomasz Dziuda Lead Developer @ @dziudek http://dziudek.pl http://dziudek.github.io/wp-links http://dziudek.github.io/dev-links
  3. 3. Disclaimer Będę mówił o WP-API w wersji v.2.* obecnie w wersji beta, ale to najbliższa przyszłość WP-API
  4. 4. Idea
  5. 5. Źródło: https://wordpress.org/plugins/rest-api/
  6. 6. + WP-API
  7. 7. + WP-API GET/POST/PUT/DELETE Opcjonalnie: {“json”: “data”}
  8. 8. GET/POST/PUT/DELETE {“json”: “data”} + WP-API Opcjonalnie: {“json”: “data”}
  9. 9. {“json”: “data”} wp_ajax_{action} wp_ajax_nopriv_{action} + WP-API GET/POST/PUT/DELETE Opcjonalnie: {“json”: “data”}
  10. 10. {“json”: “data”} wp_ajax_{action} wp_ajax_nopriv_{action} + WP-API GET/POST/PUT/DELETE Opcjonalnie: {“json”: “data”}
  11. 11. JSON jako nośnik danych
  12. 12. Wtyczka JSON Viewer: https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh/
  13. 13. Struktura URLi wp-json/
  14. 14. Struktura URLi wp-json/<namespace> wp/v2
  15. 15. Struktura URLi wp-json/<namespace>/<zasób> wp/v2 posts
  16. 16. Struktura URLi wp-json/<namespace>/<zasób>/<id_lub_filtr> wp/v2 posts 128
  17. 17. Struktura URLi wp-json/<namespace>/<zasób>/<id_lub_filtr>/<dodatkowe_zasoby> wp/v2 posts 128 terms/tag
  18. 18. ! " { }Wymaga autoryzacji Nie wymaga autoryzacji Wymaga przesłania danych JSON
  19. 19. GET wp-json/wp/v2/posts/"! ! " { }Wymaga autoryzacji Nie wymaga autoryzacji Wymaga przesłania danych JSON
  20. 20. GET wp-json/wp/v2/posts/ GET wp-json/wp/v2/posts/128 "! "! ! " { }Wymaga autoryzacji Nie wymaga autoryzacji Wymaga przesłania danych JSON
  21. 21. GET wp-json/wp/v2/posts/ GET wp-json/wp/v2/posts/128 POST wp-json/wp/v2/posts/ "! { } "! ! ! " { }Wymaga autoryzacji Nie wymaga autoryzacji Wymaga przesłania danych JSON
  22. 22. GET wp-json/wp/v2/posts/ GET wp-json/wp/v2/posts/128 POST wp-json/wp/v2/posts/ PUT wp-json/wp/v2/posts/128 "! { } "! ! { }! ! " { }Wymaga autoryzacji Nie wymaga autoryzacji Wymaga przesłania danych JSON
  23. 23. GET wp-json/wp/v2/posts/ GET wp-json/wp/v2/posts/128 POST wp-json/wp/v2/posts/ PUT wp-json/wp/v2/posts/128 DELETE wp-json/wp/v2/posts/128 "! { } "! ! { }! ! ! " { }Wymaga autoryzacji Nie wymaga autoryzacji Wymaga przesłania danych JSON
  24. 24. Przykłady
  25. 25. Przykłady wp-json/wp/v2/posts/303 wp-json/wp/v2/posts?filter[cat]=1,2,3 wp-json/wp/v2/posts?filter[posts_per_page]=20 wp-json/terms/category wp-json/users/me
  26. 26. Przykłady wp-json/wp/v2/posts/303 wp-json/wp/v2/posts?filter[cat]=1,2,3 wp-json/wp/v2/posts?filter[posts_per_page]=20 wp-json/terms/category wp-json/users/me
  27. 27. Przykłady wp-json/wp/v2/posts/303 wp-json/wp/v2/posts?filter[cat]=1,2,3 wp-json/wp/v2/posts?filter[posts_per_page]=20 wp-json/terms/category wp-json/users/me
  28. 28. Przykłady wp-json/wp/v2/posts/303 wp-json/wp/v2/posts?filter[cat]=1,2,3 wp-json/wp/v2/posts?filter[posts_per_page]=20 wp-json/wp/v2/terms/category wp-json/wp/v2/users/me
  29. 29. Przykłady wp-json/wp/v2/posts/303 wp-json/wp/v2/posts?filter[cat]=1,2,3 wp-json/wp/v2/posts?filter[posts_per_page]=20 wp-json/wp/v2/terms/category wp-json/wp/v2/users/me
  30. 30. Sposoby autoryzacji
  31. 31. Cookie Auth • Standardowa metoda autoryzacji dla wtyczek i motywów • Wymaga przesłania w zapytaniu AJAX-owym dodatkowego nagłówka X-WP-Nonce
 http://wp-api.org/guides/authentication.html#cookie-authentication
  32. 32. Cookie Auth • Standardowa metoda autoryzacji dla wtyczek i motywów • Wymaga przesłania w zapytaniu AJAX-owym dodatkowego nagłówka X-WP-Nonce
 http://v2.wp-api.org/guide/authentication/
  33. 33. OAuth • Dla aplikacji zewnętrznych - webowych, mobilnych, desktopowych • Wymaga dodatkowego pluginu - OAuth Server
 https://github.com/WP-API/OAuth1 • Wsparcie tylko dla OAuth 1.* • Niestety obecnie nie ma UI do zarządzania kluczami
  34. 34. OAuth • Dla aplikacji zewnętrznych - webowych, mobilnych, desktopowych • Wymaga dodatkowego pluginu - OAuth Server
 https://github.com/WP-API/OAuth1 • Wsparcie tylko dla OAuth 1.* • Niestety obecnie nie ma UI do zarządzania kluczami
  35. 35. OAuth • Dla aplikacji zewnętrznych - webowych, mobilnych, desktopowych • Wymaga dodatkowego pluginu - OAuth Server
 https://github.com/WP-API/OAuth1 • Wsparcie tylko dla OAuth 1.* • Niestety obecnie nie ma UI do zarządzania kluczami
  36. 36. OAuth • Dla aplikacji zewnętrznych - webowych, mobilnych, desktopowych • Wymaga dodatkowego pluginu - OAuth Server
 https://github.com/WP-API/OAuth1 • Wsparcie tylko dla OAuth 1.* • Niestety obecnie nie ma UI do zarządzania kluczami
  37. 37. Basic Auth • Tylko do środowisk testowych, istnieje duże ryzyko wycieku hasła wskutek braku szyfrowania • Wymaga dodatkowej wtyczki: Basic Auth
 https://github.com/WP-API/Basic-Auth
  38. 38. Basic Auth • Tylko do środowisk testowych, istnieje duże ryzyko wycieku hasła wskutek braku szyfrowania • Wymaga dodatkowej wtyczki: Basic Auth
 https://github.com/WP-API/Basic-Auth
  39. 39. Istotne zmiany pomiędzy REST API v.1.* i v.2.*
  40. 40. Przestrzenie nazw
  41. 41. Przestrzenie nazw Nasz motyw lub wtyczka może korzystać z własnej przestrzeni nazw w REST API. Tworzenie nowych endpointów API poprzez register_rest_route wymaga zdefiniowania przestrzeni nazw. Domyślna przestrzeń nazw to wp/v2
  42. 42. Przestrzenie nazw Nasz motyw lub wtyczka może korzystać z własnej przestrzeni nazw w REST API. Tworzenie nowych endpointów API poprzez register_rest_route wymaga zdefiniowania przestrzeni nazw. Domyślna przestrzeń nazw to wp/v2
  43. 43. Przestrzenie nazw Nasz motyw lub wtyczka może korzystać z własnej przestrzeni nazw w REST API. Tworzenie nowych endpointów API poprzez register_rest_route wymaga zdefiniowania przestrzeni nazw. Domyślna przestrzeń nazw to wp/v2
  44. 44. Implementacja HAL Źródło: http://stateless.co/hal_specification.html
  45. 45. Implementacja HAL HAL - Hypertext Application Language Źródło: http://stateless.co/hal_specification.html
  46. 46. Implementacja HAL HAL - Hypertext Application Language Wprowadza dla zasobów kolekcje _links i _embedded Źródło: http://stateless.co/hal_specification.html
  47. 47. Implementacja HAL HAL - Hypertext Application Language Wprowadza dla zasobów kolekcje _links i _embedded _links zawiera adresy powiązanych zasobów _embedded zawiera dane powiązanych zasobów gdy dodamy w URLu &_embed Źródło: http://stateless.co/hal_specification.html
  48. 48. Nowe endpointy wp/v2/comments wp/v2/pages wp/v2/terms wp/v2/types wp/v2/statuses
  49. 49. Możliwości
  50. 50. Motywy jako SPA
  51. 51. Łatwa komunikacja z aplikacjami
  52. 52. Migrowanie danych
  53. 53. Migrowanie danych
  54. 54. Migrowanie danych JSON XML SQL YAML RSS Atom
  55. 55. Migrowanie danych JSON JSON XML SQL YAML RSS Atom
  56. 56. Przetwarzanie danych
  57. 57. Przetwarzanie danych
  58. 58. JSON Przetwarzanie danych
  59. 59. JSON Przetwarzanie danych
  60. 60. Własne endpointy http://v2.wp-api.org/extending/adding/
  61. 61. Filtry i akcje
  62. 62. • Akcja rest_insert_post - pozwala zmodyfikować dane przed dodaniem do bazy • Filtr rest_prepare_{POST_TYPE} - może w niektórych wypadkach zastąpić własne endpointy • Akcja rest_api_init - pozwala dodawać pola i nowe endpointy oraz np. ograniczyć zapytania do określonej puli IP lub zarejestrowanych kluczy
  63. 63. • Akcja rest_insert_post - pozwala zmodyfikować dane przed dodaniem do bazy • Filtr rest_prepare_{POST_TYPE} - może w niektórych wypadkach zastąpić własne endpointy • Akcja rest_api_init - pozwala dodawać pola i nowe endpointy oraz np. ograniczyć zapytania do określonej puli IP lub zarejestrowanych kluczy
  64. 64. • Akcja rest_insert_post - pozwala zmodyfikować dane przed dodaniem do bazy • Filtr rest_prepare_{POST_TYPE} - może w niektórych wypadkach zastąpić własne endpointy • Akcja rest_api_init - pozwala dodawać pola i nowe endpointy oraz np. ograniczyć zapytania do określonej puli IP lub zarejestrowanych kluczy
  65. 65. Kilka ciekawostek
  66. 66. Zmiana URLa REST API Możemy zmienić URL do API (domyślnie wp-json) poprzez filtr: rest_url_prefix
  67. 67. Podstawowe informacje o stronie Pod adresem wp-json/ znajdują się podstawowe dane witryny: • nazwa, • opis, • dostępne przestrzenie nazw, • lista endpointów
  68. 68. Własne metody autoryzacji • Wymagają implementacji z użyciem filtra rest_authentication_errors • Można zaimplementować np. JSON Web Tokens
 http://jwt.io/
  69. 69. Własne metody autoryzacji • Wymagają implementacji z użyciem filtra rest_authentication_errors • Można zaimplementować np. JSON Web Tokens
 http://jwt.io/
  70. 70. Zmiana klasy obsługującej API Korzystając z filtra wp_rest_server_class możemy podmienić klasę WP_REST_Server na własną klasę
  71. 71. REST API a mobilna agenda WordCampa
  72. 72. +
  73. 73. + Raw JSON data
  74. 74. + Raw JSON data
  75. 75. + Raw JSON data speakers.json presentations.json
  76. 76. + Raw JSON data speakers.json presentations.json
  77. 77. JSON ~320kB JSON ~60kB
  78. 78. Motyw jako SPA
  79. 79. Motyw-mapa
  80. 80. Co wykorzystać?
  81. 81. REST API Adresy URL, które wykorzystamy: • wp-json/wp/v2/terms/category/ • wp-json/wp/v2/posts?filter[posts_per_page]=200 • wp-json/wp/v2posts?filter[posts_per_page]=200&filter[cat]=1,2,3
  82. 82. REST API Adresy URL, które wykorzystamy: • wp-json/wp/v2/terms/category/ • wp-json/wp/v2/posts?filter[posts_per_page]=200 • wp-json/wp/v2posts?filter[posts_per_page]=200&filter[cat]=1,2,3
  83. 83. REST API Adresy URL, które wykorzystamy: • wp-json/wp/v2/terms/category/ • wp-json/wp/v2/posts?filter[posts_per_page]=200 • wp-json/wp/v2posts?filter[posts_per_page]=200&filter[cat]=1,2,3
  84. 84. REST API Adresy URL, które wykorzystamy: • wp-json/wp/v2/terms/category/ • wp-json/wp/v2/posts?filter[posts_per_page]=200 • wp-json/wp/v2posts?filter[posts_per_page]=200&filter[cat]=1,2,3
  85. 85. Handlebars http://handlebarsjs.com/ <script id="stats-popup-tmpl" type="text/x-handlebars-template"> <h3 class="stats__header"><?php _e('Znaleziono {{total}} odwiedzonych miejsc', 'theme-map'); ?></h3> <ul class="stats__list"> {{#each stats}} <li class="stats__item"> <strong class="stats__counter{{#if count}} stats__counter--active{{/ if}}">{{count}}</strong> <img src="{{iconsUrl}}{{slug}}.svg" alt="" class="stats__icon" /> {{name}} </li> {{/each}} </ul> </script>
  86. 86. Handlebars http://handlebarsjs.com/ <script id="stats-popup-tmpl" type="text/x-handlebars-template"> <h3 class="stats__header"><?php _e('Znaleziono {{total}} odwiedzonych miejsc', 'theme-map'); ?></h3> <ul class="stats__list"> {{#each stats}} <li class="stats__item"> <strong class="stats__counter{{#if count}} stats__counter--active{{/ if}}">{{count}}</strong> <img src="{{iconsUrl}}{{slug}}.svg" alt="" class="stats__icon" /> {{name}} </li> {{/each}} </ul> </script>
  87. 87. Handlebars http://handlebarsjs.com/ <script id="stats-popup-tmpl" type="text/x-handlebars-template"> <h3 class="stats__header"><?php _e('Znaleziono {{total}} odwiedzonych miejsc', 'theme-map'); ?></h3> <ul class="stats__list"> {{#each stats}} <li class="stats__item"> <strong class="stats__counter{{#if count}} stats__counter--active{{/ if}}">{{count}}</strong> <img src="{{iconsUrl}}{{slug}}.svg" alt="" class="stats__icon" /> {{name}} </li> {{/each}} </ul> </script>
  88. 88. Inne
  89. 89. Inne • Google Maps API - bo musimy mieć jakieś mapy ;)
 https://developers.google.com/maps/documentation/javascript/tutorial • LocalStorage - do przechowywania filtrów • History API - aby mieć dostęp poprzez URL do konkretnych miejsc • Snazzy maps
 https://snazzymaps.com/ • Travel icon set
 http://www.smashingmagazine.com/2014/12/23/freebie-tourism-travel-icon-set-100-icons- png-svg/
  90. 90. Inne • Google Maps API - bo musimy mieć jakieś mapy ;)
 https://developers.google.com/maps/documentation/javascript/tutorial • LocalStorage - do przechowywania filtrów • History API - aby mieć dostęp poprzez URL do konkretnych miejsc • Snazzy maps
 https://snazzymaps.com/ • Travel icon set
 http://www.smashingmagazine.com/2014/12/23/freebie-tourism-travel-icon-set-100-icons- png-svg/
  91. 91. Inne • Google Maps API - bo musimy mieć jakieś mapy ;)
 https://developers.google.com/maps/documentation/javascript/tutorial • LocalStorage - do przechowywania filtrów • History API - aby mieć dostęp poprzez URL do konkretnych miejsc • Snazzy maps
 https://snazzymaps.com/ • Travel icon set
 http://www.smashingmagazine.com/2014/12/23/freebie-tourism-travel-icon-set-100-icons- png-svg/
  92. 92. Inne • Google Maps API - bo musimy mieć jakieś mapy ;)
 https://developers.google.com/maps/documentation/javascript/tutorial • LocalStorage - do przechowywania filtrów • History API - aby mieć dostęp poprzez URL do konkretnych miejsc • Snazzy maps
 https://snazzymaps.com/ • Travel icon set
 http://www.smashingmagazine.com/2014/12/23/freebie-tourism-travel-icon-set-100-icons- png-svg/
  93. 93. Inne • Google Maps API - bo musimy mieć jakieś mapy ;)
 https://developers.google.com/maps/documentation/javascript/tutorial • LocalStorage - do przechowywania filtrów • History API - aby mieć dostęp poprzez URL do konkretnych miejsc • Snazzy maps
 https://snazzymaps.com/ • Travel icon set
 http://www.smashingmagazine.com/2014/12/23/freebie-tourism-travel-icon-set-100-icons- png-svg/
  94. 94. Problemy?
  95. 95. Wprowadzanie pozycji elementów na mapie
  96. 96. Wprowadzanie pozycji elementów na mapie Wtyczka Pronamic Google Maps
 https://wordpress.org/plugins/pronamic-google-maps/
  97. 97. Wprowadzanie pozycji elementów na mapie Advanced Custom Fields
 https://wordpress.org/plugins/advanced-custom-fields/
  98. 98. Duża liczba markerów
  99. 99. Duża liczba markerów • Marker Clusterer
 https://googlemaps.github.io/js-marker-clusterer/docs/examples.html • Gorsze przypadki omówimy później ;)
  100. 100. Wpis
  101. 101. Dane geolokalizacyjne
  102. 102. Kategoria Kategoria
  103. 103. Tagi
  104. 104. Adres
  105. 105. Najważniejsze pliki motywu • index.php - jedyny plik wyświetlający szablon • index-templates.php - przechowuje szablony Handlebars • functions.php - konfiguracja wstępna i wczytywanie plików JS/CSS
  106. 106. Najważniejsze pliki motywu • index.php - jedyny plik wyświetlający szablon • index-templates.php - przechowuje szablony Handlebars • functions.php - konfiguracja wstępna i wczytywanie plików JS/CSS
  107. 107. Najważniejsze pliki motywu • index.php - jedyny plik wyświetlający szablon • index-templates.php - przechowuje szablony Handlebars • functions.php - konfiguracja wstępna i wczytywanie plików JS/CSS
  108. 108. Najważniejsze pliki motywu • index.php - jedyny plik wyświetlający szablon • index-templates.php - przechowuje szablony Handlebars • functions.php - konfiguracja wstępna i wczytywanie plików JS/CSS • tgm.php - do ułatwienia/wymuszenia instalacji potrzebnych wtyczek
  109. 109. Wczytywanie konfiguracji wstępnej z ekranu personalizacji motywu wp_register_script( 'tm-app', get_template_directory_uri() . '/js/app.js', array('jquery', ‘tm-handlebars’) ); $app_config = array( 'URL' => home_url(), 'mapLatitude' => get_theme_mod('map_latitude', '51.919438'), 'mapLongitude' => get_theme_mod('map_longitude', '19.145135'), 'mapZoom' => get_theme_mod('map_zoom', '6'), ); wp_localize_script( 'tm-app', 'appConfig', $app_config );
  110. 110. Wczytywanie konfiguracji wstępnej z ekranu personalizacji motywu wp_register_script( 'tm-app', get_template_directory_uri() . '/js/app.js', array('jquery', ‘tm-handlebars’) ); $app_config = array( 'URL' => home_url(), 'mapLatitude' => get_theme_mod('map_latitude', '51.919438'), 'mapLongitude' => get_theme_mod('map_longitude', '19.145135'), 'mapZoom' => get_theme_mod('map_zoom', '6'), ); wp_localize_script( 'tm-app', 'appConfig', $app_config );
  111. 111. Wczytywanie konfiguracji wstępnej z ekranu personalizacji motywu wp_register_script( 'tm-app', get_template_directory_uri() . '/js/app.js', array('jquery', ‘tm-handlebars’) ); $app_config = array( 'URL' => home_url(), 'mapLatitude' => get_theme_mod('map_latitude', '51.919438'), 'mapLongitude' => get_theme_mod('map_longitude', '19.145135'), 'mapZoom' => get_theme_mod('map_zoom', '6'), ); wp_localize_script( 'tm-app', 'appConfig', $app_config );
  112. 112. Pobieranie danych $.ajax({ url: apiUrl + “posts?filter[posts_per_page]=200" }).done(function( data ) { // przetwarzanie danych });
  113. 113. Pobieranie danych $.ajax({ url: apiUrl + “posts?filter[posts_per_page]=200" }).done(function( data ) { // przetwarzanie danych });
  114. 114. Pobieranie danych $.ajax({ url: apiUrl + “posts?filter[posts_per_page]=200" }).done(function( data ) { // przetwarzanie danych });
  115. 115. Pobieranie danych $.ajax({ method: ‘GET’, url: apiUrl + “posts?filter[posts_per_page]=200" }).done(function( data ) { // przetwarzanie danych });
  116. 116. Pobieranie danych $.ajax({ method: ‘GET’, cache: false, url: apiUrl + “posts?filter[posts_per_page]=200" }).done(function( data ) { // przetwarzanie danych });
  117. 117. Usuwanie/modyfikowanie pól z odpowiedzi REST API jest NIEBEZPIECZNE Lepiej stworzyć własne zoptymalizowane endpointy w przestrzeni nazw motywu lub dodać brakujące pola
  118. 118. W wypadku dodawana własnych pól, warto dodać im prefiksy celem uniknięcia konfliktów z innymi wtyczkami i motywami modyfikującymi odpowiedzi API np. tm_geodata
  119. 119. Dodawanie danych do wpisu function PREFIX_register_FIELD_NAME() { register_api_field('TYPE', ‘PREFIX_FIELD_NAME', array( 'get_callback' => 'PREFIX_get_FIELD_NAME', 'update_callback' => null, 'schema' => null ) ); } add_action('rest_api_init', ‘PREFIX_register_FIELD_NAME');
  120. 120. Dodawanie danych do wpisu function PREFIX_register_FIELD_NAME() { register_api_field('TYPE', ‘PREFIX_FIELD_NAME', array( 'get_callback' => 'PREFIX_get_FIELD_NAME', 'update_callback' => null, 'schema' => null ) ); } add_action('rest_api_init', ‘PREFIX_register_FIELD_NAME');
  121. 121. Dodawanie danych do wpisu function PREFIX_register_FIELD_NAME() { register_api_field('TYPE', ‘PREFIX_FIELD_NAME', array( 'get_callback' => 'PREFIX_get_FIELD_NAME', 'update_callback' => null, 'schema' => null ) ); } add_action('rest_api_init', ‘PREFIX_register_FIELD_NAME');
  122. 122. Dodawanie danych do wpisu function PREFIX_register_FIELD_NAME() { register_api_field('TYPE', ‘PREFIX_FIELD_NAME', array( 'get_callback' => 'PREFIX_get_FIELD_NAME', 'update_callback' => null, 'schema' => null ) ); } add_action('rest_api_init', ‘PREFIX_register_FIELD_NAME');
  123. 123. Dodawanie danych do wpisu function tm_register_category() { register_api_field( 'post', 'tm_category', array( 'get_callback' => 'tm_get_category', 'update_callback' => null, 'schema' => null ) ); } add_action( 'rest_api_init', 'tm_register_category');
  124. 124. function tm_get_category( $object, $field_name, $request ) { $category_slug = null; $categories = get_the_category($object['id']); if(count($categories)) { $category_slug = $categories[0]->slug; } return $category_slug; } Dodawanie danych do wpisu
  125. 125. Co dalej?
  126. 126. 1 wpis = 2-5kB 100 wpisów = ~200-500kB
  127. 127. 1 wpis = 2-5kB 100 wpisów = ~200-500kB
  128. 128. Dla większej liczby markerów • Utworzenie własnych end-pointów do serwowania danych markerów: • ID, • Dane geolokalizacyjne • Kategoria • Reszta danych wczytywana po kliknięciu popupa poprzez wp-json/posts/<id>
  129. 129. Dla większej liczby markerów • Utworzenie własnych end-pointów do serwowania danych markerów: • ID, • Dane geolokalizacyjne • Kategoria • Reszta danych wczytywana po kliknięciu popupa poprzez wp-json/posts/<id>
  130. 130. Dla większej liczby markerów • Utworzenie własnych end-pointów do serwowania danych markerów: • ID, • Dane geolokalizacyjne • Kategoria • Reszta danych wczytywana po kliknięciu popupa poprzez wp-json/wp/v2/posts/<id>
  131. 131. Gdy mamy bardzo dużo markerów • Wczytywanie markerów zależnie od widocznego obszaru mapy • Przygotowanie end-pointu, który na bazie zakresu szerokości i długości geograficznej zwróci listę markerów na danym obszarze
  132. 132. Gdy mamy bardzo dużo markerów • Wczytywanie markerów zależnie od widocznego obszaru mapy • Przygotowanie endpointu, który na bazie zakresu szerokości i długości geograficznej zwróci listę markerów na danym obszarze
  133. 133. Kod przykładu: https://github.com/dziudek/theme-map
  134. 134. Podsumowanie
  135. 135. Podsumowanie • REST API tworzy zupełnie nowe obszary wykorzystania wtyczek i motywów • REST API jest bardzo skalowalne i edytowalne • Trzeba pamiętać, że nie tylko my będziemy korzystać z REST API na danej instalacji WP
  136. 136. Podsumowanie • REST API tworzy zupełnie nowe obszary wykorzystania wtyczek i motywów • REST API jest bardzo skalowalne i edytowalne • Trzeba pamiętać, że nie tylko my będziemy korzystać z REST API na danej instalacji WP
  137. 137. Podsumowanie • REST API tworzy zupełnie nowe obszary wykorzystania wtyczek i motywów • REST API jest bardzo skalowalne i edytowalne • Trzeba pamiętać, że nie tylko my będziemy korzystać z REST API na danej instalacji WP
  138. 138. Pytania?

×