Passwortgeschützte externe RSS in WordPress-Vorlage anzeigen

Ich verwende den folgenden Code, um externen RSS-Feed in meiner WordPress-Blog-Seitenvorlage anzuzeigen:

items, 0, $maxitems); ?> 
  • No items
  • <a href='https://wordpress.stackexchange.com/questions/199051/display-password-protected-external-rss-in-wordpress-template/' title='https://wordpress.stackexchange.com/questions/199051/display-password-protected-external-rss-in-wordpress-template/'> https://wordpress.stackexchange.com/questions/199051/display-password-protected-external-rss-in-wordpress-template/

Der obige Feed war früher geöffnet, ist jetzt jedoch passwortgeschützt. Ich kenne den Benutzernamen und das Passwort bereits. Wie man den obigen Code zwickt, um Benutzer / Name Passwort zu benutzen?

Solutions Collecting From Web of "Passwortgeschützte externe RSS in WordPress-Vorlage anzeigen"

Ich gehe davon aus, dass Sie einen externen Feed mit einer HTTP-Authentifizierung abrufen .

Feeds mit HTTP-Authentifizierung abrufen

Beachten Sie, dass fetch_rss() die MagPie- Bibliothek verwendet, die in WordPress veraltet ist.

Verwenden Sie stattdessen fetch_feed() , das die SimplePie- Bibliothek verwendet.

Es sieht so aus, als ob es diese Art von URL nicht unterstützt:

 http://user:pass@example.tld/feed/ 

Wie können wir mit curl in der Kommandozeile verwenden, zB:

 # curl -i http://user:pass@example.tld/feed/ 

Die function fetch_feed() ruft die function wp_safe_remote_request() , um den Feed abzurufen. Dies geschieht in der WP_SimplePie_File class, die eine Erweiterung der SimplePie_File class ist.

Das sind gute Nachrichten, denn das bedeutet, dass wir den http_request_args Filter verwenden können, um die Anforderungsheader zu ändern. Wenn wir die Codex-Seite der HTTP-API aufrufen, sehen wir in den externen Referenzen, dass es einen Link zu John Blackbourns kurzem, aber informativem Beitrag über die Standardauthentifizierung mit der WordPress-HTTP-API gibt . Dort gibt er folgendes Beispiel:

 $args = array( 'headers' => array( 'Authorization' => 'Basic ' . base64_encode( YOUR_USERNAME . ':' . YOUR_PASSWORD ) ) ); wp_remote_request( $url, $args ); 

um den korrekten Authentifizierungsheader mit der Anfrage zu senden.

Demo-Plugin

Wir können jetzt eine Unterstützung für den folgenden URL-Typ hinzufügen:

 $rss = fetch_feed( 'http://user:pass@example.tld/feed/' ); 

mit dem Demo-Plugin:

 < ?php /** * Plugin Name: Fetch Feeds with http authentication * Description: Allows feeds urls like http://user:pass@example.tld/feed/ * Plugin URI: http://wordpress.stackexchange.com/a/199101/26350 */ add_action( 'wp_feed_options', function( $feed, $url ) { $user = parse_url( $feed->feed_url, PHP_URL_USER ); $pass = parse_url( $feed->feed_url, PHP_URL_PASS ); // Nothing to do if( ! $user || ! $pass ) return; // Remove the user:pass@ part from the feed url $feed->feed_url = str_replace( sprintf( '%s:%s@', $user, $pass ), '', $feed->feed_url ); add_filter( 'http_request_args', function( $r, $url ) use ( $user, $pass ) { // Add the user & pass to the request's header if( $user && $pass ) $r['headers']['Authorization'] = 'Basic ' . base64_encode( $user . ':' . $pass ); return $r; }, 10, 2 ); }, 10, 2 ); 

Aktualisieren:

So sieht der Fehler aus:

 WP HTTP Error: A valid URL was not provided. 

wenn wir laufen:

 $rss = fetch_feed( 'http://user:pass@example.tld/feed/' ); 

Es kommt von der WP_Http::request() Methode :

 if ( empty( $url ) || empty( $arrURL['scheme'] ) ) return new WP_Error('http_request_failed', __('A valid URL was not provided.')); 

So wird die function wp_safe_remote_request() definiert :

 function wp_safe_remote_request( $url, $args = array() ) { $args['reject_unsafe_urls'] = true; $http = _wp_http_get_object(); return $http->request( $url, $args ); } 

Ich habe nur damit gespielt und getestet:

 $args['reject_unsafe_urls'] = false; 

durch:

 add_action( 'wp_feed_options', function( $feed ) { $user = parse_url( $feed->feed_url, PHP_URL_USER ); $pass = parse_url( $feed->feed_url, PHP_URL_PASS ); if( ! $user || ! $pass ) return; add_filter( 'http_request_args', function( $r, $url ) use ( $user, $pass ) { if( $user && $pass ) $r['reject_unsafe_urls'] = false; return $r; }, 10, 2 ); } ); 

und dann hat das geklappt:

 $rss = fetch_feed( 'http://user:pass@example.tld/feed/' ); 

Innerhalb der WP_Http::request() -Methode haben wir folgende Bedingung:

 if ( $r['reject_unsafe_urls'] ) $url = wp_http_validate_url( $url ); 

Es sieht also so aus, als ob wp_http_validate_url() diese URL nicht validiert:

 http://user:pass@example.tld/feed/ 

Indem Sie reject_unsafe_urls auf false setzen, überspringen wir diese Prüfung.

Dafür gibt es einen Filter: http_request_reject_unsafe_urls , aber ich würde nicht empfehlen:

 add_filter( `http_request_reject_unsafe_urls`, '__return_false' ); 

Ich denke, dass das obige Demo-Plugin im Allgemeinen eine bessere Wahl wäre, weil es immer noch wp_http_validate_url() auf der authentifizierten URL verwendet.

Hinweis:

Dieser Teil :

 if ( isset( $parsed_url['user'] ) || isset( $parsed_url['pass'] ) ) return false; 

innerhalb der function wp_http_validate_url() scheint der show-stopper für fetch_feed() für URLs mit user: pass zu sein .