How to get WordPress Multisite to allow nested paths on Bedrock

Chris Jones
Jul 10, 2017 · 2 min read

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.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade