Bắt dữ liệu từ xa API thời tiết
Các msg
, bạn đang hiển thị trong câu hỏi của bạn về cơ bản là kết quả từ API thời tiết. Và nó nói rằng không có dữ liệu cho vị trí của bạn.
Điều đầu tiên bạn muốn làm là một số nghiên cứu về Codex và "WP HTTP API" .
Cách đúng / WP để lấy dữ liệu từ xa
Sau khi bạn đã tìm hiểu về API HTTP HTTP, bạn sẽ thấy rằng cách phổ biến để làm điều đó là (đơn giản hóa như thế này):
$response = wp_remote_request( 'http://example.com?some=parameter', array(
'ssl_verify' => true
) );
Nếu có lỗi (như trong ví dụ của bạn), thì bạn sẽ có thể bắt lỗi bằng cách sử dụng WP_Error
lớp:
is_wp_error( $response ) AND printf(
'There was an ERROR in your request.<br />Code: %s<br />Message: %s',
$response->get_error_code(),
$response->get_error_message()
);
Sau đó là thời gian để có được dữ liệu thích hợp. Điều này sẽ hiển thị 200
và OK
, nếu mọi thứ ở phía xa hoạt động. QUAN TRỌNG: Dữ liệu từ xa có thể sẽ không theo tiêu chuẩn nào so với dữ liệu nội bộ của chúng. Vì vậy, có thể có lỗi, nhưng bạn vẫn sẽ nhận được 200/OK
thông điệp tích cực từ họ.
$response_code = wp_remote_retrieve_response_code( $response );
$response_status = wp_remote_retrieve_response_message( $response );
Nhận kết quả
Cuối cùng cũng đến lúc kiểm tra kết quả. Đầu tiên, chúng ta thoát khỏi khoảng trắng hàng đầu / dấu. Trong mẫu sau, bạn thấy cách sử dụng API HTTP HTTP để kiểm tra tiêu đề. Nếu chúng ta bắt được JSON
, thì chúng ta sẽ đi json_decode()
và nếu chúng ta có XML
, thì chúng ta sẽ đi với SimpleXML
lớp bản địa của PHP .
// Prepare the data:
$content = trim( wp_remote_retrieve_body( $response ) );
// Convert output to JSON
if ( strstr( wp_remote_retrieve_header( $response, 'content-type' ), 'json' ) )
{
$content = json_decode( $content );
}
// … else, after a double check, we simply go with XML string
elseif ( strstr(
wp_remote_retrieve_header( $response, 'content-type' ),
'application/xhtml+xml'
) )
{
// Lets make sure it is really an XML file
// We also get cases where it's "<?XML" and "<?xml"
if ( '<?xml' !== strtolower( substr( $content, 0, 5 ) ) )
return false;
// Also return stuff wrapped up in <![CDATA[Foo]]>
$content = simplexml_load_string( $content, null, LIBXML_NOCDATA );
}
// If both didn't work out, then we maybe got a CSV, or something else...
Trong trường hợp tệp CSV, bạn sẽ phải tìm một giải pháp tùy chỉnh hoặc tìm kiếm một lớp PHP trên các bản interwebs. Nhưng thành thật mà nói: Nếu họ đang sử dụng CSV, việc tìm kiếm dịch vụ khác sẽ dễ dàng hơn.
Lưu trữ dữ liệu với Transient
Các API thoáng Mời một cách khá thoải mái để làm điều này:
// Set Transient
$transient = set_transient(
'Your cache key',
$content,
60*60*6
);
Sau đó bạn sẽ có thể bắt được thoáng qua với get_transient()
.
Lỗi thông thường
Một lỗi thường gặp là xác minh SSL không hoạt động. Rất vui khi bạn có thể bật / tắt nó khá dễ dàng:
// ON:
add_filter( 'https_ssl_verify', '__return_true' );
// OFF:
add_filter( 'https_ssl_verify', '__return_false' );
Có một điều khá buồn cười, như bạn sẽ tìm ra khi kiểm tra tệp lõi thích hợp: Core cũng có một bộ lọc cho các yêu cầu cục bộ . Nhưng đừng để bị lừa bởi cái này. Bộ lọc này chỉ có nghĩa là được sử dụng trong trường hợp bạn A) cung cấp dịch vụ từ xa trong cài đặt WP của bạn và B) cũng tự tiêu thụ nó! Tôi biết, đây có thể là một #WTF?!
khoảnh khắc mà đây không phải là một công tắc để bạn sử dụng các cài đặt xác minh SSL khác nhau giữa cài đặt cục bộ và môi trường / máy chủ sản xuất của bạn, nhưng nó cũng có một ý tưởng đằng sau nó: Đó là để kiểm tra các dịch vụ mà bạn cung cấp cho mình như tôi cũng đã giải thích cho cộng đồng WP G + ở đây .
// Debug your own service without SSL verification.
add_filter( 'https_local_ssl_verify', '__return_false' );
Gỡ lỗi yêu cầu và kết quả của nó
Không đào sâu 'quá sâu vào quá trình cập nhật, nhưng API HTTP WP sử dụng lớp WP_HTTP. Nó cũng cung cấp một điều tốt đẹp: Một cái móc gỡ lỗi.
do_action( 'http_api_debug', $response, 'response', $class, $args, $url );
Nơi $response
cũng có thể là một WP_Error
đối tượng có thể cho bạn biết nhiều hơn.
Lưu ý: Từ một thử nghiệm ngắn, bộ lọc này dường như chỉ hoạt động (vì một số lý do) hoạt động nếu bạn đặt nó gần với nơi bạn thực sự thực hiện yêu cầu. Vì vậy, có thể bạn cần gọi nó từ trong một cuộc gọi lại trên một trong các bộ lọc dưới đây.
Y KHÔNG CÓ HIỆN TẠI?
Dễ dàng. Tất cả sự thú vị của "API HTTP WP", mà tôi đã trình bày ở trên, về cơ bản là một trình bao bọc dựa trên chức năng cho các phần WP_HTTP
bên trong lớp, hoạt động như lớp cơ sở (và sẽ được mở rộng cho các kịch bản khác nhau). Các mở rộng WP_HTTP_*
lớp học Fsockopen
, Streams
, Curl
, Proxy
, Cookie
, Encoding
. Nếu bạn kết nối một cuộc gọi lại với 'http_api_debug'
-action, thì đối số thứ ba sẽ cho bạn biết lớp nào đã được sử dụng cho yêu cầu của bạn. Bạn không phải gọi các lớp trực tiếp. Chỉ cần sử dụng các chức năng.
Đối với hầu hết các yêu cầu API từ xa / HTTP, đó là WP_HTTP_curl
lớp, là trình bao bọc cho curl
thư viện gốc PHP .
Trong WP_HTTP_curl
Lớp học, bạn sẽ tìm thấy request()
phương pháp. Phương pháp này cung cấp hai bộ lọc để chặn hành vi SSL: Một cho các yêu cầu cục bộ 'https_local_ssl_verify'
và một cho các yêu cầu từ xa 'https_ssl_verify'
. WP có thể sẽ xác định local
là localhost
và những gì bạn nhận được return
từ get_option( 'siteurl' );
.
get_transient()
- nhưng với yêu cầu API: như được đưa ra bởi thông báo lỗi. Ngoài việc khuyến nghị bạn sử dụng,wp_remote_post
bạn chỉ cần đảm bảo rằng yêu cầu được gửi là hợp lệ.