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):
$response = wp_remote_request( 'http://example.com?some=parameter', array(
'ssl_verify' => true
) );
Se houver um erro (como mostrado no seu exemplo), você poderá detectá-lo usando a WP_Error
classe:
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()
);
Então é hora de obter os dados apropriados. Isso será exibido 200
e OK
, 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á a 200/OK
mensagem positiva deles.
$response_code = wp_remote_retrieve_response_code( $response );
$response_status = wp_remote_retrieve_response_message( $response );
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
, seguimos json_decode()
e, se conseguimos XML
, seguimos com a SimpleXML
classe nativa do 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...
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:
// Set Transient
$transient = set_transient(
'Your cache key',
$content,
60*60*6
);
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:
// ON:
add_filter( 'https_ssl_verify', '__return_true' );
// OFF:
add_filter( 'https_ssl_verify', '__return_false' );
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 .
// Debug your own service without SSL verification.
add_filter( 'https_local_ssl_verify', '__return_false' );
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.
do_action( 'http_api_debug', $response, 'response', $class, $args, $url );
Onde $response
também pode ser um WP_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 estendem WP_HTTP_*
classes são Fsockopen
, 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.
Para a maioria das solicitações de API remota / HTTP, é a WP_HTTP_curl
classe, que é um wrapper para a curl
biblioteca nativa do PHP .
Dentro da WP_HTTP_curl
classe, você encontrará o request()
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 definir local
como localhost
eo que você entrar em return
partir get_option( 'siteurl' );
.
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.