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

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

WordPressのカテゴリーやタグには半角英数文字で表示されるスラッグ(slug)が付加されています。このスラッグを記事分類の識別子として使用することが出来れば、カテゴリー分類を更に詳細に分けて処理することが出来ます。またその他にも有用な使用法が見出されるかもしれません。本稿ではこのスラッグを活用して記事を処理できるシステムの構築を目指しています。

次の関数は、プラグイン「Category Tag Article List」の機能をphpファイルで使用できるように、プラグインの関数を取り出して一部書き換えたものです。スラッグを基順にしてカテゴリーごと、タグごとに記事を分類できるようになっています。

<?php
function tag_slug_callback($term,$number_of_posts,$link_term,$more_link){
 global $table_prefix, $wpdb;
 $output='';
 $date_format="Y年m月d日";
 $more_text="more";
 
 if ($link_term == "header"){
    $cattag_name_sql = "select name from wp_terms where slug='".$term."'";
    $headings = $wpdb->get_results($cattag_name_sql);
   foreach ($headings as $heading){
     $output .="<div style=\"padding:10px 0 10px 10px\">".$heading->name."</div>"; }
       } elseif ($link_term == "no") $output=$output;
 $cattag_sql = "select wpp.post_title, wpp.post_date,wpp.id, wpp.guid, 
             wpt.term_id, wtt.taxonomy from wp_term_taxonomy wtt, wp_terms wpt, 
             wp_term_relationships wtr, wp_posts wpp
               where 
                 wtt.term_id=wpt.term_id 
                 and wpt.slug='".$term."'
                 and wtr.term_taxonomy_id = wtt.term_taxonomy_id
                 and wtr.object_id = wpp.ID
                 and wpp.post_status = 'publish'
                 and (wpp.post_type = 'post' or wpp.post_type='page')
                 order by wpp.post_date desc
                 limit ".$number_of_posts;
 $posts = $wpdb->get_results($cattag_sql);
 foreach ($posts as $post) {
  $date_temp=mysql2date($date_format, $post->post_date);
  $output .= "<li><a href='".get_permalink($post->id)."'>"
          .$post->post_title."</a> (".$date_temp.")</li>";
      }
    if ($more_link=="more"){
       $output = $output."<li>";
       if ($post->taxonomy=='post_tag'){
          $output .="<a href='".get_tag_link($post->term_id)."'>"
                  .$more_text."</a>";
             }
       else if ($post->taxonomy=='category'){
         $output .="<a href='".get_category_link($post->term_id)."'>"
                 .$more_text."</a>";
             }
         $output = $output."</li>";
     }elseif ($more_link=="no") $output=$output;
 return $output;
 } 
?>

2行目:関数の定義。引数$termはカテゴリーまたはタグのスラッグ、$number_of_postsは最新の記事を表示する数、$link_termはカテゴリまたはタグ名を表示するかの指定、$more_linkは、カテゴリーあるいはタグに属する記事が規定の表示数よりも上回る場合に、カテゴリーあるいはタグの記事全てを表示するページへのリンクを表示するかどうかの指定です。
3行目:グローバル変数を定義
4行目:出力変数の初期化
5行目:記事の投稿日時のファーマットを指定
6行目:$more_linkを張る際に表示する文字列。日本語でも結構。
8行目:link_term(カテゴリー名あるいは記事タグ名)を表示するかどうかの条件子
9行目:mysqlデータベースからカテゴリー名またはタグ名(Header)を選択。条件は指定スラッグを含む
10行目:選択したデータベースをPHP用に加工して取得
11~12行目:link_termの内容をファーマットを指定して出力関数に代入
13行目:link_termの出力を設定しない場合、出力関数はそのまま。
14~25行目:記事の題名、記事の投稿日時、記事ID、guid(?)、term_id、taxonomy、を選択。これをテーブルwp_term_taxonomy wtt, wp_terms wpt, wp_term_relationships wtr, wp_posts wppから取得。where以下は、取得条件。slug=$termのものを記事の投稿日でソートし、数$number_of_postsだけ取り出す。
26行:選択したデータベースをPHP用に加工して取得
27行目:取得した全ての記事に対して次の処理を実行
28行目:取得した投稿日時を規定された方式でフォーマット
29から30行目:出力変数にリンク付き記事タイトル+投稿日を格納
32行目:more_linkがONの場合以下の処理を実行
34行目:タグがpost_tagの場合次の処理を実行
35行目:指定されたポスト・タグに属する記事一覧を表示するリンクをつけてmoreを表示
38行目:タグがカテゴリー・タグの場合次の処理を実行
39~40行目:指定されたカテゴリー・タグに属する記事一覧を表示するリンクをつけてmoreを表示
43行目:more_linkを表示しない場合

使用法

上記の関数を挿入しようとしているテンプレート・ファイルの適当な部分に挿入します。次に出力したい部分に以下のようなタグを埋め込みます。

<ul>
<?php
if (function_exists('tag_slug_callback')){
  print tag_slug_callback(wordpress,5,header,more);
 }
?>
</ul>

関数の引数、wordpressの部分にはカテゴリーまたはタグのスラッグを記入します。第2引数の5は、表示する記事の数です。第3引数はカテゴリー名あるいはタグ名を表示するかしないかの指定です。headerは表示、noは非表示になります。第4引数は、当該カテゴリーあるいはタグに属する記事が規定の表示数よりも上回る場合に、カテゴリーあるいはタグの記事全てを表示するページへのリンクが張られた文字列を指定します。moreが表示、noが非表示です。次の表示例は本サイトのサイドバーに試験的に、Wordpressのカテゴリーに含まれる記事をスラッグ=wordpressを識別子として表示させた例です。

sample2

展望

このプログラムをどのように発展させていくかについては次のようなオプションがあります。

  1. このプログラムを更に機能を充実させてプラグインとして仕上げる。プラグインに仕上げる方法については、次の記事の「4.関数のプラグイン化」を参照してください。
    タグスラグを基準にした記事分類システムの開発-(2)

  2. このプログラムをCPLプラグインに組み込む。この場合、①$categoriesレベルでスラッグ基準分類の変数を新たに作る、②%擬似関数にプログラムを組み込む、のオプションが考えられます。

現実的なのは、(1)と(2)の②です。いずれにしても、スラッグを活用するメリットをもっと探し出す必要があります。今後のプログラムの開発の深度もこの進展具合にかかっていますので、読者からのコメントを歓迎いたします。


関連記事



コメントを残す




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