半ば以上覚書である。これをこのBlogに書く意味があるのか気になるが、 もしかしたらWPMUで困っている他のヒトが見つけて喜ぶかもしれないので、敢えて書く。
さて私のWPMU暦は1月程度である。いや、以下か。 とりあえず、みんなのバイブルへリンクを張っておく。
さらに、私が参考にしまくったページを挙げておこう。
- CODEXの中のデータベース概要
- 同関数リファレンス
- 英語版の、WPMU_Functions
- 同じく、Global_Variables
そもそも私が本格的にWPMU向けコーディングを始めたのは、某サイト管理者から、 「こんな感じの出力をしたい」と相談を受けたためである。 RSSワカンネと思いつつ、参考資料として渡された、コレのソースを解読するのが、私の作業の始まりであった。
SQLシラネと思いつつも、適当に見当をつけて、 自分のブログにテスト記事を投稿して反応を見、 大体把握する。重要だったのは、
$blog_list = $wpdb->get_results( "SELECT blog_id, last_updated FROM " . $wpdb->blogs. " WHERE public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted ='0' " . $order . " " . $limit . "", ARRAY_A );
このへんと、
get_blog_option( $bid, "blogname");
このへんであった。
この時点では理解していなかったが、最初のget_resultsの方では、 先ほどリストで挙げた、グローバル変数のテーブルからデータをひっぱて来ている。
そしてなんだかんだやっていて、投稿のデータをどうやって取得するかが問題になった。 最初はこの関数が使えないかと思ったのだが、どうやらコレは特定のブログにおいてだけ使える(ブログをまたいで記事を取得できない)らしいことが分かった。
んー。どうしたものか…。なにやら検索を繰り返しているうちに、この関数に辿りつく。しかし、最新の投稿のpost_idなんてどうやって取得するんだ?分からん。。。
しばらく眺めていると、get_blog_postの$wpdb->get_row();を、$wpdb->get_results();に変えたらどうなるかなーと思いつく。この頃になると、大分SQL文の構造が分かってきたのである。 そこでとりあえずWHERE句を消して、get_resultsに置き換えたものを走らせて見る。 怖いので、自分のblog_idだけにしておく。
おお!なんか上手くいったみたいだぞ?
こうなりゃこっちのものである。帰ってくる構造体がデータベース概要にあった、wp_postsであることも分かったので、WHERE句で欲しいデータを検索できるようになる。さらに、ORDERで当初はdateの降順にしていたのだが、last_modified降順の方が適切な気がしたので、そうする。
こうして骨組みが出来上がった。 この辺でやっと最終的にどうやって実行するか考える。 うーんやはりプラグインにすべきか…?この段階でようやっと、プラグインの作り方を読み始める。 テンプレートタグとして作るなら、特に何も考えずに関数を書けばいいだけらしい。 そうすることにした。しかし上記ページを読んでいて、コーディング基準に従ってください、とあったのでリンクを飛ぶと、
オレの書き方と全然違う…。しかもデータベースにはなるべく触るなと書いてある…。 「止むを得ない場合を除き」だからまぁ良いか…。と言いつつも、当初は全部データベースから直接データを取得する方法で書いていたのを、できる所は用意された関数を使うように改める。
この辺で、要素技術は大体そろった。しかし、定番であるが、くっつけると何かしらエラーが出るモノである。大体、変数名が食い違ってるとか、書き足した行末にセミコロンがないとか、そんなくだらないことなのだが、WordPress上にPHPを書き込んでも、エラーメッセージは出ない。当然だけど…。しかも、データベースなどWP上じゃないと意味を成さない変数関数が山ほどあるので、ローカルで実行してエラーを洗い出すわけにも行かない。
しょーがないから、上のほうから意味を成すブロックごとに区切り、書いてはプレヴュー、の繰り返しでエラーチェックをしていく。さっきまでエラーが出ておらず、今回の更新でエラーが出たなら、足した部分がおかしいはず、ということで。
意外だったのが、コメントを途中で書き込んでもちゃんと処理される、ということ。 最初はテキストエディタに書き込んだコードをWPに貼り付ける際いちいちコメントを消していたのだが、結論から言うと必要ない作業だった。
それから、これはPHPの仕様かもしれないが、空文字列かどうかの評価が上手く働かなかった。 つまり、ある文字列$strがあったら、if($str=”)とやっても予期した結果が出ない。 PHPManualを見て、空文字列はFALSEに評価されるとあったので、if($str)にして、ifのブロックとelseのブロックを入れ替えたら、大丈夫だった。
あと、どうもヒアドキュメントはWPMUでは上手く動かないらしい。
これもPHPの仕様かもしれないが、文字列の中で(もちろんダブルクォートでクォートした場合の話であるが)変数はきちんと展開されるのだが、関数は中括弧{}で囲んでも、全くパースされない。記憶が正しければ、普通のPHPだったらコレでも大丈夫だった気がするのだが…。