WordPress-URL und wp_get_attachment_image_src – http vs. https

Lesezeit: 3 Minuten

In den WordPress-Einstellungen muss die WordPress-URL (die für viele Ressourcen-URLs verwendet wird) auch fest codiert werden http:// oder https:// in der URL. Dies führt zu Problemen, wenn unsichere Teile auf eine sichere Site geladen werden oder umgekehrt. Wie gehe ich damit um?

Beispiel:

//The wordpress URL setting (In Settings->General)
http://example.net

//An image source (this is now http://example.net/images/myimage.png)
$imageSource = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), "myimage" );

?><img src="https://stackoverflow.com/questions/24127714/<?php%20echo%20$imageSource;%20?>" .?<?php ... ?>

Wenn der Benutzer zu Besuch ist https://example.netwird das Bild weiterhin vom unsicheren “http” geladen.

Wie behebe ich das, damit eine Site in https alles lädt (nicht nur wp_get_attachment_image_src) in https und umgekehrt?

Das ist ein bekannter Defekt/Bug in WordPress und soll in WP 4.0 behoben werden.

Inzwischen, Hier ist ein Filter, den ein WP-Entwickler gepostet hat mit denen ich großen Erfolg hatte:

function ssl_post_thumbnail_urls($url, $post_id) {

  //Skip file attachments
  if(!wp_attachment_is_image($post_id)) {
    return $url;
  }

  //Correct protocol for https connections
  list($protocol, $uri) = explode('://', $url, 2);

  if(is_ssl()) {
    if('http' == $protocol) {
      $protocol="https";
    }
  } else {
    if('https' == $protocol) {
      $protocol="http";
    }
  }

  return $protocol.'://'.$uri;
}
add_filter('wp_get_attachment_url', 'ssl_post_thumbnail_urls', 10, 2);

  • Danke, ich wusste nicht, dass Sie einen Filter für diese Funktion erstellen können

    – Don Rhummy

    10. Juli 2014 um 21:31 Uhr

  • @cfx hat die beste Antwort, es spricht sowohl an, warum dies ein Problem ist, als auch eine wirklich einfache und verallgemeinerte Lösung für das Problem. Ich habe es heute erst implementiert und es war genau das, was ich brauchte. Danke!

    – Matt Cromwell

    29. Oktober 2014 um 4:15 Uhr

  • @cfx Ich bin froh, dass Sie meinen kleinen Filter nützlich fanden!

    – Chaoix

    13. Oktober 2015 um 16:01 Uhr

Sie müssten nur das http in der URL-Zeichenfolge ersetzen.

$imageSource = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), "myimage" ); 
$output = preg_replace( "^http:", "https:", $imageSource );
echo $output;

Sie können Ihren erforderlichen Funktionen jederzeit einen Filter hinzufügen (z. B.: add_filter( 'template_directory_uri', function( $original )… um immer SSL zu verwenden.

  • Ist die einzige Lösung, Preg-Replace für den gesamten Code zu verwenden? Warum berücksichtigen die WordPress-Funktionen nicht die verschiedenen Protokolle, die für den Zugriff auf die Website verwendet werden?

    – Don Rhummy

    9. Juni 2014 um 19:51 Uhr

  • Wenn Sie einen Beitrag erstellen, wird die URL in die Datenbank post_content eingegeben. Es dient der Einfachheit beim Bau von Funktionen. Sie müssten Ihre Funktionsaufrufe anders angehen, wenn Sie preg_replace nicht verwenden oder Filter anwenden möchten. Sie würden beispielsweise die Bild-ID abrufen und // anstelle von http(s):// in Ihrer URL-Zeichenfolge verwenden. Wie auch immer, kurz gesagt, ja, Sie müssen auf die eine oder andere Weise Instanzen von http:// durch https:// ersetzen

    – Mike

    9. Juni 2014 um 19:52 Uhr


Nur um die @Epik-Antwort näher auszuführen – Wir sollten ein HTTP bei HTTP und HTTPS bei HTTPS bereitstellen.

Wir können eine Logik hinzufügen, die mit der eingebauten WordPress-Funktion is_ssl() prüft und dann entweder den Preg-Ersatz durchführt oder das Standard-http verwendet.

    $imageSource = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), "myimage" ); 

    $output = is_ssl() ? preg_replace( "^http:", "https:", $imageSource ) : $imageSource ;
    echo $output;

1002010cookie-checkWordPress-URL und wp_get_attachment_image_src – http vs. https

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy