多个域名-一个WP安装(非多站点)-默认每个域名为类别档案

时间:2011-04-15 作者:aj martin

用例有点简单-如下所示:

五个人共享一个wordpress安装,而不是多用户,每个人都写博客并将其帖子放在自己独特的类别中,每个人都有自己的域名,所有域名都指向或存放在相同的WP安装文件夹中,每个人的域名只显示其类别中的帖子,即。

  • http://blogger1.com 将返回Blogger1帖子的分类存档http://blogger2.com 将返回Blogger2帖子的类别存档,等等。每个域名的谷歌友好索引将首选重写解决方案,而不是重定向,但可以接受重定向。“主”帐户将能够通过“主”域登录发布或编辑任何博主帖子
  • 奖金-如果这可以扩展到自定义帖子类型
    1. 环境

      安装一个最新版本的WP(非多用户)

    2. Pretty Permalinks
    3. Cpanel-设置域驻车
    4. 无子域访问.htaccessfunctions.php

2 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

这里有两种不同的解决方案(为您的用例编辑细节):

执行重定向:

1。)在您的/wp-config.php 文件添加以下内容:

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.)然后将此添加到主题functions.php 文件:

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;
    }
  }
}
以上将执行302重定向到http://blogger1.com/category/blogger1/ 当对任何URL发出请求时http://blogger1.com 而不是以http://blogger1.com/category/ (您需要进行一些更改以支持其他URL。)

做一个;“重写”:

以上不支持的是;“重写”vs.a;重定向(&Q)解决方案。如果你想这样的话,它会更复杂一点。以下代码将导致类别页面加载到映射到中的任何域的根路径中is_yoursite_blogger_domain() 作用当然是你的is_yoursite_blogger_domain() 函数可以根据现有类别进行验证,但我不知道完整的标准,所以我只是硬编码了它。您可以将此代码复制到函数的theme.php 归档或放入.php 您可能正在编写的插件的文件。请注意,此代码还需要/wp-config.php 以上文件:

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;
}
下面的屏幕截图显示了第二个实际示例:

Screenshot of a WordPress site using hooks to enable a category page to be displayed in the URL root for selected categoriesmikeschinkel.com)

另一种可能更好的方法是使用自定义分类法而不是类别,或者更好的方法是将域映射到用户名。这样就减少了作者的工作量,您也不必担心在代码或单独的分类列表中维护博主列表。

至于你;“奖金”

SO网友:luukvhoudt

创建域别名

将此添加到wp配置文件:

define(\'WP_SITEURL\',\'http://\'.$_SERVER[\'SERVER_NAME\']);
define(\'WP_HOME\',\'http://\'.$_SERVER[\'SERVER_NAME\']);
转到主题并添加类似的内容以加载主要内容(用于单页):

$home=get_page_by_path(substr($_SERVER[\'SERVER_NAME\'], 0, strlen($_SERVER[\'SERVER_NAME\'])-4));
echo do_shortcode($home->post_content);
将categorie、page或post slug更改为toplevel域中的域名,在这种情况下,toplevel域只有4个字符。例如:。com。网org,如果你想使用类似的东西。荷兰。是或。然后你应该把4改成3。如果你想同时使用这两种方法,就必须添加条件。

Note: 这可能只适用于一页,但我只是给你一个想法。如果有必要,您可以自己扩展代码的功能

结束