web-dev-qa-db-ja.com

複数のドメイン名 - 1つ WP インストール(マルチサイト以外) - デフォルト各ドメイン名をカテゴリアーカイブに

ユースケースはやや単純です - ここに行きます:

  1. マルチユーザーではなく、5人で1つのワードプレスインストールを共有
  2. 各人がブログを作成し、自分の投稿を自分の固有のカテゴリに入れます
  3. それぞれの人は自分のドメイン名を持っています
  4. すべてのドメイン名が同じWPインストールフォルダにポイントまたはパークされている
  5. 各個人のドメイン名には、そのカテゴリの投稿のみが表示されます。

  6. 各ドメイン名のGoogleフレンドリインデックス
  7. リダイレクトよりもリライトソリューションを優先するがリダイレクトは許容される
  8. 「マスター」アカウントは、「メイン」ドメインログインを介してブロガーの投稿を投稿または編集することができます。
  9. ボーナス - これがカスタム投稿タイプに拡張できる場合

環境

  1. 最新版のWPを1回インストール(マルチユーザーではない)
  2. かなりパーマリンク
  3. Cpanel - ドメインパーキングを設定する
  4. サブドメインなし
  5. .htaccessへのアクセス
  6. functions.phpへのアクセス
3
aj martin

2つの異なるソリューション(ユースケースの詳細を編集)

リダイレクトを行う:

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;
    }
  }
}

上記は、http://blogger1.com/category/blogger1/で始まるURL以外のhttp://blogger1.comから要求が行われたときに、http://blogger1.com/category/への302リダイレクトを行います他のURLをサポートするためにいくつかの変更を行います。)

"Rewrite":を行う

上記がサポートしないのは、 "rewrite"vs. "redirect"ソリューション。あなたがそれを望むなら、それはもう少し複雑です。次のコードにより、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;
}

そして、実際の2番目の例を示すスクリーンショットを次に示します。

Screenshot of a WordPress site using hooks to enable a category page to be displayed in the URL root for selected categories
(ソース: mikeschinkel.com

これにアプローチする別のおそらくより良い方法は、カテゴリの代わりにカスタム分類を使用するか、さらに良いことに、代わりにドメインをユーザー名にマップすることです。そうすれば、作成者の作業が減り、コードや別の分類リストでブロガーリストを管理する必要がなくなります。

あなた "bonus"については、申し訳ありませんが、私はあなたがそこに望むものには従いません。

4
MikeSchinkel
  1. ドメインエイリアスを作成します

  2. これをwp-configファイルに追加してください。

    define('WP_SITEURL','http://'.$_SERVER['SERVER_NAME']);
    define('WP_HOME','http://'.$_SERVER['SERVER_NAME']);
    
  3. あなたのテーマに行き、メインコンテンツをロードするために次のようなものを追加してください(これは1ページに使われます):

    $home=get_page_by_path(substr($_SERVER['SERVER_NAME'], 0, strlen($_SERVER['SERVER_NAME'])-4));
    echo do_shortcode($home->post_content);
    
  4. カテゴリ、ページ、またはポストスラグをトップレベルドメインのドメイン名、この場合は4文字のみのトップレベルドメインに変更します。たとえば、.com .net .orgのように、.nl .beや.deのようなものを使いたい場合は、4を3に変更する必要があります。両方を使いたい場合は、条件を追加します。

注: これは1ページでしか機能しない可能性がありますが、私はあなたにそのアイデアを提供するだけです。必要に応じてコードの機能を自分で拡張できます

0
Fleuv