かけちゃんねる2

エモいことを書く

Ruby on RailsとWordPressを競合させない方法

URLでhttp://sample.com/と叩かれたときにはrailsを動かし、http://sample.com/(wordpressのカテゴリ名)/(記事番号)/と叩かれたときにはWordPressが動くような仕組みを作っていく。

先ずはWordPress(以下wp)を/home/rails/(アプリケーション名)/public/にインストールする。
これでディレクトリ階層は/home/rails/(アプリケーション名)/public/wordpressとなる。

ここから、Railsとwpがバッティングしないような設定をしていく。

1. wpの中身のindex.phpをpublicディレクトリにコピーする

コピーした後、public/index.phpの中身を変更してあげる必要がある。
パスの指定が変更となっているからだ。

変更前

<?php
/* Short and sweet */
define('WP_USE_THEMES', true);
require('/wp-blog-header.php'); ※ここが変更箇所
?>

変更後

<?php
/* Short and sweet */
define('WP_USE_THEMES', true);
require('/wordpress/wp-blog-header.php');
?>

こうすることでパスを正しく指示してあげる。

2. wordpressディレクトリをRailsで動かさないように指示する

今の状態でhttp://sample.com/wordpress/wp-login.phpを表示させようとしてもRailsのルーティングエラーになってしまう。
それを解決するために、apacheの設定ファイルを編集していく。

  • /etc/httpd/conf.d/vhost.conf に以下のように記述する。(それぞれの環境に合った場所に記述してください)
<location /wordpress>
PassengerEnabled off # turn off Passenger for /blog subdirectory
</location>

また次のディレクトリの.htaccessを有効にするというAllowOverride Allが必要。

  <Directory /home/rails/taskapp/public/>
     # This relaxes Apache security settings.
     AllowOverride All
     # MultiViews must be turned off.
     Options -MultiViews
     # Uncomment this if you're on Apache >= 2.4:
     #Require all granted
  </Directory>

こうしてあげることでhttp://sample.com/wordpress/以降のものに関してはapacheに流してあげることができる。

3. wpのサイトアドレス設定を変更する

これでhttp://sample.com/wordpress/wp-login.phpでログインが可能になる。ここからはwpの設定をしていく。
wp設定>一般>サイトアドレス (URL)の記述をhttp://sample.com/wordpressからhttp://sample.com/に変更する。
なお、その上にあるWordPress アドレス (URL)についてはhttp://sample.com/wordpressのままでよい。

  • WordPressの「WP Multibyte Patch」プラグインを動作しようとしたところ、「お使いの WP Multibyte Patch を有効にするには、PHP の mbstring 関数が必要です。」というエラーメッセージが表示されたため、以下のコマンドで「php-mbstring」をインストール…

$ sudo yum install php-mbstring

4. wpのパーマリンク設定を変更する

http://sample.com/(wordpressのカテゴリ名)/(記事番号)/で記事を表示させたいのでパーマリンクの設定を変更する。
wp設定>パーマリンク設定>カスタム構造を選択し、次のように記述。

http://sample.com/%category%/%post_id%/

これでひとつ例をあげるとhttp://sample.com/game/1030/といったURL構造になるのだが、このままではgameに対する指示がないので上と同様にRailsのルーティングエラーになってしまう。

5. public/.htaccessに追記する

それに対処するため、public/.htaccessに以下のような記述をしてあげる。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^game/[0-9]*/$ /index.php [L]
RewriteRule ^cd/[0-9]*/$ /index.php [L]
RewriteRule ^dvd/[0-9]*/$ /index.php [L]
RewriteRule ^category /index.php [L]
RewriteRule ^feed /index.php [L]
RewriteRule ^comments /index.php [L]
RewriteRule ^date/[0-9]* /index.php [L]
</IfModule>
# END WordPress

これは何かというと、パーマリンク設定のページで.htaccessの書き込み権限が有効ではない場合にページ下部に表示されるソースをコピーしたものにカテゴリ名を追加したものである。
注意しなければならないのは、デフォルトのソースに記述してあるRewriteRule . /index.php [L]というものを除くという点だ。
これを反映させてしまうとapacheの設定が.htaccessによって上書きされhttp://sample.com/以降のディレクトリが全てwpに侵食されてしまう。

またカテゴリ名の後の正規表現については、パーマリンク設定のカスタム構造もそうであったようにトレイリングスラッシュを有効にしている。
理由は、^game/[0-9]*という表現だと^game/にも一致してしまいRailsのほうのアプリケーションのコンテンツの一部がwpに侵食されてしまったからだ。
もっと賢い正規表現の記述方法はあるはずなので、読者の中にご存じの方がいたら是非ご教示願いたい。

RewriteRule ^category /index.php [L]の行については、wpのカテゴリ記事一覧ページを表示するためのものである。

6. プレビュー表示ができるようにする

wpの仕様上、プレビューページは サイトアドレス/?p=投稿ID&preview=true で呼び出されてしまい、ドキュメントディレクトリのindex.phpを見ようとしてしまう。
したがって、これの対応も.htaccessへ記述してあげなければいけない。
今回は以下のように記述した。

RewriteCond %{QUERY_STRING} (^|&)preview=true($|&)
RewriteCond %{QUERY_STRING} (^|&)p=(\d+)($|&)
RewriteRule ^$ /index.php [L]

7. 検索機能が使えるようにする

プレビュー表示と同様の理由。クエリを取り出してwpに渡してあげる。

RewriteCond %{QUERY_STRING} ^s=(.+)$
RewriteRule ^$ /index.php [L]

8. wpのインデックスを表示するための固定ページを作成する

wpのサイトアドレス(URL)を変更した都合上、もちろんだがhttp://sample.comでは記事一覧を見ることができない。
public(Railsアプリの/publicディレクトリ)に、WordPress側へのシンボリックリンクを置くことで解決するようだがうまくいかなかったので、固定ページを作成することにした。
もし固定ページを作成するということであれば、インストールするときのwpの名前はデフォルトのwordpressのままがいい。というのも固定ページの名称はwordpressのディレクトリ名と重複させることができないからだ。固定ページを作成する段になって、newsなど正式な名称を決めたほうがいいだろう。

感想

apacheの設定ファイルを弄るのは初めてだったので難しかったです!
confディレクトリとconf.dディレクトリがあって、今回はそのうち後者の中のvhost.confを弄ることでapacheの設定をしましたが、それがどういう意味を示しているのかまだよくわかってないです。
こんな複雑なURL構造にすることは滅多にないと思いますが、SEOの都合上ホスト名の後にカテゴリ名が欲しいという場合もあるかと思います。
そういう人のお役に立てるような記事になっていれば幸いです。

あと、どうでもいいですけど初めてマークダウン記法で記事を書いてみました!なんかスマートでいいですね!

以上

参考にしたサイト