-
-
Save kingkool68/d5e483528a260e5c7921afb5c88bffd6 to your computer and use it in GitHub Desktop.
<?php | |
// Put this in wp-config.php and replace https://example.com/ with the URL of the production site. | |
define( 'RH_USE_REMOTE_MEDIA_URL', 'https://example.com/' ); | |
// Put the rest of this in functions.php or a custom plugin or somewhere else. | |
if ( defined( 'RH_USE_REMOTE_MEDIA_URL' ) && ! empty( RH_USE_REMOTE_MEDIA_URL ) ) { | |
add_filter( 'wp_get_attachment_image_src', 'filter_wp_get_attachment_image_src' ); | |
add_filter( 'wp_calculate_image_srcset', 'filter_wp_calculate_image_srcset' ); | |
add_filter( 'wp_get_attachment_url', 'filter_wp_get_attachment_url' ); | |
} | |
function filter_wp_get_attachment_image_src( $image = array() ) { | |
if ( ! is_array( $image ) || empty( $image ) ) { | |
return $image; | |
} | |
$wp_upload_dir = wp_upload_dir(); | |
$base_dir = $wp_upload_dir['basedir']; | |
$base_url = $wp_upload_dir['baseurl']; | |
$absolute_path = str_replace( $base_url, $base_dir, $image[0] ); | |
if ( file_exists( $absolute_path ) ) { | |
return $image; | |
} | |
$find = get_site_url(); | |
$replace = RH_USE_REMOTE_MEDIA_URL; | |
$image[0] = str_replace( $find, $replace, $image[0] ); | |
return $image; | |
} | |
function filter_wp_calculate_image_srcset( $src = array() ) { | |
if ( is_array( $src ) && ! is_admin() ) { | |
$wp_upload_dir = wp_upload_dir(); | |
$base_dir = $wp_upload_dir['basedir']; | |
$base_url = $wp_upload_dir['baseurl']; | |
$find = get_site_url(); | |
$replace = RH_USE_REMOTE_MEDIA_URL; | |
foreach ( $src as $key => $val ) { | |
$absolute_path = str_replace( $base_url, $base_dir, $val['url'] ); | |
if ( ! file_exists( $absolute_path ) ) { | |
$val['url'] = str_replace( $find, $replace, $val['url'] ); | |
$src[ $key ] = $val; | |
} | |
} | |
} | |
return $src; | |
} | |
function filter_wp_get_attachment_url( $url = '' ) { | |
if ( is_admin() ) { | |
return $url; | |
} | |
$wp_upload_dir = wp_upload_dir(); | |
$base_dir = $wp_upload_dir['basedir']; | |
$base_url = $wp_upload_dir['baseurl']; | |
$find = get_site_url(); | |
$replace = RH_USE_REMOTE_MEDIA_URL; | |
$absolute_path = str_replace( $base_url, $base_dir, $url ); | |
if ( ! file_exists( $absolute_path ) ) { | |
$url = str_replace( $find, $replace, $url ); | |
} | |
return $url; | |
} |
@pixelbrad Oops! You're right. I have updated the gist.
Just a heads up, you missed the last $this in line 9, which was still causing a fatal error
@KimBranzell Oops! You're right. I have updated the gist.
Thanks! This worked for me but I had to remove the trailing slash when defining RH_USE_REMOTE_MEDIA_URL
. Not sure if that's specific to my environment but it may help others.
@bacoords if you have a Composer based site setup I took this work and created a MU Plugin that can be installed as a dev dependency on a site. I have addressed that trailing slash issue in my version of the code.
https://packagist.org/packages/ndigitals/wp-local-media-proxy
Also if you're running WordPress on an Apache server you can accomplish the same thing by dropping a .htaccess
file into /wp-content/uploads/
with the following contents:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) https://example.com/wp-content/uploads/$1 [L]
Replace https://example.com
with the production URL of your site to redirect media requests to.
Just a heads up, I tried this on a local project and ran into a fatal error. On lines 7, 8, and 9, you're adding filters as if the functions are part of a class.
should be
Other than that, this script is a godsend. Thank you for sharing this with the rest of us.