Wordpress - Multiple Domain Names - One WP Install (non-Multisite) - Default Each Domain name to Category Archive
Here's two different solutions (editing the specifics for your use case):
Doing a Redirect:
1.) At the top of your /wp-config.php
file add the following:
if ( is_yoursite_blogger_domain( $_SERVER['SERVER_NAME'] ) ) {
$domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
define( 'WP_SITEURL', 'http://' . $domain );
define( 'WP_HOME', 'http://' . $domain );
} else if ( ! is_main_domain( $_SERVER['SERVER_NAME'] ) ) {
header( "Location:http://{$yoursite_main_domain}", true, 301 );
exit;
}
function is_main_domain( $domain ) {
$domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
return strpos( $domain, 'maindomain.com' ) !== false;
}
function is_yoursite_blogger_domain( $domain ) {
$domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
return in_array( $domain, array(
'blogger1.com',
'blogger2.com',
'blogger3.com',
'blogger4.com',
'blogger5.com',
'uncategorized.dev', // Only here for use on my own test site
) );
}
2.) Then add this to your theme's functions.php
file:
add_action( 'template_redirect', 'yoursite_template_redirect' );
function yoursite_template_redirect() {
$path = $_SERVER['REQUEST_URI'];
if (strpos($path,"/category/") === false) {
$domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] ) ;
$category = str_replace( '.com', '', $domain );
$category = str_replace( '.dev', '', $domain ); // Only for my own test site
$location = "http://{$domain}/category/{$category}/" ;
wp_safe_redirect( $location );
exit;
}
}
}
The above will do a 302 redirect to http://blogger1.com/category/blogger1/
when a request is made of any URL http://blogger1.com
other than one that starts with http://blogger1.com/category/
(you made need to make some changes to support other URLs.)
Doing a "Rewrite":
What the above does not support is "rewrite" vs. a "redirect" solution. If you want to that it is a little more complicated. The following code will result in the category page being loaded in the root path for any domain that is mapped in your is_yoursite_blogger_domain()
function. Of course your is_yoursite_blogger_domain()
function could be validating against existing categories but I don't know the full criteria so I just hard coded it. You can copy this code into your function's theme.php
file or put into a .php
file of a plugin you might be writing. Note that this code also requires the code in the /wp-config.php
file above:
add_action( 'category_link', 'yoursite_category_link', 11, 2 );
function yoursite_category_link( $category_link, $category_id ) {
// Make sure any blogger category links are truncated to the root
$parts = explode( '/', $category_link );
if ( is_yoursite_blogger_domain( $parts[2] ) ) {
// if %category% in http://%domain%/category/%category%/
// equals %domain% minus the 'com' extension
if ( "{$parts[4]}." == substr( $parts[2], 0, strlen( $parts[4] ) + 1 ) ) {
$category_link = "http://{$parts[2]}/"; // Strip 'category/%category%/'
}
}
return $category_link;
}
add_action( 'init', 'yoursite_init' );
function yoursite_init() {
// Remove the canonical redirect to the category page
// if %category% in http://%category%.%ext%/ is a blogger category.
if ( is_yoursite_blogger_domain( $_SERVER['SERVER_NAME'] ) ) {
$parts = explode( '/', strtolower( $_SERVER['REQUEST_URI'] ) );
if (count($parts) > 1) {
$category_base = get_option( 'category_base' );
if ( empty( $category_base ) )
$category_base = 'category';
if ( $category_base == $parts[1] ) {
remove_filter( 'template_redirect', 'redirect_canonical' );
}
}
}
}
add_action( 'template_redirect', 'yoursite_template_redirect' );
function yoursite_template_redirect() {
// Redirect any http://%category%.%ext%/category/%category%/ to http://%category%.%ext%/
if ( is_yoursite_blogger_domain( $_SERVER['SERVER_NAME'] ) ) {
$category_base = get_option('category_base');
if (empty($category_base))
$category_base = 'category';
$parts = explode( '/', strtolower( $_SERVER['REQUEST_URI'] ) );
if ( $category_base == $parts[1] &&
"{$parts[2]}." == substr( $_SERVER['SERVER_NAME'], 0, strlen( $parts[2] ) + 1 ) ) {
wp_safe_redirect( "http://{$_SERVER['SERVER_NAME']}/", 301 );
exit;
}
}
}
add_action( 'request', 'yoursite_request' );
function yoursite_request($query_vars) {
// If %category% in http://%category%.%ext%/ is a blogger category set the
// 'category_name' query var to tell WordPress to display the category page.
$domain = $_SERVER['SERVER_NAME'];
if ( is_yoursite_blogger_domain( $domain ) ) {
$path = $_SERVER['REQUEST_URI'];
if ( strpos( $path, "/category/" ) === false ) {
$domain = str_replace( 'www.', '', $domain ) ;
$category_name = substr( $domain, 0, strrpos( $domain, '.' ) );
$query_vars = array( 'category_name' => $category_name );
}
}
return $query_vars;
}
And here's a screen shot to show the second example in action:
(source: mikeschinkel.com)
Another probably better way to approach this would be with a custom taxonomy instead of categories, or even better yet, map the domain to a user name instead. That way it's less work on the authors and you don't have to worry about maintaining the blogger list in code or in a separate taxonomy list.
As for you "bonus", sorry but I don't follow what you want there.