最近のコメントを表示する[WordPressテーマ作成#11]

最近のコメントを表示するテンプレートを作成します。

MovableTypeにはありますが、WordPressには「最近のコメント」を表示するタグや機能がありません。これはsimple_recent_commentsプラグインをインストールすれば簡単にできます。

単純にインストールしてもいいのですが、SQL文をつかったデータベースへのアクセス方法の勉強になりそうなので少しコードを追いながら仕組みを理解しようと思います。コードは以下。

<?php
       global $wpdb;
       $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID,
       comment_post_ID, comment_author, comment_date_gmt, comment_approved,
       comment_type,comment_author_url,
       SUBSTRING(comment_content,1,30) AS com_excerpt
       FROM $wpdb->comments
       LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID =
       $wpdb->posts.ID)
       WHERE comment_approved = '1' AND comment_type = '' AND
       post_password = ''
       ORDER BY comment_date_gmt DESC
       LIMIT 10";
       $comments = $wpdb->get_results($sql);
       $output .= "\n<ul>";
       foreach ($comments as $comment) {
       $output .= "\n<li>".strip_tags($comment->comment_author)
       .":" . "<a href=\"" . get_permalink($comment->ID) .
       "#comment-" . $comment->comment_ID . "\" title=\"on " .
       $comment->post_title . "\">" . strip_tags($comment->com_excerpt)
       ."</a></li>";
       }
       $output .= "\n</ul>";
       echo $output;
?>

それでは自分なりの理解の範囲で順にコードを調べていきます。PHPは勉強中なので間違っているところもあると思います。そのときは指摘ください。ちょっと長くなりそう・・・。

global $wpdb;

グローバル変数$wpdbを宣言します。これでデータベースへの接続準備ができるようです。データベース接続はwp-db.php内でwpdbクラスの形で定義されています。wpdbクラスはezSQLというPHPライブラリをもとに書かれているようなので興味のある方はそちらも参考にしてください。全部英語ですけど。

次はデータベースに接続するためのSQL文です。ほとんどやったことがないので少しずつ解決していきます。

SELECT文はデータを取り出すためにつかいます。基本の形は次のようになります。

SELECT <列名> FROM <テーブル名> [WHERE 検索条件];

これをベースに細かな条件を指定していくようです。

SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url,

DISTINCT文は結果に重複した行があるとき、それを削除した結果を返してくれます。この場合はDESTINCT以下の列名の組み合わせで重複がないものを取り出します。

SUBSTRING(comment_content,1,30) AS com_excerpt

SUBSTRINGでcomment_content(コメントの本文)の1~30文字を抜き出します。それをcom_excerptという別名に名前を変更するという処理です。

FROM $wpdb->comments

$wpdb->commentsというテーブルからデータを取り出します。普通、コメントテーブル(wp_comments)からデータをとってくるなら

FROM wp_comments

と書きますが、$wpdb->commentsを実行するとwp_commentsという文字列が帰ってきてこれがテーブル名になります。詳しくは公式ドキュメント(下のほう)を参照してください。

Function Reference/wpdb Class « WordPress Codex

テーブル構造は以下に書いてあります。

Database Description/2.5 « WordPress Codex

 LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID)

ここではwp_commentswp_postsの2つのテーブルを結合しています。FROMで指定したwp_commentsテーブルをすべて参照してwp_postsテーブルと比べます。そのなかからcomment_post_IDwp_postsテーブルのIDが等しいものを選んで結合するということらしいです。できあがったテーブル名は$wpdb->commentsで参照される文字列wp_commentsです。

WHERE comment_approved = '1' AND comment_type = '' AND
         post_password = ''
         ORDER BY comment_date_gmt DESC
         LIMIT 10";

さきほど結合したテーブルをさらに絞り込みます。comment_approved = "1"で認証されていて、且つcomment_typeが空、且つpost_passwordが空という条件を満たすものをコメント日時でソートして10件取り出すという処理になります。

SQL文ができたらget_results()でデータベースに問い合わせをします。

$comments = $wpdb->get_results($sql);

結果はオブジェクトで帰ってきます。$commentsprint_r()で出力したらこうなります。

stdClass Object 
  (             
   [ID] => 記事のID
   [post_title] => 記事のタイトル
   [post_password] => 記事のパスワード
   [comment_ID] => コメントID
   [comment_post_ID] =>  コメントをつけた記事ID
   [comment_author] => コメントの投稿者名
   [comment_date_gmt] => コメントの投稿日時             
   [comment_approved] => コメントの状態              
   [comment_type] => コメントタイプ              
   [comment_author_url] => コメント投稿者のURL               
   [com_excerpt] => コメントの抜粋
  )

あとはforeachでまわして必要なデータを抜き出してHTMLに整形です。

SQLは難しいですね。

そうのひとりごと

© 2017 PAOLOG