皆様いつもコメントやSNSボタンのクリックありがとうございます
「ブログを運営していて一番嬉しいのはコメントをいただけること」です。
やはりコメントで質問を頂いたり、お礼のコメントを頂けると「次回はもっと役に立つ投稿をしよう」という意欲に繋がります。
しかし残念なことに「ブログを運営していて一番煩わしいのがスパムコメントへの対応」ではないでしょうか。
WordPressではスパムへの対応を自動でしてくれる便利なプラグインが用意されています。
しかしそれらの対策も万全ではありません。一部のスパムはAkismetをすり抜け、CAPTCHAの画像が難読過ぎるという問題もあります。
そこで、気軽にコメントをいただけるフォームを維持しつつ、スパムを減らす対策を考えました。
目次
WordPressのコメントの仕組み
1.特定の投稿だけコメントを停止する
2.特定の投稿タイプだけコメントを停止する
3.投稿してから特定の期間を過ぎるとコメントを停止する
時間の取得に関する補足
WordPressのコメントの仕組み
まずはWordPressにおけるコメントの仕組みを把握しておきます。
WordPressでは投稿とコメントに関する条件分岐タグが用意されているのでテンプレートの編集ができれば簡単に制御できます。
コメントは以下のタグで表示しています。
TwentyTenでは「loop-single.php」、TwentyElevenでは「single.php」に記述されています。
<?php comments_template( '', true ); ?>
Codexの「comments template」についての解説
さらに細かい表示の設定は、コメント専用のテンプレートで指定できます。
Codexの解説にもありますが「comments_template()」でコメント用の全体を表示しています。つまりいただいた「コメントを表示する機能」なども含まれます。
「comments_template()」の引数が空欄だと、デフォルトで「comments.php」が読み込まれます。
コメント機能全体でなくコメント用のフォームだけ削除したい場合は「comments.php」の以下のタグを削除します。
<?php comment_form(); ?>
フォーム自体の変更は以前の投稿「WordPressのテンプレートタグを使ってコメントフォームをカスタマイズする方法」を参照してください。
1.特定の投稿だけコメントを停止する
スパムは特定の単語を標的にしている事が多く、特定の投稿だけスパムの対象になることがあります。
当サイトでは「ログ解析やユーザーの振り分けに活躍する、ユーザーエージェントまとめ」へ毎日大量のスパムコメントが投稿されます。
ほとんどの投稿はAkismetでスパム登録されますが、この投稿へのスパムは1日数百件を数えるため、どうしてもすり抜けるコメントが出てしまいます。
そこでこの投稿だけコメント欄を非表示にしました。
コメント機能全体を削除する方法
TwentyTenでは「loop-single.php」、TwentyElevenでは「single.php」の「comments_template()」を以下のように書き換えます。
(上記のスパムが多い投稿のIDは5188)
<?php if( !is_single( 5188 ) ){//指定したIDの投稿ではないときにtrue。つまり停止したい投稿のIDを指定。 comments_template( '', true ); }; ?>
今回は1つだけ登録しましたが、複数の投稿を指定する場合は「&&」で繋いで「01&&02」とします。
コメントフォームだけを削除する方法
投稿されたコメントは残してフォームだけを削除したい場合は「comments.php」で「comment_form()」を以下のように書き換えます。
<?php if( !is_single( 5188 ) ){//指定したIDの投稿ではないときにtrue。つまり停止したい投稿のIDを指定。 comment_form(); }; ?>
2.特定の投稿タイプだけコメントを停止する
「投稿(post)」ではコメントを許可して、「固定ページ(page)」ではコメントを拒否。または「カスタム投稿タイプ」だけは許可するなど。
単純に個別のテンプレートでフォームを削除してもいいですし、上記のように条件分岐しても実現できます。
固定ページの場合はコメントフォームを表示しない方法
<?php if( !is_page() ){//固定ページの場合は表示しない(固定ページ以外ではコメントフォームを表示する) comment_form(); }; ?>
カスタム投稿タイプhogeの場合はコメントフォームを表示しない方法
<?php if( !get_post_type() != 'hoge' ){//カスタム投稿タイプhogeの場合は表示しない(hoge以外ではコメントフォームを表示する) comment_form(); }; ?>
条件分岐について詳しくは過去の投稿「もう覚えなくても大丈夫!?WordPressの条件分岐タグの使い方まとめ」を参照してください。
3.投稿してから特定の期間を過ぎるとコメントを停止する
ニュース性の高いブログでは、古い投稿は資料として参照される程度で、追加されるコメントはほぼスパムという場合があります。
そこで「30日を経過した投稿にはコメント禁止」とします。
合わせてコメントを停止した場合「投稿してから30日以上経過しているためコメントを停止しています。」と表示する方法を解説します。
<?php $posttime = the_date('U','','',false);//the_dateで投稿の時間を取得。UでUNIXタイムを取得、falseでPHPで利用できる数値に変換 $basetime = time();//time()で現在のUNIXタイムを取得 if(($posttime+2592000)>$basetime){//投稿時間+1カ月(2592000)が現在の投稿より大きい場合(投稿が30日より新しい場合) comments_template( '', true ); }else{//投稿が30日より古い場合 echo '投稿してから30日以上経過しているためコメントを停止しています。'; } ?>
30日ではなく、1年(365日)にしたいという場合は4行目にある「2592000」を変更してください。
UNIXタイムを変換してくれるサイトが複数あるので利用させていただきましょう。「UNIXタイムスタンプ変換ツール」
「the_time()」でも投稿の日時を取得できますが、強制的に出力されてしまうので、今回は日時のデータをPHPで利用できる数値に変換してくれる「the_date()」を利用しました。
時間の取得に関する補足
今回利用したコードは1例で、他にも便利な関数が用意されています。よく使うものを合わせて追記しました。
getdateを利用したUNIXタイムの取得
UNIXタイムだけでなく、引数を指定すれば様々な時間を取得できます。
<?php $today = getdate(); echo $today[0]; ?>
mktimeを利用したUNIXタイムの成形
日数ベースで計算したいときに、秒や時間を無視したデータに成形したい場合に利用すると便利です。
<?php $today = getdate(); $today_month = $today['mon']; $today_day = $today['mday']; $today_year = $today['year']; $timestamp = mktime(0, 0, 0, $today_month, $today_day, $today_year); echo $timestamp; ?>