ワイヤード・パンチ

元・大阪人が、岡山の山奥でも生きていけることを証明するためのブログ。

WordPress、get_commentsで返信コメントを除外する方法。

不特定多数からの意見を否応なしに見せられるのは好きじゃないので、当サイトでは絶対にコメント欄は設置しません。

でも、仕事のうえではコメント欄を設置しないといけないことがありました。

それはさておき、返信以外のコメントを取得したかったのですが、どうしても返信込みで取得してしまいます。返信を除外する方法はないでしょうか?

広告

get_commentsだけでは無理?

関数リファレンス/get comments – WordPress Codex 日本語版

コメントを取得するには、get_commentsという関数を使います。

配列で引数を指定することになり、post_idを指定すれば特定の投稿に紐付いているコメントだけを取得するなど、絞り込みをかけることができます。

しかし、上記サイトなどを参考に、引数に何が使えるのか調べてみましたが、子コメントを持たないかどうかという条件で絞り込みをかけることができませんでした。

特定のコメントを親に持つ子コメントとか、そういう絞り込みならできるのですが…。

なお、戻り値としてならcomment_parentで親コメントのIDがわかるのですが、comment_parentは引数にできませんでした。

いったん取得して、いらないものを除外する。

残念ながらget_commentsだけで子コメントなしのコメントだけを取得するのはできなさそうです。

よって、ここはやり方を変えて、ひとまずコメントを全部取得して、そこから必要なものだけを抽出していく形にします。

下記のコードは、そのための一例です。

$comments = get_comments([
	"post_id" => $post_id,
]);
$output = [];
foreach($comments as $comment) {
	if($comment->comment_parent != 0) {
		continue;
	}
	array_push($output, $comment);
}
return $output;

まず、get_commentsで取得したコメント一覧を、foreachによるループにかけます。

comment_parentの値を取得して、0以外だった場合は親コメントを持っている、つまり子コメントということなので除外します。

除外されなかった場合は、最終的に出力するための変数の中に格納してきます。

これで、処理の最後で出来上がる配列には、返信がすべて省かれた、親コメントだけが入っているということになります。

今回はコメントでの例でしたが、その他にも取得の段階で除外できないものがあった場合は、いったん取得してからふるいにかけるのが良いかもしれません。