Отримайте 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();

оскільки 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
Існує ще одне вирішення цієї проблеми в Pulgin
Девід

1
Я думаю, що корисно, щоб ви додали джерело як відповідь для інших читачів. Посилання не є стабільним і не відповідає WPSE відповіді.
Бульдж

1
@bueltge В основному я згоден. Але мій коментар, покладаючись на це рішення, був трохи переборливим. Рішення є підходом до цієї проблеми, але воно має деякі обмеження: github.com/inpsyde/multilingual-press/isissue/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);

1
Так, це повинно працювати в стандартних установках WordPress. Однак я не хотів би використовувати це через дії запису в БД. Це зробить switch_to_blog()ще повільніше.
Девід

Це також передбачає, що ваш вміст URL-адреса насправді є wp-content / uploads, що може бути не так.
rfair404
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.