folosirea wp_remote_get pentru a prelua URL-ul propriu pe localhost
Am un site în dezvoltare locală la test:8888 și încerc să fac următorul cod să funcționeze în fișierul meu functions.php.
$response = wp_remote_get( 'test:8888/?p=1' );
print_r($response);
Din păcate, acest cod afișează:
WP_Error Object ( [errors] => Array ( [http_request_failed] => Array ( [0] => A valid URL was not provided. ) ) [error_data] => Array ( ) )
Este posibil să soliciți propriul URL atunci când lucrezi pe localhost?

Timp de așteptare pentru reclame
Poți depăși timpul de așteptare folosind un filtru
add_filter( 'http_request_timeout', 'wpse35826_timeout_extd' );
function wpse35826_timeout_extd( $time )
{
// Timpul implicit de așteptare este 5
return 10;
}
Alege protocolul/schema corectă
Referitor la problema ta cu protocolul/schema: Dacă este o instalație locală, poți folosi condiționalul.
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 ) );
}
// Declanșează cererea
wpse35826_remote_get();
Dacă faci cereri către propriul tău server local, atunci poate exista o problemă cu verificarea SSL. WP folosește un filtru pentru a declanșa setarea:
add_filter( 'https_local_ssl_verify', '__return_false' );
Acest filtru nu(!) se activează pentru serverele locale care fac cereri către un server pe internet. Pentru servere externe folosește următorul filtru:
add_filter( 'https_ssl_verify', '__return_false' );
Probleme cu cererile locale
De asemenea, pot exista probleme cu cererile locale blocate:
add_filter( 'block_local_requests', '__return_false' );
Alte lucruri care pot influența capacitatea ta de a face cereri locale sunt constantele setate greșit în fișierul tău wp-config.php
:
WP_HTTP_BLOCK_EXTERNAL
// Dacă WP_HTTP_BLOCK_EXTERNAL este definit, poți adăuga gazde care nu ar trebui blocate.
WP_ACCESSIBLE_HOSTS
În cazul în care folosești Proxies:
// Îți permite să definești unele adrese care nu ar trebui să treacă printr-un proxy.
// Nucleul setează atât versiunea www cât și non-www ca ocolire.
// get_option('siteurl') și localhost sunt ocolite implicit.
WP_PROXY_BYPASS_HOSTS
Nicio cURL?
Dacă cURL
nu este disponibil și nu transmiți date către un fișier, WP va reveni la folosirea Fsocketopen()
. Dintr-un comentariu din nucleu, care rezumă frumos:
Fsocketopen are probleme cu 'localhost' în IPv6 cu anumite versiuni de PHP, Încearcă să se conecteze la ::1, ceea ce eșuează când serverul nu este configurat pentru asta. Pentru compatibilitate, conectează-te întotdeauna la adresa IPv4.
Ideea este că WP intervine doar dacă avem numele de gazdă localhost
. Gazda fsocketopen va fi apoi setată la '127.0.0.1'
.

'test:8888/?p=1' nu este un URL valid.
Încearcă 'http://test:8888/?p=1' în schimb.

care returnează acest obiect WP_Error ( [errors] => Array ( [http_request_failed] => Array ( [0] => Operațiunea a expirat după 5001 de milisecunde fără a primi niciun byte ) ) [error_data] => Array ( ) )

Este "test:8888" o adresă URL validă pe mașina ta? Nu există nicio problemă în accesarea resurselor locale, dar acele resurse trebuie să existe și să fie accesibile.

Cred că de fapt ai două probleme aici. Răspunsul lui Otto a rezolvat prima ta problemă, deoarece omiterea http://
a făcut ca URL-ul să fie invalid, motiv pentru care ai primit eroarea A valid URL was not provided
.
A doua problemă este ceva diferit și fără legătură, și îți dă eroarea Operation timed out
. Nu pot spune cu siguranță fără a vedea întregul cod, dar bănuiesc că apelul wp_remote_get()
se află în interiorul unei funcții de callback care este înregistrată la un hook care se declanșează și pe pagina care este solicitată prin wp_remote_get()
. Această situație creează o buclă recursivă care în cele din urmă expiră din cauza timeout-ului.
Trebuie să te asiguri că apelul wp_remote_get()
nu este declanșat pe pagina pe care o soliciți. Poți face asta prin înregistrarea callback-ului la un alt hook sau prin folosirea tag-urilor condiționale pentru a evita apelarea wp_remote_get()
pe pagina solicitată.
Iată un exemplu, presupunând că vei apela întotdeauna pagini care nu sunt din administrare:
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' );
Încearcă oricare dintre filtre... a funcționat pentru mine
