Estou tentando usar o get_transient()
método no meu Wordpress, li o documento e parece que estou fazendo o que foi descrito nos documentos.
Preciso mostrar o clima no meu site e estou usando uma API climática de terceiros que é atualizada a cada 6 horas.
Estamos criando um cache local do tempo para que a API só seja chamada após o prazo de validade. (Outro motivo: limitação da taxa da API)
Este é o meu código:
$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);
}
Quando estou enviando um local para obter weather ( say delhi
) e se ele não estiver no cache, esperava que ele retornasse false
enquanto me retornasse a sequência de caracteres
'{ "data": { "error": [ {"msg": "Unable to find any matching weather location to the query submitted!" } ] }}'
Eu costumava var_dump($weather);
verificar o valor de$weather
Alguém pode me corrigir onde estou fazendo errado?
get_transient()
- mas com a solicitação da API: conforme fornecido pela mensagem de erro. Além de recomendar o uso,wp_remote_post
você só precisa garantir que a solicitação enviada seja válida.if (false === $weather)
.i ter actualizado a minha perguntaRespostas:
Captura dos dados remotos da API do tempo
O que
msg
você está mostrando na sua pergunta é basicamente o resultado da API do tempo. E diz que não há dados disponíveis para sua localização.A primeira coisa que você deseja fazer é pesquisar no Codex e na "API HTTP do WP" .
A maneira correta / WP de capturar dados remotos
Depois de aprender sobre a API HTTP do WP, você verá que a maneira mais comum de fazer isso é (simplificada desta maneira):
Se houver um erro (como mostrado no seu exemplo), você poderá detectá-lo usando a
WP_Error
classe:Então é hora de obter os dados apropriados. Isso será exibido
200
eOK
, se tudo do lado remoto der certo. IMPORTANTE: Os dados remotos provavelmente não seguirão nenhum padrão que o interno. Portanto, pode haver erros, mas você ainda receberá a200/OK
mensagem positiva deles.Obter o resultado
Finalmente, é hora de inspecionar o resultado. Primeiro, nos livramos dos espaços em branco à esquerda / à direita. No exemplo a seguir, você vê como usar a API HTTP do WP para verificar o cabeçalho. Se pegamos
JSON
, seguimosjson_decode()
e, se conseguimosXML
, seguimos com aSimpleXML
classe nativa do PHP .No caso de um arquivo CSV, você terá que encontrar uma solução personalizada ou procurar uma classe PHP nas interwebs. Mas, honestamente: se eles estiverem usando CSV, é mais fácil procurar outro serviço.
Armazenar em cache os dados com um Transient
A API transitória oferece uma maneira bastante legal de fazer isso:
Você deve conseguir pegar o transitório com
get_transient()
.Erros comuns
Um erro frequentemente encontrado é que a verificação SSL não funciona. Felizmente, você pode ativar / desativar muito fácil:
Há uma coisa bem engraçada, como você descobrirá ao inspecionar o arquivo principal apropriado: o Core também possui um filtro para solicitações locais . Mas não se deixe enganar por este. Esse filtro serve apenas para ser usado no caso de você A) fornecer um serviço remoto a partir da instalação do WP e B) também consumi-lo! Sei que pode ser um
#WTF?!
momento em que isso não é uma opção para você usar diferentes configurações de verificação SSL entre a instalação local e o ambiente / servidor de produção, mas também tem uma ideia: é para testar os serviços que você forneça-se como também expliquei à comunidade WP G + aqui .Depurando a solicitação e seus resultados
Sem aprofundar muito no processo de atualização, mas a API HTTP do WP usa a classe WP_HTTP. Ele também oferece uma coisa interessante: um gancho de depuração.
Onde
$response
também pode ser umWP_Error
objeto que talvez lhe conte mais.Nota: A partir de um breve teste, esse filtro parece funcionar (por algum motivo) apenas se você o colocar o mais próximo de onde você está realmente fazendo a solicitação. Talvez você precise chamá-lo de dentro de um retorno de chamada em um dos filtros abaixo.
Y NÃO CURL?
Fácil. Todo o humor da "WP HTTP API", que mostrei acima, é basicamente um wrapper baseado em função para os
WP_HTTP
internos da classe, que atua como classe base (e será estendido para diferentes cenários). Os que se estendemWP_HTTP_*
classes sãoFsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
. Se você ligar um retorno de chamada à'http_api_debug'
ação-, o terceiro argumento informará qual classe foi usada para sua solicitação. Você não precisa ligar diretamente para as aulas. Basta usar as funções.Dentro da
WP_HTTP_curl
classe, você encontrará orequest()
método. Este método oferece dois filtros para interceptar o comportamento do SSL: um para solicitações locais'https_local_ssl_verify'
e outro para solicitações remotas'https_ssl_verify'
. WP provavelmente vai definirlocal
comolocalhost
eo que você entrar emreturn
partirget_option( 'siteurl' );
.fonte
wp_remote_request()
com o seu URL e depois vá mais longe com a resposta. É um tutorial bastante completo e mostra o caminho certo para fazer solicitações HTTP no WP. Para esclarecer um pouco mais: você não precisa chamar aWP_HTTP_curl
classe, pois o WordPress já faz isso por você, quando você usa as funções mostradas acima.O problema não está na função 'transitórios'. Parece uma mensagem de erro retornada da sua API de terceiros. Você provavelmente precisa verificar isso antes de usar
set_transient
.set_transient
irá inserir o que for fornecido eget_transient
recuperará o que estiver no DB. Em outras palavras, tenho certeza de que o problema não está onde você pensa que está.Eu estou adivinhando sobre alguns dos resultados da sua API do tempo, então você pode precisar ajustá-los para obter os resultados desejados.
Nota: Sua API está retornando JSON. Seu exemplo decodifica para:
fonte
if (false === $weather)
statement.I não estava ciente deWP_HTTP_curl
classe vai tentar usar esse