タグスラグを基準にした記事分類システムの開発-(2)

投稿日: 2009年7月1日 | カテゴリ:『ワードプレス』>プログラムの開発と改良

タグスラッグを基順に記事を分類できる関数にquery_posts()があることを知りました。スラッグ分類システムをより洗練されたものに仕上げるために、この関数を利用して、ページや記事内でスラッグを基準にして最新記事を表示できるプログラム(runPHPと共に使用)を作成してみました。記事の内容は、開発プロセスに従って時系列的に述べられていますので、実用性を重視する方は、「4.関数のプラグイン化」から読み進んでください。

1. サイドバーで使用するプログラム

まず、サイドバーなどのPHPファイルにタグを基準にして最新の記事を表示するプログラムについて紹介しておきます。次のスクリプトをサイドバーの適当な部分に挿入してください。

<ul>
<?php if (have_posts()) :  query_posts('&tag=nber&showposts=3');  ?>
<?php while (have_posts()) : the_post(); ?>
<li><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link: 
<?php the_title(); ?>"><?php the_title(); ?></a>
<?php endwhile; ?>
<?php endif; ?>
</ul>

1行目:箇条書きの開始指定です。
2行目:query_posts関数で選択記事の指定を行います。引数の&tag=の次に表示しようとしている記事のスラッグを指定します。showposts=3は、表示する記事の数の上限です。この関数の詳しい説明については次のサイトを参照してください。
テンプレートタグ/query posts(日本語版)
Template Tags/query posts(英語版)

3行目:指定された記事が存在する限り、記事のタイトルをパーマリンク付きで表示するループの始まりです。
4~5行目:記事のタイトルをパーマリン付きで表示する指定。
6行目:ループの終了。
7行目:条件子の終了。
8行目:箇条書きの終了。

2. 記事・ページで使用できるようにプログラムを加工

上記のプログラムを直接、runPHPと共にページやポストで使用すると惨憺たる結果になります。これはrunPHPの問題に起因するものと思われます。この点については次の記事を参照してください。
プラグインrunPHPの不具合と対処法

以下は、この点を踏まえて作り変えたプログラムです。実用的には、次のセクション「3. 関数の作成」で紹介されている関数を利用すればよいのですが、プログラムの内容を理解し、開発用として使って頂くために敢えて掲載しました(プログラムの理解を必要としない場合には、この箇所は飛ばして結構です)。

<?php 
$slug_1="nalps";
$slug_2="salps";
$type="tag_slug__in";
$num=4;
query_posts(array("$type" => array($slug_1,$slug_2),
  'showposts'=>$num,'orderby'=>date,'order'=>DESC));
if (have_posts()){
$n=1;   
while ($num>=$n) { 
     the_post();
     $link=get_permalink();
     $title=get_the_title();
    if ($title==""){break;}  
    $new .= '<li>'.'<a href="'.$link.'" rel="bookmark" title="" >'
         .$title.'</a>'.'</li>' ;
    $n++; 
   }
}
if ($title){
  $myurl=get_bloginfo('wpurl');
  if ($type=="tag_slug__in"){ 
    $new.='<li>'.'<a href="'.$myurl.'/?tag='.$slug_1.','.$slug_2
        .' " title="" >'.more.'</a>'.'</li>';
  }elseif($type=="tag_slug__and"){
   $new.='<li>'.'<a href="'.$myurl.'/?tag='.$slug_1.'+'.$slug_2
       .' " title="" >'.more.'</a>'.'</li>';}
}
print "<ul>";
print $new;
print "</ul>";
?>

