マルチサイトを移行する際につまづいたところを、自分のために書いておこう。
当サイトの WordPress を長らく更新していなかった。
更新ついでに、ダッシュボードで警告が出ていた PHPのバージョンと MySQL も更新しようとステージングサイトを用意することにした。Web に関わる仕事をしていながら ここをサボっていた理由は マルチサイトのためだ。
TORIYAMAHONPOS WordPressのまめ知識
の記事
TORIYAMA Yuko
マルチサイトを移行する際につまづいたところを、自分のために書いておこう。
当サイトの WordPress を長らく更新していなかった。
更新ついでに、ダッシュボードで警告が出ていた PHPのバージョンと MySQL も更新しようとステージングサイトを用意することにした。Web に関わる仕事をしていながら ここをサボっていた理由は マルチサイトのためだ。
TORIYAMA Yuko
親カテゴリparent、子カテゴリchildとある場合、
子カテゴリの一覧ページが通常なら、
http://example.com/blog/category/parent/child/
となるところ
http://example.com/child/
としたい。
WordPressとしては非推奨と思われるものの、以前から後者のようなURLで運営してきたサイトのため、WordPressになってもURLは変えたくないという運営側の事情がある。WordPressの印象を悪くしないためにも、パーマリンクぐらいなんとかせねば!と取り組んだ。
TORIYAMA Yuko
既存のサイトに子サイトを追加することになり、ネットワークの設定を行った。初めてこれを行う際にはサブドメイン方式かサブディレクトリ方式かが選べるはずだったように思う。ところが選択肢が表示されずに、強制的にサブドメイン方式になってしまった。
WordPressをインストールしてから1カ月以上経過している場合や再インストールした場合には、この現象になるらしい。wp-config.phpと.htaccessを手修正することでサブディレクトリ方式に変更することができた。
参考にしたのは、
akibonne’s manual of style : WordPress: サブディレクトリ式でマルチサイト化する手順
TORIYAMA Yuko
マルチサイトにかかわっているため、親ブログ子ブログに関するメモが続く。
さて、子ブログから親ブログの情報を取得するには、
[PHP]
switch_to_blog(ブログID);
//なにか処理
restore_current_blog();
[/PHP]
こうすることで、親ブログの情報を取得することができる。
例えば処理でget_categories()を行えば、親ブログのカテゴリ一覧を取得する。ブログIDを指定すればよいので、もちろん親子にかかわることはない。マルチサイトでの他ブログの情報、という意味である。
TORIYAMA Yuko
WordPressで構築しているポータルサイトに記事コンテンツ(いわゆるブログ)を設置することになった。ここで同じブログ内の別カテゴリとしてやるか、子ブログでやるかで悩むところだ。管理者が別ということもあって、記事が混在しないほうがよいかと子ブログを採用した。
デザインも似ているため子テーマでやってみようしたら、困ったことがあった。テーマ配下にある画像やJavaScriptのパスである。画像のパスを取得する際に親テーマのディレクトリにあるのか、子テーマのディレクトリにあるのかで区別する必要があったのだ。以下で区別できるとすぐに分かった。
子テーマの場合親テーマのURLは、
bloginfo('template_url');
子テーマの場合子テーマのURLは、
bloginfo('stylesheet_directory');
通常は同じ値が返るため区別のつかなかったこのコードを子テーマで使うと、違いがあった。
WPtouchの無料版では、機能制限としてテーマディレクトリを設定することができない。テーマディレクトリは/plugins/wotouch/themes/default/に固定されているので、スマホ用テーマを自作した際には、このディレクトリ下のファイルを差し替えるのが無難としてきた。
このほど複数あったブログをひとつのWordPressにまとめ、マルチサイトとして管理するようにしたところ、ここでつまずいた。ブログは複数あるのに、WPTouchのテーマディレクトリが固定(ひとつしかない)ではブログによってスマホ用テーマを分けることはできないではないか。
おとなしく有料版にグレードアップするしかないのか?
そもそも有料版ではマルチサイトに対応しているのか?
と諦めモードになりつつ、ダメモトでWPtouchのコアコードを修正する手段にでた。wptouch.phpの中にreturn ‘default’としている箇所が2つある。まさにテーマディレクトリを固定で返しているところだ。ここでディレクトリ名を操作できそうだ。get_blog_ID()によりマルチサイトのブログIDが分かるので、この値によってテーマ名を分ければよさそうだ。たとえばブログIDが2であればexample-2、3であればexample-3というように分岐してそれぞれのディレクトリにテーマファイルを置けばよい。結果、いまのところうまく動いている!
TORIYAMA Yuko
以前はルート直下の”blog”というディレクトリにWordPressをインストールして運営していた当ブログである。WordPressのバージョンアップに伴い、マルチサイトのサブディレクトリとしてブログを構築することにした。
ルートディレクトリにWordPressをインストールし、ネットワーク管理者の[新規サイトを追加]を行ったところ、エラーで作成できなかった。
以下の語句は WordPress の機能によって予約されており、ブログ名として使うことはできません: page, comments, blog, files, feed
とのことで、”blog”というブログ名はダメらしい。
そういわれても、これまで”blog”だったのだからURLは変えたくない。CMSとして複数サイトを運営できるシステムであるなら、そのなかに”blog”という名前のブログを作成するのは自然な要求ではないのか。そうこうしているうちに、ネットワーク管理者の設定に[登録の設定]-[禁止名]の項目を見つけた。そこに、
www web root admin main invite administrator files blog
と設定されているので、おぉここか!?と思って”blog”を削除した。が、新規サイトを作成しようとしても同じエラーである。”blog”はどうしてもダメらしい。設定項目の値と、エラー内容が異なるではないか、この設定はなんなのか?
仕方なく本ブログは別のサブディレクトリ名で作成し、.htaccessにリダイレクトの設定をした。
いままでシングルサイトとして運営していたデータをWordPress3.0のマルチサイトとして移行するには、phpMyAdminでインポート作業を行う。
MySQLのテーブル接頭辞が以下のようになっているとして、
・移行元:wp_
・移行先(2つめのブログ):wp_2_
移行元のwp_というテーブルが、移行先の2つめのブログとなるwp_2_というテーブルに上書きされるようにする。インポートするのはwp_options、wp_users以外のテーブル全部、と思っておけばよい(この2つは絶対に移してはいけない)。そうすれば投稿やカテゴリ、コメントなどのほかContact Form 7といったプラグインのテーブルも移行される。
さらに投稿者の再設定を行う。投稿者はwp-postsにユーザIDが入っているため、新しい環境のユーザIDに書き換える必要がある。phpMyAdminでクエリを発行して書き換える。
TORIYAMA Yuko
WordPress 3.0の日本語版がリリースされた。
大きな変化は複数サイトを管理できることだろう。さっそく試してみた。複数サイトにするには、wp-config.phpに、
[sourcecode language=’php’]
define(‘WP_ALLOW_MULTISITE’, true);
[/sourcecode]
の1文を加える。すると[ツール]-[ネットワーク]メニューに手順が示されるので、それに従ってwp-config.phpや.htaccessを修正する。ログインしなおすと、特権管理者としてサイトを追加することができる。サイトを追加すると、WP_と同じDB内にWP_2_という接頭辞のテーブルがもうワンセットできていた。
参考:ネットワークの作成 – WordPress Codex 日本語版
新しいデフォルトのテーマは、HTML5対応の「Twenty Ten」だ。新機能がもりこまれたたテーマとのこと、すこしづつ眺めていきたい。
うまく使えるかな?いろいろ楽しみ!