P0-2 + Phase A: drop Adsanity iframes, fix SEO baseline, noindex while staging
P0-2 (Adsanity iframe path removed): - AdImage.tsx: deleted the iframe branch and the ADSANITY_CAMPAIGN_MAP fallback. AdImage now renders local images only; banners without a src render nothing. - ads.ts: removed Ad.adsanity_id from the interface. Pruned AJA, Zixi, Lectrosonics, Opengear, Studio Hero, Magewell 300x250 and Blackmagic 300x600 — they relied on ads.broadcastbeat.com which does not resolve. Surviving live banners: LiveU 728x90, LiveU PAYG 300x250, Telycam 300x250. - SidebarAdStack: key no longer references the removed field. - No banner_analytics rows reference ads.broadcastbeat.com. Phase A (SEO baseline): - robots.ts: fallback base URL now broadcastbeat.com (was rocket staging URL). - sitemap.ts: fallback base URL now broadcastbeat.com (was bb-staging). - news/[slug]/page.tsx and articles/[slug]/page.tsx: same fallback fix. JSON-LD now uses ISO 8601 for datePublished, absolute image URL via SITE_URL prefix, and publisher.logo points at /assets/images/logo.png instead of the 404-ing /legacy/site/broadcastbeat-logo.png. - layout.tsx: removed the /en /es /pt /fr /de /zh /ja /ar /hi hreflang alternates - those routes 404 today; Phase D will reinstate. Replaced rocket.new Organization schema URL with broadcastbeat.com. Set robots index/follow=false until Phase B-D land and Rich Results passes. Featured-image fallback hardening: - legacy-source: rowToArticle now treats BB_Gray, no_image and placeholder URLs as null and falls back to the new placeholder so dead images do not leak through to the page. - public/assets/images/article-placeholder.svg: new clean dark gradient with BroadcastBeat wordmark, NOT no_image.png style. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -16,7 +16,19 @@ interface PageProps {
|
||||
}
|
||||
|
||||
const SITE_URL =
|
||||
process.env.NEXT_PUBLIC_SITE_URL || "https://bb-staging.onsethost.com";
|
||||
process.env.NEXT_PUBLIC_SITE_URL || "https://broadcastbeat.com";
|
||||
|
||||
function toIso(d: string | null | undefined): string {
|
||||
if (!d) return new Date().toISOString();
|
||||
const parsed = new Date(d);
|
||||
return isNaN(parsed.getTime()) ? new Date().toISOString() : parsed.toISOString();
|
||||
}
|
||||
|
||||
function absoluteImage(src: string | undefined | null): string {
|
||||
if (!src) return `${SITE_URL}/assets/images/article-placeholder.jpg`;
|
||||
if (/^https?:\/\//i.test(src)) return src;
|
||||
return `${SITE_URL}${src.startsWith("/") ? "" : "/"}${src}`;
|
||||
}
|
||||
|
||||
async function loadArticle(slug: string): Promise<{
|
||||
article: Article | null;
|
||||
@@ -77,15 +89,16 @@ export default async function ArticlePage({ params }: PageProps) {
|
||||
"@type": "Article",
|
||||
headline: article.title,
|
||||
description: article.excerpt,
|
||||
image: article.image,
|
||||
image: [absoluteImage(article.image)],
|
||||
author: { "@type": "Person", name: article.author },
|
||||
publisher: {
|
||||
"@type": "Organization",
|
||||
name: "BroadcastBeat",
|
||||
logo: { "@type": "ImageObject", url: `${SITE_URL}/legacy/site/broadcastbeat-logo.png` },
|
||||
logo: { "@type": "ImageObject", url: `${SITE_URL}/assets/images/logo.png` },
|
||||
},
|
||||
datePublished: article.date,
|
||||
datePublished: toIso(article.date),
|
||||
dateModified: new Date().toISOString(),
|
||||
mainEntityOfPage: { "@type": "WebPage", "@id": `${SITE_URL}/articles/${article.slug}` },
|
||||
};
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user