Studio Multimedialne ljasinski.pl

  • O mnie
  • Blog
  • Prelekcje
  • Portfolio
  • Kontakt
Jesteś tutaj: Strona główna / Komputery / WordPress / Know your functions – wp_remote_get() i podobne

Know your functions – wp_remote_get() i podobne

3 marca 2013 by lucasyas Zostaw komentarz

Przy wielu dyskusjach na WordCampach był to jeden z najczęściej poruszanych tematów. Nie wymyślaj na nowo koła. Używaj WordPressa z całym dobrodziejstwem inwentarza, nie zaś wybiórczo.

Teraz, gdy pluginy są weryfikowane przed dopuszczeniem do repozytorium będzie to konieczność. Nawet jednak, jeżeli piszesz coś tylko na własny użytek – zrób to raz i poprawnie. Założę się, że kiedyś będziesz chciał do tego kodu wrócić, coś zmienić, może zastosować w innym projekcie. Wtedy prawidłowe pisanie na pewno zaprocentuje.

Jeden z najczęściej popełnianych błędów przez developerów przytrafia się przy otwieraniu zdalnych zasobów. Ręka do góry, kto widział (lub popełnił – nie wierzę, że wszyscy zaczynali z wysokim poziomem znajomości API WordPressa) wtyczkę używającą [cci]curl()[/cci] lub nie daj Boże jeszcze[cci]fopen()[/cci] dla zdalnych plików?. A można to zrobić w sposób o wiele prostszy i, co ważne, uniwersalny.

WordPress jest dostarczany ze specjalnie służącą do tego celu klasą [cci]WP_Http[/cci]. Dla wygody użytkowników powstały nawet cztery funkcje, które ułatwiają pobieranie zdalnych plików:

  • wp_remote_request
  • wp_remote_get
  • wp_remote_post
  • wp_remote_head

Dlaczego warto?

Po pierwsze – jest łatwiej. Używasz jednej funkcji, która od razu daje Ci dostęp do tego co potrzebujesz. Nie przepisujesz całej sekwencji wywołań CURL, nie tworzysz do tego własnej funkcji. Prosto i do celu.

Po drugie – jest bardziej uniwersalne. Kod WordPressa tworzyli specjaliści, którzy wiedzą, że nie wszystko działa na wszystkich serwerach. Klasa [cci]WP_Http[/cci] jest tak zbudowana, by sprawdzić jakie metody pobierania zdalnych plików są na danym serwerze dostępne, po czym wybiera spośród nich najbezpieczniejszą.

Jak z tych funkcji korzystać?

Składnia wszystkich czterech funkcji jest taka sama. Przyjmują one dwa parametry

[code]wp_remote_request( $url, $args )[/code]

[cci]$url[/cci] jest adresem internetowym zasobu, który chcemy pobrać.

[cci]$args[/cci] to tablica argumentów dla funkcji. Nie musimy jej definiować. Co więcej, jeżeli chcemy jakiś argument zmienić to wystarczy podać (oczywiście w postaci odpowiedniej tablicy) tylko ten argument. Domyślne wartości [cci]$args[/cci] to:

$defaults = array(
    'method' => 'GET',
    'timeout' => apply_filters( 'http_request_timeout', 5),
    'redirection' => apply_filters( 'http_request_redirection_count', 5),
    'httpversion' => apply_filters( 'http_request_version', '1.0'),
    'user-agent' => apply_filters( 'http_headers_useragent', 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) ),
    'blocking' => true,
    'headers' => array(),
    'cookies' => array(),
    'body' => null,
    'compress' => false,
    'decompress' => true,
    'sslverify' => true,
    'stream' => false,
    'filename' => null
);

W przypadku [cci]wp_remote_post()[/cci] i [cci]wp_remote_head[/cci] zmienia się tylko parametr [cci]method[/cci].

