Come utilizzare wp_remote_get per recuperare l'URL locale in sviluppo

8 dic 2011, 01:58:27
Visualizzazioni: 17.1K
Voti: 1

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?

0
Tutte le risposte alla domanda 5
1

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'.

19 gen 2013 12:33:42
Commenti

Risposta eccellente! La magia per me è stata cambiare da http://localhost a http://127.0.0.1 - nessun'altra parte di questa risposta ha avuto importanza dopo aver effettuato questa modifica.

random_user_name random_user_name
28 dic 2016 01:32:42
4

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

Prova con 'http://test:8888/?p=1'.

8 dic 2011 02:16:32
Commenti

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 ( ) )

Mike Mike
8 dic 2011 04:50:05

Sto utilizzando MAMP

Mike Mike
8 dic 2011 04:50:15

"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.

Otto Otto
8 dic 2011 16:06:25

sì, si risolve correttamente sulla mia macchina.

Mike Mike
8 dic 2011 18:22:28
0

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');
18 apr 2012 09:26:06
0

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);
28 ago 2012 01:29:13
0
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

22 lug 2024 21:30:29