Estoy tratando de usar el get_transient()
método en mi Wordpress, he leído el documento y parece que estoy haciendo lo que se describe en los documentos.
Necesito mostrar el clima en mi sitio web y estoy usando una API meteorológica de terceros que se actualiza cada 6 horas.
Estamos creando un caché local del clima para que solo se llame a la API después del tiempo de caducidad. (Otro motivo: limitación de velocidad API)
Este es mi 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);
}
Cuando envío una ubicación para obtener el clima ( say delhi
) y si no está allí en el caché, esperaba que regresara false
mientras me devuelve la siguiente cadena
'{ "data": { "error": [ {"msg": "Unable to find any matching weather location to the query submitted!" } ] }}'
Solía var_dump($weather);
comprobar el valor de$weather
¿Alguien puede corregirme donde estoy haciendo mal?
get_transient()
, pero con la solicitud de la API: como se indica en el mensaje de error. Además de recomendar su usowp_remote_post
, solo tendrá que asegurarse de que la solicitud que se envía sea válida.if (false === $weather)
He actualizado mi preguntaRespuestas:
Capturando los datos remotos de la API meteorológica
El
msg
que estás mostrando en tu pregunta es básicamente el resultado de la API meteorológica. Y dice que no hay datos disponibles para su ubicación.Lo primero que quiere hacer es investigar en el Codex y la "API WP HTTP" .
La forma correcta / WP de capturar datos remotos
Después de que haya aprendido sobre la API HTTP de WP, verá que la forma común de hacerlo es (simplificada de esta manera):
Si hay un error (como se muestra en su ejemplo), podrá detectarlo utilizando la
WP_Error
clase:Entonces es hora de obtener los datos apropiados. Esto se mostrará
200
yOK
, si todo en el lado remoto funcionó. IMPORTANTE: los datos remotos probablemente no seguirán un estándar que el interno. Por lo tanto, puede haber errores, pero aún recibirá el200/OK
mensaje positivo de ellos.Obtén el resultado
Finalmente es hora de inspeccionar el resultado. Primero, nos deshacemos de los espacios en blanco iniciales / finales. En el siguiente ejemplo, verá cómo usar la API HTTP de WP para verificar el encabezado. Si atrapamos
JSON
, entonces vamos conjson_decode()
y si tenemosXML
, entonces vamos con laSimpleXML
clase nativa de PHP .En el caso de un archivo CSV, tendrá que encontrar una solución personalizada o buscar una clase PHP en los interwebs. Pero honestamente: si están usando CSV, es más fácil buscar otro servicio.
Caché los datos con un transitorio
La API transitoria ofrece una forma bastante agradable de hacer esto:
Entonces deberías poder atrapar al transitorio con
get_transient()
.Errores comunes
Un error frecuente es que la verificación SSL no funciona. Con mucho gusto puedes encenderlo / apagarlo bastante fácil:
Hay una cosa bastante divertida, como descubrirá cuando inspeccione el archivo core apropiado: Core también tiene un filtro para solicitudes locales . Pero no te dejes engañar por este. ¡Este filtro solo está destinado a usarse en caso de que A) proporcione un servicio remoto desde su instalación WP y B) también lo consuma usted mismo! Lo sé, este puede ser un
#WTF?!
momento en el que este no es un cambio para que usted use diferentes configuraciones de verificación SSL entre su instalación local y su entorno / servidor de producción, pero también tiene una idea detrás: es probar los servicios que usted proporcione usted mismo como también le expliqué a la comunidad de WP G + aquí .Depuración de la solicitud y sus resultados
Sin profundizar demasiado en el proceso de actualización, pero la API WP HTTP utiliza la clase WP_HTTP. También ofrece algo agradable: un gancho de depuración.
Donde
$response
también puede haber unWP_Error
objeto que quizás te diga más.Nota: a partir de una breve prueba, este filtro parece funcionar solo (por alguna razón) si lo coloca tan cerca de donde realmente está haciendo la solicitud. Entonces, tal vez deba llamarlo desde una devolución de llamada en uno de los siguientes filtros.
Y NO RIZO?
Fácil. Todo el funkiness de la "API HTTP WP", que he mostrado anteriormente, es básicamente un contenedor basado en funciones para las
WP_HTTP
partes internas de la clase, que actúa como clase base (y se extenderá para diferentes escenarios). Los extiendenWP_HTTP_*
clases sonFsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
. Si'http_api_debug'
conecta una devolución de llamada a la acción, el tercer argumento le dirá qué clase se utilizó para su solicitud. No tiene que llamar a las clases directamente. Solo usa las funciones.Dentro de la
WP_HTTP_curl
clase, encontrarás elrequest()
método. Este método ofrece dos filtros para interceptar el comportamiento SSL: uno para solicitudes locales'https_local_ssl_verify'
y otro para solicitudes remotas'https_ssl_verify'
. WP probablemente definirálocal
comolocalhost
y lo que se obtienereturn
a partirget_option( 'siteurl' );
.fuente
wp_remote_request()
con su URL, luego vaya más allá con la respuesta. Es un tutorial bastante completo y le muestra la forma correcta de realizar solicitudes HTTP en WP. Para aclarar un poco más: no tiene que llamar a laWP_HTTP_curl
clase, ya que WordPress ya lo hace por usted, cuando usa las funciones que se muestran arriba.El problema no es con la función 'transitorios'. Parece un mensaje de error devuelto por su API de terceros. Probablemente necesite verificar eso antes de usar
set_transient
.set_transient
insertará lo que se le haya dado yget_transient
recuperará lo que esté en la base de datos. En otras palabras, estoy bastante seguro de que el problema no está donde crees que está.Supongo que algunos de los resultados de su API meteorológica pueden ser necesarios para obtener los resultados que desea.
Nota: Su API está devolviendo JSON. Su ejemplo decodifica a:
fuente
if (false === $weather)
declaración. No estaba al tanto de que laWP_HTTP_curl
clase tratará de usar eso