folosirea wp_remote_get pentru a prelua URL-ul propriu pe localhost

8 dec. 2011, 01:58:27
Vizualizări: 17.1K
Voturi: 1

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?

0
Toate răspunsurile la întrebare 5
1

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

19 ian. 2013 12:33:42
Comentarii

Răspuns excelent! Magia pentru mine a fost trecerea de la http://localhost la http://127.0.0.1 - nicio altă parte din acest răspuns nu a mai contat după ce am făcut această modificare.

random_user_name random_user_name
28 dec. 2016 01:32:42
4

'test:8888/?p=1' nu este un URL valid.

Încearcă 'http://test:8888/?p=1' în schimb.

8 dec. 2011 02:16:32
Comentarii

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

Mike Mike
8 dec. 2011 04:50:05

Folosesc MAMP

Mike Mike
8 dec. 2011 04:50:15

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.

Otto Otto
8 dec. 2011 16:06:25

da, asta se rezolvă corect pe mașina mea.

Mike Mike
8 dec. 2011 18:22:28
0

Am avut o problemă similară și am rezolvat-o astfel:

function wpse35826_remote_get() {
    $response = wp_remote_get( 'http://test:8888/?p=1' );
    echo 'Răspuns:<pre>';
    print_r($response);
    echo '</pre>';
}
add_action('admin_init','wpse35826_remote_get');
18 apr. 2012 09:26:06
0

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);
28 aug. 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' );

Încearcă oricare dintre filtre... a funcționat pentru mine

22 iul. 2024 21:30:29