Wordpress URL和wp_get_attachment_image_src - http vs https

时间:2014-06-09 19:41:23

标签: php wordpress

在Wordpress设置中,Wordpress URL(用于许多资源网址)要求您在网址中对http://https://进行硬编码。这导致在安全站点上加载不安全部件的问题,反之亦然。我该如何处理?

示例:

//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="<?php echo $imageSource; ?>" .?<?php ... ?>

如果用户正在访问https://example.net,则仍会从非安全&#34; http&#34;中加载图片。

如何解决此问题,以便https中的网站加载https中的所有内容(不只是wp_get_attachment_image_src),反之亦然?

3 个答案:

答案 0 :(得分:13)

这是WordPress中的known defect/bug,计划在WP 4.0中修复。

与此同时,here is a filter a WP dev posted我取得了巨大的成功:

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

答案 1 :(得分:5)

您只需要替换URL字符串中的http即可。

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

您始终可以为所需的功能添加过滤器(例如:add_filter( 'template_directory_uri', function( $original ) ...以始终使用SSL。

答案 2 :(得分:0)

仅详细说明@Epik答案 - 我们应该在HTTPS时使用HTTP和HTTPS服务HTTP。

我们可以添加一些逻辑,使用内置的Wordpress函数is_ssl()进行检查,然后执行preg替换或使用标准的http。

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

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