Saya mencoba menggunakan get_transient()
metode di Wordpress saya, saya sudah membaca dokumen dan sepertinya saya melakukan apa yang telah dijelaskan dalam dokumen.
Saya perlu menunjukkan cuaca di situs web saya dan saya menggunakan API cuaca pihak ketiga yang diperbarui setiap 6 jam.
Kami membuat cache cuaca lokal sehingga API hanya dapat dipanggil setelah waktu kedaluwarsa. (Alasan lain: pembatasan tingkat API)
Ini kode saya:
$country = 'India';
$API_Key = 'xxxxxxxxxxxxxx';
$url = 'http://weatherAPI.com/feed/weather.ashx?q='.$latlong.'&format=json&num_of_days=4&key='.$API_Key;
$weather = get_transient($location);
if (false === $weather) {
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);
$weather = curl_exec($ch);
curl_close($ch);
set_transient($location, $weather, 60*60*6);
}
Ketika saya mengirim lokasi untuk mendapatkan cuaca ( say delhi
) dan jika tidak ada di cache, saya berharap itu akan kembali false
saat itu mengembalikan saya mengikuti string
'{ "data": { "error": [ {"msg": "Unable to find any matching weather location to the query submitted!" } ] }}'
Saya digunakan var_dump($weather);
untuk memeriksa nilai$weather
Adakah yang bisa memperbaiki saya di tempat saya melakukan kesalahan?
get_transient()
- tetapi dengan permintaan API: seperti yang diberikan oleh pesan kesalahan. Selain menyarankan Anda menggunakanwp_remote_post
Anda hanya perlu memastikan bahwa permintaan yang dikirim adalah valid.if (false === $weather)
. Saya telah memperbarui pertanyaan sayaJawaban:
Menangkap data jarak jauh API cuaca
The
msg
, yang Anda tunjukkan dalam pertanyaan Anda pada dasarnya adalah hasil dari API cuaca. Dan dikatakan, bahwa tidak ada data tersedia untuk lokasi Anda.Hal pertama yang ingin Anda lakukan adalah penelitian di Codex dan "WP HTTP API" .
Cara kanan / WP untuk mengambil data jarak jauh
Setelah Anda belajar tentang WP HTTP API, Anda akan melihat bahwa cara umum untuk melakukannya adalah (disederhanakan seperti ini):
Jika ada kesalahan (seperti yang ditunjukkan pada contoh Anda), maka Anda dapat menangkapnya menggunakan
WP_Error
kelas:Maka saatnya untuk mendapatkan data yang sesuai. Ini akan menunjukkan
200
danOK
, jika semuanya di sisi jarak jauh berhasil. PENTING: Data jarak jauh kemungkinan tidak mengikuti standar selain yang internal. Jadi mungkin ada kesalahan, tetapi Anda masih akan mendapatkan200/OK
pesan positif kembali dari mereka.Dapatkan hasilnya
Akhirnya saatnya untuk memeriksa hasilnya. Pertama, kita menyingkirkan ruang putih terdepan / tertinggal. Dalam sampel berikut, Anda melihat cara menggunakan WP HTTP API untuk memeriksa header. Jika kita ketahuan
JSON
, maka kita pergi denganjson_decode()
dan jika kita punyaXML
, maka kita pergi denganSimpleXML
kelas asli PHP .Dalam hal file CSV, Anda harus menemukan solusi khusus atau mencari kelas PHP pada jalinan. Tapi jujur: Jika mereka menggunakan CSV, lebih mudah untuk mencari layanan lain.
Cache data dengan Transient
The API Transient menawarkan cara yang cukup bagus untuk melakukan hal ini:
Anda kemudian dapat menangkap transient dengan
get_transient()
.Kesalahan Umum
Kesalahan yang sering dijumpai adalah verifikasi SSL tidak berfungsi. Dengan senang hati Anda dapat menyalakan / mematikannya dengan mudah:
Ada satu hal yang cukup lucu, karena Anda akan tahu ketika memeriksa file inti yang sesuai: Core juga mendapat filter untuk permintaan lokal . Tapi jangan tertipu oleh yang satu ini. Filter ini hanya dimaksudkan untuk digunakan jika Anda A) menyediakan layanan jarak jauh dari dalam instalasi WP Anda dan B) juga mengkonsumsinya sendiri! Saya tahu, ini bisa menjadi
#WTF?!
momen yang cukup sulit bagi Anda untuk menggunakan pengaturan verifikasi SSL yang berbeda antara instalasi lokal Anda dan lingkungan produksi / server Anda, tetapi juga memiliki ide di baliknya: Ini untuk menguji layanan yang Anda gunakan berikan diri Anda seperti yang saya jelaskan kepada komunitas WP G + di sini .Men-debug permintaan & hasilnya
Tanpa diggin terlalu jauh ke dalam proses pembaruan, tetapi WP HTTP API menggunakan kelas WP_HTTP. Ini juga menawarkan hal yang menyenangkan: Sebuah kait debug.
Di mana
$response
juga bisa menjadiWP_Error
objek yang mungkin memberi tahu Anda lebih banyak.Catatan: Dari tes singkat, filter ini tampaknya hanya (karena alasan tertentu) berfungsi jika Anda menempatkannya sedekat mungkin dengan tempat Anda benar-benar melakukan permintaan. Jadi mungkin Anda perlu meneleponnya dari dalam panggilan balik di salah satu filter di bawah ini.
Y TIDAK ADA CURL?
Mudah. Semua kegembiraan "WP HTTP API", yang telah saya perlihatkan di atas, pada dasarnya adalah pembungkus berbasis fungsi untuk
WP_HTTP
internal kelas, yang bertindak sebagai kelas dasar (dan akan diperluas untuk skenario yang berbeda). The memperpanjangWP_HTTP_*
kelas yangFsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
. Jika Anda mengaitkan panggilan balik ke'http_api_debug'
-aksi, maka argumen ketiga akan memberi tahu Anda kelas mana yang digunakan untuk permintaan Anda. Anda tidak harus memanggil kelas secara langsung. Cukup gunakan fungsinya.Di dalam
WP_HTTP_curl
Kelas, Anda akan menemukanrequest()
metodenya. Metode ini menawarkan dua filter untuk mencegat perilaku SSL: Satu untuk permintaan lokal'https_local_ssl_verify'
dan satu untuk permintaan jarak jauh'https_ssl_verify'
. WP kemungkinan akan mendefinisikanlocal
sebagailocalhost
dan apa yang Anda dapatkan direturn
dariget_option( 'siteurl' );
.sumber
wp_remote_request()
dengan URL Anda, kemudian lanjutkan dengan jawabannya. Ini adalah tutorial yang cukup lengkap dan menunjukkan kepada Anda cara yang tepat untuk membuat permintaan HTTP di WP. Untuk memperjelas lebih banyak: Anda tidak perlu memanggilWP_HTTP_curl
kelas, karena WordPress sudah melakukan ini untuk Anda, ketika Anda menggunakan fungsi yang ditunjukkan di atas.Masalahnya bukan dengan fungsi 'sementara'. Itu tampak seperti pesan kesalahan yang dikembalikan dari API pihak ketiga Anda. Anda mungkin perlu memeriksa itu sebelum digunakan
set_transient
.set_transient
akan memasukkan apa pun yang diberikan danget_transient
akan mengambil apa pun yang ada di DB. Dengan kata lain, saya cukup yakin masalahnya bukan di mana Anda pikir itu.Saya menebak tentang beberapa output dari API cuaca Anda sehingga Anda mungkin perlu mengubah itu untuk mendapatkan hasil yang Anda inginkan.
Catatan: Anda API mengembalikan JSON. Contoh Anda diterjemahkan ke:
sumber
if (false === $weather)
pernyataan di dalam. Saya tidak tahuWP_HTTP_curl
kelas akan mencoba menggunakannya