Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Check if a local file exists in the WordPress media library and if it doesn't exist, replace the URL with a different URL. Helpful when working with a local site that doesn't have all of the media downloaded as the production site. See https://localwp.com/community/t/proxying-requests-to-wp-content-uploads-to-a-production-site/15701
<?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

This comment has been minimized.

Copy link

@pixelbrad pixelbrad commented May 12, 2020

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.

if ( defined( 'RH_USE_REMOTE_MEDIA_URL' ) && ! empty( RH_USE_REMOTE_MEDIA_URL ) ) {
	add_filter( 'wp_get_attachment_image_src', array( $this, 'filter_wp_get_attachment_image_src' ) );
	add_filter( 'wp_calculate_image_srcset', array( $this, 'filter_wp_calculate_image_srcset' ) );
	add_filter( 'wp_get_attachment_url', array( $this, 'filter_wp_get_attachment_url' ) );
}

should be

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

Other than that, this script is a godsend. Thank you for sharing this with the rest of us.

@kingkool68

This comment has been minimized.

Copy link
Owner Author

@kingkool68 kingkool68 commented May 12, 2020

@pixelbrad Oops! You're right. I have updated the gist.

@KimBranzell

This comment has been minimized.

Copy link

@KimBranzell KimBranzell commented May 15, 2020

Just a heads up, you missed the last $this in line 9, which was still causing a fatal error

@kingkool68

This comment has been minimized.

Copy link
Owner Author

@kingkool68 kingkool68 commented May 20, 2020

@KimBranzell Oops! You're right. I have updated the gist.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment