web-dev-qa-db-ja.com

単一のサイトで著者/カテゴリに別のドメイン/サブドメインを使用する方法

この質問を正しく表現したかどうかはわかりませんが….

この例では、私の妻と私は1つのブログ、family.comを持っています。

私はfamily.comにすべてのブログ記事を表示してもらいたいです。

me.family.comは私が投稿した投稿のみを表示し、her.family.comは自分が投稿した投稿のみを表示します。後で、kid1.family.comなどを追加します。

さらに、時には彼女/私/私たちは1ポストを超えて成長するプロジェクトを行います。 project1.comは、「project1」カテゴリのすべての投稿のみを表示します。ただし、作者とは異なり、特定のカテゴリのみが独自のドメイン名を持ちます。

wp-subdomains-revisited プラス domain-mapping-system を併用したようです私が探しているものに最も近いが、それらは時代遅れであり、私は自分でそれらを複製することができなかったと確信しています。

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

編集2:私は自分のサイトでmikeschinkelのコードを動かしている。すばらしいです!今、私はサブドメインでも動作するようにそれを修正しようとしています。それはそれほどうまくいっていません - 私の修正が適所にあるとき白いページだけがロードされます。

編集3:サイトに再び作業ドメインとサブドメインが読み込まれています。楽しそう!

次の作業は、すべてのリンクにそれぞれのドメイン/サブドメインを使用させることです。たとえば、meおよびcategoryproject1で書かれた投稿休日は、次のようになります。 family.com/holiday me.family.com/holiday 、またはproject1.comのように表示されます。リンク元のサブドメインに応じて/ holiday。任意の提案は大いに感謝されるでしょう!

(また、WPML - >me.family.com/holiday を使用する必要があります。翻訳すると、her.family.com/になります。休日/...怖い!)

編集4:明確にするために、機能的にこれは個々の著者またはカテゴリアーカイブを見ることと違いがないはずです、唯一の違いはアーカイブがそれ自身のサブ/ドメインを持つことです。

また、私のTLDは。is...であり、私のドメインは私の姓です。それは私のURLがセンテンスになる途中であることを意味します - > _adam.rabbit.is/...

目標は、どんな関係にも固有のURLを持つことです。
adam.rabbit.is/gardening
wife.rabbit.is/coding
rabbit.is/旅行

編集5:更新されたコード - ほとんどが現在動作中。基本カテゴリを削除したり、各ページに個別のヘッダー/タイトルを追加したりしていないので、解決済みとマークすることは躊躇します。私は他の誰かがそれが便利だと思うことを願っています:)

編集6:カテゴリベースを削除するwp-no-base-permalinkというNiceプラグインを見つけました。このプラグインで動作するようにコードを更新しました。今私がadam.rabbit.is/uncategorizedとタイプすればそれは私によってすべての未分類の投稿を表示します - まさに私が探していたもの!

以下に答えてください...

1
adammoore

wp-config.php

if ( is_alt_domain( $_SERVER['SERVER_NAME'] ) ) {
    $domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
    define( 'WP_SITEURL', 'http://www.' . $domain );
    define( 'WP_HOME', 'http://www.' . $domain );
} else if (is_sub_domain( $_SERVER['HTTP_Host'] ) ) {
    $domain = "{$_SERVER['HTTP_Host']}";
    define( 'WP_SITEURL', 'http://' . $domain );
    define( 'WP_HOME', 'http://' . $domain );
} else if (! (is_main_domain( $_SERVER['SERVER_NAME']) ) ) {
    Header( "HTTP/1.1 301 Moved Permanently" );
    Header( "Location:http://family.com", true, 301 );
    exit;
}
function is_main_domain( $domain ) {
    $domain = $_SERVER['HTTP_Host'] ;
    return strcmp( $domain, my_main_domain() ) == 0 ;
}
function is_sub_domain ( $domain ) {
    $domain = str_replace( my_main_domain(), '', $_SERVER['HTTP_Host'] );
    return in_array( substr( $domain, 0, -1), sub_domains() );
}
function is_alt_domain( $domain ) {
    $domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
    $domain = substr( $domain, 0, strrpos( $domain, '.') );
    return array_key_exists( $domain, alt_domains() );
}
function sub_domains() {
    return array(
        'me',
        'her',
        'kid1',
    );
}
function alt_domains() {
    return array(
        'project1' => 'com',
        'project2' => 'com',
        'project3' => 'is',
    );
}
function my_main_domain() {
    return 'family.com';
}

