WordPress

コメントされたときのみ、コメント最新リストを更新する

最新コメント5件を表示するような共通エリアを、すべてのページに用意するお話しです。

実現したいこと

最新コメント5件を表示するような共通エリアを用意する際の要件をまとめました。

  • ある記事に複数のコメントがある場合はユニークとして最新のコメントのみカウントとし、記事が重複しないようにする
  • ページをアクセスするたびにデータベースを参照するのではなく、コメントされたときにスタティックなファイルを事前に生成しておき、それを参照する
  • 対象のコメントは、公開されている・許可されているコメントのみで、保留やスパム判定されたコメントやPINGは対象外とする

実装までの思考

WordPressのテンプレートには、コメントを軸としたテンプレートはないので、別途、固定ページなどで専用ページを用意する必要がある。とりあえず、page-comments.php を用意して、コメント一覧を表示するページを作ろう。

このままだと、ページにアクセスするたびに、page-comments.phpを呼び出す、つまり都度データベースを参照してしまうのでよろしくない。とはいえ、サーバーキャッシュ対応はレンタルサーバーだとできないので、別案を考える。

コメントされたタイミングで、スタティックファイルを作る。ページにアクセスするたびに、そのスタティックファイルを参照するようにする。

つまりは、重要なポイントは2つ。
それは「コメント一覧を表示する」ことと「コメントがあったタイミングをフックにする」ことだ。
それではそれぞれ実装していきます。

下準備

実装するためのテスト用ファイルを用意します。
WordPressが有効になる必要があります。どのテンプレートファイルでも対応しますので、トップページなり、固定ページなり、投稿ページなり、エラーページなり、お好きなように。

コメント一覧を表示する → get_comments

コメント情報を取得するには、関数 get_comments を利用します。
引数には多くの条件を指定できるので、大概のことはこの関数で絞り込みや並び替えを行うことができるでしょう。
詳しくは、公式リファレンスを参照します。
関数リファレンス/get comments - WordPress Codex 日本語版

今回は、取得対象を「公開許可しているコメント」として情報を取得します。とりあえず、コメント本文を出力する例です。

$args_comment = array(
  'type' => 'comment',
  'status' => 'approve',
);

foreach ($comments as $comment) {
  echo $comment -> comment_content;
}

これだけで、サイト内のすべての許可したコメントの本文のみが表示されます。
htmlやCSSの反映はここでは省きますが、よしなに。
ちなみに、本文以外にもコメントごとに下記のような情報が返却されています。

戻り値

comment_ID (整数) コメントの ID
comment_post_ID (整数) コメントが付いた投稿または固定ページの ID
comment_author (文字列) コメント投稿者の名前
comment_author_email (文字列) コメント投稿者のメールアドレス
comment_author_url (文字列) コメント投稿者のウェブサイト
comment_author_IP (文字列) コメント投稿者の IP アドレス
comment_date (文字列) コメントの日時 (YYYY-MM-DD HH:MM:SS)
comment_date_gmt (文字列) コメントの GMT 日時 (YYYY-MM-DD HH:MM:SS)
comment_content (文字列) コメント内容
comment_karma (整数) コメントのカルマ値 (訳注: 常に0です)
comment_approved (文字列) コメントの承認レベル (0, 1 または "spam")
comment_agent (文字列) コメント投稿者のユーザーエージェント (ブラウザーやオペレーティングシステムなど)
comment_type (文字列) 該当すればコメントの種類 (pingback|trackback), 普通のコメントなら空
comment_parent (文字列) 入れ子になったコメントなら親コメントの ID (トップレベルなら0)
user_id (整数) コメント投稿者が登録済みならユーザー ID (未登録なら0)

コメントありの記事を5件取得するためにカスタマイズする

$comment_maxnum = 5;    // 5件取得する

$comment_num = 0;    // 記事数をカウントする
$comment_array = array();    // 記事IDを格納する

$args_comment = array(
  'type' => 'comment',
  'status' => 'approve',
);

$comments = get_comments($args_comment);

foreach ($comments as $comment) {
  $post_id = $comment -> comment_post_ID;    // 記事IDを取得する

  // 記事IDが重複していないか判別する
  if (in_array($post_id, $comment_array)) {
    
    // 重複しているため、次のコメントあり記事を参照する
    continue;

  // 記事数が所得したい件数より少ないか判別する
  } else if ($comment_num < $comment_maxnum) {
    
    $comment_num++;    // 取得記事数を追加する
    $comment_array[] = $post_id;    // 記事IDを格納する
                                            
    echo $comment -> comment_content; 
  } else {
    
    // 取得したい件数に達したので、このループから抜ける
    break;
  }
}

これで、一つ目の「コメント一覧を表示する」は実装完了。この記述をすべてのテンプレートに適用させてもいいのだが、このままだとサイト内の各ページにアクセスするたびにデータベースを参照するので、コメントがあったときにファイルを更新して、スタティックファイルを用意する。

