Come utilizzare wp_remote_get per recuperare l'URL locale in sviluppo
Ho un sito in sviluppo locale all'indirizzo test:8888 e sto cercando di far funzionare questo codice nel mio file functions.php.
$response = wp_remote_get( 'test:8888/?p=1' );
print_r($response);
Purtroppo questo codice restituisce:
WP_Error Object ( [errors] => Array ( [http_request_failed] => Array ( [0] => A valid URL was not provided. ) ) [error_data] => Array ( ) )
È possibile effettuare una richiesta al proprio URL durante lo sviluppo in locale?

Timeout degli annunci
Puoi aggirare il timeout utilizzando un filtro
add_filter( 'http_request_timeout', 'wpse35826_timeout_extd' );
function wpse35826_timeout_extd( $time )
{
// Il timeout predefinito è 5
return 10;
}
Scegli il protocollo/schema corretto
Per il problema del protocollo/schema: Se è la tua installazione locale, puoi usare il condizionale.
function wpse35826_remote_get( $args )
{
$protocol = is_SSL() ? 'https://' : 'http://';
$response = wp_remote_get( "{$protocol}test:8888/?p=1" );
if ( is_wp_error( $response ) )
return "{$response->get_error_code()}: {$response->get_error_message()}";
return print htmlspecialchars( var_export( $response, true ) );
}
// Attiva la richiesta
wpse35826_remote_get();
Se stai facendo richieste al tuo server locale, potrebbe esserci un problema con la verifica SSL. WP utilizza un filtro per attivare questa impostazione:
add_filter( 'https_local_ssl_verify', '__return_false' );
Questo filtro non si attiva(!) per i server locali che fanno richieste a un server sul web. Per i server esterni usa il seguente filtro:
add_filter( 'https_ssl_verify', '__return_false' );
Problemi con le richieste locali
Possono anche esserci problemi con le richieste locali bloccate:
add_filter( 'block_local_requests', '__return_false' );
Altre cose che possono influenzare la tua capacità di fare richieste locali sono costanti impostate in modo errato nel tuo file wp-config.php
:
WP_HTTP_BLOCK_EXTERNAL
// Se WP_HTTP_BLOCK_EXTERNAL è definito puoi aggiungere host che non dovrebbero essere bloccati.
WP_ACCESSIBLE_HOSTS
Nel caso stessi utilizzando Proxy:
// Permette di definire alcuni indirizzi che non dovrebbero passare attraverso un proxy.
// Il core imposta sia www che non-www come bypass.
// get_option('siteurl') e localhost sono bypassati di default.
WP_PROXY_BYPASS_HOSTS
Nessun cURL?
Se cURL
non è disponibile e non stai trasferendo dati a un file, WP utilizzerà Fsocketopen()
come alternativa. Da un commento nel core, che riassume bene la situazione:
Fsocketopen ha problemi con 'localhost' e IPv6 con alcune versioni di PHP, tenta di connettersi a ::1, cosa che fallisce se il server non è configurato per questo. Per compatibilità, connettiti sempre all'indirizzo IPv4.
Il punto è che WP interviene solo se abbiamo il nome host localhost
. L'host fsocketopen verrà quindi impostato su '127.0.0.1'
.

'test:8888/?p=1' non è un URL valido.
Prova con 'http://test:8888/?p=1'.

che restituisce questo oggetto WP_Error ( [errors] => Array ( [http_request_failed] => Array ( [0] => Operazione scaduta dopo 5001 millisecondi con 0 byte ricevuti ) ) [error_data] => Array ( ) )

"test:8888" è un URL valido sulla tua macchina? Non ci sono problemi ad accedere a risorse locali, ma tali risorse devono effettivamente esistere ed essere accessibili.

Ho avuto un problema simile e l'ho risolto in questo modo:
function wpse35826_remote_get() {
// Effettua una richiesta HTTP GET all'URL specificato
$response = wp_remote_get( 'http://test:8888/?p=1' );
// Stampa la risposta formattata
echo 'Risposta:<pre>';
print_r($response);
echo '</pre>';
}
// Aggiunge la funzione all'hook admin_init di WordPress
add_action('admin_init','wpse35826_remote_get');

Penso che tu abbia effettivamente due problemi qui. La risposta di Otto ha risolto il tuo primo problema, perché omettendo http://
hai reso l'URL non valido, motivo per cui hai ricevuto l'errore A valid URL was not provided
.
Il secondo problema è qualcosa di diverso e non correlato, e ti sta dando l'errore Operation timed out
. Non posso dirlo con certezza senza vedere tutto il tuo codice, ma immagino che la chiamata wp_remote_get()
sia all'interno di una funzione di callback registrata a un hook che viene attivato anche sulla pagina che viene richiesta da wp_remote_get()
. Questa situazione crea un loop ricorsivo che alla fine scade il tempo.
Devi assicurarti che la chiamata wp_remote_get()
non venga eseguita sulla pagina che stai richiedendo. Puoi farlo registrando la callback a un hook diverso, o usando tag condizionali per evitare di chiamare wp_remote_get()
sulla pagina richiesta.
Ecco un esempio, assumendo che chiamerai sempre pagine non di amministrazione:
if( !is_admin() )
return;
$response = wp_remote_get( 'http://test:8888/?p=1' );
print_r($response);

add_filter( 'http_request_host_is_external', '__return_true' );
add_filter( 'http_request_args', function ( $args ) {
$args['reject_unsafe_urls'] = false;
return $args;
}, 999 );
add_filter( 'https_local_ssl_verify', '__return_false' );
add_filter( 'block_local_requests', '__return_false' );
Prova uno di questi filtri... ha funzionato nel mio caso
