マルチサイトでブログIDによってアップロードURLを取得する


11

質問の本質は、私はこのような解決策を探している:

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

$blog_ID現在のブログIDとはどこが異なりますか。ほとんどの»WP-obvious«ソリューションは失敗します:

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()あり、定数に依存しているため、あまり良い方法ではありません。さらに、フォークは常に元の実装に結合されており、元の変更があった場合は、フォークを修正する必要もあります。

したがって、このソリューションは完全とはほど遠いので、ブログIDでアップロードURLを取得するためのより良い方法があるかどうか疑問に思います。


1
プラグインの多言語押しでこの問題の別の回避策があります:github.com/inpsyde/multilingual-press/blob/...
デヴィッド・

1
他の読者のために回答としてソースを追加すると役立つと思います。リンクは安定しておらず、WPSE Answerの外部にあります。
bueltge

1
@bueltge基本的に同意します。しかし、この回避策に依存している私のコメントは少しやり過ぎでした。解決策はこの問題へのアプローチですが、いくつかの制限があります:github.com/inpsyde/multilingual-press/issues/133 解決策を見つけたら、もちろんここでも答えます。
デビッド

回答:


1

get_option('upload_path')あなたの後に使ってみませんswitch_to_blog( $blog_ID );か?それはそれをしますか?


get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_detailsを使用して完全なURLを作成する
Megan

調査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インストールで動作するはずです。ただし、DB書き込みアクションのため、これを使用したくありません。これはswitch_to_blog()さらに遅くなります。
デビッド

これは、コンテンツURLが実際にはwp-content / uploadsであることも想定していますが、そうではない場合もあります。
rfair404
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.