Wonderful! WordPress

指定日数以内に送信されたコメントの一覧表示

この記事は公開または最後に更新されてから2166日が経過しています。情報が古くなっている可能性があるのでご注意下さい。

こんなローカルなブログに訪れてくれる方の数もしれているので、コメントを残してくれる方などは全くおらず考える必要もないのですが、もう一つある私の仲間内だけの鳥見報告的なブログには、ごくたまにコメントを残してくれるうれしい方もいます。

コメントを送信してくれた人がいる場合、メールにての通知もありますが、やはりサイドバーなどに表示されれば一目で確認できますし便利ですよね。
標準で備わるウィジットにも「最近のコメント」があるので、それを利用すれば事足ります。
ただ、毎日たくさんのコメントがあるサイトなどでは全く考える必要のない事ですが、コメントの数が絶対的に少ないと随分時間の経ってしまったコメントへのリンクがいつまでもサイドバーに表示されていることになります。
あまり古いものをいつまでも表示させておくのも意味がありませんし、サイドバーもただ場所をとるだけですっきりしません。
標準のウィジットは件数は指定できても送信されてから何日以内のという指定まではできませんが、普通はこんなことを考える必要もないわけですから当然です。
通常だと必要のない機能を望んでいるのですね。そんなに難しい事ではなさそうなので自分で作ります。

*2015/10/01 更新
前の物はsql で指定した日数以内に送信されたコメントの数を取得して、ということをしていたのですが、別にそんなことをしなくとも、と思い直して2015/10/01に作り直しました。
未承認の物も含めとりあえず新し物から指定した数だけコメントを取得して、指定された期日内かどうかを確かめるということにしています。
パラメータの'all''0'を渡せば、指定期日内に送信されたコメントが無い場合に期日外のコメントを表示できます。WordPress のウィジットと同じということになりますか。

<?php
function recent_comment() {

	$param = array( //パラメータ
		'ptype' => '',//取得するコメントのポストタイプ指定
		'lnum' => 4,//表示するコメント数
		'div' => 'li',//最外枠のhtml要素の指定 0:li 1:div
		'all' => 0,//指定期日以内の新着が無い場合に古い件を表示するかの指定 0:表示 1:非表示 
		'daynum' => 3,//新着の期日指定の日数
	);
	$args = func_get_args();

	if ( func_num_args() > 0 ) {
		$param = array_merge( $param, $args[0] );
	}

	//取得するコメントのポストタイプを指定 ''(空文字)で全て
	$target = $param['ptype'];

	//表示するコメント数の指定
	$linum = intval( $param['lnum'] );
	if ( $linum < 1 or $linum > 20 ){
		$linum = 4;
	}
	$getnum = $linum *2;

	//最外枠のhtml要素の指定
	$divorli = 'li';
	if('li' !== $param['div'] ) {
		$divorli = 'div';
	}

	//期日指定
	$limitnum = intval( $param['daynum'] );
	if ( $limitnum < 1 or $limitnum > 30 ){
		$limitnum = 3;
	}

	$to = time();
	$form = $to - 86400 * $limitnum;//期日指定
	$newary = array();//指定期日以内のコメントを入れる配列
	$oldary = array();//指定期日外のコメントを入れる配列
	$holdflg = 0;

	if ( '' !== $target ) {//ポストタイプを指定されている場合
		$comments = get_comments( array( 'post_type' => $target, 'number' => $getnum ) );
	} else {
		$comments = get_comments( array( 'number' => $getnum ) );
	}

	if( count( $comments ) > 0 ) {
		foreach( $comments as $comment ) {
			if ( '0' === $comment->comment_approved ) {
				++$holdflg;//未承認のコメントの数
			} elseif ( '1' === $comment->comment_approved ) {
				$comtimestamp = strtotime( $comment->comment_date );
				$compost = get_post( $comment->comment_post_ID );
				$comtitle = get_the_title( $compost->ID );
				$comauthor = $comment->comment_author;
				$brstr = ': ';

				if ( $comtimestamp >= $form ) {
					$newary[] = '<li><a href="'.get_permalink($compost->ID).'#comments">'.$comtitle.$brstr.$comauthor.'</a></li>';
				} else {
					$oldary[] = '<li><a href="'.get_permalink($compost->ID).'#comments">'.$comtitle.$brstr.$comauthor.'</a></li>';
				}
			}
		}
	
		$licount = 0;
		$showhold = 0;
		if ( count( $newary ) > 0 ) {//指定期日内のコメントがある場合
			echo '<'.$divorli.' class="widget"><h2>New comments</h2><ul>';
			foreach( $newary as $val ) {
				echo $val;
				++$licount;
				if ( $licount > $linum ) {
					break;
				}
			}
			if ( $holdflg > 0 ) {//未承認のコメントがある場合
				echo '<li>New comment:'.$holdflg.'</li>';
				$showhold = 1;
			}
			echo '</ul></'.$divorli.'>';
		} elseif ( count( $oldary ) > 0 ) {
			//期日指定内のコメントが無い場合、全てのコメントを表示する指定がされている場合
			if ( 0 === $param['all'] ) {
				echo '<'.$divorli.' class="widget"><h2>Comments</h2><ul>';
				if ( $holdflg > 0 ) {//未承認のコメントがある場合
					echo '<li>New comment:'.$holdflg.'</li>';
					$showhold = 1;
				}
				foreach( $oldary as $val ) {
					echo $val;
					++$licount;
					if ( $licount > $linum ) {
						break;
					}
				}
				echo '</ul></'.$divorli.'>';
			}
		}
		if ( $holdflg > 0 and 0 === $showhold ) {
			echo '<'.$divorli.' class="widget"><h2>Comments</h2><ul>';
			echo '<li>New comment:'.$holdflg.'</li>';
			echo '</ul></'.$divorli.'>';
		}
	}
}
?>
PHP
CopyExpand

