{"id":2883,"date":"2025-04-13T14:27:00","date_gmt":"2025-04-13T13:27:00","guid":{"rendered":"https:\/\/wlc.team\/?p=2883"},"modified":"2025-04-13T14:27:00","modified_gmt":"2025-04-13T13:27:00","slug":"jak-zbudowac-wlasne-api-w-woocommerce","status":"publish","type":"post","link":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/","title":{"rendered":"Jak zbudowa\u0107 w\u0142asne API w WooCommerce?"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Zanim napiszesz linijk\u0119 kodu, sprawd\u017a, czy musisz. <strong>WooCommerce ma pe\u0142ne REST API obejmuj\u0105ce produkty, zam\u00f3wienia, klient\u00f3w, kupony i raporty, wraz z zarz\u0105dzaniem kluczami w panelu administracyjnym.<\/strong> Do podpi\u0119cia CRM-u, przewo\u017anika czy systemu magazynowego to zwykle ca\u0142a odpowied\u017a. Dla bardziej z\u0142o\u017conej granicy integracji zobacz, <a href=\"https:\/\/wlc.team\/pl\/blog\/jakie-api-sa-niezbedne-w-integracji-oprogramowania-igaming\/\" target=\"_blank\" rel=\"noopener\">jakie API s\u0105 niezb\u0119dne w integracji oprogramowania iGaming<\/a>. W\u0142asny endpoint warto zbudowa\u0107 wtedy, gdy potrzebujesz logiki biznesowej, kt\u00f3rej wbudowane API nie wyra\u017ca, odpowiedzi przygotowanej pod konkretnego odbiorc\u0119 albo agregacji, kt\u00f3ra inaczej wymaga\u0142aby kilku zapyta\u0144. Poni\u017cej obie \u015bcie\u017cki: kiedy wystarczy to, co ju\u017c jest, i jak zbudowa\u0107 w\u0142asne API, kt\u00f3re przejdzie przegl\u0105d bezpiecze\u0144stwa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zacznij od wbudowanego API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WooCommerce udost\u0119pnia REST API pod adresem <code>\/wp-json\/wc\/v3\/<\/code>. Klucze generuje si\u0119 w panelu, w sekcji WooCommerce \u2192 Ustawienia \u2192 Zaawansowane \u2192 REST API, przypisane do konkretnego u\u017cytkownika, z uprawnieniem do odczytu albo odczytu i zapisu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dwa wymagania bywaj\u0105 przeoczone: bezpo\u015brednie odno\u015bniki musz\u0105 by\u0107 ustawione na cokolwiek innego ni\u017c domy\u015blne, a po\u0142\u0105czenie musi dzia\u0142a\u0107 po HTTPS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Co ju\u017c jest obs\u0142u\u017cone:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>produkty, warianty, kategorie, atrybuty<\/li>\n\n\n\n<li>zam\u00f3wienia, zwroty, notatki do zam\u00f3wie\u0144<\/li>\n\n\n\n<li>klienci, kupony, raporty<\/li>\n\n\n\n<li>webhooki do integracji zdarzeniowych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli Twoja integracja da si\u0119 wyrazi\u0107 w tych poj\u0119ciach, na tym mo\u017cna poprzesta\u0107. W\u0142asny endpoint to endpoint, kt\u00f3ry utrzymujesz, zabezpieczasz i dokumentujesz przez ca\u0142y okres \u017cycia sklepu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kiedy w\u0142asny endpoint si\u0119 op\u0142aca<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Warto go napisa\u0107, gdy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>liczy si\u0119 kszta\u0142t odpowiedzi.<\/strong> Aplikacja mobilna potrzebuj\u0105ca o\u015bmiu p\u00f3l nie powinna pobiera\u0107 pe\u0142nych danych produktu przy ka\u017cdym \u017c\u0105daniu.<\/li>\n\n\n\n<li><strong>mi\u0119dzy danymi a odpowiedzi\u0105 le\u017cy logika biznesowa.<\/strong> Ceny progowe dla grup klient\u00f3w, dost\u0119pno\u015b\u0107 liczona z wielu magazyn\u00f3w, weryfikacja uprawnie\u0144.<\/li>\n\n\n\n<li><strong>agregujesz.<\/strong> Jedno \u017c\u0105danie zamiast czterech.<\/li>\n\n\n\n<li><strong>kontrakt narzuca system zewn\u0119trzny<\/strong> i musisz si\u0119 do niego dostosowa\u0107, a nie go definiowa\u0107.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Rejestracja endpointu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kod trzymaj we w\u0142asnej wtyczce, nie w motywie. Zmiana motywu nie powinna nigdy wy\u0142\u0105cza\u0107 integracji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/**\n * Plugin Name: Shop API\n * Description: W\u0142asne endpointy REST dla sklepu.\n * Version:     1.0.0\n *\/\n\nif ( ! defined( 'ABSPATH' ) ) {\n    exit;\n}\n\nadd_action( 'rest_api_init', function () {\n    register_rest_route( 'my-shop\/v1', '\/products\/featured', array(\n        'methods'             =&gt; WP_REST_Server::READABLE,\n        'callback'            =&gt; 'shop_api_get_featured_products',\n        'permission_callback' =&gt; 'shop_api_permission_check',\n        'args'                =&gt; array(\n            'per_page' =&gt; array(\n                'type'              =&gt; 'integer',\n                'default'           =&gt; 10,\n                'minimum'           =&gt; 1,\n                'maximum'           =&gt; 100,\n                'sanitize_callback' =&gt; 'absint',\n            ),\n            'page'     =&gt; array(\n                'type'              =&gt; 'integer',\n                'default'           =&gt; 1,\n                'minimum'           =&gt; 1,\n                'sanitize_callback' =&gt; 'absint',\n            ),\n        ),\n    ) );\n} );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dwie rzeczy s\u0105 tu istotne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Schemat <code>args<\/code> wykonuje walidacj\u0119 za Ciebie.<\/strong> Zadeklarowanie typ\u00f3w, zakres\u00f3w i funkcji oczyszczaj\u0105cych sprawia, \u017ce WordPress odrzuca b\u0142\u0119dne dane, zanim uruchomi Twoj\u0105 funkcj\u0119, i zwraca poprawnie sformu\u0142owany b\u0142\u0105d. R\u0119cznie pisane warunki wewn\u0105trz funkcji to miejsce, w kt\u00f3rym powstaj\u0105 luki w walidacji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>permission_callback<\/code> nigdy nie jest opcjonalne i nigdy nie zwraca <code>true<\/code>.<\/strong> WordPress zg\u0142asza ostrze\u017cenie, gdy go brakuje, a endpoint zwracaj\u0105cy <code>true<\/code> jest endpointem otwartym. Je\u015bli kusi Ci\u0119 ustawienie <code>true<\/code> \u201ena razie&#8221;, ustaw <code>__return_false<\/code> i doprowad\u017a uwierzytelnianie do dzia\u0142ania, zanim zajmiesz si\u0119 reszt\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Uwierzytelnianie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do komunikacji mi\u0119dzy serwerami korzystaj z mechanizm\u00f3w, kt\u00f3re WordPress i WooCommerce ju\u017c maj\u0105: kluczy API WooCommerce albo hase\u0142 aplikacji WordPressa dla w\u0142asnych przestrzeni nazw. Jedne i drugie s\u0105 zarz\u0105dzane w panelu, odwo\u0142ywalne i powi\u0105zane z u\u017cytkownikiem, kt\u00f3rego uprawnienia kontrolujesz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tam, gdzie wsp\u00f3lny sekret jest faktycznie w\u0142a\u015bciwym rozwi\u0105zaniem, obowi\u0105zuj\u0105 trzy zasady.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function shop_api_permission_check( WP_REST_Request $request ) {\n\n    \/\/ Zalogowany u\u017cytkownik WordPressa z odpowiednim uprawnieniem.\n    if ( current_user_can( 'manage_woocommerce' ) ) {\n        return true;\n    }\n\n    \/\/ Wsp\u00f3lny sekret do komunikacji mi\u0119dzy serwerami. Zdefiniowany w wp-config.php\n    \/\/ albo w zmiennej \u015brodowiskowej, nigdy w tym pliku i nigdy w repozytorium.\n    $expected = defined( 'SHOP_API_SECRET' ) ? SHOP_API_SECRET : '';\n    $provided = $request-&gt;get_header( 'x-shop-api-secret' );\n\n    if ( '' !== $expected &amp;&amp; is_string( $provided ) &amp;&amp; hash_equals( $expected, $provided ) ) {\n        return true;\n    }\n\n    return new WP_Error(\n        'shop_api_forbidden',\n        __( 'Wymagane uwierzytelnienie.', 'shop-api' ),\n        array( 'status' =&gt; rest_authorization_required_code() )\n    );\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sekret mieszka poza kodem.<\/strong> W pliku <code>wp-config.php<\/code> albo w zmiennej \u015brodowiskowej. Dane uwierzytelniaj\u0105ce wpisane do pliku wtyczki trafiaj\u0105 do repozytorium, do ka\u017cdej kopii zapasowej i do ka\u017cdej kopii serwisu, jak\u0105 ktokolwiek kiedykolwiek wykona\u0142.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Por\u00f3wnuj przez <code>hash_equals()<\/code>, nie przez <code>!==<\/code>.<\/strong> Zwyk\u0142e por\u00f3wnanie \u0142a\u0144cuch\u00f3w ko\u0144czy si\u0119 w chwili napotkania pierwszej r\u00f3\u017cnicy, a ta r\u00f3\u017cnica czasowa jest mierzalna przy odpowiedniej liczbie \u017c\u0105da\u0144. <code>hash_equals()<\/code> por\u00f3wnuje w sta\u0142ym czasie. To najcz\u0119\u015bciej pomijana linijka w kodzie API dla WordPressa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nag\u0142\u00f3wki czytaj przez <code>$request-&gt;get_header()<\/code>.<\/strong> Funkcja normalizuje nazwy nag\u0142\u00f3wk\u00f3w i trzyma Ci\u0119 z dala od <code>$_SERVER<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zwr\u00f3\u0107 uwag\u0119 na kolejno\u015b\u0107 sprawdze\u0144. Samo sprawdzenie uprawnie\u0144 nie uwierzytelni komunikacji mi\u0119dzy serwerami, bo w takim \u017c\u0105daniu nie ma zalogowanego u\u017cytkownika. Uwierzytelnianie i autoryzacja to dwa osobne kroki: najpierw ustalasz, kto dzwoni, potem co mu wolno.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poza tym: wy\u0142\u0105cznie HTTPS, najw\u0119\u017csze uprawnienie, kt\u00f3re wystarcza, ograniczanie liczby \u017c\u0105da\u0144 oraz logowanie nieudanych pr\u00f3b uwierzytelnienia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funkcja obs\u0142uguj\u0105ca \u017c\u0105danie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function shop_api_get_featured_products( WP_REST_Request $request ) {\n\n    $products = wc_get_products( array(\n        'status'   =&gt; 'publish',\n        'featured' =&gt; true,\n        'limit'    =&gt; $request&#91;'per_page'],\n        'page'     =&gt; $request&#91;'page'],\n    ) );\n\n    $data = array();\n\n    foreach ( $products as $product ) {\n        $data&#91;] = array(\n            'id'            =&gt; $product-&gt;get_id(),\n            'name'          =&gt; $product-&gt;get_name(),\n            'price'         =&gt; wc_format_decimal( $product-&gt;get_price() ),\n            'regular_price' =&gt; wc_format_decimal( $product-&gt;get_regular_price() ),\n            'sale_price'    =&gt; wc_format_decimal( $product-&gt;get_sale_price() ),\n            'image'         =&gt; wp_get_attachment_url( $product-&gt;get_image_id() ),\n            'permalink'     =&gt; get_permalink( $product-&gt;get_id() ),\n        );\n    }\n\n    return rest_ensure_response( array( 'products' =&gt; $data ) );\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poniewa\u017c schemat ju\u017c zwalidowa\u0142 i oczy\u015bci\u0142 parametry, funkcja pozostaje czytelna. <code>wc_format_decimal()<\/code> utrzymuje sp\u00f3jny format cen niezale\u017cnie od tego, co konsumuje odpowied\u017a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Je\u015bli endpoint dotyka zam\u00f3wie\u0144, korzystaj z warstwy CRUD.<\/strong> <code>wc_get_order()<\/code> i <code>wc_get_orders()<\/code>, nigdy <code>get_post()<\/code> ani <code>get_post_meta()<\/code> na identyfikatorach zam\u00f3wie\u0144. Przy w\u0142\u0105czonym wydajnym przechowywaniu zam\u00f3wie\u0144 dane nie le\u017c\u0105 ju\u017c w tabelach wpis\u00f3w, wi\u0119c kod odczytuj\u0105cy je bezpo\u015brednio zwraca pustk\u0119 albo dane nieaktualne. Pe\u0142ny obraz tego, co i gdzie le\u017cy, znajdziesz w tek\u015bcie <a href=\"https:\/\/wlc.team\/pl\/blog\/gdzie-woocommerce-przechowuje-dane\/\" target=\"_blank\" rel=\"noopener\">gdzie WooCommerce przechowuje dane<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dane osobowe<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Endpoint zwracaj\u0105cy dane klient\u00f3w albo zam\u00f3wie\u0144 wyprowadza dane osobowe poza sklep. To wprowadza do gry RODO: podstaw\u0119 prawn\u0105 przekazania, umow\u0119 powierzenia z odbiorc\u0105 i ustalenie, jak d\u0142ugo odbiorca te dane przechowuje.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce przek\u0142ada si\u0119 to na projekt. Zwracaj minimum tego, czego odbiorca faktycznie potrzebuje, trzymaj endpointy z danymi klient\u00f3w w osobnej przestrzeni nazw z w\u0119\u017cszym sprawdzeniem uprawnie\u0144 i loguj dost\u0119p.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cache<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cache&#8217;uj dane, nie obiekt odpowiedzi, i wy\u0142\u0105cznie te endpointy, kt\u00f3re zwracaj\u0105 to samo ka\u017cdemu odpytuj\u0105cemu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function shop_api_get_featured_products( WP_REST_Request $request ) {\n\n    $cache_key = 'shop_api_featured_' . md5( wp_json_encode( $request-&gt;get_params() ) );\n    $data      = get_transient( $cache_key );\n\n    if ( false === $data ) {\n        $data = shop_api_build_featured_payload( $request );\n        set_transient( $cache_key, $data, HOUR_IN_SECONDS );\n    }\n\n    return rest_ensure_response( $data );\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nigdy nie cache&#8217;uj odpowiedzi zale\u017cnej od odpytuj\u0105cego pod kluczem, kt\u00f3ry go nie uwzgl\u0119dnia. Klucz oparty wy\u0142\u0105cznie na parametrach \u017c\u0105dania poda dane jednego klienta drugiemu w chwili, gdy zastosujesz go do endpointu wymagaj\u0105cego uwierzytelnienia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CORS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli Tw\u00f3j endpoint wywo\u0142uje aplikacja przegl\u0105darkowa z innej domeny, potrzebujesz nag\u0142\u00f3wk\u00f3w CORS. Ogranicz je do swojej przestrzeni nazw i do znanych \u017ar\u00f3de\u0142.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'rest_pre_serve_request', function ( $served, $result, $request ) {\n\n    if ( 0 !== strpos( $request-&gt;get_route(), '\/my-shop\/v1' ) ) {\n        return $served;\n    }\n\n    $allowed = array( 'https:\/\/app.example.com' );\n    $origin  = get_http_origin();\n\n    if ( $origin &amp;&amp; in_array( $origin, $allowed, true ) ) {\n        header( 'Access-Control-Allow-Origin: ' . esc_url_raw( $origin ) );\n        header( 'Vary: Origin' );\n    }\n\n    return $served;\n}, 10, 3 );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dw\u00f3ch rzeczy nale\u017cy unika\u0107. <strong>Nie wysy\u0142aj <code>Access-Control-Allow-Origin: *<\/code> razem z <code>Access-Control-Allow-Credentials: true<\/code>.<\/strong> Przegl\u0105darki odrzucaj\u0105 t\u0119 kombinacj\u0119, a intencja, kt\u00f3ra za ni\u0105 stoi, jest dok\u0142adnie tym, przed czym CORS ma chroni\u0107. <strong>Nie usuwaj globalnie w\u0142asnego filtru CORS WordPressa<\/strong>, \u017ceby rozwi\u0105za\u0107 problem na jednej trasie. To zmienia zachowanie ca\u0142ego REST API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testowanie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Postman albo Insomnia, na \u015brodowisku testowym, nigdy na produkcji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Testuj \u015bcie\u017cki b\u0142\u0119du, nie tylko t\u0119 dzia\u0142aj\u0105c\u0105: brak sekretu, b\u0142\u0119dny sekret, parametry poza zakresem, nieznana trasa. Sprawd\u017a, czy kody odpowiedzi s\u0105 takie, na kt\u00f3rych odbiorca mo\u017ce si\u0119 oprze\u0107.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>200 sukces<\/li>\n\n\n\n<li>400 b\u0142\u0119dne \u017c\u0105danie, nieprawid\u0142owe parametry<\/li>\n\n\n\n<li>401 brak uwierzytelnienia<\/li>\n\n\n\n<li>403 uwierzytelniony, ale bez uprawnie\u0144<\/li>\n\n\n\n<li>404 nie znaleziono<\/li>\n\n\n\n<li>429 przekroczony limit \u017c\u0105da\u0144<\/li>\n\n\n\n<li>500 b\u0142\u0105d serwera<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Query Monitor pokazuje, ile zapyta\u0144 generuje ka\u017cde \u017c\u0105danie. Endpoint, kt\u00f3ry wygl\u0105da szybko przy dziesi\u0119ciu produktach, przy dziesi\u0119ciu tysi\u0105cach cz\u0119sto ju\u017c nie jest.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zanim trafi na produkcj\u0119<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sekret przechowywany poza kodem, wymienialny bez wdro\u017cenia<\/li>\n\n\n\n<li><code>permission_callback<\/code> na ka\u017cdej trasie, sprawdzone \u017c\u0105daniem, kt\u00f3re ma si\u0119 nie uda\u0107<\/li>\n\n\n\n<li>wymuszone HTTPS<\/li>\n\n\n\n<li>ograniczanie liczby \u017c\u0105da\u0144<\/li>\n\n\n\n<li>logowanie i monitoring nieudanych pr\u00f3b uwierzytelnienia<\/li>\n\n\n\n<li>wersjonowana przestrze\u0144 nazw, \u017ceby da\u0142o si\u0119 zmieni\u0107 kontrakt bez psucia odbiorc\u00f3w<\/li>\n\n\n\n<li>spisana dokumentacja, cho\u0107by jednostronicowa: trasy, parametry, kody b\u0142\u0119d\u00f3w<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">API nie jest zadaniem jednorazowym. To kontrakt, kt\u00f3ry utrzymujesz tak d\u0142ugo, jak d\u0142ugo co\u015b od niego zale\u017cy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli budujesz integracje przenosz\u0105ce dane zam\u00f3wie\u0144 albo klient\u00f3w, <a href=\"https:\/\/wlc.team\/pl\/audyty-techniczne\/\" data-type=\"page\" data-id=\"1976\">audyt bezpiecze\u0144stwa<\/a> przed uruchomieniem kosztuje niepor\u00f3wnanie mniej ni\u017c incydent po nim.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zanim napiszesz linijk\u0119 kodu, sprawd\u017a, czy musisz. WooCommerce ma pe\u0142ne REST API obejmuj\u0105ce produkty, zam\u00f3wienia, klient\u00f3w, kupony i raporty, wraz z zarz\u0105dzaniem kluczami w panelu administracyjnym. Do podpi\u0119cia CRM-u, przewo\u017anika czy systemu magazynowego to zwykle ca\u0142a odpowied\u017a. Dla bardziej z\u0142o\u017conej granicy integracji zobacz, jakie API s\u0105 niezb\u0119dne w integracji oprogramowania iGaming. W\u0142asny endpoint warto zbudowa\u0107 [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":2882,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"wlc_update_modified":false,"wlc_modified_date":"","footnotes":""},"categories":[10],"tags":[],"class_list":["post-2883","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bez-kategorii"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Jak zbudowa\u0107 w\u0142asne API w WooCommerce? - WLC<\/title>\n<meta name=\"description\" content=\"Wi\u0119kszo\u015b\u0107 integracji nie wymaga w\u0142asnego endpointu. Sprawd\u017a, kiedy wystarczy wbudowane REST API WooCommerce, a kiedy i jak zbudowa\u0107 w\u0142asne bez luk.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jak zbudowa\u0107 w\u0142asne API w WooCommerce? - WLC\" \/>\n<meta property=\"og:description\" content=\"Wi\u0119kszo\u015b\u0107 integracji nie wymaga w\u0142asnego endpointu. Sprawd\u017a, kiedy wystarczy wbudowane REST API WooCommerce, a kiedy i jak zbudowa\u0107 w\u0142asne bez luk.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/\" \/>\n<meta property=\"og:site_name\" content=\"WLC\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-13T13:27:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wlc.team\/app\/uploads\/2025\/04\/How-do-I-create-an-API-in-WooCommerce.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"520\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Pawe\u0142 Zmys\u0142owski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pawe\u0142 Zmys\u0142owski\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/\"},\"author\":{\"name\":\"Pawe\u0142 Zmys\u0142owski\",\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/#\\\/schema\\\/person\\\/c2bcfdeef992bd8742ca5b346bc40dcc\"},\"headline\":\"Jak zbudowa\u0107 w\u0142asne API w WooCommerce?\",\"datePublished\":\"2025-04-13T13:27:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/\"},\"wordCount\":1168,\"publisher\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wlc.team\\\/app\\\/uploads\\\/2025\\\/04\\\/How-do-I-create-an-API-in-WooCommerce.png\",\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/\",\"url\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/\",\"name\":\"Jak zbudowa\u0107 w\u0142asne API w WooCommerce? - WLC\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wlc.team\\\/app\\\/uploads\\\/2025\\\/04\\\/How-do-I-create-an-API-in-WooCommerce.png\",\"datePublished\":\"2025-04-13T13:27:00+00:00\",\"description\":\"Wi\u0119kszo\u015b\u0107 integracji nie wymaga w\u0142asnego endpointu. Sprawd\u017a, kiedy wystarczy wbudowane REST API WooCommerce, a kiedy i jak zbudowa\u0107 w\u0142asne bez luk.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/#primaryimage\",\"url\":\"https:\\\/\\\/wlc.team\\\/app\\\/uploads\\\/2025\\\/04\\\/How-do-I-create-an-API-in-WooCommerce.png\",\"contentUrl\":\"https:\\\/\\\/wlc.team\\\/app\\\/uploads\\\/2025\\\/04\\\/How-do-I-create-an-API-in-WooCommerce.png\",\"width\":1280,\"height\":520,\"caption\":\"How do I create an API in WooCommerce\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/blog\\\/jak-zbudowac-wlasne-api-w-woocommerce\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wlc.team\\\/pl\\\/agencja-wordpress-development-wlc\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jak zbudowa\u0107 w\u0142asne API w WooCommerce?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/#website\",\"url\":\"https:\\\/\\\/wlc.team\\\/pl\\\/\",\"name\":\"WLC\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wlc.team\\\/pl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/#organization\",\"name\":\"WLC\",\"url\":\"https:\\\/\\\/wlc.team\\\/pl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/wlc.team\\\/app\\\/uploads\\\/2026\\\/05\\\/logo-WLC.svg\",\"contentUrl\":\"https:\\\/\\\/wlc.team\\\/app\\\/uploads\\\/2026\\\/05\\\/logo-WLC.svg\",\"caption\":\"WLC\"},\"image\":{\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/wlc.team\\\/pl\\\/#\\\/schema\\\/person\\\/c2bcfdeef992bd8742ca5b346bc40dcc\",\"name\":\"Pawe\u0142 Zmys\u0142owski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6ee44112f45966811b27bcb16cea8224ce2e414b42387f5bd64f10cd729b310c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6ee44112f45966811b27bcb16cea8224ce2e414b42387f5bd64f10cd729b310c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6ee44112f45966811b27bcb16cea8224ce2e414b42387f5bd64f10cd729b310c?s=96&d=mm&r=g\",\"caption\":\"Pawe\u0142 Zmys\u0142owski\"},\"description\":\"Started his career as a founder of a local ISP company during his student times, next became a founder and president of one of the leading Polish online photo laboratories delivering photo prints, highly recognized in the professional photographers community due to the focus on the highest quality of services and customer care. At White Label Coders responsible for the sales process and sales team, still involved in the analytical and advisory roles in case of more complex projects.\",\"url\":\"https:\\\/\\\/wlc.team\\\/pl\\\/author\\\/pawel-zmyslowski\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Jak zbudowa\u0107 w\u0142asne API w WooCommerce? - WLC","description":"Wi\u0119kszo\u015b\u0107 integracji nie wymaga w\u0142asnego endpointu. Sprawd\u017a, kiedy wystarczy wbudowane REST API WooCommerce, a kiedy i jak zbudowa\u0107 w\u0142asne bez luk.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/","og_locale":"pl_PL","og_type":"article","og_title":"Jak zbudowa\u0107 w\u0142asne API w WooCommerce? - WLC","og_description":"Wi\u0119kszo\u015b\u0107 integracji nie wymaga w\u0142asnego endpointu. Sprawd\u017a, kiedy wystarczy wbudowane REST API WooCommerce, a kiedy i jak zbudowa\u0107 w\u0142asne bez luk.","og_url":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/","og_site_name":"WLC","article_published_time":"2025-04-13T13:27:00+00:00","og_image":[{"width":1280,"height":520,"url":"https:\/\/wlc.team\/app\/uploads\/2025\/04\/How-do-I-create-an-API-in-WooCommerce.png","type":"image\/png"}],"author":"Pawe\u0142 Zmys\u0142owski","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Pawe\u0142 Zmys\u0142owski","Est. reading time":"5 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/#article","isPartOf":{"@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/"},"author":{"name":"Pawe\u0142 Zmys\u0142owski","@id":"https:\/\/wlc.team\/pl\/#\/schema\/person\/c2bcfdeef992bd8742ca5b346bc40dcc"},"headline":"Jak zbudowa\u0107 w\u0142asne API w WooCommerce?","datePublished":"2025-04-13T13:27:00+00:00","mainEntityOfPage":{"@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/"},"wordCount":1168,"publisher":{"@id":"https:\/\/wlc.team\/pl\/#organization"},"image":{"@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/#primaryimage"},"thumbnailUrl":"https:\/\/wlc.team\/app\/uploads\/2025\/04\/How-do-I-create-an-API-in-WooCommerce.png","inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/","url":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/","name":"Jak zbudowa\u0107 w\u0142asne API w WooCommerce? - WLC","isPartOf":{"@id":"https:\/\/wlc.team\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/#primaryimage"},"image":{"@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/#primaryimage"},"thumbnailUrl":"https:\/\/wlc.team\/app\/uploads\/2025\/04\/How-do-I-create-an-API-in-WooCommerce.png","datePublished":"2025-04-13T13:27:00+00:00","description":"Wi\u0119kszo\u015b\u0107 integracji nie wymaga w\u0142asnego endpointu. Sprawd\u017a, kiedy wystarczy wbudowane REST API WooCommerce, a kiedy i jak zbudowa\u0107 w\u0142asne bez luk.","breadcrumb":{"@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/#primaryimage","url":"https:\/\/wlc.team\/app\/uploads\/2025\/04\/How-do-I-create-an-API-in-WooCommerce.png","contentUrl":"https:\/\/wlc.team\/app\/uploads\/2025\/04\/How-do-I-create-an-API-in-WooCommerce.png","width":1280,"height":520,"caption":"How do I create an API in WooCommerce"},{"@type":"BreadcrumbList","@id":"https:\/\/wlc.team\/pl\/blog\/jak-zbudowac-wlasne-api-w-woocommerce\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wlc.team\/pl\/agencja-wordpress-development-wlc\/"},{"@type":"ListItem","position":2,"name":"Jak zbudowa\u0107 w\u0142asne API w WooCommerce?"}]},{"@type":"WebSite","@id":"https:\/\/wlc.team\/pl\/#website","url":"https:\/\/wlc.team\/pl\/","name":"WLC","description":"","publisher":{"@id":"https:\/\/wlc.team\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wlc.team\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/wlc.team\/pl\/#organization","name":"WLC","url":"https:\/\/wlc.team\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/wlc.team\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/wlc.team\/app\/uploads\/2026\/05\/logo-WLC.svg","contentUrl":"https:\/\/wlc.team\/app\/uploads\/2026\/05\/logo-WLC.svg","caption":"WLC"},"image":{"@id":"https:\/\/wlc.team\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/wlc.team\/pl\/#\/schema\/person\/c2bcfdeef992bd8742ca5b346bc40dcc","name":"Pawe\u0142 Zmys\u0142owski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/secure.gravatar.com\/avatar\/6ee44112f45966811b27bcb16cea8224ce2e414b42387f5bd64f10cd729b310c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/6ee44112f45966811b27bcb16cea8224ce2e414b42387f5bd64f10cd729b310c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6ee44112f45966811b27bcb16cea8224ce2e414b42387f5bd64f10cd729b310c?s=96&d=mm&r=g","caption":"Pawe\u0142 Zmys\u0142owski"},"description":"Started his career as a founder of a local ISP company during his student times, next became a founder and president of one of the leading Polish online photo laboratories delivering photo prints, highly recognized in the professional photographers community due to the focus on the highest quality of services and customer care. At White Label Coders responsible for the sales process and sales team, still involved in the analytical and advisory roles in case of more complex projects.","url":"https:\/\/wlc.team\/pl\/author\/pawel-zmyslowski\/"}]}},"_links":{"self":[{"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/posts\/2883","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/comments?post=2883"}],"version-history":[{"count":3,"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/posts\/2883\/revisions"}],"predecessor-version":[{"id":2886,"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/posts\/2883\/revisions\/2886"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/media\/2882"}],"wp:attachment":[{"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/media?parent=2883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/categories?post=2883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wlc.team\/pl\/wp-json\/wp\/v2\/tags?post=2883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}