articles/[slug]: drop Stay Updated sidebar card; related fallback to latest

Empty Related Articles bug on /articles/<slug> traced to two issues:
- Two rows were imported with category="industry" instead of the canonical
  "Industry News", so the category-match query returned zero peers.
- The fallback path was missing — getLegacyRelatedArticles now tops up
  with the latest published rows whenever the category match is short.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ryan Salazar
2026-05-29 10:40:44 +00:00
parent 0a97e6d168
commit 29862fe394
2 changed files with 35 additions and 25 deletions

View File

@@ -252,21 +252,42 @@ export async function getLegacyRelatedArticles(
category: string | null,
count: number,
): Promise<Article[]> {
try {
let q = client()
.from("wp_imported_posts")
.select(SELECT_COLS)
.eq("status", "published")
.neq("wp_slug", excludeSlug)
.order("wp_published_at", { ascending: false })
.limit(count);
if (category) q = q.eq("category", category);
const { data, error } = await q;
if (error || !data) return [];
return (data as ImportedPostRow[]).map((r) => rowToArticle(r));
} catch {
return [];
const collected: ImportedPostRow[] = [];
const seen = new Set<string>([excludeSlug]);
// First pass: same category. Skip when no category recorded.
if (category) {
try {
const { data } = await client()
.from("wp_imported_posts")
.select(SELECT_COLS)
.eq("status", "published")
.eq("category", category)
.neq("wp_slug", excludeSlug)
.order("wp_published_at", { ascending: false })
.limit(count);
for (const row of (data as ImportedPostRow[] | null) || []) {
if (!seen.has(row.wp_slug)) { collected.push(row); seen.add(row.wp_slug); }
}
} catch {}
}
// Fallback: top up to `count` with the latest published, excluding what we
// already have. Handles tiny categories, orphan rows, and category=null.
if (collected.length < count) {
try {
const { data } = await client()
.from("wp_imported_posts")
.select(SELECT_COLS)
.eq("status", "published")
.neq("wp_slug", excludeSlug)
.order("wp_published_at", { ascending: false })
.limit(count + collected.length + 5);
for (const row of (data as ImportedPostRow[] | null) || []) {
if (collected.length >= count) break;
if (!seen.has(row.wp_slug)) { collected.push(row); seen.add(row.wp_slug); }
}
} catch {}
}
return collected.map((r) => rowToArticle(r));
}
export async function getLegacyArticlesBySection(