コメントがあったタイミングをフックにする → wp_insert_comment

公式サイトを漁っていたら、コメントがあったタイミングをフックにする関数を見つけたので、これをfunctions.php に適用するのみ。
【注意】functions.php を修正する場合は、必ずファイルをバックアップしてから修正することを強くオススメします。コードに誤りがあるとサイトが閲覧できなくなる可能性があるので、扱い要注意です。

function mp_comment_inserted($comment_id, $comment_object) {
  
    // do something  
}
add_action('wp_insert_comment', 'mp_comment_inserted', 99, 2);

これで、コメントがあったタイミングをフックにする処理ができます。関数名「mp_comment_inserted」は任意です。ご自身の命名ルールで。
do something の箇所に、さきほどテストしたコードをこちらに差し替え、echoではなく、file_put_contentsでファイルを作成するようにすれば完成です。

function mp_comment_inserted($comment_id, $comment_object) {

  $comment_maxnum = 5;

  $comment_num = 0;
  $comment_array = array();
  $comment_text = '';    // 保存用テキスト

  $args_comment = array(
    'type' => 'comment',
    'status' => 'approve',
  );

  $comments = get_comments($args_comment);

  foreach ($comments as $comment) {
    $post_id = $comment -> comment_post_ID;

    // 記事IDが重複していないか判別する
    if (in_array($post_id, $comment_array)) {

      continue;
    } else if ($comment_num < $comment_maxnum) {

      $comment_num++;
      $comment_array[] = $post_id;

      $comment_text .= $comment -> comment_content;    // テキストを追加する
    } else {
      break;
    }
  }
      
  // テキストを保存する
  file_put_contents(__DIR__.'/include_comment.html', $comment_text);
}
add_action('wp_insert_comment', 'mp_comment_inserted', 99, 2);

include_comment.html というファイルを生成 or 上書きするように指定していますが、もちろんファイル名や階層もよしなに変更で。
ちなみに、functions.php 内に移動した場合は、先に用意したテスト用のテンプレートは不要となり、include_comment.html をincludeするようにします。

最後に

この記事で紹介した内容で、このブログの全ページに「最近の記事」「人気の記事」がありますが、ここに「コメントありの記事」というエリアを追加しました。

何かお困りではありませんか?

さいごまで記事を読んでいただき、ありがとうございます!
何かお困りなことはありませんか?
当方、ホームページ制作・改修/WordPress構築/Webデザイン/UI・UXデザイン/Webディレクション/広告運用/ブランディング/マーケティング/撮影・レタッチ/動画撮影・編集/プロトタイプ制作、幅広く対応しておりますので、まずはお気軽にご相談いただけると嬉しいです!ご連絡お待ちしております。
Stay Safe.
詳細 » 案件、承っております

最近の記事

「やりたいことを全部やってみる」を読んで

2019年9月に書いたレビューがあったので、ここに転載。--- タイトル「やりたいことを全部やってみる ストレスフリーな生き方を叶える・・・

起業向け情報

「世界一やさしいブログxYouTubeの教科書1年生」を読んで

2019年1月に書いたレビュー(2年以上前!)が残っていたので、ここに転載。当時YouTubeをやろうとしていた頃を思い出す。今でもYouTube更新しようと・・・

知識編

「図解モチベーション大百科」を読んで

書籍「図解モチベーション大百科」。主に行動経済学、実験心理学を扱った国内外の文献から、編著者なりの解釈で紹介された本。ここでは備忘録として書・・・

マーケティング・ブランディング

ローカル環境(MAMP)でgmailからメール送信できるようにする

MAMPにWordPressを入れてテストをしていると、ユーザー作成時やら何かとメール送信が必要になるタイミングがる。何も設定をしていないとローカル環境のWo・・・

MAMP

ユーザビリティと機能はどちらが上?

先日、「iOS Safariで絶対配置(position:fixed)して惰性スクロールしてもロックしない、フリーズ回避方法」という記事を書いたときに、エンジ・・・

デザイン思考

ビジネスカードとショップカード

以前にブランディングページを用意させてもらった、Sunny Side Accessory(サニーサイド アクセサリー)さんのビジネスカードとショップカードを制・・・

お仕事・制作日記

DtoC におけるプロモーションと広告運用

公開が2020年7月ということで、もう少しで1年経つのかぁ。「最終回 株式会社北の達人コーポレーション 木下勝寿社長 DMM MARKETING CAMP x・・・

マーケティング・ブランディング

スタバに学ぶ。PART 2

以前、スタバに学ぶ。という記事を書いたが、そのときに記事にし忘れていたことがある。企業ミッションについて、だ。何より大事なことなので後でしっかり書こうとしたき・・・

起業向け情報

自主出版したい熱は消えない

学生の頃から、物書きや写真を撮るのが好きで、いつか自主出版してみたいと思いながら、映画館では必ず観た作品のパンフレットを購入したり、フリーペーパー冊子を集め続・・・

