WordPressをちょっと弄る機会がありました。その機会にプラグインを作ったのですが、これが結構簡単・・・・というか「すげー」*1って感じだったのでメモします。
以前は、XOOPSのうぇブログを使っていたブログを、年末にWordPressにSwapするお手伝いをしたのですが、その際に気をつけたのは
WordPressって脆弱性多いから、即アップデート可能なようにテーマとプラグインだけでSwap対応すること
っていうことです。中のファイルをいじっちゃうともうアップデートがとたんに面倒になるんですよね。この辺りはオープンソースなもの使ってると「ソースいじれるけど、いじらない」というジレンマでもあるんですが。
ちなみに、以下の文章ではWordPressをWPって書きます。あとWPのバージョンは2.7です。
とりあえず、やりたいこと
WordPressにしたままでも、以前のRSSリンクにしたままにします。別にRSSリーダの方でも301ヘッダ出せばリダイレクトしてくれるんでしょうけど、とりあえず変えないようにしてみます。要するに
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ja"> <head profile="http://gmpg.org/xfn/11"> <title>***************</title> <!-- 省略 --> <link rel="alternate" type="application/rss+xml" href="http://example.jp/modules/weblogs/feed" title="**** Posts RSS feed" />
を
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ja"> <head profile="http://gmpg.org/xfn/11"> <title>***************</title> <!-- 省略 --> <link rel="alternate" type="application/rss+xml" href="http://example.jp/modules/weblog/backend_weblog.php" title="**** Posts RSS feed" />
って感じにするだけです。
最初の一歩は、テンプレートを見る
WPのテンプレートは「これ、テンプレートかよ!」って突っ込みたくなるようなものですが、テンプレートです。とりあえず、Defaultテーマを使っている場合は、
wp-content/themes/default/header.php
を見ます。(別のテーマ使ってる場合は、defaultをそのテーマ名に)
すると、10行目に
<link rel="alternate" type="application/rss+xml" title="<?php printf(__('%s RSS Feed', 'kubrick'), get_bloginfo('name')); ?>" href="<?php bloginfo('rss2_url'); ?>" />
ってあるので、
bloginfo()って関数をいじればなんとかなるんだな〜
っていうあたりをつけます。
じゃあ、そのbloginfo()って関数はどこで定義されてるの?
ってことで、気の利いたテキストエディタ*2でfunction bloginfoの文字列で検索します。
すると、
wp-includes/feed.php:48:function bloginfo_rss($show = '') {
wp-includes/general-template.php:222:function bloginfo($show='') {
ってなりますが、ここで1行目の結果はfeed.phpなので「んー、これはRSSとか表示するときのやつかなー」というので2行目の方を採用(?)します。
本体を探せ!
wp-includes/general-template.phpの222行目には
<?php /** * Display information about the blog. * * @see get_bloginfo() For possible values for the parameter. * @since 0.71 * * @param string $show What to display. */ function bloginfo($show='') { echo get_bloginfo($show, 'display'); }
って書かれているだけです。んがーこれじゃget_bloginfo()関数と同じジャン!って思って30行ほど下を見るとその本体があります。
これをみると、$showの引数によって色々と出力を変えていて、今の場合の$showは、wp-content/themes/default/header.phpのところに戻ってみると'rss2_url'です。
<?php function get_bloginfo($show = '', $filter = 'raw') { switch($show) { /* 省略 */ case 'rss2_url': $output = get_feed_link('rss2'); break;
ってなってるので、んがーこれじゃget_feed_link()関数と同じジャン!ってなって再びget_feed_link()関数を探します(WPではこの手の作業が非常に多くなる)。
すると
wp-includes/link-template.phpの354行目からの関数でようやく本体らしきものにあたります。
じゃあ、この本体は何をしてるの?
「何をしてるの?」って言われても、WPのコードを全部読む気になんてなれません。
こっちがやりたいのは、「文字列を変える」ことだけです。で何を返しているのかを見ると、wp-includes/link-template.phpの380行目に
<?php return apply_filters('feed_link', $output, $feed);
ってなってます。
このapply_filtersってあるのがWP最大のポイント。これがあることで、プラグイン作るのに本体全部なんて追っかける必要はなくプラグインが作成・適用できるのです。
まぁなんて素晴らしい!ちなみに、XOOPSCubeには同じような仕組みのDelegateがあります。こっちの方がもっとスマートで素晴らしいと思いますがそれはまた後日。
プラグインの設置
プラグインを作るには、
wp-content/plugins/
ディレクトリにファイルをアップします。なんか、ディレクトリを掘って適当にアップしても、ファイルをSEEKしてくれるようで大変便利です。ただし、ディレクトリは1段のみです。
プラグインを適当に
wp-content/plugins/new_plugin/hoge.php
とでも設置します。
そのファイルがWPのプラグインであるという証明をするために、ファイルの先頭にごにょごにょと記述が必要ですが、これはこちらの記事をごらんください。簡単です。要約すると、プラグインファイルの先頭に
<?php /* Plugin Name: プラグイン名 Plugin URI: プラグインの配布のURL Description: プラグインの説明 Version: プラグインのバージョン Author: 作者名 Author URI: 作者のURL */
という記述をすればいいだけです。日本語の場合はUTF-8で書いてください。
PHPスクリプトの記述
で、さっきのプラグインには、上の記述の後に
<?php /* ←この<?phpは、はてなダイアリーでPHP記法を使うためのものなので、この行自体は不要 */ add_filter('feed_link', 'convert_wp2xoopsWeblog_FeedUrl');
って書きます。これは、apply_filters('feed_link')ってしたところで、このconvert_wp2xoopsWeblog_FeedUrl()関数をコールしますよっていう宣言です。*3
んで、宣言したからには関数を用意しないとだめで、その下部分にでも
<?php /* ←この<?phpは、はてなダイアリーでPHP記法を使うためのものなので、この行自体は不要 */ function convert_wp2xoopsWeblog_FeedUrl() { }
って書きます。
この関数が受ける引数は、apply_filters('feed_link', $output, $feed)を見ると2つってわかるんですが、私はコードをよく読んでないので面倒で
<?php /* ←この<?phpは、はてなダイアリーでPHP記法を使うためのものなので、この行自体は不要 */ function convert_wp2xoopsWeblog_FeedUrl() { $args = func_get_args(); var_dump($args); }
みたいにして、引数をチェックしてしまいます。まぁ、今回は引数とか必要無くて、単純に
<?php /* ←この<?phpは、はてなダイアリーでPHP記法を使うためのものなので、この行自体は不要 */ function convert_wp2xoopsWeblog_FeedUrl() { return 'http://example.jp/modules/weblog/backend_weblog.php'; }
ってしてしまいます。
これで、目的のwp-content/themes/default/header.phpの10行目にてRSSのURLの指定を目的のものにしてしまえました。