【WordPress】投稿一覧をコメントの日付を含めて最新のもので並び替える

WordPress上に掲示板プラグインを開発しているときの覚書。

環境: WordPress 5.4.1

投稿一覧を表示するときに最近コメントがあったものを上にもってきたい。
デフォルトではできないので、どこかにHookしてorder by句を直書きする必要がある。

WP_Queryのソースコードを読んでみると、「posts_orderby」にadd_filterすればいけそう。

フック関数のコード例
function group_forum_posts_orderby($orderby, $query) {
if (empty($query->query['orderby'])) {
return $orderby;
}

if ($query->query['orderby'] != 'active') {
return $orderby;
}

global $wpdb;

// Latest comment date
$sql = [];
$sql[] = "(";
$sql[] = "SELECT comment_date";
$sql[] = "  FROM {$wpdb->comments}";
$sql[] = " WHERE comment_post_ID = {$wpdb->posts}.ID";
$sql[] = "   And comment_approved = 1";
$sql[] = " ORDER By comment_date DESC";
$sql[] = " LIMIT 1";
$sql[] = ")";

return "COALESCE(" . implode("", $sql) . ", {$wpdb->posts}.post_modified) DESC";
}
add_filter('posts_orderby', 'group_forum_posts_orderby', 10, 2);

呼び出すときはこんな感じ。
new WP_Query([
'orderby' => 'active',  // Custom hooks in hooks.php
])

応用すれば並び替え自由自在。
「active」という名前でなくてもいい。
「order」は無視。
postmetaだけで並び替えるならhookせずにできる。