Получить URL загрузки по идентификатору блога в мультисайте

11

Суть вопроса в том, что я ищу решение, подобное этому:

$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 для загрузки по идентификаторам блогов.

Дэвид
источник
1
Есть еще одно решение этой проблемы в плагине «Многоязычная пресса»: github.com/inpsyde/multilingual-press/blob/…
Дэвид
1
Я думаю, что это полезно, чтобы вы добавили источник в качестве ответа для других читателей. Ссылка нестабильна и находится вне ответа WPSE.
Bueltge
1
@bueltge В основном я согласен. Но мой комментарий в отношении этого обходного пути был немного поспешным. Решение - это подход к этой проблеме, но у него есть некоторые ограничения: github.com/inpsyde/multilingual-press/issues/133 Когда мы нашли решение, я, конечно, отвечу и здесь.
Дэвид

Ответы:

1

Почему бы просто не использовать get_option('upload_path')после вашего switch_to_blog( $blog_ID );? Это делает это?

Меган
источник
(Создайте полный URL с помощью get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_details )
Меган,
Посмотрите wp_upload_dir(): эта опция upload_pathне является опцией по умолчанию и может быть пустой. Далее это может быть опущено опцией upload_url_path. Тем не менее, правильное решение для этой проблемы будет полностью раскошелиться, wp_upload_dir()чтобы покрыть все эти возможные настройки и крайние случаи.
Дэвид
-1

Для полноты картины это решение работает до тех пор, пока проблема не будет устранена в ядре:

add_action('switch_blog', function($new_blog, $prev_blog_id) {
    update_option( 'upload_url_path',  get_option('siteurl') . '/wp-content/uploads');
}, 10, 2);
Arbelzapf
источник
1
Да, это должно работать в стандартных установках WordPress. Однако я не хотел бы использовать это из-за действия записи в БД. Это сделает switch_to_blog()еще медленнее.
Дэвид
Это также предполагает, что URL-адрес вашего контента на самом деле является wp-content / uploads, что может быть не так.
rfair404