プラグインCPL-最近のコメント表示の改良

投稿日: 2009年5月13日 | カテゴリ:『ワードプレス』>記事整理システム(CPL)

WordPressのプラグインであるCPL(customizable-post-listings)のマニュアルVer.201で紹介しているコメントの表示方法(「C. 最近掲載されたコメント」)は、最新のコメントが掲載された記事+その記事の最新のコメント1件という仕様です。これを改良して、対象記事に複数のコメントが含まれている場合には、複数のコメンテータを表示できるようにしました。

複数のコメンテータを表示するための関数はデフォルトで準備されています。オリジナルでは次のように解説されています。

%last_commenters(limit,more,between)% 
特定の記事に対する最新のコメンテータをリストします。 
引数: 
limit = リストする最新のコメンテータの数を指定します。 
more = リストされたコメンテータの後ろに表示されるテキスト(limitで指定した数よりも多くのコメンテータが存在する場合)。デフォルトは、[...] 
between = リストされるコメンテータの間に表示されるテキスト。デフォルトは、 「, 」 
使用例: 
%last_commenters(5, and others!)% 
%last_commenters(1,,)% 

この解説をマニュアルに含めなかったのは、私のミスです。その原因は、当時はコメントが全くなかったので、あまりコメントの表示に関心がなかったことにあります。最近コメントが増えてきたことと、CPLのユーザーからも指摘を受けたこともあってCPLのコメント表示の改良にようやく意欲が沸いてきました。罪滅ぼしの意味もこめて上記の%タグ関数を改良(若干の変更と日付変数を追加)しました。以下にこの改良版についてスクリプトの変更内容と使用方法について説明いたします。

スクリプトの改良

変更箇所は、customizable-post-listings.phpの814行目あたりからです。変更を加えたスクリプトを以下に示します。変更を施す場合にはファイルのバックアップを必ず取って置いてください。

