11

The essence of the question is, I'm looking for a solution like this:

$blog_upload_dir_info = wp_upload_dir( $date, $blog_ID ); $blog_upload_url = $blog_upload_dir_info[ 'baseurl' ]; 

Where $blog_ID is different of the current blog ID. The most »WP-obvious« solution fails:

switch_to_blog( $blog_ID ); $blog_upload_dir_info = wp_upload_dir(); restore_current_blog(); 

as wp_upload_dir() relies on the constant WP_CONTENT_URL which is dynamically set the URL of the current blog unless the option upload_url_path is set.

Of course, I could set this option, but this would couple my code to concrete system settings which includes much »WTF?«-potential.

So I decided to add this option virtually:

/** * Apply a value to the option blog_upload_url * if there's not already one * * @wp-hook option_upload_url_path * @param string $upload_url * @return string */ function get_real_blog_upload_url( $upload_url ) { if ( '' !== trim( $upload_url ) ) return $upload_url; $upload_path = trim( get_option( 'upload_path' ) ); $siteurl = get_option( 'siteurl' ); $wp_content_dir = $siteurl . '/wp-content'; if ( empty( $upload_path ) || 'wp-content/uploads' == $upload_path ) { $dir = $wp_content_dir . '/uploads'; } elseif ( 0 !== strpos( $upload_path, ABSPATH ) ) { // $dir is absolute, $upload_path is (maybe) relative to ABSPATH $dir = path_join( ABSPATH, $upload_path ); } else { $dir = $upload_path; } if ( empty( $upload_path ) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) ) $upload_path = $wp_content_dir . '/uploads'; else $upload_path = trailingslashit( $siteurl ) . $upload_path; return $upload_path; } 

which is in fact a partly fork of wp_upload_dir() and as such relies on constants which isn't a good practice at all. Moreover a fork is always coupled to the original implementation and if the original changes, one also have to fix the fork.

So as this solution is far away from being perfect, I wonder if there's a better way to get upload URLs by blog IDs.

3
  • 1
    There's another workaround for this problem in the Plugin Multilingual Press: github.com/inpsyde/multilingual-press/blob/… Commented May 1, 2015 at 12:30
  • 1
    I think it is helpful that you add the source as answer for other readers. The link is not stable and outside the WPSE Answer. Commented May 6, 2015 at 8:20
  • 1
    @bueltge Basically I agree. But my comment relying to this workaround was a bit overhasty. The solution is an approach for this problem, but it has some limitations: github.com/inpsyde/multilingual-press/issues/133 When we found a solution, I of course will answer it here too. Commented Jul 10, 2015 at 7:30

2 Answers 2

1

Why not just use get_option('upload_path') after your switch_to_blog( $blog_ID );? Does that do it?

2
  • (Build the full URL by using get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_details) Commented Feb 25, 2016 at 12:46
  • Look into wp_upload_dir(): The option upload_path is not a default option and might be empty. Further it could be omitted by the option upload_url_path. However, a proper solution for this problem would be to fork wp_upload_dir() completely to cover all this possible settings and edge cases. Commented Feb 25, 2016 at 16:48
-1

For completeness' sake, this solution seems to work until the issue is fixed in core:

add_action('switch_blog', function($new_blog, $prev_blog_id) { update_option( 'upload_url_path', get_option('siteurl') . '/wp-content/uploads'); }, 10, 2); 
2
  • 1
    Yes, that should work in standard WordPress installs. However, I wouldn't want to use this due to the DB write action. This will make switch_to_blog() even slower. Commented Oct 14, 2016 at 14:16
  • This is also assuming that your content url is actually wp-content/uploads, which may not be the case. Commented Apr 18, 2017 at 16:50

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.