4

Use case is somewhat simple - here goes:

  1. Five people share a single wordpress install - not multi-user
  2. Each person blogs and puts their posts in a their own unique category
  3. Each person has their own domain name
  4. All domain names are pointed or parked to same WP install folder
  5. Each person's domain name only shows the posts from their category, i.e.

  6. Google friendly indexing for each domain name
  7. Prefer rewrite solution rather than redirect but redirect is acceptable
  8. A"master" account would be able to post or edit any of the bloggers posts via the "main" domain login.
  9. Bonus - if this could be extended to custom post types

Environment

  1. One installation of latest version of WP (not multi-user)
  2. Pretty Permalinks
  3. Cpanel - to set up domain parking
  4. No subdomains
  5. Access to .htaccess
  6. Access to functions.php
2
  • Why wouldn't you just use Multisite for this? Mar 30, 2017 at 16:59
  • This is functionally equivalent to multisite, but more complicated, and the master account would just be a super admin user. As an aside, the domains here you'll want rewriting, but even then, permalink rewrite rules won't be able to handle this scenario, doing this will be fragile, take a lot of time to maintain, easily break, and be difficult to implement. Multisite on the other hand does all of this by design
    – Tom J Nowell
    Mar 30, 2017 at 17:54

2 Answers 2

5

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:

Screenshot of a WordPress site using hooks to enable a category page to be displayed in the URL root for selected categories
(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.

14
  • custom taxonomy instead of categories - this was the bonus
    – aj martin
    Apr 18, 2011 at 0:25
  • this is an awesome solution. I left out a use case. The "master" account would be able to post or edit any of the bloggers posts via the "main" domain login. It seems here that you must be logged in on the domain name to see any of the posts. What would be great is to be able to exclude the main domain name from the rewrite so it can edit any post.
    – aj martin
    Apr 18, 2011 at 0:45
  • Call to undefined function wp_safe_redirect() in /home/targeted/public_html/wp-config.php on line 3 I get this error if I use non-listed domain - I assume the function isnt loaded at this point
    – aj martin
    Apr 18, 2011 at 1:33
  • @aj martin - I've updated the code to address your "main domain requirement and fixed the bug you found. As for a custom taxonomy, maybe another day. :) Apr 18, 2011 at 2:14
  • @aj martin - Also please update your question with your new requirement so that someone who finds this question via SEO won't be confused if they only read your question and not the comments. Apr 18, 2011 at 2:16
0
  1. Create the domain alias(es)

  2. Add this to your wp-config file:

    define('WP_SITEURL','http://'.$_SERVER['SERVER_NAME']);
    define('WP_HOME','http://'.$_SERVER['SERVER_NAME']);
    
  3. Go to your theme and add something like this to load the main content (used this for a one pager):

    $home=get_page_by_path(substr($_SERVER['SERVER_NAME'], 0, strlen($_SERVER['SERVER_NAME'])-4));
    echo do_shortcode($home->post_content);
    
  4. change the categorie, page or post slug to the domain name min the toplevel domain, in this case a toplevel domain only with 4 characters. For example: .com .net .org if you want to use something like .nl .be or .de than you should change the 4 into a 3. If you wanna use both than you've to add conditions.

Note: This may only work for one page, but I'm only giving you the idea. You can expand the functionality of the code yourself if it's necessary

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.