在多站点中按博客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/…–
David

1
我认为将源添加为其他读者的答案是有帮助的。链接不稳定,并且不在WPSE答案之列。
bueltge

1
@bueltge基本上我同意。但是,我依靠此变通办法的评论有点过于笼统。解决方案是解决此问题的一种方法,但有一些局限性:github.com/inpsyde/multilingual-press/issues/133 当我们找到解决方案时,我当然也会在这里回答。
大卫,

Answers:


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安装中使用。但是,由于数据库写入操作,我不想使用此功能。这将使switch_to_blog()速度变慢。
大卫,

这还假设您的内容url实际上是wp-content / uploads,事实并非如此。
rfair404
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.