[wp-trac] [WordPress Trac] #22702: Base URL is not properly set for the main site when ms-files rewriting is enabled for MU-era installs
WordPress Trac
noreply at wordpress.org
Mon Dec 3 21:23:17 UTC 2012
#22702: Base URL is not properly set for the main site when ms-files rewriting is
enabled for MU-era installs
-----------------------+--------------------------
Reporter: nacin | Type: defect (bug)
Status: new | Priority: high
Milestone: 3.5 | Component: Multisite
Version: trunk | Severity: critical
Keywords: has-patch |
-----------------------+--------------------------
I attempted to untangle wp_upload_dir() this release via #19235. Clearly,
that didn't work out too well.
Finally down to the last bug: In a MU-era install, the main site has the
wrong base URL. This is as simple as stale logic. (Aren't all bugs?)
A MU-era install is defined as an install that was installed prior to the
merge. As it wasn't created in a single-to-multi upgrade step, the first
site uses blogs.dir, among other things. Setting this up is a total pain,
but can mostly be done by taking 3.4, upgrading it to multisite, renaming
the main site non-global tables to `wp_1_` (if your table prefix was
`wp_`), and removing MULTISITE (but keeping SUBDOMAIN_INSTALL). Then
update to trunk. It's not perfect, but it works for this test.
So, here's the issue: In prior versions, we calculated the base URL as
follows:
{{{
if ( defined('UPLOADS') && !$main_override && ( !isset( $switched ) ||
$switched === false ) ) {
$dir = ABSPATH . UPLOADS;
$url = trailingslashit( $siteurl ) . UPLOADS;
}
if ( is_multisite() && !$main_override && ( !isset( $switched ) ||
$switched === false ) ) {
if ( defined( 'BLOGUPLOADDIR' ) )
$dir = untrailingslashit(BLOGUPLOADDIR);
$url = str_replace( UPLOADS, 'files', $url );
}
}}}
UPLOADS is always defined for multisite, so think of this code like this
instead:
{{{
if ( defined('UPLOADS') && !$main_override && ( !isset( $switched ) ||
$switched === false ) ) {
$dir = ABSPATH . UPLOADS;
$url = trailingslashit( $siteurl ) . UPLOADS;
if ( is_multisite() ) {
if ( defined( 'BLOGUPLOADDIR' ) )
$dir = untrailingslashit(BLOGUPLOADDIR);
$url = str_replace( UPLOADS, 'files', $url );
}
}
}}}
And, if you look at $url, it's silly to do an str_replace there. So $url
becomes just:
{{{
$url = trailingslashit( $siteurl ) . 'files';
}}}
Got it? Good. Now, here's trunk:
{{{
if ( defined( 'UPLOADS' ) && ! ( is_multisite() && get_site_option(
'ms_files_rewriting' ) ) ) {
$dir = ABSPATH . UPLOADS;
$url = trailingslashit( $siteurl ) . UPLOADS;
}
}}}
Oops, in an ms-files-rewriting situation, we don't touch $dir and $url.
Why? Because we need to handle it separately for two cases:
* When ms-files-rewriting is not enabled (and if not the main site of a
post-MU network!)
* When it is enabled and we are not switched (and if not the main site of
a post-MU network!)
So we do that in the subsequent block:
{{{
// If not the main site of a post-MU network!
if ( is_multisite() && ! ( is_main_site() && defined( 'MULTISITE'
) ) ) {
// If ms-files-rewriting is not enabled
if ( ! get_site_option( 'ms_files_rewriting' ) ) {
[[ truncated, we don't care about this situation right
now ]]
// If it is not enabled and we are not switched
} elseif ( defined( 'UPLOADS' ) && ! ms_is_switched() ) {
if ( defined( 'BLOGUPLOADDIR' ) )
$dir = untrailingslashit( BLOGUPLOADDIR );
$url = trailingslashit( $siteurl ) . 'files';
}
}
}}}
So, what's missing? We're setting $dir and $url exactly as before, but
we're missing the part where $dir and $url are already set. $dir should be
ABSPATH . UPLOADS going into this block, and $url should be $siteurl .
UPLOADS.
Patch attached.
--
Ticket URL: <http://core.trac.wordpress.org/ticket/22702>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software
More information about the wp-trac
mailing list