{"id":231122,"date":"2022-12-28T18:34:00","date_gmt":"2022-12-28T15:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231122"},"modified":"2022-12-28T18:35:53","modified_gmt":"2022-12-28T15:35:53","slug":"roznica-w-zadaniach-curl-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/roznica-w-zadaniach-curl-i-wordpress\/","title":{"rendered":"R\u00f3\u017cnica w \u017c\u0105daniach cURL i WordPress"},"content":{"rendered":"\n<p><a href=\"https:\/\/curl.haxx.se\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cURL<\/a> to bardzo popularna biblioteka PHP, do kt\u00f3rej odwo\u0142ywa\u0142em si\u0119 w kilku innych postach (na przyk\u0142ad <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/uzywanie-curl-do-okreslenia-czy-okreslony-adres-url-jest-prawidlowa-strona\/\" title=\"1\">1<\/a> i <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/znajdowanie-miejsca-docelowego-przekierowania-za-pomoca-php\/\" title=\"2\">2<\/a> ). Uwa\u017cam, \u017ce powinien zosta\u0107 przejrzany, zbadany i prawdopodobnie u\u017cywany przez ka\u017cdego pracuj\u0105cego w PHP (tak, nawet tych pracuj\u0105cych w WordPressie).<\/p>\n<p>Ale z powodu natywnych interfejs\u00f3w API WordPress mamy poziom abstrakcji, kt\u00f3ry pozwala nam osi\u0105gn\u0105\u0107 wiele z tych samych funkcji (je\u015bli nie t\u0119 sam\u0105 funkcjonalno\u015b\u0107).<\/p>\n<p>W szczeg\u00f3lno\u015bci m\u00f3wi\u0119 o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_safe_remote_get\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_safe_remote_get<\/a>.<\/p>\n<blockquote><p>\n<a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159653-61e6f9c04b30e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159653-61e6f9c04b30e.png\" alt=\"R\u00f3\u017cnica w \u017c\u0105daniach cURL i WordPress\"><\/a><\/p>\n<p>Ta funkcja jest idealna, gdy \u017c\u0105danie HTTP jest kierowane do dowolnego adresu URL. Adres URL jest weryfikowany, aby unikn\u0105\u0107 przekierowa\u0144 i atak\u00f3w fa\u0142szowania \u017c\u0105da\u0144.<\/p>\n<\/blockquote>\n<p>Konkretnie wspominam o bezpiecznym wariancie <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_remote_get\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tej funkcji<\/a> dla powy\u017cszej definicji (istnieje inny wariant, ale ze wzgl\u0119d\u00f3w bezpiecze\u0144stwa wa\u017cne jest, aby zachowa\u0107 \u015brodki ostro\u017cno\u015bci przed przypadkowymi adresami URL).<\/p>\n<h2>cURL i \u017c\u0105dania WordPress<\/h2>\n<p>W ka\u017cdym razie, jak mog\u0142aby wygl\u0105da\u0107 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/8762acc585d6b4987b23a1304615bd4d#file-00-get-curl-response-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funkcja<\/a>, gdyby\u015bmy u\u017cywali tej biblioteki cURL?<\/p>\n<pre><code>&lt;?php\n\ntry {\n    $curl = curl_init();\n    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');\n    curl_setopt($curl, CURLOPT_URL, $url);\n    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);\n    $response = curl_exec($curl);\n\n    if (is_object($response)) {\n        return false;\n    }\n\n    if (false === $response) {\n        throw new Exception(curl_error($curl), curl_errno($curl));\n    }\n\n    curl_close($curl);\n} catch (Exception $e) {\n    trigger_error(\n        sprintf(\n            'Curl failed with error #%d: %s',\n            $e-&gt;getCode(),\n            $e-&gt;getMessage()\n        ),\n        E_USER_ERROR\n    );\n}<\/code><\/pre>\n<p>W skr\u00f3cie (i jest to typowe dla wi\u0119kszo\u015bci \u017c\u0105da\u0144 cURL):<\/p>\n<ul>\n<li>zainicjowa\u0107 bibliotek\u0119 cURL,<\/li>\n<li><a href=\"https:\/\/curl.haxx.se\/docs\/manpage.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ustawi\u0107 opcje<\/a> specyficzne dla Twojego \u017c\u0105dania (kt\u00f3re b\u0119d\u0105 si\u0119 r\u00f3\u017cni\u0107 w zale\u017cno\u015bci od tego \u017c\u0105dania),<\/li>\n<li>z\u0142o\u017cy\u0107 wniosek,<\/li>\n<li>oce\u0144 odpowied\u017a<\/li>\n<li>z\u0142ap wszystkie niezb\u0119dne wyj\u0105tki.<\/li>\n<\/ul>\n<p>A gdyby\u015bmy mieli u\u017cy\u0107 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/8762acc585d6b4987b23a1304615bd4d#file-01-safe-remote-get-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tej samej odmiany kodu<\/a> w WordPressie?<\/p>\n<pre><code>&lt;?php\n\n$response = wp_safe_remote_get($url);\nif (is_wp_error($response)) {\n    return '';\n}\n$response = $response['body'];<\/code><\/pre>\n<p>Jest znacznie mniejszy i prawdopodobnie \u0142atwiejszy do odczytania (przynajmniej dla os\u00f3b pracuj\u0105cych w WordPressie). Je\u015bli chodzi o argumenty, r\u00f3wnie\u017c nie przekazuj\u0119 do funkcji niczego poza adresem URL.<\/p>\n<p>Je\u015bli przeczytasz po\u0142\u0105czon\u0105 dokumentacj\u0119 API, zobaczysz, \u017ce mamy nad tym pewn\u0105 kontrol\u0119; jednak b\u0119dzie si\u0119 r\u00f3\u017cni\u0107 w zale\u017cno\u015bci od tego, jak musisz komunikowa\u0107 si\u0119 z danym punktem ko\u0144cowym.<\/p>\n<p>Ponadto, jak poradzisz sobie z <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_error\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Error<\/a>, zale\u017cy od Ciebie. Zwr\u00f3cenie pustego ci\u0105gu rzadko jest najlepsz\u0105 opcj\u0105; jednak na potrzeby tego przyk\u0142adu jest to wystarczaj\u0105ce. Sprawa, kt\u00f3rej szukamy przede wszystkim, to tre\u015b\u0107 odpowiedzi i na tym skupiamy si\u0119 w kodzie.<\/p>\n<h2>Kiedy u\u017cywamy jednego lub drugiego?<\/h2>\n<p>Je\u015bli chodzi o prac\u0119 ze zdalnymi \u017c\u0105daniami cURL i WordPress oraz okre\u015blenie, kt\u00f3rej metody u\u017cy\u0107, kieruj\u0119 si\u0119 t\u0105 zasad\u0105:<\/p>\n<ul>\n<li>Je\u015bli to, czego potrzebuj\u0119, mo\u017cna osi\u0105gn\u0105\u0107 za pomoc\u0105 funkcji API WordPress, korzystam z niej.<\/li>\n<li>Je\u015bli nie, u\u017cyj\u0119 cURL.<\/li>\n<\/ul>\n<p>Nie mog\u0119 poda\u0107 bardziej solidnej zasady.<\/p>\n<p>Zamiast tego sp\u00f3jrz na punkt ko\u0144cowy, z kt\u00f3rym si\u0119 komunikujesz, okre\u015bl, jakiego poziomu kontroli potrzebujesz nad \u017c\u0105daniem, i podejmij decyzj\u0119, jak chcesz obs\u0142u\u017cy\u0107 odpowied\u017a.<\/p>\n<p>Stamt\u0105d powiniene\u015b mie\u0107 dobry pomys\u0142, kt\u00f3rej biblioteki u\u017cy\u0107.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zdalne \u017c\u0105dania cURL i WordPress umo\u017cliwiaj\u0105 nam wiele z tych samych funkcji. Ale musimy by\u0107 w stanie okre\u015bli\u0107, kt\u00f3ra opcja jest najlepsza.<\/p>\n","protected":false},"author":1,"featured_media":237087,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,845],"tags":[1169],"class_list":["post-231122","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=231122"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231122\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/237087"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=231122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=231122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=231122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}