*/ public array $query_vars; /** @param array $query_vars */ public function __construct(array $query_vars) { $this->query_vars = $query_vars; } } final class AKSRT_Test_WPDB { public string $comments = 'wp_comments'; public string $commentmeta = 'wp_commentmeta'; } $GLOBALS['wpdb'] = new AKSRT_Test_WPDB(); $GLOBALS['aksrt_test_filters'] = []; function add_filter(string $tag, callable $callback, int $priority = 10, int $accepted_args = 1): void { $GLOBALS['aksrt_test_filters'][$tag][] = [$callback, $priority, $accepted_args]; } function sanitize_key(string $key): string { return strtolower(preg_replace('/[^a-z0-9_\-]/', '', $key) ?? ''); } function wp_unslash($value) { return $value; } function aksrt_test_apply_comments_clauses(array $clauses, WP_Comment_Query $query): array { $filters = $GLOBALS['aksrt_test_filters']['comments_clauses'] ?? []; usort($filters, static fn (array $a, array $b): int => $a[1] <=> $b[1]); foreach ($filters as [$callback, $priority, $accepted_args]) { $clauses = $callback($clauses, $query); } return $clauses; } require __DIR__ . '/../../inc/helpers/aksrt-comments.php'; $newest_args = aksrt_comments_template_query_args(['order' => 'ASC']); if (($newest_args['order'] ?? '') !== 'DESC' || ($newest_args['orderby'] ?? '') !== 'comment_date_gmt') { throw new RuntimeException('The newest tab must use descending comment date order regardless of the WordPress discussion setting.'); } $_GET['aksrt_comment_order'] = 'hottest'; $hottest_args = aksrt_comments_template_query_args([]); if (empty($hottest_args['aksrt_hottest_order']) || ($hottest_args['order'] ?? '') !== 'DESC') { throw new RuntimeException('The hottest tab must set a descending, query-local hottest marker.'); } unset($_GET['aksrt_comment_order']); $base = [ 'join' => '', 'where' => 'wp_comments.comment_post_ID = 42', 'orderby' => 'wp_comments.comment_date_gmt DESC', ]; $hot = aksrt_test_apply_comments_clauses($base, new WP_Comment_Query([ 'post_id' => 42, 'aksrt_hottest_order' => true, ])); if (!str_contains($hot['join'], 'LEFT JOIN wp_commentmeta AS aksrt_cm_hot')) { throw new RuntimeException('Hottest ordering must use LEFT JOIN so comments without like metadata remain in the result.'); } if (!str_contains($hot['orderby'], 'COALESCE(aksrt_cm_hot.meta_value, 0) AS UNSIGNED) DESC')) { throw new RuntimeException('Hottest ordering must sort likes from high to low and treat missing metadata as zero.'); } if (!str_contains($hot['orderby'], 'wp_comments.comment_date_gmt DESC')) { throw new RuntimeException('Equal like counts must use newest date as the stable tie-breaker.'); } if ($hot['where'] !== $base['where']) { throw new RuntimeException('Hottest sorting must not alter the query scope.'); } $ordinary = aksrt_test_apply_comments_clauses($base, new WP_Comment_Query([ 'post_id' => 99, 'orderby' => 'comment_date_gmt', ])); if ($ordinary !== $base) { throw new RuntimeException('Queries without the hottest marker must remain unchanged.'); } fwrite(STDOUT, "Hottest comment query behavior passed.\n");