Поймать погодные API удаленных данных
То msg
, что вы показываете в своем вопросе, в основном является результатом API погоды. И это говорит о том, что нет данных, доступных для вашего местоположения.
Первое, что вы хотите сделать, это некоторые исследования в Кодексе и "WP HTTP API" .
Правильный / WP способ получить удаленные данные
После того, как вы узнаете о API WP HTTP, вы увидите, что наиболее распространенный способ сделать это (упрощенно так):
$response = wp_remote_request( 'http://example.com?some=parameter', array(
'ssl_verify' => true
) );
Если есть ошибка (как показано в вашем примере), вы сможете отловить ее, используя WP_Error
класс:
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()
);
Тогда пришло время получить соответствующие данные. Это покажет 200
и OK
, если все на удаленной стороне сработало. ВАЖНО: удаленные данные, скорее всего, не будут соответствовать никаким стандартам, чем их внутренние. Так что могут быть ошибки, но вы все равно получите 200/OK
от них положительное сообщение.
$response_code = wp_remote_retrieve_response_code( $response );
$response_status = wp_remote_retrieve_response_message( $response );
Получить результат
Наконец пришло время проверить результат. Сначала мы избавляемся от пробелов в начале / конце. В следующем примере вы увидите, как использовать API-интерфейс WP HTTP для проверки заголовка. Если мы поймали JSON
, то мы идем с, json_decode()
и если мы получили XML
, то мы идем с родным SimpleXML
классом 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...
В случае CSV-файла вам нужно найти собственное решение или выполнить поиск класса PHP на веб-страницах. Но, честно говоря: если они используют CSV, проще искать другой сервис.
Кэшировать данные с помощью Transient
В пролетном API предлагает довольно хороший способ сделать это:
// Set Transient
$transient = set_transient(
'Your cache key',
$content,
60*60*6
);
Затем вы должны быть в состоянии поймать переходный процесс с get_transient()
.
Распространенные ошибки
Часто встречающаяся ошибка заключается в том, что проверка SSL не работает. Рад, что вы можете включить / выключить его довольно легко:
// ON:
add_filter( 'https_ssl_verify', '__return_true' );
// OFF:
add_filter( 'https_ssl_verify', '__return_false' );
Есть одна довольно забавная вещь, которую вы узнаете при проверке соответствующего файла ядра: Core также получил фильтр для локальных запросов. Но не обманывайтесь этим. Этот фильтр предназначен для использования только в том случае, если вы A) предоставляете удаленный сервис из вашей установки WP и B) также используете его самостоятельно! Я знаю, что это может быть #WTF?!
момент, когда вы не можете использовать различные параметры проверки SSL между вашей локальной установкой и вашей производственной средой / сервером, но у этого также есть идея: для тестирования сервисов вы представьте себя, как я уже объяснил сообществу WP G + здесь .
// Debug your own service without SSL verification.
add_filter( 'https_local_ssl_verify', '__return_false' );
Отладка запроса и его результатов
Без diggin 'слишком глубоко в процессе обновления, но API WP HTTP использует класс WP_HTTP. Это также предлагает хорошую вещь: крюк отладки.
do_action( 'http_api_debug', $response, 'response', $class, $args, $url );
Где $response
также может быть WP_Error
объект, который, возможно, говорит вам больше.
Примечание. Из краткого теста кажется, что этот фильтр работает (по какой-то причине) только в том случае, если вы поместите его как можно ближе к тому месту, где вы фактически выполняете запрос. Поэтому, возможно, вам нужно вызвать его из-за обратного вызова на одном из приведенных ниже фильтров.
Y НЕТ CURL?
Легко. Вся эта штука «WP HTTP API», которую я показал выше, в основном представляет собой обертку на основе функций для WP_HTTP
внутренних объектов класса, которая действует как базовый класс (и будет расширяться для различных сценариев). Выступающие WP_HTTP_*
классы Fsockopen
, Streams
, Curl
, Proxy
, Cookie
, Encoding
. Если вы подключите обратный вызов к 'http_api_debug'
-action, то третий аргумент сообщит вам, какой класс использовался для вашего запроса. Вам не нужно вызывать классы напрямую. Просто используйте функции.
Для большинства удаленных / HTTP-запросов API это WP_HTTP_curl
класс, который является оболочкой для собственной curl
библиотеки PHP .
Внутри WP_HTTP_curl
класса вы найдете request()
метод. Этот метод предлагает два фильтра для перехвата поведения SSL: один для локальных запросов 'https_local_ssl_verify'
и один для удаленных запросов 'https_ssl_verify'
. WP, скорее всего , определить , local
как localhost
и то , что вы получите в return
с get_option( 'siteurl' );
.
get_transient()
с запросом API, как указано в сообщении об ошибке. Помимо рекомендации по использованию,wp_remote_post
вам просто нужно убедиться, что отправляемый запрос является действительным.