Znaczenie poszczególnych parametrów:

  • [cci]timeout[/cci] – czas na wykonanie (domyślnie 5 sekund). Można ustawić filtr, by zmienić czas domyślny dla wszystkich zapytań.
  • [cci]redirection[/cci] – ilość przekierowań, za którymi skrypt może podążyć.
  • [cci]blocking[/cci] – zmiana na [cci]false[/cci] umożliwia kontynuowanie wykonywania strony przed zakończeniem pobrania pliku
  • [cci]body[/cci] – treść requesta
  • [cci]compress[/cci] – zmiana na [cci]true[/cci] pozwala na kompresję requesta
  • [cci]decompress[/cci] – wysyła w nagłówkach informację, że jest w stanie zaakceptować skompresowaną odpowiedź oraz dekompresuje ją automatycznie po otrzymaniu
  • [cci]sslverify[/cci] – odrzuca połączenia ssl, jeżeli certyfikat witryny nie jest wiarygodny

Na temat [cci]stream[/cci] i [cci]file[/cci] znana mi dokumentacja nie wspomina.

Jak funkcja zwraca wynik?

Nie jest to prosty typ zmiennej lecz tablica lub obiekt klasy [cci]WP_Error[/cci] w przypadku niepowodzenia.

Przykładowa tablica zwracana przez funkcję [cci]wp_remote_get[/cci] wygląda następująco:

Array
(
    [headers] => Array
        (
            [date] => Thu, 30 Sep 2010 15:16:36 GMT
            [server] => Apache
            [x-powered-by] => PHP/5.3.3
            [x-server] => 10.90.6.243
            [expires] => Thu, 30 Sep 2010 03:16:36 GMT
            [cache-control] => Array
                (
                    [0] => no-store, no-cache, must-revalidate
                    [1] => post-check=0, pre-check=0
                )

            [vary] => Accept-Encoding
            [content-length] => 1641
            [connection] => close
            [content-type] => application/php
        )
    [body] =>This is a website!
    [response] => Array
        (
            [code] => 200
            [message] => OK
        )
    [cookies] => Array
        (
        )
)

WordPress Codex poleca następujący fragment kodu, aby pobrać treść witryny:

$response = wp_remote_get( $url );
if( is_wp_error( $response ) ) {
   $error_message = $response->get_error_message();
   echo "Something went wrong: $error_message";
} else {
   echo 'Response: <pre>';
   print_r( $response );
   echo '</pre>';
}

Kiedy nie używać tych funkcji?

Pytanie dość nietypowe, prawda? Otóż tych funkcji należy używać zawsze, gdy pobieramy zewnętrzny plik chyba, że istnieje funkcja bardziej wyspecjalizowana. Funkcją taką może być na przykład [cci]fetch_feed[/cci] służąca do pobierania kanałów RSS.

Jeżeli zdarza nam się często pobierać ten sam plik, warto pomyśleć o mechanizmach cache’owania. Znów – nie piszmy własnych, lecz użyjmy wbudowanych w WordPressa. Jakich? O tym następnym razem.

Podsumowując

Znaj swoje funkcje. Dziś poznałeś [cci]wp_remote_get[/cci] i jej rodzinę. Następnym razem będzie o cache – przykład z życia wzięty.

Aby rozszerzyć swoją wiedzę, warto poświęcać regularnie czas na studiowanie WordPress Codex oraz… źródeł samego WordPressa. Wiele z tych rzeczy nie jest opisanych w dokumentacji, bądź są porozrzucane po różnych miejscach. Szybciej można znaleźć je w samym kodzie. Poza tym zapoznasz się ze specyfiką pisania kodu pod WordPressa oraz pewnymi przyjętymi konwencjami (nowe linie, spacje, wcięcia itp.).

A może znasz jakąś funkcję, o której warto tu napisać. Jeżeli czujesz się na siłach – te łamy są dla Ciebie otwarte. Jeżeli chcesz tylko poruszyć temat – daj znać w komentarzu.

Podobne

W kategorii:WordPress Tagi:PHP, wordpress

Leave a ReplyCancel reply

WP Core Contributions

View all 0 tickets on Trac.

Mastodon