//Modified by H.Suzuki-Start
  list($limit,$more,$between,$c_date) = explode(',',$matches[1]);
  if (empty($more)) $more = '';
  if (empty($between)) $between = ', ';
  $nlimit = $limit + 1;
  $comments = $wpdb->get_results("SELECT comment_author, comment_date, comment_ID 
              FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' 
              and comment_approved = '1' 
              AND ( comment_type = '' OR comment_type = 'comment' 
              OR comment_type = 'pingback' OR comment_type = 'trackback') 
              ORDER BY comment_date DESC LIMIT $nlimit"); 
  $count = 1;
  if ($comments) :
  foreach ($comments as $cmnt) {
   if (empty($c_date)) $c_date = "";
     else {$temp=mysql2date($date_format, $cmnt->comment_date);
           $c_date=' ('.$temp.')';}
   if ($count > 1) $new .= $between;
   if ($count > $limit) {
    $new .= '<a href="'.get_permalink().'#comments" title="View all comments">' 
         . $more . "</a>\n";
    break;
   }
   $new .= '<a href="'.get_permalink().'#comment-'.$cmnt->comment_ID
        .'" title="View comment by '.$cmnt->comment_author.'">'.$cmnt->comment_author.'</a>'
        ."<font color=\"#FF3399\"> さん</font>"
        ."<font color=\"#008000\">".$c_date."</font>";
//Modified by H.Suzuki-END

2行目:list関数の最後に変数$c_date(日付)を追加してあります。
3行目:$more変数の値がない場合には、この項目は表示しない設定です。デフォルトでは[…]でしたが、これだとコメンテータが制限数よりも多い場合には必ずmore部分が表示されます。このリンクは記事のタイトルに設定されているものと同じ(コメント欄の先頭にリンク)ですので、コメントの総数などを表示しておけば必要ないものと思われます。
4行目:コメンテータの間に挿入するデフォルトの文字(「, 」)です。<BR>、<li>などのタグを挿入することもできます。
5行目:表示するコメンテータの最大数を指定する変数
6~11行目:mysqlデータベースからデータを取得するスクリプトです。comment_dateを新たに取り込む設定、comment_type= ‘pingback’ OR comment_type = ‘trackback’を追加し、これらのコメントも表示に含めるようにしています。「ORDER BY comment_date DESC LIMIT $nlimit」は、comment_dateで新しい順にソートして$nlimit数だけデータを取り込む設定です。
15行目:変数$c_dateが空の場合に日付を表示させない設定です。
16~17行目:変数$c_dateに値(例えばdate)が設定されている場合に、comment_dateをテンプレート関数の$date_formatで指定されているフォーマットで加工して、両側に()を付して変数$c_dateに格納します。
20~21行目:more変数のリンク設定
24~25行目:コメンテータのリンク設定です。
26行目:敬称の付加です。
27行目:日付の設定です。

使用法

サイドバーの表示したい場所に以下のようなタグを挿入します。

<ul>
<?php c2c_get_recently_commented( $num_posts = '5',
  $format = "<li>%comments_URL% (%allcomments_count%)
            <ul><li>%last_commenters(3,more,<li>,date)%</ul>",
  $categories = '',
  $order = 'DESC',
  $offset = 0,
  $date_format = 'Y-m-d'); ?>
</ul>

2行目:$num_posts = ‘5’は、最新のコメント5件にそれぞれ対応する記事を表示させる設定です。
3~4行目:%comments_URL%は、最近コメントが掲載された記事、%allcomments_count%は、コメント、トラックバックとピンバックを含めたこの記事に対するコメントの総数、次の<ul><li>は、箇条書き第2レベルの指定、%last_commenters%が複数のコメンテータを表示する指定です。この%タグ関数の引数である「3」は、コメントを投稿したコメンテータの最大表示数を指定、「more」はコメントが表示数以上あった場合に末尾に表示される文字列を指定します。もちろん日本語でもかまいません。デフォルト(空)は、表示しない設定です。次の引数は、コメンテータ+日付の後に付加されます。この場合は<li>ですが、実質上は次のコメンテータの前に付加される<li>として意義を持ちます。第2レベルの箇条書きを使用しない場合には、%last_commentersの前の<ul><li>を<BR>に、引数の<li>を<BR>に変えてください。第4番目の引数は、投稿日付を挿入するかどうかのオプションです。挿入したくない場合には、空のまま (3,more,<li>,) にしておいてください。文字列は何でも良いのですがここでは、わかりやすいようにdateにしてあります。日付のフォーマットは$date_formatで行ってください。

[追記](2009年5月20日)
この改良プログラムを使用していて1つ欠けている機能があることに気づきました。それは、質問を含むコメントに対して管理者として回答する場合に、誰への回答なのかが明示されないということです。色々考えたあげく、コメントの冒頭の部分(「...さんへ」という部分)の抜粋をとって、宛先がわかるようにする対策に落ち着きました。
[追記](2009年5月24日)
サイト「管理者」に「さん」を付けるのはおかしいですね。「管理者」だけには敬称を付けないようにしました。$comment_authorにおける識別子は、ダッシュボード右上にあるadmin設定の「表示名」になります。これを確認して、上記の変数に代入してください。

次に変更したスクリプトを挙げておきます。右の▽ボタンを押せばウィンドウが開きます。サイトの特殊性に踏まえて各変数の値を変えてください。

   if (strpos($tag, '%last_commenters(') !== false) {
    global $wpdb;
    preg_match("/^%last_commenters\((.+)\)%$/U", $tag, $matches);
//Modified by H.Suzuki-Start
    list($limit,$more,$between,$c_date,$excerpt) = explode(',',$matches[1]);
    if (empty($more)) $more = '';
    if (empty($between)) $between = ', ';
    $nlimit = $limit + 1;
    $comments = $wpdb->get_results("SELECT comment_content, comment_author, comment_date, comment_ID 
             FROM $wpdb->comments 
             WHERE comment_post_ID = '$post->ID' and comment_approved = '1' 
               AND ( comment_type = '' OR comment_type = 'comment' 
               OR comment_type = 'pingback' OR comment_type = 'trackback') 
               ORDER BY comment_date DESC LIMIT $nlimit"); 
    $count = 1;
    if ($comments) :
    foreach ($comments as $cmnt) {
     if (empty($c_date)) $c_date = "";
       else {$temp=mysql2date($date_format, $cmnt->comment_date);
             $c_date=' ('.$temp.')';}
     if (empty($excerpt)) $excerpt = "";
      else {$mycomment = strip_tags($cmnt->comment_content);
            $excerpt = mb_substr($mycomment,0,13)."...";}
     if ($cmnt->comment_author == "管理者") $respect = "";
      else $respect = " さん";
     if ($count > 1) $new .= $between;
     if ($count > $limit) {
      $new .= '<a href="'.get_permalink().'#comments" title="View all comments">' 
           . $more . "</a>\n";
      break;
     }
  $new .='<a href="'.get_permalink().'#comment-'.$cmnt->comment_ID
        .'" title="View comment by '.$cmnt->comment_author.'">'
        .$cmnt->comment_author.'</a>'
        ."<font color=\"#FF3399\">".$respect."</font>"
        ."<font color=\"#008000\">".$c_date."</font>"
        ."<BR>"."<font color=\"#555555\">".$excerpt."</font>";
//Modified by H.Suzuki-END
     $count++;
    }
    endif;

$excerptの仕様は変数$dateと同じです。%関数の最後にexcerptとでも記入してください。空にすれば表示されなくなります。最終的な関数挿入部分は次のようになります。

<?php c2c_get_recently_commented( $num_posts = '5',
  $format = "<li>%comments_URL% (%allcomments_count%)
             <ul><li>%last_commenters(3,,<li>,date,excerpt)%</ul>",

注意点

  • この設定には使用できない(あるいは使用しても意味を成さない)%タグがあります。例えば、%last_comment_excerpt%などです。他の%タグを使用する場合には、この%関数の意味をよく把握してから使用してください。
  • この関数の設定は、「C. 最近掲載されたコメント」で解説されている使用法になんら影響を与えるものではありません。言い換えれば両者の関数を2つ続けて使用することもできます(あまり意味がないでしょうが)。
  • もう少し詳細なコメント一覧を表示したいという人は、変数を追加することも可能です。上記のスクリプトの構造をよく理解して作業してください。あるいは、「Get Recent Comments」というプラグインを使用すれば、豊富な付帯事項を追加してコメントを表示することができます(プラグイン「Get Recent Comments」の使用方法を参照)。

関連記事



プラグインCPL-最近のコメント表示の改良” への2件のコメント

  1. はじめまして
    プラグインPostViewsの使用方法などで検索していましたらここにた取りつきました。
    で最近のコメント表示なども検索していましたが
    こちらのサイドにある最近のコメントがすごく気に入りましてくぐってきましたら
    このページ見つけました。
    まだ他の記事は(CPLに関して)読んでませんが
    参考にさせていただきます。

コメントを残す




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