2~3行目:変数にスラッグを代入しています。
4行目:タグ引数を変数$typeに代入
5行目:表示する記事の数を指定
6行目:関数query_postsの引数を指定。タグ引数は変数$typeで代置。array引数を使用する場合には、全てアレー表示にしてください(&引数を混ぜて使用できない)。この例では、スラッグ$slug_1と$slug_2で指定する記事の和集合を4件、日付を基順に降順に表示する指定です。
8行目:上に指定した記事が存在すれば以下のプロセスを実行します。
9行目:ループを制御する変数$nに1を代入。
10行目:指定した記事数が$nよりも大きい限りでループを実行。
11行目:次の記事にポインターを移す関数。
12行目:記事のパーマリンクを取得。
13行目:記事のタイトルを取得。
14行目:指定された記事のタイトルが空になった場合には、while条件子が真であってもループを抜ける。つまり、指定した記事数よりも実際の記事数が少ない場合の条件子です。この条件子がないと空の箇条書きが表示されてしまいます。
15~16行目:変数$newに箇条書きとリンク設定を順に代入。
17行目:$nに1をプラス。ループの先頭に戻る。
20行目:14行目$title設定が真(タイトルが代入された状態でループを抜けた場合)のとき、指定したスラグを含む記事を全て表示するリンク(archive.php)に移動する設定。
21行目:自サイトのURLを取得
22行目:アレータイプが和集合の場合
23~24行目:全指定記事を表示するリンクを指定。?tag=の後に「,」で区切ってスラッグを指定すると和集合の範囲で記事が表示されます。26行目のように+で区切れば積集合で表示されます。
25行目:積集合の場合の条件子
26~27行目:全指定記事を表示するリンクを指定。
29~31行目:出力設定。

3. 関数の作成

上記のプログラムでは複数の異なったスラッグを媒介に記事を表示したい場合には、各ケースで同じプログラムを全て挿入しなければなりません。そこでプログラムを関数形式で作成し、各ケースにおいてはこの関数に適当な引数を代入すれば良いようにしました。

<?php
function tag_recent_post($type,$slug_1,$slug_2,$num){ 
if ($type=="A") {$type="tag_slug__in";}
 elseif ($type=="B"){$type="tag_slug__and";}
query_posts(array("$type" => array($slug_1,$slug_2),
  'showposts'=>$num,'orderby'=>date,'order'=>DESC));
if (have_posts()){
  $n=1;
  $new="";
  while ($num>=$n) { 
     the_post();
     $link=get_permalink();
     $title=get_the_title();
    if ($title==""){break;}  
    $new .= '<li>'.'<a href="'.$link.'" rel="bookmark" title="" >'
         .$title.'</a>'.'</li>' ;
    $n++; 
   }
}
 if ($title){
  $myurl=get_bloginfo('wpurl');
  if ($type=="tag_slug__in"){ 
    $new.='<li>'.'<a href="'.$myurl.'/?tag='.$slug_1.','.$slug_2
        .' " title="" >'.more.'</a>'.'</li>';
  }elseif ($type=="tag_slug__and"){
    $new.='<li>'.'<a href="'.$myurl.'/?tag='.$slug_1.'+'.$slug_2
        .' " title="" >'.more.'</a>'.'</li>'; }
 }
print $new;
}
?>

プログラムの内容は、基本的には上記のプログラムで説明したとおりです。

上記のプログラムを表示する記事やページにその都度挿入するのは煩わしいし、プログラム誤動作の原因にもなります。そこでこの関数をプラグインにして使用する方法を紹介いたします。
これは簡単で以下のような決まり文句を<?phpと関数の開始位置の間に挿入するだけです。挿入したら、適当なファイル名(例えば、tag_recent_post_plugin.php。日本語を使用する場合には必ず文字コードをUTF-8Nにしてください)をつけて保存します。このファイルをpluginsディレクトリにコピーし、adminでログインして有効化すれば関数が使用できるようになります。