Web本・デザイン本

行動経済学

数年前に読んだ本だが、ノートに書き写していたものを備忘録として書き起こし。行動経済学は、心理現象を背景に、人間の意思決定に関する メカニズム・・・

マーケティング・ブランディング

人気の記事

WP_Queryを使って絞り込み検索するのにコレは便利!

めっちゃ参考になるページを見つけた。 絞り込みをするたびに色々ググっていたが、これがあればほとんどのことが解決できそうな気がする。 参考: これは便利!Word・・・

WordPress

overflowをautoにした要素のスクロール位置を変更する → scrollTop scrollLeft

まずはサンプル。 これは、overflowをautoにした要素のスクロール位置を変更するサンプルです。 これは、overflowをautoにした要素のスクロ・・・

JavaScript

http://localhost:8888/ → http://localhost/

http://localhost:8888/ での参照ではなく、http://localhost/ で参照できるようにします。 MAMPの設定を変更する M・・・

MAMP

iframeの高さを自動調整する

iframeで呼び出した際、iframe自体はスクロールさせずに高さを取得してiframe全体を表示させます。 サンプル:iframeの高さを自動調整するデモ・・・

JavaScript

イラストレーターでレイヤーごとにPNGで書き出す

【2020年07月13日】 macOS Catalina(10.15.5) / Adobe iLLustrator 2020(24.2.1) にて動作確認済・・・

Illustorator

WordPressのカテゴリー一覧ページでカテゴリー名とスラッグを取得する → get_queried_object()

やりたいこと カテゴリー一覧ページで、そのカテゴリー一覧ページに属する記事一覧を取得するためにループさせるのとは別に、タイトルやカテゴリー別にデザインを変・・・

WordPress

アーカイブページでカスタムフィールドやタクソノミーで絞り込みした状態でリスト表示する

<?php $args = array( 'paged' => 1, 'posts_per_page' => 20, 'post・・・

WordPress

MAMP を 5.7 から 6.2 にアップデートした

5年以上前と比べると、アップデートが簡単で驚く。とくに記事にするまでもないと思いつつ、一応備忘録。 インストールすると、既存のディレクトリはそのままに別・・・

MAMP

管理画面のカスタム投稿一覧で並び順を変更する

WordPressの管理画面。「投稿」や「固定ページ」の一覧は、公開日順に並んでいる。ところが、カスタム投稿を追加した場合、公開順ではなく名前順に並んでいること・・・

WordPress

カウントアップ、カウントダウンするJavaScript

ポイントを使ったり、増やしたりしたときに、結果のポイント数に差し替えるのではなくて、カウントアップしたり、カウントダウンして動的に動かそうと思って作ってみた。・・・

JavaScript

コメントありの記事

jQueryでformを操る【nameの値を取得する/クリアする】

「「値をクリアする」を追加しました。チェックボックスやラジオボタンの値を何も選択していない状態に戻すときについて触れています。」

JavaScript

iframeの高さを自動調整する

「>匿名さん コメントありがとうございます。 サンプルでは、beforeは何も処理していないので期待する表示にならない、で正解です。 クリックした後が、対応・・・」

JavaScript

Instagram API を使ってインスタに投稿した画像データを取得する

「コメントに嬉しいお言葉、ありがとうございます!」

API

MAMPでMySQL Serverが突然起動しなくなった時 → ログファイル削除

「(匿名)さん コメントありがとうございます。何も設定変更していないのに、それまで使用できていたサーバーが突然使えなくなるのは辛いですよね、、。 ここで紹介したや・・・」

MAMP

イラストレーターでレイヤーごとにPNGで書き出す

「コメントありがとうございます! そもそもできるかはわかりませんが、ソースを書き換える必要はあります。 下記記事などが参考になるかもしれません。 illustra・・・」

Illustorator

05_各種キーワードツール

「公開から14年振りの更新w デッドリンクを削除しました。ツール系は「SEO対策に役立つ便利ツール」に集約します。」

SEO

WP_Queryを使って絞り込み検索するのにコレは便利!

「「特定の「タイプ」に関連付けられた投稿を表示する場合」を一つの場合を追記し、複数の場合と分けました。」

WordPress

ホーム画面からの起動か判別する

「コメントありがとうございます。 この記事で紹介している機能は、記事内のサンプル「ホーム画面からの起動か判別する」というリンクをクリックすることで確認できます。 ・・・」

JavaScript

Javascriptでカレンダーを作ってみた

「JWOLさん> 祝日名を追加されるとのこと、いいですね!コメント&参考にしていただきありがとうございます!」

JavaScript

WordPressで記事の数を取得する → wp_count_posts() か found_posts

「絞り込み検索した場合の記事数の取得方法を追記しました。 $my_query->found_posts;」

WordPress

WEB制作アプリケーションWordPressコメントされたときのみ、コメント最新リストを更新する | シンプルシンプルデザイン