マルチサイトを移行する際につまづいたところを、自分のために書いておこう。
当サイトの WordPress を長らく更新していなかった。
更新ついでに、ダッシュボードで警告が出ていた PHPのバージョンと MySQL も更新しようとステージングサイトを用意することにした。Web に関わる仕事をしていながら ここをサボっていた理由は マルチサイトのためだ。
TORIYAMAHONPOS WordPressのまめ知識
の記事
TORIYAMA Yuko
マルチサイトを移行する際につまづいたところを、自分のために書いておこう。
当サイトの WordPress を長らく更新していなかった。
更新ついでに、ダッシュボードで警告が出ていた PHPのバージョンと MySQL も更新しようとステージングサイトを用意することにした。Web に関わる仕事をしていながら ここをサボっていた理由は マルチサイトのためだ。
TORIYAMA Yuko
データベースにたったいま追加したばかりの行のAUTO_INCREMENTの値を知るには、PHPでmysql_insert_id()という関数がある。いつもこれを使っていたら、WordPressでは $wpdb->insert_id というメソッドがあることを知った。自分で追加したテーブルにも利用できる。
TORIYAMA Yuko
面倒でほったらかしになっていたサーバまわりのアップデートを、連休中に行った。WordPress3.0がリリースされてからほぼ1年になるので、かなりサボっていたことになる。業務ではもちろん3.0以上を使用していながらも、当ブログは2.8のままだった。というのも、WordPressをバージョンアップするには、さくらインターネットでMySQLのバージョンを4から5に上げねばならなかったからだ。MySQLはMovableTypeと併用していることもあり、手を付けるのに勇気を要した。連休の目標はMySQLとWordPressを最新版にすることと決めた。
さくらインターネットでのMySQLのバージョンアップは以下のとおりだ。データが少ないためかなんのトラブルもなく、30分もかからずに終わった。
singleページでのコメントの表示数について、
ディスカッション設定によりコメントを複数ページに分割表示できるものの、singleページを表示するタイミングで取得するコメントは常にその記事に関するコメントすべてとなる。つまりコメントを5件づつ表示する場合でも、その投稿についてコメントが100件あれば100件を取得している。
あるサイトのサーバー負荷が異様に重くて調べたところ、特定の記事についてコメントが10000件以上ついているためと分かった。この10000件とは決してスパムではなく、singleページがFLASHゲームで遊ぶ構成になっているため人気ゲームにコメントがたくさんついてしまったのだ。コメントは最新の50件を5件づつ分割表示している。必要なコメントは50件なので、できれば古くなったコメントを削除してしまいたかった。しかしサイト運営者からは過去のコメントを削除しないようにと要求されている。
そうこうしているうちに、問題となるslow queryが浮かび上がった。
SELECT wp_comments.* FROM wp_comments WHERE comment_post_ID = '99' AND comment_approved = '1' ORDER BY comment_date_gm
このSQL文はwp-includes/comment-template.phpのcomments_template()という関数にあった。singleページを表示するさいにグローバル変数の$commentsにコメント配列をセットしている部分である。
ここにLIMITを追加すればよいのだろうがコアコードは修正できない。フォーラムで質問したところ、query フックでlimit句を追加するアドバイスをいただいた。しかし、コメント取得のSQL文は3とおりがあり並び順が固定の場合もあるため、どうも思ったとおりにいかない。そうこうしているうちに、コメントの取得に件数が制限できないのはコメント階層を考慮してのことだと気付いた。単純にLIMITを付けるだけではダメなのだ。
今回はコメント階層を使っていないということもあり、comments_template()をfunction.phpにリネームコピーしてカスタマイズすることで対処した。 ここのSQL文のORDERをDESCにして、LIMITを追加。さらにsingle.phpからcomments_template()を呼んでいる部分を、新しい関数名に変更した。
問題のsingleページはなんとか軽くなったように思う。
こんな対応でよいのかな?10000件もコメントがつくとは想定外だ。
いままでシングルサイトとして運営していたデータを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でクエリを発行して書き換える。