<?php
/*
 Plugin Name: Tag Recent Post Plugin
 Plugin URI: http://hsuzuki.ddo.jp/weblog/?p=4265 
 Description: タグスラッグを基準にして最近の記事を表示できるプログラム
 Author: H.Suzuki
 Version: 1.0
 Author URI: http://hsuzuki.ddo.jp/weblog/
*/
function tag_recent_post($type,$slug_1,$slug_2,$num){ 
.......

3行目:プラグイン名
4行目:プラグインが紹介されているサイトのアドレス
5行目:このプログラムの特徴、使用方法など
6行目:作者
7行目;バージョン
8行目:プラグイン作成者のサイトアドレス
以上適当に変更して挿入してください。

以下は、関数をプラグイン化して本サイトで使用しているものです。ダウンロード(右クリックして「対象をファイルに保存」を選択)、解凍後、readme.txtファイルをよく読んで使用してみてください。
tag_recent_post_plugin

5. 関数の使用法

次に関数の使用方法について説明いたします。
ページ、ポストあるいはテンプレートファイルの適当な部分に上記の関数を引数と共に挿入します。ポストあるいはページに挿入する場合には、runPHPを有効にすることを忘れないでください。runPHPのインストールについては次の記事を参照してください。
プラグインrunPHPのインストール

関数tag_recent_post()の引数には、①アレータイプの指定(A:和集合、B:積集合)、②1番目のスラッグ、③2番目のスラッグ、④表示する記事数の順に代入します。スラッグの使用を1つにしたい場合には、2番目の変数の部分に数字の「0」を代入してください(空にしておくと機能しません)。この場合、アレータイプの指定はAにしてください。
次に、本サイトのスラッグを使用して記事を表示する関数の使用例を示します。

<div style="font-size:14px;padding:20px 0 0px 0;">
タグCPLを含む記事を4件表示</div>
<ul>
<?php tag_recent_post(A,cpl,0,4); ?>
</ul>
<div style="font-size:14px;padding:20px 0 0px 0;">
タグCPLとVER201の両方を含む記事を全て表示(積集合)</div>
<ul>
<?php tag_recent_post(B,cpl,ver201,10); ?>
</ul>
<div style="font-size:14px;padding:20px 0 0px 0;">
タグCPLかWP_RUNPHPを含む記事を8件表示(和集合)</div>
<ul>
<?php tag_recent_post(A,cpl,wp_runphp,8); ?>
</ul>
[注意]

本サイトでは、スラッグにハイフンを使用するとこのプログラムでは認識されませんでした。本サイトと同じ現象が起こった場合には、スラッグで使用されているハイフンをアンダーバーや他の英小文字に変更してください。「投稿」-「投稿のタグ」には次のような表示があるのでハイフンも有効かなと思っていたのですが…。
「“スラッグ” は URL 内で使用可能な形式にされた名前です。通常はすべて小文字で構成され、アルファベット、数字、ハイフンを含めることができます。」

[編集後記]
    このプログラムを仕上げるにはかなり苦労しました。

  1. まず、第一に、while (have_posts())を使用してループを張ると、記事のリンク付きタイトルの表示と共に記事の内容までが表示されてしまうという不具合が起こりました。これを消すために色々苦労した結果、while() の部分には指定した記事数を基準にしてループの数をコントロールする方法に行き着きました。これで記事の内容は消えたのですが、今度は次のような問題が発生しました。
  2. すなわち、指定した記事数よりも実際に含まれる記事数の方が少ない場合には箇条書きに空白行が現れてしまうということです。例えば、次のようになってしまいます。
    ・記事A
    ・記事B
    ・
    ・
    

    ここでも色々苦労しましたが、まず途中にbreakを入れて実際の記事がなくなったらループを抜けさせようという方針は直ぐに思い付きました。しかし、ループ脱出の契機をどう作るかで行き詰ってしまいました。初めは、if(have_posts())でやってみましたがダメ。指定スラッグに付随する記事数の取得方法を探してみましたがダメ。考えあぐねた結果、(2)の箇条書きを見て、ふと思い当たることがありました。つまり、箇条書きが空になるのは、実際の記事が表示され尽くされてしまって変数$titleに何も代入されなくなってしまう(空になってしまう)からだ、と。そこで、これをループを抜ける契機に使用することにしました。

  3. 次に、実際の記事の数が指定した数よりも少ない場合には、ループを抜けますが、最後にmoreを付けてリンク(和集合と積集合の場合)を張らなければなりません。まず、tagのスラグへのリンクの張り方です。そして和集合と積集合の指定の仕方です。少し時間がかかりましたが、この方法はネットで探し出すことができました。詳しくは、以下のサイトを参照してください。
    タグ付け機能

以上で問題は解決しましたが、遅々とした歩みでした。実際に、コンピュータでプログラムを修正しながら追っかけていると1つのことに凝り固まってしまって中々発想の転換ができません。この様な場合には、少し息抜きをして(例えば、散歩に行くとか、一晩寝過ごすとか)やると新しい発想が生まれることが多々あります。

このプログラムは、発展性を持っています。アレー変数に他のタイプを組み入れることもできますし、スラッグ変数を必要に応じて増やすこともできます。
これらの発展性は多くの人に使用してもらって、フィードバック(バグやプログラムの修正、追加機能のリクエストなど)を頂いて、ある程度の有用性が認識できたら行っていきたいと思っています。


関連記事



コメントを残す




空欄に計算式を満たす数値を記入してください(必須)