Суть вопроса в том, что я ищу решение, подобное этому:
$blog_upload_dir_info = wp_upload_dir( $date, $blog_ID );
$blog_upload_url = $blog_upload_dir_info[ 'baseurl' ];
Где $blog_ID
отличается текущий идентификатор блога. Наиболее «WP-очевидное» решение терпит неудачу:
switch_to_blog( $blog_ID );
$blog_upload_dir_info = wp_upload_dir();
restore_current_blog();
as wp_upload_dir () полагается на константу, WP_CONTENT_URL
которая динамически устанавливает URL текущего блога, если upload_url_path
не задана опция .
Конечно, я мог бы установить эту опцию, но это связало бы мой код с конкретными настройками системы, что включает в себя большой потенциал »WTF?«.
Поэтому я решил добавить эту опцию виртуально:
/**
* 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;
}
который на самом деле является частью ветвления wp_upload_dir()
и, как таковой, опирается на константы, что вовсе не является хорошей практикой . Более того, разветвление всегда связано с исходной реализацией, и если исходное изменение изменяется, нужно также исправить разветвление.
Так как это решение далеко от совершенства, мне интересно, есть ли лучший способ получить URL для загрузки по идентификаторам блогов.
Ответы:
Почему бы просто не использовать
get_option('upload_path')
после вашегоswitch_to_blog( $blog_ID );
? Это делает это?источник
get_blog_details
codex.wordpress.org/WPMU_Functions/get_blog_details )wp_upload_dir()
: эта опцияupload_path
не является опцией по умолчанию и может быть пустой. Далее это может быть опущено опциейupload_url_path
. Тем не менее, правильное решение для этой проблемы будет полностью раскошелиться,wp_upload_dir()
чтобы покрыть все эти возможные настройки и крайние случаи.Для полноты картины это решение работает до тех пор, пока проблема не будет устранена в ядре:
источник
switch_to_blog()
еще медленнее.