Phase 1: technical SEO foundations
- Per-page titles, descriptions, canonicals, Open Graph/Twitter tags via a shared pageMetadata() helper; metadataBase on the root layout - Sitemap generated from a route list on the canonical non-www host; robots.txt points to it; /services removed - One H1 per page; decorative images get empty alt text - JSON-LD: site-wide ComputerRepairService, FAQPage on the homepage, Service on each service page - FAQ answers are now server-rendered (forceMount) so the schema matches the HTML; fixed the nested payment FAQ item - Drop web design (page, nav link, homepage card and FAQs); 301 the old URL - Remove GA, Facebook Pixel and Vercel Analytics/Speed Insights - Fix tel: links (+640211... -> +64211...) - Add og-image.png and logo.png Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
0478ab65e5
commit
c085e2b031
23 files changed
+375
-386
No files matched your search
+7
-27
@@ -3,12 +3,8 @@ import "./globals.css";
|
||||
import Navbar from "./components/Navbar";
|
||||
import Footer from "./components/Footer";
|
||||
import ChatwootWidget from "./components/ChatwootWidget";
|
||||
|
||||
// Add spyware
|
||||
import { Analytics } from "@vercel/analytics/react";
|
||||
import { GoogleAnalytics } from "@next/third-parties/google";
|
||||
import { SpeedInsights } from "@vercel/speed-insights/next";
|
||||
import Script from "next/script";
|
||||
import JsonLd from "./components/JsonLd";
|
||||
import { SITE_URL, business, localBusinessSchema } from "@/lib/site";
|
||||
|
||||
const geistSans = localFont({
|
||||
src: "./fonts/GeistVF.woff",
|
||||
@@ -21,37 +17,21 @@ const geistMono = localFont({
|
||||
weight: "100 900",
|
||||
});
|
||||
|
||||
// Pages set their own title, description and canonical via pageMetadata().
|
||||
export const metadata = {
|
||||
title: "Te Atatu Computer Repair & Web Design",
|
||||
description:
|
||||
"Your Local Experts for PCs, Laptops, Web Design, IT Support & More.",
|
||||
metadataBase: new URL(SITE_URL),
|
||||
title: business.name,
|
||||
};
|
||||
|
||||
export default function RootLayout({ children }) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<html lang="en-NZ">
|
||||
<body className={`${geistSans.variable} ${geistMono.variable}`}>
|
||||
<JsonLd data={localBusinessSchema()} />
|
||||
<ChatwootWidget />
|
||||
<Navbar />
|
||||
{children}
|
||||
<Footer />
|
||||
<Analytics />
|
||||
<SpeedInsights />
|
||||
<GoogleAnalytics gaId="G-TN7ZL1Y4CC" />
|
||||
<Script id="facebook-pixel">
|
||||
{`
|
||||
!function(f,b,e,v,n,t,s)
|
||||
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
|
||||
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
|
||||
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
|
||||
n.queue=[];t=b.createElement(e);t.async=!0;
|
||||
t.src=v;s=b.getElementsByTagName(e)[0];
|
||||
s.parentNode.insertBefore(t,s)}(window, document,'script',
|
||||
'https://connect.facebook.net/en_US/fbevents.js');
|
||||
fbq('init', '1370044511045020');
|
||||
fbq('track', 'PageView');
|
||||
`}
|
||||
</Script>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user