農場主の日常

なんちゃってエンジニアの日常をつらづらと

関連記事表示プラグイン NP_RelatedのキーワードをNP_Headerと統合

 先日まで、メタタグを表示するためのプラグイン、NP_Headerのキーワード抽出を、Yahoo キーワード抽出APIを用いて自動生成する改造を行った。
HTTPヘッダ生成プラグイン NP_Headerの修正【農場主の日常】

 このサイトでキーワードを使用するプラグインはもう1つあって、関連記事を表示するプラグインNP_Relatedがそれにあたる。
 どちらもカンマで区切ったキーワードを記事作成時に入力する必要があるのだけれど、同じものを使用するなら統合したい。

NP_Relatedの動作概要


 NP_Relatedは、各記事の最後に関連記事を表示するプラグイン。
 wpで作成されたサイトでも記事の最後に表示されているあれを作成する。
 このプラグインは、記事投稿時にキーワードをカンマ区切りで入力するか、記事のタイトルの区切り文字(半角スペースなど)からキーワードを最大3つ作成し、タイトル、本文に該当のキーワードが含まれているものを検索し、表示する。

 基本的に、記事投稿時に手入力しているのだけれど、古い記事では入力していなかったので、あまり適切な記事が抽出されない問題がある。
 また、MySQLのLIKEを使って全文を検索するので、処理時間がかかりそうというのも気になる点だった。

改造方法


 改造方法は以下。
  • 記事表示時のキーワードは、NP_Headerのキーワードを使用する。
  • 検索は、NP_Headerのキーワードフィールド(Keywords)に限定する。
  • NP_Headerのitemidと記事のidを結合し、クエリは1つにする。

 この3点の改造ならば、最小限の修正で高速化も見込めるはず。
 先日改造したNP_Headerは、記事全文からYahoo のAPIを使ってキーワード生成を行っているので、精度の高い関連記事が得られるはず。

改造内容


 NP_Related改造個所は以下。
 386行目
$result = mysql_query("SELECT localkey FROM ". sql_table("plug_related") ." WHERE itemid='$id'");
if ($msg = mysql_fetch_array($result)) {
if ($msg['localkey'] == "DONOTSEARCH") $donotsearch = true;
else $q = $msg['localkey'];
}

部分を、
$result = mysql_query("SELECT keywords FROM ". sql_table("plugin_header") ." WHERE itemid='$id'");
if ($msg = mysql_fetch_array($result)) {
if ($msg['keywords'] == "DONOTSEARCH") $donotsearch = true;
else $q = $msg['keywords'];
}
に修正。

462行目
switch ($this->searchrange) {
case 'type1':
$str_where .= $str_cat ."( ititle LIKE '%$qpiece%' )";
break;
case 'type2':
$str_where .= $str_cat ."( ititle LIKE '%$qpiece%' OR ibody LIKE '%$qpiece%' )";
break;
case 'type3':
$str_where .= $str_cat ."( ititle LIKE '%$qpiece%' OR ibody LIKE '%$qpiece%' OR imore LIKE '%$qpiece%' )";
break;
}

部分を
$str_where .= $str_cat ."( keywords LIKE '%$qpiece%' )";
に修正。

487行目
$result = mysql_query("SELECT inumber, ititle, itime, ibody FROM ". sql_table("item")
." WHERE ($str_where)" . $str_iblog
." AND idraft=0 AND inumber<>'$id'"
." AND itime<=" . mysqldate($b->getCorrectTime())
." ORDER BY inumber DESC LIMIT 0,$max");

部分を
$result = mysql_query("SELECT inumber, ititle, itime, ibody FROM ". sql_table("item")
." INNER JOIN ". sql_table("plugin_header")
." ON " . sql_table("item") . ".inumber = " . sql_table("plugin_header") . ".itemid"
." WHERE ($str_where)" . $str_iblog
." AND idraft=0 AND inumber<>'$id'"
." AND itime<=" . mysqldate($b->getCorrectTime())
." ORDER BY inumber DESC LIMIT 0,$max");

に修正。

改造結果


 NP_Relatedは検索結果をキャッシュしているようなので、特に劇的に効果があったとは思えない。
 検索結果はかなりいい。関連しそうな記事がきちんと表示されているし、何よりキーワードの入力がいらない。
 表示結果については、検索に使用したキーワードが斜体で表示されてしまうのと、検索結果がない場合には該当記事なしになってしまう点が気になる。

 検索結果がないのは仕方ないけれど、これをたとえば、指定した数分の関連記事がなければカテゴリが同一のものの中から新しい記事を追加するなどの改造が必要だろう。
 また、最近の傾向として、関連記事に気になるような画像があるサイトが多い。これは、アイキャッチ画像のサムネイルなのだけれど、そもそもない場合にはどうしてやるか。

 管理上の問題から言えば、使用しなくなったテーブルやカラムが残っていること、管理画面に入力窓が残っていることがあげられるが、大問題ではないのでとりあえずはこのままほかの改造を進める。


関連記事[メタタグ keywords WHERE

前後の記事 - [Nucleus]::タイトル一覧

コメント


コメントはありません。



コメントの追加


トラックバック

このエントリにトラックバックはありません
このトラックバックURLを使ってこの記事にトラックバックを送ることができます。

↑ PAGE TOP