WordPrssのコメント機能はDisqusやFacebook Comment Boxに押され気味で利用率が減っているように思いますが、口コミサイトなどユーザーからの投稿を受け付けるサイトの場合はなくてはならない機能です。
コメントを記事と同じく柔軟に好きな条件で抽出することができれば、更に自由度が上がるのではないかと思い、調べてみました。
ADs
記事をタクソノミーやカスタムフィールドなど好きな条件で抽出を行う場合に、pre_get_postsというフィルターフックを使います。
このpre_get_postsと同じような、記事ではなくコメントに対するpre_get_commentsというpre_get_postsのコメント版とも言うべきアクションフックがあり、こちらを使うことでコメントに対しても様々な条件で抽出することが可能です。
まずhome.phpやsingle.phpにget_commentsを使ったコメント一覧が表示されるような箇所を用意します。
pre_get_commentsはget_comments()内で使われるWP_Comment_Queryクラスの中で使われます。
1 2 3 4 5 6 7 8 9 10 11 12 |
//たとえばこんな感じでサイドバーとかに書いておいたとする <?php $comments = get_comments(); foreach($comments as $comment){ ?> <dl> <dt><?php echo $comment->comment_content; ?></dt> <dd><?php echo $comment->comment_author; ?>さんより<?php echo $comment->comment_date; ?>に投稿されました</dd> </dl> <?php } ?> |
次に、functions.phpにpre_get_commentsのアクションフックを書きます。
ほぼpre_get_postsと同じように書けますので、書き慣れている人ならそれほど抵抗ないのではないかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
function my_get_comments($query){ //管理画面ではデフォルトのまま if(is_admin()){ return; } //例:トップページでは10件のコメントを取得 if(is_home()){ $query->query_vars['number'] = 1; } //例:シングルページでは昇順でソート if(is_single()){ $query->query_vars['order'] = 'ASC'; } //例:「hoge」という固定ページでは「cf」というカスタムフィールドが「aaa」であるコメントのみ表示 //さらに2012年1月1日以降のコメントのみ表示 if(is_page('hoge')){ $query->query_vars['meta_query'] = array( array( 'key' => 'cf', 'value' => 'aaa' ) ); $query->query_vars['data_query'] = array( array( 'after' => array( 'year' => '2012', 'month' => '1', 'day' => '1' ), 'inclusive' => true ) ); } } add_action( 'pre_get_comments', 'my_get_comments' ); |
pre_get_postsとの違いはtax_queryがないぐらいで、ほぼ同等と言えます。
meta_query,data_queryが特に有用ですね。
コメントを一覧表示させたいときに使う関数としてはwp_list_comments()がおなじみです。
このwp_list_comments()による表示を調整したい場合はどうすればいいのでしょう?
wp_list_comments()のソースを見てましたが、$wp_query内に入っているcommentオブジェクトを丸ごと呼んでいるだけなのでできなさそうな感じが…。
方法をご存知の方は教えていただけると幸いです_(._.)_
個人的にはコメントはカスタムフィールドをいくつか持ったコメントという投稿タイプの記事だと思っています。
記事と同じく表現方法さえ工夫すればコンテンツを充実する助けになるのではないでしょうか。
参考になれば幸いです。
ADs
コメントはまだありません。