functions.php

// this seems to be important
update_option('siteurl','http://' . $_SERVER["HTTP_Host"]);
update_option('home','http://' . $_SERVER["HTTP_Host"]);

add_action( 'category_link', 'yoursite_category_link', 11, 2 );
function yoursite_category_link( $category_link, $category_id ) {
    $parts = explode( '/', $category_link );
    // if %category% in http://%domain%/%category%/
    // is in alt_domains() update the category_link
    if ( array_key_exists("{$parts[3]}", alt_domains() ) ) {
        $tld = alt_domains()[$parts[3]];
        $category_link = "http://www.{$parts[3]}.{$tld}/"; // Strip 'category/%category%/'
    }
    return $category_link;
}

add_action( 'author_link', 'yoursite_author_link', 11, 2 );
function yoursite_author_link( $author_link, $author_id ) {
    $parts = explode( '/', $author_link );
    // if %author% in http://domain/author/%author%/
    // is in sub_domains() update the author_link
    if ( "{$parts[3]}" == "author" && in_array("{$parts[4]}", sub_domains() ) ) {
        $author_link = "http://{$parts[4]}.family.com/"; // Strip 'author/%author%/'
    } else {
        $author_link = "http://family.com/author/{$parts[4]}"; // Strip 'author/%author%/'
    }
    return $author_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_alt_domain( $_SERVER['SERVER_NAME'] ) || is_sub_domain( $_SERVER['HTTP_Host'] ) ) {
        $parts = explode( '/', strtolower( $_SERVER['REQUEST_URI'] ) );
        if ( (count($parts) > 1) &&  ( array_key_exists("{$parts[1]}",alt_domains() ) || ( "author" == $parts[1] && in_array("{$parts[2]}", sub_domains() ) ) ) ) {
            remove_filter( 'template_redirect', 'redirect_canonical' );
        }
    }
}

