Я пытаюсь использовать get_transient()
метод в моем WordPress, я прочитал документ и, кажется, я делаю то, что было описано в документации.
Мне нужно показывать погоду на моем сайте, и я использую сторонний API погоды, который обновляется каждые 6 часов.
Мы создаем локальный кеш погоды, чтобы API вызывался только по истечении времени. (Другая причина: ограничение скорости API)
Это мой код:
$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);
}
Когда я отправляю местоположение для получения weather ( say delhi
) и если его нет в кеше, я ожидал, что оно вернется, false
пока оно возвращает мне следующую строку
'{ "data": { "error": [ {"msg": "Unable to find any matching weather location to the query submitted!" } ] }}'
Я имел обыкновение var_dump($weather);
проверять значение$weather
Может кто-нибудь поправить меня, где я делаю не так?
get_transient()
с запросом API, как указано в сообщении об ошибке. Помимо рекомендации по использованию,wp_remote_post
вам просто нужно убедиться, что отправляемый запрос является действительным.if (false === $weather)
Я обновил мой вопросОтветы:
Поймать погодные API удаленных данных
То
msg
, что вы показываете в своем вопросе, в основном является результатом API погоды. И это говорит о том, что нет данных, доступных для вашего местоположения.Первое, что вы хотите сделать, это некоторые исследования в Кодексе и "WP HTTP API" .
Правильный / WP способ получить удаленные данные
После того, как вы узнаете о API WP HTTP, вы увидите, что наиболее распространенный способ сделать это (упрощенно так):
Если есть ошибка (как показано в вашем примере), вы сможете отловить ее, используя
WP_Error
класс:Тогда пришло время получить соответствующие данные. Это покажет
200
иOK
, если все на удаленной стороне сработало. ВАЖНО: удаленные данные, скорее всего, не будут соответствовать никаким стандартам, чем их внутренние. Так что могут быть ошибки, но вы все равно получите200/OK
от них положительное сообщение.Получить результат
Наконец пришло время проверить результат. Сначала мы избавляемся от пробелов в начале / конце. В следующем примере вы увидите, как использовать API-интерфейс WP HTTP для проверки заголовка. Если мы поймали
JSON
, то мы идем с,json_decode()
и если мы получилиXML
, то мы идем с роднымSimpleXML
классом PHP .В случае CSV-файла вам нужно найти собственное решение или выполнить поиск класса PHP на веб-страницах. Но, честно говоря: если они используют CSV, проще искать другой сервис.
Кэшировать данные с помощью Transient
В пролетном API предлагает довольно хороший способ сделать это:
Затем вы должны быть в состоянии поймать переходный процесс с
get_transient()
.Распространенные ошибки
Часто встречающаяся ошибка заключается в том, что проверка SSL не работает. Рад, что вы можете включить / выключить его довольно легко:
Есть одна довольно забавная вещь, которую вы узнаете при проверке соответствующего файла ядра: Core также получил фильтр для локальных запросов. Но не обманывайтесь этим. Этот фильтр предназначен для использования только в том случае, если вы A) предоставляете удаленный сервис из вашей установки WP и B) также используете его самостоятельно! Я знаю, что это может быть
#WTF?!
момент, когда вы не можете использовать различные параметры проверки SSL между вашей локальной установкой и вашей производственной средой / сервером, но у этого также есть идея: для тестирования сервисов вы представьте себя, как я уже объяснил сообществу WP G + здесь .Отладка запроса и его результатов
Без diggin 'слишком глубоко в процессе обновления, но API WP HTTP использует класс WP_HTTP. Это также предлагает хорошую вещь: крюк отладки.
Где
$response
также может бытьWP_Error
объект, который, возможно, говорит вам больше.Примечание. Из краткого теста кажется, что этот фильтр работает (по какой-то причине) только в том случае, если вы поместите его как можно ближе к тому месту, где вы фактически выполняете запрос. Поэтому, возможно, вам нужно вызвать его из-за обратного вызова на одном из приведенных ниже фильтров.
Y НЕТ CURL?
Легко. Вся эта штука «WP HTTP API», которую я показал выше, в основном представляет собой обертку на основе функций для
WP_HTTP
внутренних объектов класса, которая действует как базовый класс (и будет расширяться для различных сценариев). ВыступающиеWP_HTTP_*
классыFsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
. Если вы подключите обратный вызов к'http_api_debug'
-action, то третий аргумент сообщит вам, какой класс использовался для вашего запроса. Вам не нужно вызывать классы напрямую. Просто используйте функции.Внутри
WP_HTTP_curl
класса вы найдетеrequest()
метод. Этот метод предлагает два фильтра для перехвата поведения SSL: один для локальных запросов'https_local_ssl_verify'
и один для удаленных запросов'https_ssl_verify'
. WP, скорее всего , определить ,local
какlocalhost
и то , что вы получите вreturn
сget_option( 'siteurl' );
.источник
wp_remote_request()
помощью URL, а затем перейдите к ответу. Это довольно полное руководство, в котором показан правильный способ выполнения HTTP-запросов в WP. Чтобы уточнить подробнее: вам не нужно вызыватьWP_HTTP_curl
класс, поскольку WordPress уже делает это за вас, когда вы используете функции, показанные выше.Проблема не в функции «переходных процессов». Это похоже на сообщение об ошибке, полученное от стороннего API. Вы, вероятно, должны проверить это, прежде чем использовать
set_transient
.set_transient
вставит все, что ему дано, иget_transient
получит все, что находится в БД. Другими словами, я уверен, что проблема не в том, что вы думаете.Я предполагаю, что некоторые из результатов от вашего API погоды, возможно, вам придется настроить его, чтобы получить желаемые результаты.
Примечание. Ваш API возвращает JSON. Ваш пример декодирует в:
источник
if (false === $weather)
оператора. Я не знал, чтоWP_HTTP_curl
класс попытается это использовать