web-dev-qa-db-ja.com

マルチサイトのブログIDでアップグレードURLを取得する

問題の本質は、私はこのような解決策を探しているということです。

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

$blog_IDは現在のブログ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()の部分的なフォークであり、そのようなものとして まったく良い習慣ではない定数に依存しています 。さらに、フォークは常にオリジナルの実装と結び付けられており、オリジナルが変更された場合は、フォークも修正する必要があります。

この解決策は完璧とは程遠いので、ブログIDでURLをアップロードするもっと良い方法があるのだろうか。

11
David

なぜあなたのget_option('upload_path')の後にswitch_to_blog( $blog_ID );を使わないのですか?それはやりますか?

1
Megan