Ostatnie wpisy

  • Do czego w roku 2025 może przydać się VPN
  • Kontenery z dostępem do Tailnetu
  • Remanent w LANie
  • Kolorowa kontrola wersji
  • Motyw wnuk – prezentacja na WordUp! Kalisz online.

Najnowsze komentarze

  • Jacek - Zakładanie darmowej domeny *.tk
  • Arek - Jak dodać swap do ubuntu
  • refy - Zakładanie darmowej domeny *.tk
  • bezrobotny niepełnosprawny magister - Darmowe domeny – one naprawdę istnieją
  • lucasyas - Jak Lenovo sobie leci…

Archiwa

  • marzec 2025
  • styczeń 2025
  • styczeń 2023
  • styczeń 2021
  • maj 2020
  • luty 2020
  • wrzesień 2018
  • lipiec 2018
  • wrzesień 2016
  • sierpień 2016
  • czerwiec 2016
  • styczeń 2016
  • wrzesień 2015
  • lipiec 2015
  • kwiecień 2015
  • marzec 2015
  • listopad 2014
  • wrzesień 2014
  • lipiec 2014
  • czerwiec 2014
  • maj 2014
  • luty 2014
  • grudzień 2013
  • październik 2013
  • wrzesień 2013
  • sierpień 2013
  • czerwiec 2013
  • maj 2013
  • marzec 2013
  • luty 2013
  • styczeń 2013
  • grudzień 2012
  • listopad 2012
  • październik 2012
  • wrzesień 2012
  • sierpień 2012
  • lipiec 2012
  • czerwiec 2012
  • maj 2012
  • kwiecień 2012
  • marzec 2012
  • luty 2012
  • styczeń 2012
  • grudzień 2011
  • listopad 2011
  • październik 2011
  • wrzesień 2011
  • sierpień 2011
  • czerwiec 2011
  • maj 2011
  • marzec 2011
  • luty 2011
  • styczeń 2011
  • grudzień 2010
  • listopad 2010
  • październik 2010
  • wrzesień 2010
  • sierpień 2010
  • lipiec 2010
  • czerwiec 2010
  • maj 2010
  • kwiecień 2010
  • marzec 2010

Kategorie

  • Android
  • Bez kategorii
  • Dla webmasterów
  • Facebook – prywatność i bezpieczeństwo
  • FAQ
  • Homelab
  • Homelab
  • Komputery
  • LJPL Armored robots.txt
  • Marketing
  • Polityka
  • SEO
  • Thanks God it’s Friday
  • TraktTV Wordpress Widget
  • TraktTV Wordpress Widget @en
  • Twitter Diary
  • ubuntu
  • WordPress
  • Wystąpienia i prezentacje

Meta

  • Zaloguj się
  • Kanał wpisów
  • Kanał komentarzy
  • WordPress.org

Tagi

*.tk .htaccess android Apache apple bezpieczeństwo blog chrome darmowe domeny e-mail facebook firefox git gmail google google analytics Google apps google docs Google drive google logo hasła instagram kernel microsoft mysql PHP piractwo plugin prywatność przekierowanie rich snippet seo serp spam ssh swap twitter ubuntu VMware webmaster windows wordcamp wordpress youtube

Najnowsze komentarze

  • Jacek - Zakładanie darmowej domeny *.tk
  • Arek - Jak dodać swap do ubuntu
  • refy - Zakładanie darmowej domeny *.tk
  • bezrobotny niepełnosprawny magister - Darmowe domeny – one naprawdę istnieją
  • lucasyas - Jak Lenovo sobie leci…

Obserwuj mnie na Twitterze

My Tweets

Copyright © 2025 · ljasinskipl-genesis on Genesis Framework · WordPress · Zaloguj się

Ta strona korzysta z ciasteczek w celach statystycznych oraz dla wyświetlania reklam. Jeżeli nie wyrażasz na to zgody, możesz to zmienić korzystając z ustawień swojej przeglądarki internetowej. Akceptuję
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary
Always Enabled
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Non-necessary
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
SAVE & ACCEPT