From aa974bf5954d0cca2506003a3cd9ec4eb89ed0bc Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Mon, 11 May 2026 18:35:55 +0000
Subject: [PATCH] =Transfer to new Registrar system

---
 seo.php |  400 +++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 288 insertions(+), 112 deletions(-)

diff --git a/seo.php b/seo.php
index abccb44..6df1e93 100644
--- a/seo.php
+++ b/seo.php
@@ -1,156 +1,332 @@
 <?php
-add_filter('jvb_schema', function($schema) {
+
+add_filter('altr_OrganizationSchemaDefault', 'altr_organization_schema');
+function altr_organization_schema(array $schema):array {
     return array_merge($schema, [
-        'organization' => [
-            'type' => 'LocalBusiness',
-            'name' => 'Legacy Tattoo Removal',
-            'url' => get_home_url(),
-            'description' => 'The laser techs who love tattoos: Edmonton\'s removal experts working with tattoo artists.',
-            'slogan' => 'See the Difference.',
-            'logo' => get_theme_mod('custom_logo'),
-            'foundingDate' => '2023-10-03',
+        'id'    => '#legacy-tattoo-removal',
+        'type' => 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\HealthAndBeautyBusiness',
+        'name' => 'Legacy Tattoo Removal',
+        'url' => get_home_url(),
+        'description' => 'The laser techs who love tattoos: Edmonton\'s removal experts working with tattoo artists.',
+        'slogan' => 'See the Difference.',
+        'logo' => get_theme_mod('custom_logo'),
+        'foundingDate' => '2023-10-03',
 
-            'founders' => [
-                ['name' => 'Madi Rawson', 'url' => 'https://tattysoap.ca'],
-                ['name' => 'Heidi Freschauf'],
-                ['name' => 'Jake Vanderwerf', 'url' => 'https://jakevan.ca'],
+        'founder' => [
+            [
+                'id'    => 'madi-rawson',
+                'type' => 'JVBase\managers\SEO\render\Thing\Person\Person',
+                'name' => 'Madi Rawson',
+                'url' => 'https://madimori.ca'],
+            [
+                'id'=> 'heidi-freschauf',
+                'type' => 'JVBase\managers\SEO\render\Thing\Person\Person',
+                'name' => 'Heidi Freschauf'],
+            [
+                'id'=> 'jake-vanderwerf',
+                'type' => 'JVBase\managers\SEO\render\Thing\Person\Person','name' => 'Jake Vanderwerf', 'url' => 'https://jakevan.ca'],
+        ],
+
+        'sameAs' => [
+             'https://www.instagram.com/LegacyTattooRemoval',
+            'https://www.facebook.com/LegacyTattooRemoval',
+            'https://www.tiktok.com/@legacytattooremoval',
+            'https://bsky.app/profile/legacytattooremoval.ca'
+        ],
+
+        // Contact
+        'telephone' => '+1-825-925-7398',
+        'email' => 'info@legacytattooremoval.ca',
+
+        // Address - note the key names
+        'address' => [
+            'streetAddress' => '6551 111 St NW',
+            'addressLocality' => 'Edmonton',
+            'addressRegion' => 'AB',
+            'postalCode' => 'T6H 4R5',
+            'addressCountry' => 'CA',
+        ],
+
+        // Geo - note the key names
+        'geo' => [
+            'latitude' => '53.5035125',
+            'longitude' => '-113.5188023',
+        ],
+
+        // Business details
+        'priceRange' => '$$',
+        'paymentAccepted' => ['Cash', 'Credit Card', 'Debit Card', 'E-Transfer'],
+        'currenciesAccepted' => ['CAD'],
+        'areaServed' => [
+            [
+                'id'    => '#edmonton',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Edmonton',
+                'sameAs'    => 'https://en.wikipedia.org/wiki/Edmonton'
             ],
+            [
+                'id'    => '#stalbert',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'St. Albert',
+                'sameAs' => 'https://en.wikipedia.org/wiki/St._Albert,_Alberta'   ],
+            [
+                'id'    => '#sherwoodpark',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Sherwood Park',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Sherwood_Park'   ],
+            [
+                'id'    => '#leduc',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Leduc',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Leduc,_Alberta'   ],
+            [
+                'id'    => '#sprucegrove',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Spruce Grove',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Spruce_Grove'    ],
+            [
+                'id'    => '#calgary',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Calgary',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Calgary'    ],
+            [
+                'id'    => '#reddeer',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Red Deer',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Red_Deer,_Alberta'   ],
+            [
+                'id'    => '#strathconacounty',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Strathcona County',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Strathcona_County'    ],
+            [
+                'id'    => '#grandprairie',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Grande Prairie',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Grande_Prairie'   ],
+            [
+                'id'    => '#lloydminster',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Lloydminster',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Lloydminster'    ],
+            [
+                'id'    => '#fortsaskatchewan',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Fort Saskatchewan',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Fort_Saskatchewan'    ],
+            [
+                'id'    => '#camrose',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Camrose',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Camrose,_Alberta'    ],
+            [
+                'id'    => '#stonyplain',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Stony Plain',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Stony_Plain,_Alberta'    ],
+            [
+                'id'    => '#coldlake',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Cold Lake',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Cold_Lake,_Alberta'    ],
+            [
+                'id'    => '#draytonvalley',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Drayton Valley',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Drayton_Valley'    ],
+            [
+                'id'    => '#ponoka',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Ponoka',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Ponoka,_Alberta'    ],
+            [
+                'id'    => '#vegreville',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Vegreville',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Vegreville'   ],
+            [
+                'id'    => '#fortmcmurray',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Fort McMurray',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Fort_McMurray'],
+            [
+                'id'    => '#lethbridge',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Lethbridge',
+                'sameAs'=> 'https://en.wikipedia.org/wiki/Lethbridge'    ],
+            [
+                'id'    => '#airdrie',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Airdrie',
+                'sameAs' =>    'https://en.wikipedia.org/wiki/Airdrie,_Alberta'],
+            [
+                'id'    => '#medicinehat',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Medicine Hat',
+                'sameAs' =>'https://en.wikipedia.org/wiki/Medicine_Hat'],
+            [
+                'id'    => '#cochrane',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Cochrane',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Cochrane,_Alberta'    ],
+            [
+                'id'    => '#okotoks',
+                'type'  => 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\City',
+                'name' => 'Okotoks',
+                'sameAs' => 'https://en.wikipedia.org/wiki/Okotoks'],
+        ],
 
-            'sameAs' => [
-                ['url' => 'https://www.instagram.com/LegacyTattooRemoval'],
-                [ 'url' => 'https://www.facebook.com/LegacyTattooRemoval'],
-                [ 'url' => 'https://www.tiktok.com/@legacytattooremoval'],
-                [ 'url' => 'https://bsky.app/profile/legacytattooremoval.ca']
-            ],
+        // Hours - note the key names
+        'openingHoursSpecification' => [
+            [
+                'type'  => 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\OpeningHoursSpecification',
+                'dayOfWeek' => ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
+                'opens' => '10:00',
+                'closes' => '18:00'
+            ]
 
-            // Contact
-            'telephone' => '+1-825-925-7398',
-            'email' => 'info@legacytattooremoval.ca',
+        ],
 
-            // Address - note the key names
-            'address' => [
-                'street' => '6551 111 St NW',      // was 'street_address'
-                'city' => 'Edmonton',                    // was 'locality'
-                'province' => 'AB',                      // was 'region'
-                'postal_code' => 'T6H 4R5',
-                'country' => 'CA',
-            ],
-
-            // Geo - note the key names
-            'geo' => [
-                'lat' => '53.5035125',                      // was 'latitude'
-                'lng' => '-113.5188023',                    // was 'longitude'
-            ],
-
-            // Business details
-            'priceRange' => '$$',
-            'paymentAccepted' => ['Cash', 'Credit Card', 'Debit Card', 'E-Transfer'],
-            'currenciesAccepted' => ['CAD'],
-            'areaServed' => [
-                ['name' => 'Edmonton'],
-                ['name' => 'St. Albert'],
-                ['name' => 'Sherwood Park'],
-                ['name' => 'Leduc'],
-                ['name' => 'Spruce Grove'],
-                ['name' => 'Calgary'],
-                ['name' => 'Red Deer'],
-                ['name' => 'Strathcona County'],
-                ['name' => 'Grande Prairie'],
-                ['name' => 'Lloydminster'],
-                ['name' => 'Fort Saskatchewan'],
-                ['name' => 'Camrose'],
-                ['name' => 'Stoney Plain'],
-                ['name' => 'Cold Lake'],
-                ['name' => 'Drayton Valley'],
-                ['name' => 'Ponoka'],
-                ['name' => 'Vegreville'],
-                ['name' => 'Fort McMurry'],
-                ['name' => 'Lethbridge'],
-                ['name' => 'Airdrie'],
-                ['name' => 'Medicine Hat'],
-                ['name' => 'Cochrane'],
-                ['name' => 'Okotoks'],
-            ],
-
-            // Hours - note the key names
-            'openingHours' => [
-                'wednesday' => ['opens' => '10:00', 'closes' => '18:00'],
-                'thursday' => ['opens' => '10:00', 'closes' => '18:00'],
-                'friday' => ['opens' => '10:00', 'closes' => '18:00'],
-                'saturday' => ['opens' => '10:00', 'closes' => '18:00'],
-                'sunday' => ['opens' => '10:00', 'closes' => '18:00'],
-            ],
-
-            // Services as offer catalog
-            'hasOfferCatalog' => [
-                'source'    => 'manual',
-                'manual_items' => [
-                    [
-                        'type'  => 'Service',
+        // Services as offer catalog
+        'hasOfferCatalog' => [
+            'name'  => 'Our Services',
+            'items' => [
+                [
+                    'type'  => 'JVBase\managers\SEO\render\Thing\Intangible\AggregateOffer',
+                    'id'    => '#fading-for-cover-up-tattoo',
+                    'lowPrice'  => '150',
+                    'highPrice' => '400',
+                    'priceCurrency' => 'CAD',
+                    'priceSpecification'    => [
+                        'type'  => 'JVBase\inc\managers\SEO\render\Thing\Intangible\StructuredValue\UnitPriceSpecification',
+                        'minPrice'  => '150',
+                        'maxPrice'  => '400',
+                        'priceCurrency' => 'CAD',
+                        'unitText' => 'treatment'
+                    ],
+                    'itemOffered' => [
+                        'id'    => 'service-fading-for-cover-up-tattoo',
+                        'type'  => 'JVBase\managers\SEO\render\Thing\Intangible\Service',
                         'name' => 'Tattoo Fading for Cover Up Tattoos',
                         'description' => 'Precise laser fading to prepare your skin for a new tattoo. We work directly with your tattoo artist to target exactly what\'s in the way.',
-                        'price' => '$150-$400/treatment'
+                    ]
+                ],
+                [
+                    'id'    => '#complete-tattoo-removal',
+                    'type'  => 'JVBase\managers\SEO\render\Thing\Intangible\AggregateOffer',
+                    'lowPrice'  => '150',
+                    'highPrice' => '400',
+                    'priceCurrency' => 'CAD',
+                    'priceSpecification'    => [
+                        'type'  => 'JVBase\inc\managers\SEO\render\Thing\Intangible\StructuredValue\UnitPriceSpecification',
+                        'minPrice'  => '150',
+                        'maxPrice'  => '400',
+                        'priceCurrency' => 'CAD',
+                        'unitText' => 'treatment'
                     ],
-                    [
-                        'type' => 'Service',
+                    'itemOffered' => [
+                        'id'    => 'service-complete-tattoo-removal',
+                        'type' => 'JVBase\managers\SEO\render\Thing\Intangible\Service',
                         'name' => 'Complete Tattoo Removal',
                         'description' => 'Full removal of unwanted tattoos using PicoWay laser technology. Safe for all skin types with minimal scarring.',
-                        'price' => '$150-$400/treatment'
                     ],
-                    [
-                        'type' => 'Service',
+                ],
+                [
+                    'id'    => 'permanent-makeup-removal',
+                    'type'  => 'JVBase\managers\SEO\render\Thing\Intangible\Offer',
+                    'price'  => '200',
+                    'priceCurrency' => 'CAD',
+                    'priceSpecification'    => [
+                        'type'  => 'JVBase\inc\managers\SEO\render\Thing\Intangible\StructuredValue\UnitPriceSpecification',
+                        'price'  => '200',
+                        'priceCurrency' => 'CAD',
+                        'unitText' => 'treatment'
+                    ],
+                    'itemOffered' => [
+                        'id'    => 'service-permanent-makeup-removal',
+                        'type' => 'JVBase\managers\SEO\render\Thing\Intangible\Service',
                         'name' => 'Permanent Makeup Removal',
                         'description' => 'Specialized removal of cosmetic ink including microbladed brows, freckles, and scalp micropigmentation (SMP).',
-                        'price' => '$200'
                     ],
-                    [
-                        'type' => 'Service',
+                ],
+                [
+                    'id'    => 'scalp-smp-removal',
+                    'type'  => 'JVBase\managers\SEO\render\Thing\Intangible\AggregateOffer',
+                    'lowPrice'  => '200',
+                    'highPrice' => '400',
+                    'priceCurrency' => 'CAD',
+                    'priceSpecification'    => [
+                        'type'  => 'JVBase\inc\managers\SEO\render\Thing\Intangible\StructuredValue\UnitPriceSpecification',
+                        'minPrice'  => '200',
+                        'maxPrice'  => '400',
+                        'priceCurrency' => 'CAD',
+                        'unitText' => 'treatment'
+                    ],
+                    'itemOffered' => [
+                        'id'    => 'service-scalp-smp-removal',
+                        'type' => 'JVBase\managers\SEO\render\Thing\Intangible\Service',
                         'name' => 'Scalp Micro Pigmentation Removal',
                         'description' => 'Specialized removal of scalp micro pigmentation (SMP).',
-                        'price' => '$200 - $400/treatment'
                     ],
-                    [
-                        'type' => 'Service',
+                ],
+                [
+                    'id'    => 'pro-bono-laser-tattoo-removal',
+                    'type'  => 'JVBase\managers\SEO\render\Thing\Intangible\Offer',
+                    'price'  => 'free',
+                    'itemOffered' => [
+                        'id'    => 'service-pro-bono-laser-tattoo-removal',
+                        'type' => 'JVBase\managers\SEO\render\Thing\Intangible\Service',
                         'name' => 'Pro Bono Removal Services',
                         'description' => 'Free and sliding-scale tattoo removal for gang-related, hate symbols, domestic violence, and human trafficking tattoos.',
                     ],
-                ]
-            ],
-
-            // Rating - note the structure
-            'aggregateRating' => [
-                'value' => 5,
-                'count' => 103,
-                'best' => 5,
-                'worst' => 1,
-            ],
+                ],
+            ]
         ],
 
-        // Website settings (optional overrides)
-        'website' => [
+        'aggregateRating' => [
+            'ratingValue' => 5,
+            'reviewCount' => 109,
+            'bestRating' => 5,
+            'worstRating' => 1,
+        ],
+    ]);
+}
+
+add_filter('altr_WebsiteSchemaDefault', 'altr_website_schema');
+function altr_website_schema(array $schema):array
+{
+    return array_merge(
+        $schema,
+        [
+            'type'  => 'JVBase\managers\SEO\render\Thing\CreativeWork\WebSite',
             'name' => 'Legacy Tattoo Removal',
             'description' => 'The laser techs who love tattoos: Edmonton\'s removal experts working with tattoo artists.',
             'inLanguage' => 'en-CA',
             'potentialAction' => [
                 [
-                    'type' => 'scheduleAction',
+                    'type' => 'JVBase\inc\managers\SEO\render\Thing\Action\ScheduleAction',
+                    'id'    => 'free-consult',
                     'name' => 'Book a Free Consultation',
-                    'target' => '/book-consult/',
+                    'target' => '/free-consult/',
                     'description' => 'Schedule your free consultation today',
                 ],
                 [
-                    'type' => 'communicateAction',
+                    'id'    => 'get-an-estimate',
+                    'type' => 'JVBase\inc\managers\SEO\render\Thing\Action\CommunicateAction',
                     'name' => 'Get an Estimate',
                     'target' => '/get-an-estimate/',
                     'description' => 'Get a rough estimate before you book.',
                 ],
                 [
-                    'type' => 'communicateAction',
+                    'id'    => 'contact',
+                    'type' => 'JVBase\inc\managers\SEO\render\Thing\Action\CommunicateAction',
                     'name' => 'Contact Us',
                     'target' => '/contact/',
                     'description' => 'Get in touch with our team',
                 ],
             ],
         ],
-    ]);
-});
\ No newline at end of file
+    );
+}
+
+

--
Gitblit v1.10.0