パラメータは以下の具合。

<?php
	$args = array(
		'ptype' => 'page',//取得するコメントのポストタイプ :page
		'lnum' => 10,//表示するコメント数10ケ
		'div' => 'div',//最外枠のhtml要素の指定:div
		'all' => 1,//指定期日以内の新着が無い場合に古い件を表示しない 
		'daynum' => 7,//新着の期日指定の日数7日
	);

	recent_comment($args);
?>
PHP
CopyExpand

指定したいものだけを連想配列にして渡すだけ。期日指定だけなら

<?php
	$args = array(
		'daynum' => 5,//新着の期日指定の日数5日
	);
?>
PHP
CopyExpand

*これから下は以前のものです。
コメントを取得する関数の中には日付を指定できるものはなさそうですので、とりあえず指定した日数以内に送信されたコメントの数を調べるには sql を使うしかなさそうです。
取得したコメントの数が0でなければ、リストを表示する処理に入りますが、実際のコメントは get_comments()関数 を使って取得し、ループのなかで日付を比較しながら処理させました。
以下の、get_comments()関数において、

<?php
	get_comments(array('post_type'=>$target,'status'=>'approve','number'=>2));
?>
PHP
CopyExpand

post_type において投稿のタイプを指定できます。通常の投稿なら post 、カスタム投稿ならその指定したカスタム投稿名を指定すればそれぞれの投稿に送信されたコメントを分類して取得できます。ここのサイトの場合、カスタム投稿はこの wordpressのDIY だけなのでわかりやすく、以下の関数には引数に0か1を渡すことで判別させています。
number に取得するコメントの件数を指定します。

<?php
function recent_comment($targid){
	global $wpdb;//function.php内の関数でデータベースを使う時のきまりごと
	
	if($targid===0){
		$target="post";
	}else{
		$target="diys";
	}
	$to=time();
	$fromnum=$to-86400*3;//86400=24*60*60、3日以内の指定
	$from_sql=date('y-m-d H:i:s',$fromnum);
	$sql=<<<HERE
	SELECT COUNT(a.comment_ID) FROM $wpdb->comments a,$wpdb->posts p
	WHERE a.comment_post_ID=p.ID
	AND p.post_type='$target' 
	AND comment_date >= '$from_sql'
HERE;
	$comcount=$wpdb->get_var($sql);
	$comflg=0;

	if($comcount>0){
		echo "<li class=\"widget\"><h2>New comments</h2><ul>";

		$comments=get_comments(array('post_type'=>$target,'status'=>'approve','number'=>2));
		foreach($comments as $comment){
			$comtimestamp=strtotime($comment->comment_date);
			if($comtimestamp>=$fromnum){
				$compost=get_post($comment->comment_post_ID);
				$comtitle=get_the_title($compost->ID);
				$comauthor=$comment->comment_author;

				echo "<li><a href=\"".get_permalink($compost->ID)."#comments\">".$comtitle.": ".$comauthor."</a></li>";
				$comflg=1;
			}
		}
		if($comflg===0){
			echo "<li>Check new comment!</li>";	
		}
		echo "</ul></li>";
	}
}
?>
PHP
CopyExpand

尚、sql 中では post_type の指定をしていないので、'hold''trash' の属性のコメントも数に含めてしまいますが、承認待ちのコメントかあった場合にコメントは表示されずにリストの枠だけが表示されて、承認待ちのコメントがあることがわかるのでそうしています。

Leave a Reply!

JavaScript is necessary to send a comment.
You can edit and delete your comment if you input a edit key.
Edit key is necessary for attesting you when you edit and delete it.
The tag of HTML cannot be used in comment.
When you comment for the first time, it is displayed after the approval of the administrator.
Because I cannot speak English so much, it takes time to answer.
Required fields are marked *.

※Please enter more than 5 characters only alphabets.
※Edit or delete are possible for 2000 days after approval.

*

♠Simplistic Comment User Editable v4.0

♠When visitors leave comments on the site this site collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.
♠This site does not use cookie when visitors leave comments and commenter edit comment.
♠This site uses Akismet to reduce spam. Learn how your comment data is processed.

Comments feed

Trackback URL : https://strix.main.jp/wp-trackback.php?p=17687

Sanbanse Funabashi

Top

スクロールさせるか画像をクリックすると元に戻ります。