add_action( 'template_redirect', 'yoursite_template_redirect' );
function yoursite_template_redirect() {
    // Redirect any http://%domain%.%ext%/%category%/ to http://%category%.%ext%/
    // and any http://%domain%.%ext%/author/%author%/ to http://%author%.%domain%.%ext%
    $parts = explode( '/', strtolower( $_SERVER['REQUEST_URI'] ) );
    if ( array_key_exists( "{$parts[1]}", alt_domains()) ) {
        $tld = alt_domains()[$parts[1]];
        wp_redirect( "http://www.{$parts[1]}.{$tld}/", 301 );
        exit;
    } else if ( 'author' == $parts[1] && in_array("{$parts[2]}", sub_domains() ) ) {
        wp_redirect( "http://{$parts[2]}.famliy.com/", 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.
    if ( is_alt_domain( $_SERVER['SERVER_NAME']) || is_sub_domain( $_SERVER['HTTP_Host'] ) ) {
        $category_domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
        $category_domain = substr( $category_domain, 0, strrpos( $category_domain, '.' ) );
        $author_name = substr( $_SERVER['HTTP_Host'], 0, strpos( $_SERVER['HTTP_Host'], '.' ) );
        $parts = explode( '/', $_SERVER['REQUEST_URI'] );
        $category_name = "{$parts[1]}";
        if ( array_key_exists($category_domain, alt_domains()) ) {
            if ( strlen( $category_name ) < 1  ) {
                $query_vars = array( 'pagename' => $category_domain.'-page' );
            } else if ( term_exists("{$category_name}", 'category') ) {
                $query_vars = array(
                    'category__and' => array(
                        get_category_by_slug($category_domain)->term_id,
                        get_category_by_slug($category_name)->term_id
                    )
                );
            }
        } else if ( in_array( $author_name, sub_domains() ) ) {
            if ( strlen( $category_name ) < 1  ) {
                $query_vars = array( 'pagename' => $author_name.'-page' );
            } else if (term_exists("{$category_name}", 'category') ) {
                $query_vars = array(
                    'category_name' => $category_name,
                    'author_name' => $author_name
                );
            }
        }
    }
    return $query_vars;
}

そしてもちろん、ネームサーバー上のサブドメイン(または*)をWordPressのインストール先に指定する必要もあります。また、使用している他のドメイン用に仮想ホスト(Nginx)を追加する必要があります。また、CORSをセットアップする必要があります。

ちなみに、この答えは私の次の答え/質問 - と組み合わせて使われます - (== --- ==)どのように静的なカテゴリ/作者ページを持っているのですか? - 1つの多面的なサイトをもう少し明確にしたこと:)

0
adammoore

あなたが "サブディレクトリ"の上にサブドメインを必要とするいくつかの理由はありますか?(実際には実際のサブディレクトリにはならないので、引用符で囲みます。あなたがfamily.com/me、family.com/her、family.com/project1などを使いたければ、これはずっと簡単でしょう。

この方法では、 WP_Query を使用してカスタムループを含む ページテンプレート を作成し、それをWP管理者あなたがかなりのパーマリンクを使っているなら、あなたはあなたが望む何でもページに名前をつけることができ、あなたは見栄えの良いリンクを持つことになるでしょう。

私はこれがサブドメインで可能になる方法を正直には考えることができませんが、それはWPの問題ではなく、ドメイン/サーバー管理の問題でもあります。

1
brianjohnhanna

サイト間でコンテンツを分離するための最良の方法は、それらのDBを分離することです。経験則として、個別のコンテンツ、検索、RSSフィード、ソーシャルシェアを集約する方が簡単です。SEOは異なるサブドメインでは異なる動作をする必要があるかもしれません。子供が「古い」によって課せられたデザインに同意する方法はありません。みんな "。

最も簡単な解決策は、ネットワークモードでwordpressを使用し、その後、必要な場所に「ソースブログ」から適切な集約サイトにコンテンツを自動的にインポートするプラグインを作成または見つけることです。

0
Mark Kaplun

確かに巧妙な解決策、そしてあなたの最初の質問の範囲内でうまく機能するもの。私は彼らがまたマルチサイト(ネットワーク)インストールを作成することを検討することを提案するけれども類似のユースケースの参照を持つ将来の読者のために。

純粋にサブドメインサイト(つまりドメインマッピングなし)に使用される場合、標準インストールよりも作成と管理がそれほど難しくありません。そうすれば、将来的に好きなように各サブサイトを開発するためのはるかに広い範囲と、はるかに高い柔軟性(まったく異なるテーマなど)を持つことになります。より論理的で管理しやすいコンテンツの配置は言うまでもありません。マルチサイトもはるかに拡張性があります - ドメインマッピングを追加し、1つのホスティングアカウントと管理者ログオンであなたのビジネスサイト、他の友達、スポーツグループなどを追加することができます。

ThreeWP Broadcastプラグインは、トピックなどに適したサイトで投稿を公開するのに最適なソリューションです。その背景を読むことでマルチサイトの範囲がわかります。

この記事へのトラフィックの大部分(タイトルによる)は、マルチサイトが適しているが見落とされがちな人になると私は感じています。

http://codex.wordpress.org/Create_A_Network

http://plugins.plainview.se/threewp-broadcast/

0
Steve82