サポート » 使い方全般 » 重複だとはわかっているけど、ミラーサイトを作りたい

  • 解決済 mogue

    (@mogue)


    wordpressで「重複問題に抵触するとはわかっているけど、ミラーサイトを作りたい」です。
    マルチサイトや引越ししたいというのではなく

    example.com
    ┗/dir1
    ┗/dir2
    ┗/dir3
    ┗/mirror/
     ┗/dir1
     ┗/dir2
     ┗/dir3

    というふうな世間一般では推奨されないサイト構造ですが、どうしてもデザインだけが違うサイトを”ディレクトリを変えて作りたい”ということなんです。

    投稿をすればexample.comにもexample.com/mirror/にも反映されるようにしたいので、「一つのDBの内容で二つのサイトをつくる」というのが目的です。

    cookieでcssだけ変える、っていうのじゃダメ、
    2サイト作って、2回投稿させる、というのもめんどくさい、

    と言うので、考えあぐねました。
    そしてしかたなく質問させていただいている次第です。

    なにか良い方法はありますでしょうか。

    ※現在考えているのは、投稿をトリガーにしてもう一つのデザインが違うサイトへ投稿させる、という風にも考えているのですが、リンクが発生したときのためにpostIDを同期させたりする気配りが必要か、、スラッグを必須にさせるか、、、アップした画像はどうしよう、、などなどと事故が起こりそうな気配がするので、奥の手にしようと考えています。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • これはテーマをパラメータで切り替えるという手段ではだめなのでしょうか?
    例)example.com では普通テーマが、 example.com/?thame=aaa ではaaaテーマが表示されるなど。

    下位のディテクトリにWordpressを入れて同期前提だとすると公開時にトリガーしてコピー投稿するか、the_content等で表示する際に代わりにもう一つのDBから取ってくるようにするとかでしょうか?(同一データベース内にプレフィックスをかえた2つのWordpressを入れれば比較的簡単にできる?)

    トピック投稿者 mogue

    (@mogue)

    ありがとうございます!

    example.com/?thame=aaa

    どうしてもディレクトリを発生させたいということなんで、パラメータを渡すのではちょっと要求に応えられないです。

    公開時にトリガーしてコピー投稿するか、the_content等で表示する際に代わりにもう一つのDBから取ってくるようにするとかでしょうか?

    これもかなり配慮が必要ですよね。まあ簡単じゃあないのは分かっているんですが、力技になる前にスマートな方法がないかと模索しているところでもあります。

    (同一データベース内にプレフィックスをかえた2つのWordpressを入れれば比較的簡単にできる?)

    これは確かにいけそうな気がしました。要はsqlで取得して、ディレクトリなんかの書き換えを行う、というものですかね?あるいはpuery_postとか元サイトの情報を取得後、書き換えてやる程度でできそうかなあ、、、。重くなりそうな気配ですよね。

    今書いていて思いついたのですが、マルチサイトで二つ作って、元サイトの情報を書き換える、程度の方がシンプルかもしれない、、とかもありかなあと思いましたが。

    .htaccessでディレクトリを書き換える、程度でいけちゃったりしませんかね。楽に考えすぎか。

    もし他にもあったりしたらお聞かせください。

    .hraccessでGETクエリ渡す手法、使えるんじゃないかな~…………とか思ったけどWPの場合どうなんだろ…………

    以前phpでそれ(特定のurlの一部分がクエリになる)を前提としたアプリを書いたときは強引にやったけど…………)

    (余談:なおその実装はApacheよりもIISの方が思うようにいったりNginxも単純そうだったり…最終的にはなんとかなったのですが。)

    トピック投稿者 mogue

    (@mogue)

    ありがとうございます。

    .hraccessでGETクエリ渡す手法、使えるんじゃないかな~…………とか思ったけどWPの場合どうなんだろ…………

    なんかいけそうな、変なループしそうですよね。。
    しかし、やってみなくちゃわからない大実験って検証するのが一番なので、これも実験項目にいれたいと思いました。

    apacheは前提なので仕方ないのですが、もしapacheじゃない場合、いけそうな方法があれば簡単でもいいので挙げておいていただけると助かります。実験項目とヒントになるといいなと思っています。

    .hraccessで単純にrewirteすればいいかもとか思っていますが、弊害とかお気づきになる方いらっしゃいますか?
    実験はしてみます。

    ‘example.com/mirror/’にも’example.com’と同じ設定内容でWPを設置して、フィルタで利用中のテーマを書き換えるとどうでしょう?
    まったく試していないので動作するかは知りませんが。

    wp-settings.php

    // Define the template related constants.
    wp_templating_constants(  );

    wp-includes\default-constants.php

    function wp_templating_constants() {
    	/**
    	 * Filesystem path to the current active template directory
    	 * @since 1.5.0
    	 */
    	define('TEMPLATEPATH', get_template_directory());
    
    	/**
    	 * Filesystem path to the current active template stylesheet directory
    	 * @since 2.1.0
    	 */
    	define('STYLESHEETPATH', get_stylesheet_directory());

    wp-includes\theme.php

    function get_stylesheet_directory() {
    	$stylesheet = get_stylesheet();
    	$theme_root = get_theme_root( $stylesheet );
    	$stylesheet_dir = "$theme_root/$stylesheet";
    
    	/**
    	 * Filter the stylesheet directory path for current theme.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string $stylesheet_dir Absolute path to the current them.
    	 * @param string $stylesheet     Directory name of the current theme.
    	 * @param string $theme_root     Absolute path to themes directory.
    	 */
    	return apply_filters( 'stylesheet_directory', $stylesheet_dir, $stylesheet, $theme_root );
    }
    
    ...
    
    function get_template_directory() {
    	$template = get_template();
    	$theme_root = get_theme_root( $template );
    	$template_dir = "$theme_root/$template";
    
    	/**
    	 * Filter the current theme directory path.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string $template_dir The URI of the current theme directory.
    	 * @param string $template     Directory name of the current theme.
    	 * @param string $theme_root   Absolute path to the themes directory.
    	 */
    	return apply_filters( 'template_directory', $template_dir, $template, $theme_root );
    }

    追加で他にも変更が必要かもしれませんが、まず’stylesheet_directory’と’template_directory’フィルタでの変更を試してみてはどうでしょう?

    トピック投稿者 mogue

    (@mogue)

    popupさんありがとうございます。
    ちょっと理解できなかったのですが、

    ‘stylesheet_directory’と’template_directory’フィルタ

    でwordpress自体のディレクトリなどを操作できるということでしょうか。

    デザイン替えだけの場合にはcookieなどとGETを組み合わせて’stylesheet_directory’を操作させ、デザインを変える、ということはできそうですが、cookieがありならば単にcssを切り替えるとかでも大丈夫です。しかしながら今回はディレクトリを発生させたいので、こんな面倒なことになってしまっているわけなんです。

    もし私の理解不足なら補足いただけませんでしょうか。

    ※’stylesheet_directory’と’template_directory’フィルタは触ったことなかったので勉強になりました。

    それらのフィルタで変更できるのは、利用中のテーマのディレクトリのみです。
    同じ設定と書きましたが、WPのアドレス関連だけは設定ファイルに次の定数で定義すれば良いと思います。
    設定している間は、管理画面での’WordPress アドレス (URL)’等のURL変更は出来なくなります。

    http://wpdocs.sourceforge.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86
    wp-config.php の編集 – WordPress Codex 日本語版

    WordPress アドレス (URL)
    WP_SITEURL は、「WordPress アドレス (URL)」を定義できるオプションであり、バージョン 2.2 で追加されました。ここで定義する値は、WordPress のコアファイルが存在する URL です。http:// の部分は記入し、末尾にスラッシュ “/” は入れないでください。wp-config.php でこの値を設定すると、wp_options テーブルの option_value siteurl の値よりも優先され、管理パネル > 設定 > 一般設定画面の「WordPress アドレス (URL)」欄は無効となります。
    注: wp-config.php からこの行を削除すると、URL は元のデータベースの値に戻ります。データベースの値は変わりません。データベースの siteurl 値を書き換えるには RELOCATE 定数を使います/en。
    例えば、”example.com” というドメイン名の “wordpress” というディレクトリの中に WordPress を設置した場合、WP_SITEURL は次のように定義します。

    define('WP_SITEURL', 'http://www.example.com/wordpress');

    $_SERVER[‘HTTP_HOST’] を基に WP_SITEURL を動的に定義するには:

    define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/path/to/wordpress');

    注: 一部の設置の場合により安全な方法は、PHP またはユーザー側が生成した HTTP_HOST を使う代わりに、サーバーが生成した SERVER_NAME を使うことです。 HTTP_HOST は リクエストヘッダ内の値から PHP によって動的に生成されているため、ファイル混入脆弱性の可能性があります。SERVER_NAME はサーバー設定によって決定する静的な値です。
    $_SERVER[‘SERVER_NAME’] を基に WP_SITEURL を動的に定義するには:

    define('WP_SITEURL', 'http://' . $_SERVER['SERVER_NAME'] . '/path/to/wordpress');

    ブログアドレス (URL)
    WP_HOME も バージョン 2.2 で追加された wp-config.php オプションです。WP_SITEURL と同じく、WP_HOME も wp_options テーブル の home の値よりも優先されますが、恒久的に変更する訳ではなく、ここに定義している間だけ切り替えるものです。home は、あなたの WordPress ブログに訪れる人がブラウザに入力するアドレス(URL)です。http:// の部分は記入し、末尾にスラッシュ “/” を入れてはいけません。

    define('WP_HOME', 'http://www.example.com/wordpress');

    ‘stylesheet_directory’と’template_directory’よりも ‘stylesheet’と’template’フィルタで変更した方が良いかもしれません。
    ‘get_stylesheet()’と’get_template()’は、
    それぞれ’get_stylesheet_directory()’と’get_template_directory()’だけでなく、’get_stylesheet_directory_uri()’と’get_template_directory_uri()’でも使われます。

    function get_stylesheet() {
    	/**
    	 * Filter the name of current stylesheet.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string $stylesheet Name of the current stylesheet.
    	 */
    	return apply_filters( 'stylesheet', get_option( 'stylesheet' ) );
    }
    
    ...
    
    function get_template() {
    	/**
    	 * Filter the name of the current theme.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string $template Current theme's directory name.
    	 */
    	return apply_filters( 'template', get_option( 'template' ) );
    }

    上記のフィルタによるテーマの変更で動かないようなら、テーマディレクトリ名だけ同じにして、中のテンプレート群は違うテーマのファイルにするのが簡単だと思います。
    もちろん’style.css’でのテーマの定義は変更する必要があります。
    自作ではないのなら、最低限’Text Domain’の変更だけにして、著作者情報についてはそのままの方がいいと思います。

    トピック投稿者 mogue

    (@mogue)

    popupさんのおっしゃられる仕組みがどうしてもわからなく、途中で断念してしまいました。
    同じ設定のWPを置く、ということは投稿が二重に発生する、となってしまうので、今回は当てはまらないのではないかと思うのですが、私の勘違いでしょうか。
    せっかく挙げていただいたのに、とにかくわかりませんでした、、、。

    ————-

    もし、テンプレートの切り替えをGETパラメーターで行い、$public_query_varsに登録したものであれば、

    本サイト
    http://example.com/archive/1

    デザインを変えたミラーサイト
    http://example.com/archive/1/template/mirror

    のように、1ページに対して二つのURLを発生できるのではないかと思いました。
    ※この際、お尻にディレクトリがついちゃってもいいという考えです。

    この場合、WPで吐き出されるすべてのリンクにGETを付与する必要がでてきます。
    『wordpressが吐き出すリンクすべてにパラメーターを足す』ということは一括でできるのでしょうか。
    add_query_arg()で一箇所ずつに打っていくのでもいいのですが。

    DB1つで同じサイト(ミラーサイト)をデザイン別で作りたいって事ですよね。
    なら、popup さんが仰ってる、wp-config に記載する定数 WP_SITEURL、WP_HOME を設定してそれを変える事でいけそうな気がするのですが、ダメでした?。ただ、WordPress は複数インストール(最低でも2つ)にはなりますけど。

    add_query_arg で行うのであれば リンク先にGETパラメタを引き継ぎたい固定ページにてGETパラメータを用いた際のカスタムパーマリンク が参考になるかも??しれません。

    利用するデータベースが同じなので投稿の数は変わりませんが、投稿が二重発生するというのはどんな状態でしょう?
    データベースの’wp_options’テーブルの’stylesheet’と’template’には利用中のテーマの’Text Domain’(たぶんフォルダ名の場合が多い)が保存されています。
    利用中のテーマが子テーマであれば親テーマのものが’template’には保存されます。
    これらをデータベースから取得(’wp-settings.php’で’wp_templating_constants()’を実行、処理内容は’wp-includes\default-constants.php’参照)しているので、’stylesheet’と’template’フィルタで書き換えます。
    wp_options’テーブルの’stylesheet’のテーマの’functions.php’でフィルタを操作してもいいと思いますが、プラグイン化するといいんじゃないかと思います。
    サイトの表示確認程度で細かい動作は見ていませんが一応動作しました。

    パラメータ追加による切り替え方法は知りませんが、KUCKLUさんが投稿されたトピックを参考に試してみてはどうでしょう?

    いくつか条件を付けられているようですが、投稿された情報をヒントにしても解決する見込みがつかないようなら、条件には沿えないことを伝えて自分で分かる方法で解決した方がいいと思います。

    トピック投稿者 mogue

    (@mogue)

    ありがとうございます!
    なんとなく理解できてきたようなので、再度挑戦してみます。

    /mirror/以下のWPはインストールだけで「空」で動いていく、という感じなんですね。

    少しお時間ください。

    インストール(元サイトのフォルダ内からそっくりコピーして、’wp-config.php’の設定に追加変更で良いと思います。)はしているので、データベースが共有されているだけで空の状態ではないと思います。
    ミラーサイトの管理画面からの投稿や設定変更はしない方が良いと思いますが。

    テーマを切り替えるコードをプラグイン化してミラーサイトにのみインストールした場合は、元サイトでのプラグインの有効・無効切り替えを行った後には、ミラーサイトで再有効化する必要がありました。
    元サイトでの切り替え時に存在しないプラグインは無効に書き換えられます。

    トピック投稿者 mogue

    (@mogue)

    やっと理解できました。皆様ありがとうございます!!

    手順を記しておきます。

    1. 普通に元となるWordpressをインストール。
    2. ディレクトリを作成し(ここではmirror)、その中に元となったWordpressをただコピー。
    3. コピーした(mirror)の’wp-config.php’に以下を追加するだけ。

    define(‘WP_SITEURL’, ‘http://’ . $_SERVER[‘SERVER_NAME’] . ‘/mirror’);
    define(‘WP_HOME’, ‘http://’ . $_SERVER[‘SERVER_NAME’] . ‘/mirror’);

    テーマも変更したければ

    ‘stylesheet_directory’と’template_directory’よりも ‘stylesheet’と’template’フィルタで変更

    を参考にすればOK。
    今回はJSでCSSを切り替えるだけで済みそうです。

    ただコピーすればいいところを、DBも作成してしまったり、とかなり馬鹿をやったりしてしまいました。おかげで時間がかかってしまったのですが、結局はものすごい単純だったわけですね。

    皆さん、ご教授いただきまして、本当に助かりました!

    トピック投稿者 mogue

    (@mogue)

    解決済みの前にもう一つつけたしです。
    吐き出される投稿内容にリンクがあった場合、href=”/mirror/…”とreplaceしないといけませんね。

    $content = str_replace(‘href=”http://example.com/’,’href=”http://example.com/mirror/”‘,get_the_content());
    echo $content;

    とでもして回避するのがよいかと思っています。試してませんが。
    念のための補足でした。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • トピック「重複だとはわかっているけど、ミラーサイトを作りたい」には新たに返信することはできません。