今までWP POST CMというプラグインを改造して(今回見直して気づいた)、使っていましたが、なんとなくもっと良さそうなのを見つけたので乗り換えることにしました。
こちらで公開されているRelated Entriesというプラグインです。
最初に断っておきますが、自分はPHPとかWordPressのプラグインの仕組みとかよくわかっていないので、最悪バグを埋め込んでいる可能性があります。
使用される方は自己責任でお願いします。
まずはプラグインのインストールとテーブルの準備
- まずは、ダウンロード。今回はrelated-posts-2.04.zipを落としました。
- 解凍して、modules/wordpress/wp-content/plunginsにrelated-posts.phpをコピーします
- SQLを実行します。
ALTER TABLE `xoops_wp_posts` ADD FULLTEXT `post_related` ( `post_name` ,`post_content` )
おそらく、フルテキストのインデックスを作って検索を早めようとしているのだと思います。
元々のテーブルに勝手に手を加えているのはちょっと気になりますが、インデックスだからたぶんそんなに影響はないでしょう。
XOOPS用にソースを書き換える
ここからが本番。
WordPress用のプラグインはそのままではXOOPS版モジュールで使えないことが多いですが、一部書き換えるとすんなり動いてくれたりします。
related-posts.phpをテキストエディタで開きます。
61行目あたりの
function related_posts($return_bool = false, $limit=5, $len=10, $before_title = ”, $after_title = ”, $before_post = ”, $after_post = ”, $show_pass_post = false, $show_excerpt = false) {
global $wpdb, $post;
これのglobalの下に以下の内容を追加します。
global $wp_id;
$poststable = $wpdb->posts[$wp_id];
xoops版wordpressではどうもpostsが配列になっているようで、$wpdb->postsだけだとテーブル名が引っ張ってこれません。
xoopsに対応させるためには、$wpdb->postsの部分をここで定義した$posttableに書き換える必要があります(この変更箇所は以下に書いていきます)
次にその下にある
$limit = get_option(‘limit’);
$len = get_option(‘len’);
$before_title = stripslashes(get_option(‘before_title’));
$after_title = stripslashes(get_option(‘after_title’));
$before_post = stripslashes(get_option(‘before_post’));
$after_post = stripslashes(get_option(‘after_post’));
$show_pass_post = get_option(‘show_pass_post’);
$show_excerpt = get_option(‘show_excerpt’);
これを「/*」と「*/」で挟んでコメントアウト。
/*a-tak deleted
$limit = get_option(‘limit’);
$len = get_option(‘len’);
$before_title = stripslashes(get_option(‘before_title’));
$after_title = stripslashes(get_option(‘after_title’));
$before_post = stripslashes(get_option(‘before_post’));
$after_post = stripslashes(get_option(‘after_post’));
$show_pass_post = get_option(‘show_pass_post’);
$show_excerpt = get_option(‘show_excerpt’);
*/
こんな感じで。
ここら辺はよくわかりませんが、これを残しておくと、いくら引数を指定しても無視されてしまうからです。
このプラグインの設定画面が表示できないのと関係あるのかもしれません。
次に、元のファイルでいうと101行目あたり
$sql = “SELECT ID, post_title, post_content,”
. “MATCH (post_name, post_content) “
. “AGAINST (‘$terms’) AS score “
. “FROM $wpdb->posts WHERE “
. “MATCH (post_name, post_content) “
きました、これです。$wpdb->postsをさっき定義したpoststable に置き換えます。
$sql = “SELECT ID, post_title, post_content,”
. “MATCH (post_name, post_content) “
. “AGAINST (‘$terms’) AS score “
. “FROM $poststable WHERE “
. “MATCH (post_name, post_content) “
こんな感じになりますね。
次は元のファイルで言う157行目あたりの関数。
function find_keywords($id) {
global $wpdb;
また、さっきのようにテーブル名用の変数を作ります。
function find_keywords($id) {
global $wpdb;
global $wp_id;
$poststable = $wpdb->posts[$wp_id];
$postmetatable = $wpdb->postmeta[$wp_id];
今回はpostテーブルだけではなくてpostmetaテーブルも使うので二つ変数を用意しました。
次に同じ要領でテーブルを変数に置き換えていきます。
159行目のこれを、
$content = $wpdb->get_var(“SELECT post_content FROM $wpdb->posts WHERE ID = ‘$id’”);
以下のように
$content = $wpdb->get_var(“SELECT post_content FROM $poststable WHERE ID = ‘$id’”);
163行目の
$test = $wpdb->get_var(“SELECT meta_value FROM $wpdb->postmeta WHERE post_id = ‘$id’ AND meta_key = ‘keyword’”);
を
$test = $wpdb->get_var(“SELECT meta_value FROM $postmetatable WHERE post_id = ‘$id’ AND meta_key = ‘keyword’”);
にする。
同様に177,180行目の「$wpdb->postmeta」を「$postmetatable」に置き換える。
そして、187行目の「$wpdb->posts」を「$poststable 」に置き換えたら保存して終わり。
プラグインを有効にする
これは、普通に管理画面からプラグインを有効にすればいい。
忘れて次のテンプレート変更をすると、画面のレイアウトが崩れて表示されるので、焦る(笑)
テンプレートの変更
次にテンプレートを変更。
自分の場合、comments-template.phpに追記しました。
comments-template.phpは、modules/wordpress/themes/xxxx/の中にある。
適当なところに
<?php related_posts(false,5,10,'<li>’,'</li>’,”,”,false,false); ?><br />
こんな感じで追加。
これでOK
一応、これで関連しそうな記事が表示されるようになるはずです。
ただ、これちゃんと日本語に対応しているのか微妙。アルファベットのキーワードしか対応していないような・・・。
そのためか結構、関連記事なしの表示が出てしまう。
あと、keywordを指定できるような感じが書いてあるのだが、いまいちわからん。
おいおい見ていこうと思う。
今回こちらのサイトの紹介記事を参考にさせていただきました。サンクス。
[追記]
キーワードの追加の仕方わかりました。readmeに書いてありました(汗)
本文に「<!–」と「–>」を入れて、その間に「kw=キーワード1 キーワード2」という感じでキーワードを設定すればいいみたいです。
これで保存するとカスタムフィールドに自動でキーワードが登録され、本文には「<!–」「–>」で囲まれてキーワードだけが残ります(kw=の部分は消える)。
おそらく、カスタムフィールドの値を条件に、この本文に残ったキーワードを検索対象にしてるんでしょう。ソースよく見てないので当てずっぽうですが。
[さらに追記]
MySQLの全文検索機能を使っているのでやはり、日本語はだめみたいです。
しかし、先ほど書いたキーワード指定で英語のキーワードを与えてあげれば、同じキーワードを指定したエントリがヒットするみたいです。
同じタグをつけた記事を表示するみたいなことはこれでできそうですね。
ただ、my.cnfにft_min_word_len=1みたいな指定をしないと4文字以下のキーワードは無視されるみたいです。
しかも、このオプションMySQLの4からしか使えないので、いまだ3を使っているうちでは「wii」なんてキーワードをつけても無駄無駄無駄ァ!・・・そんな感じです。
どうしても日本語全文解析して自動で関連するエントリを表示したいという人は、以下のページを参考に改造にチャレンジしてみてはどうでしょうか。なんとなくできないことはなさそうな雰囲気なんですが・・・。
http://www.tatamilab.jp/rnd/archives/000390.html
あと、もしかするとsennaというのを入れたりバージョン5.1以降を入れるとすんなり検索できるのかもしれない
http://ja.wikipedia.org/wiki/Senna