How to get WordPress Multisite to allow nested paths on Bedrock
Recently the need came up to create a new site in a WordPress network installation that would exist in a nested directory (ie: heyjones.com/parent/child). Out of the box multisite only supports subdomain and single-level subdirectory sites, but by making some changes to .htaccess, implementing a modified instance of Sunrise and adding a definition to your config file.
I found an article detailing how to accomplish this with a standard WordPress installation, but in our case we needed to add this functionality to a Bedrock install. So, the first step is to modify your /web/.htaccess file like so:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ — [L]# add a trailing slash to /wp-admin
RewriteRule ^([_0–9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ — [L]RewriteRule ^(.+/)?(wp-(content|admin|includes).*) wp/$2 [L]
RewriteRule ^([_0–9a-zA-Z-]+/)?(.*\.php)$ wp/$2 [L]RewriteRule . index.php [L]
The next step is to create a file called /web/app/sunrise.php and add the following code:
<?phpif( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) ){
$current_site = new stdClass;
$current_site->id = defined( 'SITE_ID_CURRENT_SITE' ) ? constant( 'SITE_ID_CURRENT_SITE' ) : 1;
$current_site->domain = $domain = DOMAIN_CURRENT_SITE;
$current_site->path = $path = PATH_CURRENT_SITE;
if( defined( 'BLOGID_CURRENT_SITE' ) ){
$current_site->blog_id = BLOGID_CURRENT_SITE;
}
$url = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
$patharray = (array) explode( '/', trim( $url, '/' ) );
$pathsearch = '';
$blogsearch = '';
if( count( $patharray ) ){
foreach( $patharray as $pathpart ){
$pathsearch .= '/' . $pathpart;
$blogsearch .= $wpdb->prepare(" OR (domain = %s AND path = %s) ", $domain, $pathsearch . '/' );
}
}
$current_blog = $wpdb->get_row( $wpdb->prepare( "SELECT *, LENGTH( path ) as pathlen FROM $wpdb->blogs WHERE domain = %s AND path = '/'", $domain, $path ) . $blogsearch . 'ORDER BY pathlen DESC LIMIT 1' );
$blog_id = $current_blog->blog_id;
$public = $current_blog->public;
$site_id = $current_blog->site_id;
$current_site = pu_get_current_site_name( $current_site );
}function pu_get_current_site_name( $current_site ){
global $wpdb;
$current_site->site_name = wp_cache_get( $current_site->id . ':current_site_name', "site-options" );
if( !$current_site->site_name ){
$current_site->site_name = $wpdb->get_var( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = %d AND meta_key = 'site_name'", $current_site->id ) );
if( $current_site->site_name == null ){
$current_site->site_name = ucfirst( $current_site->domain );
}
wp_cache_set( $current_site->id . ':current_site_name', $current_site->site_name, 'site-options' );
}
return $current_site;
}
Finally, add the following line to /config/application.php to enable Sunrise:
define(‘SUNRISE’, true);And you’re all set! The one catch is that when creating a new site, WordPress won’t allow you to use a / in the URL, so simply replace it with a hyphen and you can go back and restore the forward slash(es) by editing the Site Address (URL) field under the Info tab.
