Navigate the UK web scraping market with confidence. Compare providers, understand pricing, and find the perfect data extraction partner for your business needs.
By UK Data Services Editorial Team
@@ -199,9 +199,9 @@ $modified_date = "2025-08-08";
Market Drivers
Digital Transformation: UK businesses prioritizing data-driven decision making
- Competitive Intelligence: Real-time market monitoring becoming essential
+ Competitive Intelligence : Real-time market monitoring becoming essential
Regulatory Compliance: GDPR-compliant data collection requirements
- E-commerce Growth: Price monitoring and competitor analysis demand
+ E-commerce Growth: Price monitoring and competitor analysis demand
Financial Services: Alternative data sources for investment decisions
diff --git a/includes.bak.20260210/author-bio.php b/includes.bak.20260210/author-bio.php
deleted file mode 100644
index 7d22ec5..0000000
--- a/includes.bak.20260210/author-bio.php
+++ /dev/null
@@ -1,218 +0,0 @@
- [
- 'role' => 'Data Intelligence Experts',
- 'bio' => 'Our editorial team comprises data scientists, engineers, and industry analysts with over 50 combined years of experience in web scraping, data analytics, and business intelligence across UK industries.',
- 'linkedin' => null,
- 'expertise' => ['Web Scraping', 'Data Analytics', 'Business Intelligence', 'GDPR Compliance'],
- 'image' => '/assets/images/authors/team-avatar.svg'
- ],
- 'James Wilson' => [
- 'role' => 'Senior Data Architect',
- 'bio' => 'James is a Senior Data Architect with 12+ years of experience in enterprise web scraping and business intelligence. He holds a Master\'s degree in Computer Science from Imperial College London and is an AWS Solutions Architect Professional.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Enterprise Architecture', 'Web Scraping', 'Cloud Solutions', 'Data Pipelines'],
- 'image' => '/assets/images/authors/james-wilson.svg'
- ],
- 'Dr. Rachel Singh' => [
- 'role' => 'Lead Data Scientist',
- 'bio' => 'Dr. Rachel Singh leads our data science team with expertise in machine learning and AI-powered data extraction. She holds a PhD in Computer Science from University of Cambridge and has published research on NLP and intelligent document processing.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Machine Learning', 'NLP', 'AI', 'Computer Vision'],
- 'image' => '/assets/images/authors/rachel-singh.svg'
- ],
- 'Michael Thompson' => [
- 'role' => 'Technical Lead - Web Scraping',
- 'bio' => 'Michael specializes in large-scale web scraping infrastructure and has designed data collection systems for FTSE 100 companies. He has 10+ years of experience in Python, Scrapy, and distributed systems.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Python', 'Scrapy', 'Distributed Systems', 'Web Scraping'],
- 'image' => '/assets/images/authors/michael-thompson.svg'
- ],
- 'Sarah Chen' => [
- 'role' => 'Compliance & Data Protection Officer',
- 'bio' => 'Sarah is a certified Data Protection Officer (GDPR-P) with extensive experience in UK and EU data regulations. She ensures all our data collection practices meet the highest compliance standards.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['GDPR', 'Data Protection', 'Compliance', 'Privacy'],
- 'image' => '/assets/images/authors/sarah-chen.svg'
- ],
- 'David Martinez' => [
- 'role' => 'Business Intelligence Consultant',
- 'bio' => 'David is a certified Tableau and Power BI consultant with 8+ years of experience helping UK businesses transform raw data into actionable insights. He specializes in dashboard design and data visualization.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Tableau', 'Power BI', 'Data Visualization', 'BI Strategy'],
- 'image' => '/assets/images/authors/david-martinez.svg'
- ],
- 'Emma Richardson' => [
- 'role' => 'Industry Analyst',
- 'bio' => 'Emma covers UK market trends and industry analysis with a focus on retail, property, and e-commerce sectors. She has over 6 years of experience in competitive intelligence and market research.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Market Research', 'Competitive Intelligence', 'E-commerce', 'Retail Analytics'],
- 'image' => '/assets/images/authors/emma-richardson.svg'
- ]
-];
-
-// Get author info
-$author_name = isset($article_author) ? $article_author : 'UK Data Services Editorial Team';
-$author_info = isset($authors[$author_name]) ? $authors[$author_name] : $authors['UK Data Services Editorial Team'];
-?>
-
-
-
-
-
-
-
-
-
-
-
-
- Expertise:
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/includes.bak.20260210/breadcrumb-schema.php b/includes.bak.20260210/breadcrumb-schema.php
deleted file mode 100644
index cf0f7b6..0000000
--- a/includes.bak.20260210/breadcrumb-schema.php
+++ /dev/null
@@ -1,52 +0,0 @@
- '/', 'label' => 'Home'],
- * ['url' => '/blog', 'label' => 'Blog'],
- * ['url' => '', 'label' => 'Current Page Title']
- * ];
- */
-
-if (!isset($breadcrumbs) || empty($breadcrumbs)) {
- return;
-}
-
-$base_url = 'https://ukdataservices.co.uk';
-$items = [];
-
-foreach ($breadcrumbs as $index => $crumb) {
- $position = $index + 1;
- $item = [
- '@type' => 'ListItem',
- 'position' => $position,
- 'name' => $crumb['label']
- ];
-
- // Add URL for all items except the last one (current page)
- if (!empty($crumb['url'])) {
- $url = $crumb['url'];
- // Ensure URL is absolute
- if (strpos($url, 'http') !== 0) {
- $url = $base_url . $url;
- }
- $item['item'] = $url;
- }
-
- $items[] = $item;
-}
-
-$schema = [
- '@context' => 'https://schema.org',
- '@type' => 'BreadcrumbList',
- 'itemListElement' => $items
-];
-?>
-
-
diff --git a/includes.bak.20260210/canonical.php b/includes.bak.20260210/canonical.php
deleted file mode 100644
index fedb756..0000000
--- a/includes.bak.20260210/canonical.php
+++ /dev/null
@@ -1,160 +0,0 @@
-';
-}
-
-/**
- * Get URL for a specific page by key
- *
- * @param string $pageKey The page identifier
- * @return string The full canonical URL
- */
-function getPageUrl($pageKey) {
- $baseUrl = 'https://ukdataservices.co.uk';
-
- $urls = [
- 'home' => '',
- 'about' => '/about',
- 'quote' => '/quote',
- 'faq' => '/faq',
- 'blog' => '/blog',
- 'contact' => '/#contact',
- 'privacy' => '/privacy-policy',
- 'terms' => '/terms-of-service',
- 'cookies' => '/cookie-policy',
- 'gdpr' => '/gdpr-compliance',
- 'project-types' => '/project-types',
- 'case-studies' => '/case-studies',
-
- // Services
- 'services' => '/#services',
- 'web-scraping' => '/services/web-scraping',
- 'competitive-intelligence' => '/services/competitive-intelligence',
- 'price-monitoring' => '/services/price-monitoring',
- 'data-cleaning' => '/services/data-cleaning',
- 'data-analytics' => '/services/data-analytics',
- 'api-development' => '/services/api-development',
- 'property-data' => '/services/property-data-extraction',
- 'financial-data' => '/services/financial-data-services',
-
- // Locations
- 'london' => '/locations/london',
- 'manchester' => '/locations/manchester',
- 'birmingham' => '/locations/birmingham',
- 'edinburgh' => '/locations/edinburgh',
- 'cardiff' => '/locations/cardiff'
- ];
-
- $path = $urls[$pageKey] ?? '';
- return $baseUrl . $path;
-}
-
-/**
- * Check if current page is the canonical version
- *
- * @return bool True if current URL is canonical
- */
-function isCanonicalUrl() {
- $currentUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http")
- . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
- $canonical = getCanonicalUrl();
-
- return cleanCanonicalUrl('https://ukdataservices.co.uk', $currentUrl) === $canonical;
-}
-
-/**
- * Output redirect to canonical URL if needed
- * Call this at the very beginning of pages before any output
- */
-function enforceCanonicalUrl() {
- if (!isCanonicalUrl()) {
- $canonical = getCanonicalUrl();
- header('HTTP/1.1 301 Moved Permanently');
- header('Location: ' . $canonical);
- exit;
- }
-}
diff --git a/includes.bak.20260210/components/location-cta.php b/includes.bak.20260210/components/location-cta.php
deleted file mode 100644
index 0ac2341..0000000
--- a/includes.bak.20260210/components/location-cta.php
+++ /dev/null
@@ -1,225 +0,0 @@
-
-
-
-
-
Serving Businesses Across the UK
-
We provide professional to businesses throughout the United Kingdom, with dedicated support for major business centres.
-
-
-
-
-
-
-
-
-
- '🏙️',
- 'manchester' => '🏭',
- 'birmingham' => '🏛️',
- 'edinburgh' => '🏴',
- 'cardiff' => '🏴'
- ];
- return $icons[$locationKey] ?? '📍';
-}
-
-/**
- * Display compact location links (for footers or sidebars)
- */
-function displayCompactLocationLinks() {
- global $locationData;
- ?>
-
-
Serving:
- $key):
- $location = $locationData[$key];
- ?>
-
-
-
and the UK
-
-
-
-
-
-
-
-
-
-
-
diff --git a/includes.bak.20260210/header.php b/includes.bak.20260210/header.php
deleted file mode 100644
index bd34f7a..0000000
--- a/includes.bak.20260210/header.php
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/includes.bak.20260210/includes/article-footer.php b/includes.bak.20260210/includes/article-footer.php
deleted file mode 100644
index 022979f..0000000
--- a/includes.bak.20260210/includes/article-footer.php
+++ /dev/null
@@ -1,115 +0,0 @@
- [
- [
- 'title' => 'UK Property Market Data Trends 2024',
- 'slug' => 'uk-property-market-data-trends',
- 'category' => 'Industry Insights',
- 'read_time' => '8 min read'
- ],
- [
- 'title' => 'E-commerce Trends UK 2025',
- 'slug' => 'ecommerce-trends-uk-2025',
- 'category' => 'Industry Insights',
- 'read_time' => '6 min read'
- ],
- [
- 'title' => 'Manufacturing Supply Chain Optimization',
- 'slug' => 'manufacturing-supply-chain-optimization',
- 'category' => 'Industry Insights',
- 'read_time' => '10 min read'
- ]
- ],
- 'Technology' => [
- [
- 'title' => 'Python Data Pipeline Tools 2025',
- 'slug' => 'python-data-pipeline-tools-2025',
- 'category' => 'Technology',
- 'read_time' => '12 min read'
- ],
- [
- 'title' => 'Selenium vs Playwright Comparison',
- 'slug' => 'selenium-vs-playwright-comparison',
- 'category' => 'Technology',
- 'read_time' => '8 min read'
- ],
- [
- 'title' => 'Python Scrapy Enterprise Guide',
- 'slug' => 'python-scrapy-enterprise-guide',
- 'category' => 'Technology',
- 'read_time' => '15 min read'
- ]
- ],
- 'Web Scraping' => [
- [
- 'title' => 'Web Scraping Compliance UK Guide',
- 'slug' => 'web-scraping-compliance-uk-guide',
- 'category' => 'Web Scraping',
- 'read_time' => '10 min read'
- ],
- [
- 'title' => 'Handling CAPTCHAs in Web Scraping',
- 'slug' => 'handling-captchas-scraping',
- 'category' => 'Web Scraping',
- 'read_time' => '7 min read'
- ],
- [
- 'title' => 'JavaScript Heavy Sites Scraping',
- 'slug' => 'javascript-heavy-sites-scraping',
- 'category' => 'Web Scraping',
- 'read_time' => '9 min read'
- ]
- ],
- 'Data Analytics' => [
- [
- 'title' => 'Real-time Analytics with Streaming Data',
- 'slug' => 'real-time-analytics-streaming-data',
- 'category' => 'Data Analytics',
- 'read_time' => '11 min read'
- ],
- [
- 'title' => 'SQL Analytics Advanced Techniques',
- 'slug' => 'sql-analytics-advanced-techniques',
- 'category' => 'Data Analytics',
- 'read_time' => '13 min read'
- ],
- [
- 'title' => 'Predictive Analytics for Customer Churn',
- 'slug' => 'predictive-analytics-customer-churn',
- 'category' => 'Data Analytics',
- 'read_time' => '9 min read'
- ]
- ]
-];
-
-// Get articles for current category, exclude current article
-$category_articles = isset($related_articles[$current_category]) ? $related_articles[$current_category] : $related_articles['Industry Insights'];
-$filtered_articles = array_filter($category_articles, function($article) use ($current_slug) {
- return $article['slug'] !== $current_slug;
-});
-
-// Limit to 3 articles
-$display_articles = array_slice($filtered_articles, 0, 3);
-?>
-
-
\ No newline at end of file
diff --git a/includes.bak.20260210/includes/author-bio.php b/includes.bak.20260210/includes/author-bio.php
deleted file mode 100644
index 7d22ec5..0000000
--- a/includes.bak.20260210/includes/author-bio.php
+++ /dev/null
@@ -1,218 +0,0 @@
- [
- 'role' => 'Data Intelligence Experts',
- 'bio' => 'Our editorial team comprises data scientists, engineers, and industry analysts with over 50 combined years of experience in web scraping, data analytics, and business intelligence across UK industries.',
- 'linkedin' => null,
- 'expertise' => ['Web Scraping', 'Data Analytics', 'Business Intelligence', 'GDPR Compliance'],
- 'image' => '/assets/images/authors/team-avatar.svg'
- ],
- 'James Wilson' => [
- 'role' => 'Senior Data Architect',
- 'bio' => 'James is a Senior Data Architect with 12+ years of experience in enterprise web scraping and business intelligence. He holds a Master\'s degree in Computer Science from Imperial College London and is an AWS Solutions Architect Professional.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Enterprise Architecture', 'Web Scraping', 'Cloud Solutions', 'Data Pipelines'],
- 'image' => '/assets/images/authors/james-wilson.svg'
- ],
- 'Dr. Rachel Singh' => [
- 'role' => 'Lead Data Scientist',
- 'bio' => 'Dr. Rachel Singh leads our data science team with expertise in machine learning and AI-powered data extraction. She holds a PhD in Computer Science from University of Cambridge and has published research on NLP and intelligent document processing.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Machine Learning', 'NLP', 'AI', 'Computer Vision'],
- 'image' => '/assets/images/authors/rachel-singh.svg'
- ],
- 'Michael Thompson' => [
- 'role' => 'Technical Lead - Web Scraping',
- 'bio' => 'Michael specializes in large-scale web scraping infrastructure and has designed data collection systems for FTSE 100 companies. He has 10+ years of experience in Python, Scrapy, and distributed systems.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Python', 'Scrapy', 'Distributed Systems', 'Web Scraping'],
- 'image' => '/assets/images/authors/michael-thompson.svg'
- ],
- 'Sarah Chen' => [
- 'role' => 'Compliance & Data Protection Officer',
- 'bio' => 'Sarah is a certified Data Protection Officer (GDPR-P) with extensive experience in UK and EU data regulations. She ensures all our data collection practices meet the highest compliance standards.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['GDPR', 'Data Protection', 'Compliance', 'Privacy'],
- 'image' => '/assets/images/authors/sarah-chen.svg'
- ],
- 'David Martinez' => [
- 'role' => 'Business Intelligence Consultant',
- 'bio' => 'David is a certified Tableau and Power BI consultant with 8+ years of experience helping UK businesses transform raw data into actionable insights. He specializes in dashboard design and data visualization.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Tableau', 'Power BI', 'Data Visualization', 'BI Strategy'],
- 'image' => '/assets/images/authors/david-martinez.svg'
- ],
- 'Emma Richardson' => [
- 'role' => 'Industry Analyst',
- 'bio' => 'Emma covers UK market trends and industry analysis with a focus on retail, property, and e-commerce sectors. She has over 6 years of experience in competitive intelligence and market research.',
- 'linkedin' => 'https://linkedin.com/company/ukdataservices',
- 'expertise' => ['Market Research', 'Competitive Intelligence', 'E-commerce', 'Retail Analytics'],
- 'image' => '/assets/images/authors/emma-richardson.svg'
- ]
-];
-
-// Get author info
-$author_name = isset($article_author) ? $article_author : 'UK Data Services Editorial Team';
-$author_info = isset($authors[$author_name]) ? $authors[$author_name] : $authors['UK Data Services Editorial Team'];
-?>
-
-
-
-
-
-
-
-
-
-
-
-
- Expertise:
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/includes.bak.20260210/includes/breadcrumb-schema.php b/includes.bak.20260210/includes/breadcrumb-schema.php
deleted file mode 100644
index cf0f7b6..0000000
--- a/includes.bak.20260210/includes/breadcrumb-schema.php
+++ /dev/null
@@ -1,52 +0,0 @@
- '/', 'label' => 'Home'],
- * ['url' => '/blog', 'label' => 'Blog'],
- * ['url' => '', 'label' => 'Current Page Title']
- * ];
- */
-
-if (!isset($breadcrumbs) || empty($breadcrumbs)) {
- return;
-}
-
-$base_url = 'https://ukdataservices.co.uk';
-$items = [];
-
-foreach ($breadcrumbs as $index => $crumb) {
- $position = $index + 1;
- $item = [
- '@type' => 'ListItem',
- 'position' => $position,
- 'name' => $crumb['label']
- ];
-
- // Add URL for all items except the last one (current page)
- if (!empty($crumb['url'])) {
- $url = $crumb['url'];
- // Ensure URL is absolute
- if (strpos($url, 'http') !== 0) {
- $url = $base_url . $url;
- }
- $item['item'] = $url;
- }
-
- $items[] = $item;
-}
-
-$schema = [
- '@context' => 'https://schema.org',
- '@type' => 'BreadcrumbList',
- 'itemListElement' => $items
-];
-?>
-
-
diff --git a/includes.bak.20260210/includes/canonical.php b/includes.bak.20260210/includes/canonical.php
deleted file mode 100644
index fedb756..0000000
--- a/includes.bak.20260210/includes/canonical.php
+++ /dev/null
@@ -1,160 +0,0 @@
-';
-}
-
-/**
- * Get URL for a specific page by key
- *
- * @param string $pageKey The page identifier
- * @return string The full canonical URL
- */
-function getPageUrl($pageKey) {
- $baseUrl = 'https://ukdataservices.co.uk';
-
- $urls = [
- 'home' => '',
- 'about' => '/about',
- 'quote' => '/quote',
- 'faq' => '/faq',
- 'blog' => '/blog',
- 'contact' => '/#contact',
- 'privacy' => '/privacy-policy',
- 'terms' => '/terms-of-service',
- 'cookies' => '/cookie-policy',
- 'gdpr' => '/gdpr-compliance',
- 'project-types' => '/project-types',
- 'case-studies' => '/case-studies',
-
- // Services
- 'services' => '/#services',
- 'web-scraping' => '/services/web-scraping',
- 'competitive-intelligence' => '/services/competitive-intelligence',
- 'price-monitoring' => '/services/price-monitoring',
- 'data-cleaning' => '/services/data-cleaning',
- 'data-analytics' => '/services/data-analytics',
- 'api-development' => '/services/api-development',
- 'property-data' => '/services/property-data-extraction',
- 'financial-data' => '/services/financial-data-services',
-
- // Locations
- 'london' => '/locations/london',
- 'manchester' => '/locations/manchester',
- 'birmingham' => '/locations/birmingham',
- 'edinburgh' => '/locations/edinburgh',
- 'cardiff' => '/locations/cardiff'
- ];
-
- $path = $urls[$pageKey] ?? '';
- return $baseUrl . $path;
-}
-
-/**
- * Check if current page is the canonical version
- *
- * @return bool True if current URL is canonical
- */
-function isCanonicalUrl() {
- $currentUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http")
- . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
- $canonical = getCanonicalUrl();
-
- return cleanCanonicalUrl('https://ukdataservices.co.uk', $currentUrl) === $canonical;
-}
-
-/**
- * Output redirect to canonical URL if needed
- * Call this at the very beginning of pages before any output
- */
-function enforceCanonicalUrl() {
- if (!isCanonicalUrl()) {
- $canonical = getCanonicalUrl();
- header('HTTP/1.1 301 Moved Permanently');
- header('Location: ' . $canonical);
- exit;
- }
-}
diff --git a/includes.bak.20260210/includes/components/location-cta.php b/includes.bak.20260210/includes/components/location-cta.php
deleted file mode 100644
index 0ac2341..0000000
--- a/includes.bak.20260210/includes/components/location-cta.php
+++ /dev/null
@@ -1,225 +0,0 @@
-
-
-
-
-
Serving Businesses Across the UK
-
We provide professional to businesses throughout the United Kingdom, with dedicated support for major business centres.
-
-
-
-
-
-
-
-
-
- '🏙️',
- 'manchester' => '🏭',
- 'birmingham' => '🏛️',
- 'edinburgh' => '🏴',
- 'cardiff' => '🏴'
- ];
- return $icons[$locationKey] ?? '📍';
-}
-
-/**
- * Display compact location links (for footers or sidebars)
- */
-function displayCompactLocationLinks() {
- global $locationData;
- ?>
-
-
Serving:
- $key):
- $location = $locationData[$key];
- ?>
-
-
-
and the UK
-
-
-
-
-
-
-
-
-
-
-
diff --git a/includes.bak.20260210/includes/header.php b/includes.bak.20260210/includes/header.php
deleted file mode 100644
index bd34f7a..0000000
--- a/includes.bak.20260210/includes/header.php
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/includes.bak.20260210/includes/meta-tags.php b/includes.bak.20260210/includes/meta-tags.php
deleted file mode 100644
index c54ca9c..0000000
--- a/includes.bak.20260210/includes/meta-tags.php
+++ /dev/null
@@ -1,164 +0,0 @@
- 'Page Title',
- * 'description' => 'Page description...',
- * 'canonicalUrl' => 'https://ukdataservices.co.uk/page',
- * 'ogImage' => '/assets/images/og-image.jpg',
- * 'type' => 'website', // or 'article'
- * 'articleData' => [...] // optional for articles
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/meta-tags.php');
- */
-
-/**
- * Generate complete meta tags for a page
- *
- * @param string $title Page title (will append brand if not already included)
- * @param string $description Meta description (max 160 chars recommended)
- * @param string $canonicalUrl Canonical URL for the page
- * @param string|null $ogImage Open Graph image URL
- * @param array|null $articleData Article-specific data for blog posts
- * @param string $type Page type (website, article, service)
- * @return string HTML meta tags
- */
-function generateMetaTags($title, $description, $canonicalUrl, $ogImage = null, $articleData = null, $type = 'website') {
- $baseUrl = 'https://ukdataservices.co.uk';
- $siteName = 'UK Data Services';
- $defaultImage = $baseUrl . '/assets/images/ukds-main-logo.png';
- $twitterHandle = '@ukdataservices';
-
- // Ensure title includes brand name
- $fullTitle = $title;
- if (strpos(strtolower($title), 'uk data services') === false) {
- $fullTitle = $title . ' | UK Data Services';
- }
-
- // Truncate description if too long
- if (strlen($description) > 160) {
- $description = substr($description, 0, 157) . '...';
- }
-
- // Use provided image or default
- $imageUrl = $ogImage ? (strpos($ogImage, 'http') === 0 ? $ogImage : $baseUrl . $ogImage) : $defaultImage;
-
- $output = '';
-
- // Basic meta tags
- $output .= '
' . htmlspecialchars($fullTitle) . ' ' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
-
- // Open Graph tags
- $output .= "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
-
- // Twitter Card tags
- $output .= "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
-
- // Article-specific tags
- if ($articleData && $type === 'article') {
- $output .= "\n \n";
- if (isset($articleData['datePublished'])) {
- $output .= '
' . "\n";
- }
- if (isset($articleData['dateModified'])) {
- $output .= '
' . "\n";
- }
- if (isset($articleData['author'])) {
- $output .= '
' . "\n";
- }
- if (isset($articleData['section'])) {
- $output .= '
' . "\n";
- }
- if (isset($articleData['tags']) && is_array($articleData['tags'])) {
- foreach ($articleData['tags'] as $tag) {
- $output .= '
' . "\n";
- }
- }
- }
-
- return $output;
-}
-
-/**
- * Generate geo meta tags for location pages
- */
-function generateGeoMetaTags($city, $region, $latitude, $longitude) {
- $output = "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- return $output;
-}
-
-/**
- * Generate hreflang tags (for potential future internationalization)
- */
-function generateHreflangTags($canonicalUrl) {
- $output = "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- return $output;
-}
-
-/**
- * Output standard favicon and manifest links
- */
-function generateFaviconTags() {
- $output = "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- return $output;
-}
-
-/**
- * Generate preconnect/prefetch hints for performance
- */
-function generateResourceHints() {
- $output = "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- return $output;
-}
-
-// If $metaData is set, output meta tags automatically
-if (isset($metaData) && is_array($metaData)) {
- echo generateMetaTags(
- $metaData['title'],
- $metaData['description'],
- $metaData['canonicalUrl'],
- $metaData['ogImage'] ?? null,
- $metaData['articleData'] ?? null,
- $metaData['type'] ?? 'website'
- );
-}
diff --git a/includes.bak.20260210/includes/schema/article-schema.php b/includes.bak.20260210/includes/schema/article-schema.php
deleted file mode 100644
index 04ce1c5..0000000
--- a/includes.bak.20260210/includes/schema/article-schema.php
+++ /dev/null
@@ -1,198 +0,0 @@
- 'Article Title',
- * 'description' => 'Article description...',
- * 'datePublished' => '2024-01-15',
- * 'dateModified' => '2024-01-20',
- * 'authorName' => 'John Smith',
- * 'imageUrl' => 'https://example.com/image.jpg',
- * 'articleUrl' => 'https://example.com/article'
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/article-schema.php');
- */
-
-/**
- * Generate Article Schema JSON-LD
- *
- * @param string $title Article title
- * @param string $description Article description/excerpt
- * @param string $datePublished Publication date (Y-m-d format)
- * @param string $dateModified Last modified date (Y-m-d format)
- * @param string $authorName Author's name
- * @param string $imageUrl Featured image URL
- * @param string $articleUrl Canonical article URL
- * @param string $category Optional article category
- * @param array $keywords Optional array of keywords
- * @return string JSON-LD script tag
- */
-function generateArticleSchema($title, $description, $datePublished, $dateModified, $authorName, $imageUrl, $articleUrl, $category = null, $keywords = []) {
- $baseUrl = 'https://ukdataservices.co.uk';
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'Article',
- '@id' => $articleUrl . '#article',
- 'headline' => $title,
- 'description' => $description,
- 'url' => $articleUrl,
- 'datePublished' => $datePublished . 'T09:00:00+00:00',
- 'dateModified' => $dateModified . 'T09:00:00+00:00',
- 'author' => [
- '@type' => 'Person',
- 'name' => $authorName,
- 'url' => $baseUrl . '/about'
- ],
- 'publisher' => [
- '@type' => 'Organization',
- '@id' => $baseUrl . '/#organization',
- 'name' => 'UK Data Services',
- 'logo' => [
- '@type' => 'ImageObject',
- 'url' => $baseUrl . '/assets/images/ukds-main-logo.png'
- ]
- ],
- 'image' => [
- '@type' => 'ImageObject',
- 'url' => $imageUrl,
- 'width' => 1200,
- 'height' => 630
- ],
- 'mainEntityOfPage' => [
- '@type' => 'WebPage',
- '@id' => $articleUrl
- ],
- 'isPartOf' => [
- '@type' => 'Blog',
- '@id' => $baseUrl . '/blog/#blog',
- 'name' => 'UK Data Services Blog',
- 'publisher' => [
- '@id' => $baseUrl . '/#organization'
- ]
- ],
- 'inLanguage' => 'en-GB'
- ];
-
- // Add category if provided
- if ($category) {
- $schema['articleSection'] = $category;
- }
-
- // Add keywords if provided
- if (!empty($keywords)) {
- $schema['keywords'] = implode(', ', $keywords);
- }
-
- // Add word count estimate based on description length (rough estimate)
- $schema['wordCount'] = max(500, strlen($description) * 5);
-
- return '';
-}
-
-/**
- * Generate BlogPosting Schema (more specific than Article)
- */
-function generateBlogPostingSchema($title, $description, $datePublished, $dateModified, $authorName, $imageUrl, $articleUrl, $category = null, $keywords = []) {
- $baseUrl = 'https://ukdataservices.co.uk';
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'BlogPosting',
- '@id' => $articleUrl . '#blogposting',
- 'headline' => $title,
- 'description' => $description,
- 'url' => $articleUrl,
- 'datePublished' => $datePublished . 'T09:00:00+00:00',
- 'dateModified' => $dateModified . 'T09:00:00+00:00',
- 'author' => [
- '@type' => 'Person',
- 'name' => $authorName,
- 'url' => $baseUrl . '/about',
- 'worksFor' => [
- '@type' => 'Organization',
- '@id' => $baseUrl . '/#organization'
- ]
- ],
- 'publisher' => [
- '@type' => 'Organization',
- '@id' => $baseUrl . '/#organization',
- 'name' => 'UK Data Services',
- 'logo' => [
- '@type' => 'ImageObject',
- 'url' => $baseUrl . '/assets/images/ukds-main-logo.png',
- 'width' => 300,
- 'height' => 100
- ]
- ],
- 'image' => [
- '@type' => 'ImageObject',
- 'url' => $imageUrl,
- 'width' => 1200,
- 'height' => 630
- ],
- 'mainEntityOfPage' => [
- '@type' => 'WebPage',
- '@id' => $articleUrl
- ],
- 'isPartOf' => [
- '@type' => 'Blog',
- '@id' => $baseUrl . '/blog/#blog',
- 'name' => 'UK Data Services Blog'
- ],
- 'inLanguage' => 'en-GB'
- ];
-
- if ($category) {
- $schema['articleSection'] = $category;
- }
-
- if (!empty($keywords)) {
- $schema['keywords'] = implode(', ', $keywords);
- }
-
- return '';
-}
-
-/**
- * Author configurations for the site
- */
-$authorProfiles = [
- 'uk-data-services-team' => [
- 'name' => 'UK Data Services Team',
- 'role' => 'Data Intelligence Experts',
- 'description' => 'Our team of certified data professionals and engineers providing expert guidance on web scraping, data analytics, and business intelligence.'
- ],
- 'technical-team' => [
- 'name' => 'UK Data Services Technical Team',
- 'role' => 'Senior Data Engineers',
- 'description' => 'Expert engineers specializing in web scraping technologies, data pipelines, and enterprise data solutions.'
- ],
- 'compliance-team' => [
- 'name' => 'UK Data Services Compliance Team',
- 'role' => 'Data Protection Specialists',
- 'description' => 'Specialists in GDPR compliance, data protection, and regulatory requirements for data collection.'
- ]
-];
-
-// If $articleData is set, output the schema automatically
-if (isset($articleData) && is_array($articleData)) {
- echo generateArticleSchema(
- $articleData['title'],
- $articleData['description'],
- $articleData['datePublished'],
- $articleData['dateModified'] ?? $articleData['datePublished'],
- $articleData['authorName'] ?? 'UK Data Services Team',
- $articleData['imageUrl'],
- $articleData['articleUrl'],
- $articleData['category'] ?? null,
- $articleData['keywords'] ?? []
- );
-}
diff --git a/includes.bak.20260210/includes/schema/faq-schema.php b/includes.bak.20260210/includes/schema/faq-schema.php
deleted file mode 100644
index d6d75bf..0000000
--- a/includes.bak.20260210/includes/schema/faq-schema.php
+++ /dev/null
@@ -1,151 +0,0 @@
- 'What is web scraping?', 'answer' => 'Web scraping is...'],
- * ['question' => 'How much does it cost?', 'answer' => 'Pricing varies...']
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/faq-schema.php');
- */
-
-/**
- * Generate FAQPage Schema JSON-LD
- *
- * @param array $faqs Array of Q&A pairs with 'question' and 'answer' keys
- * @param string|null $pageUrl Optional canonical URL for the FAQ page
- * @param string|null $pageName Optional name for the FAQ page
- * @return string JSON-LD script tag
- */
-function generateFAQSchema($faqs, $pageUrl = null, $pageName = null) {
- if (empty($faqs)) {
- return '';
- }
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'FAQPage'
- ];
-
- // Add page identifier if URL provided
- if ($pageUrl) {
- $schema['@id'] = $pageUrl . '#faqpage';
- $schema['url'] = $pageUrl;
- }
-
- // Add page name if provided
- if ($pageName) {
- $schema['name'] = $pageName;
- }
-
- // Build main entity array
- $schema['mainEntity'] = array_map(function($faq) {
- return [
- '@type' => 'Question',
- 'name' => $faq['question'],
- 'acceptedAnswer' => [
- '@type' => 'Answer',
- 'text' => $faq['answer']
- ]
- ];
- }, $faqs);
-
- return '';
-}
-
-/**
- * Common FAQs for different page types
- */
-$commonFAQs = [
- 'general' => [
- [
- 'question' => 'What is web scraping and how can it benefit my business?',
- 'answer' => 'Web scraping is the automated process of extracting data from websites. It benefits businesses by providing competitive intelligence, automating data collection, enabling real-time price monitoring, and supporting strategic decision-making with accurate market data.'
- ],
- [
- 'question' => 'Is web scraping legal in the UK?',
- 'answer' => 'Yes, web scraping is legal in the UK when conducted properly. We ensure full compliance with UK Data Protection Act 2018, GDPR, website terms of service, and industry best practices. We only collect publicly available data and respect robots.txt directives.'
- ],
- [
- 'question' => 'How do you ensure data accuracy?',
- 'answer' => 'We maintain a 99.8% accuracy rate through advanced validation algorithms, multi-layer verification processes, regular monitoring, and comprehensive testing before delivery. Each dataset undergoes rigorous quality assurance checks.'
- ],
- [
- 'question' => 'What data formats do you provide?',
- 'answer' => 'We deliver data in multiple formats including Excel (XLSX/XLS), CSV, JSON, XML, SQL database dumps, and custom formats. We also offer real-time data feeds and API access for ongoing projects.'
- ],
- [
- 'question' => 'How much do your services cost?',
- 'answer' => 'Pricing varies based on project complexity: Simple extraction projects start from £500-£2,000, medium complexity projects range from £2,000-£10,000, and enterprise solutions are £10,000+. We provide custom quotes based on your specific requirements.'
- ]
- ],
- 'pricing' => [
- [
- 'question' => 'What factors affect the cost of web scraping services?',
- 'answer' => 'Costs depend on several factors: the number and complexity of target websites, data volume required, frequency of updates, anti-bot measures to navigate, data cleaning requirements, and delivery format preferences.'
- ],
- [
- 'question' => 'Do you offer monthly retainer packages?',
- 'answer' => 'Yes, we offer flexible monthly retainer packages for ongoing data collection needs. These include regular updates, priority support, and often provide better value than one-off projects for continuous monitoring requirements.'
- ],
- [
- 'question' => 'Is there a minimum project value?',
- 'answer' => 'Our minimum project value is £500. This ensures we can deliver quality work with proper attention to accuracy, compliance, and client requirements.'
- ]
- ],
- 'compliance' => [
- [
- 'question' => 'How do you handle GDPR compliance?',
- 'answer' => 'GDPR compliance is central to our operations. We only collect personal data when legally justified, follow data minimisation principles, implement robust security measures, maintain clear data retention policies, and respect data subject rights.'
- ],
- [
- 'question' => 'Do you scrape personal data?',
- 'answer' => 'We only collect personal data when there is a legitimate legal basis, such as legitimate business interests or consent. We follow strict GDPR guidelines and advise clients on compliant data collection strategies.'
- ],
- [
- 'question' => 'What security measures do you have in place?',
- 'answer' => 'We implement enterprise-grade security including encrypted data transfer (SSL/TLS), secure data storage, access controls, and regular security audits.'
- ]
- ],
- 'property-data' => [
- [
- 'question' => 'Can you extract data from Rightmove and Zoopla?',
- 'answer' => 'Yes, we can extract publicly available property data from UK property portals including Rightmove, Zoopla, OnTheMarket, and others. We ensure compliance with each platform\'s terms of service and UK data protection laws.'
- ],
- [
- 'question' => 'What property data can you collect?',
- 'answer' => 'We can collect property listings, prices, property features, location data, historical price changes, rental yields, local area information, and market trends. Custom data requirements can be discussed during consultation.'
- ],
- [
- 'question' => 'How often can property data be updated?',
- 'answer' => 'We offer daily, weekly, or monthly property data updates depending on your needs. Real-time monitoring is also available for time-sensitive market intelligence requirements.'
- ]
- ],
- 'financial-data' => [
- [
- 'question' => 'Do you provide FCA-compliant financial data services?',
- 'answer' => 'Yes, our financial data services are designed with FCA regulations in mind. We help hedge funds, asset managers, and investment firms collect market data while maintaining compliance with applicable financial regulations.'
- ],
- [
- 'question' => 'What types of alternative data do you provide?',
- 'answer' => 'We provide various alternative data sources including web traffic data, sentiment analysis, pricing data, job posting trends, satellite imagery analysis, and custom data feeds tailored to investment strategies.'
- ],
- [
- 'question' => 'Can you provide historical financial data?',
- 'answer' => 'Yes, we can extract and compile historical financial data where publicly available. This includes historical pricing, company filings, news archives, and market trend data for backtesting and analysis purposes.'
- ]
- ]
-];
-
-// If $faqs is set, output the schema automatically
-if (isset($faqs) && is_array($faqs)) {
- echo generateFAQSchema(
- $faqs,
- $faqPageUrl ?? null,
- $faqPageName ?? null
- );
-}
diff --git a/includes.bak.20260210/includes/schema/local-business-schema.php b/includes.bak.20260210/includes/schema/local-business-schema.php
deleted file mode 100644
index b9f33f1..0000000
--- a/includes.bak.20260210/includes/schema/local-business-schema.php
+++ /dev/null
@@ -1,233 +0,0 @@
- 'London',
- * 'region' => 'Greater London',
- * 'latitude' => 51.5074,
- * 'longitude' => -0.1278,
- * 'services' => ['Web Scraping', 'Data Analytics']
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/local-business-schema.php');
- */
-
-/**
- * Generate LocalBusiness Schema JSON-LD for city/location pages
- *
- * @param string $city The city name
- * @param string $region The region/county name
- * @param array $services Array of service names offered in this location
- * @param float|null $latitude Optional latitude coordinate
- * @param float|null $longitude Optional longitude coordinate
- * @return string JSON-LD script tag
- */
-function generateLocalBusinessSchema($city, $region, $services = [], $latitude = null, $longitude = null) {
- $baseUrl = 'https://ukdataservices.co.uk';
- $citySlug = strtolower(str_replace(' ', '-', $city));
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'LocalBusiness',
- '@id' => $baseUrl . '/locations/' . $citySlug . '#localbusiness',
- 'name' => 'UK Data Services - ' . $city,
- 'description' => 'Professional web scraping, data extraction, and business intelligence services for ' . $city . ' businesses. GDPR-compliant data solutions across ' . $region . '.',
- 'url' => $baseUrl . '/locations/' . $citySlug,
- 'telephone' => '+44 1692 689150',
- 'email' => 'info@ukdataservices.co.uk',
- 'priceRange' => '££-£££',
- 'paymentAccepted' => ['Credit Card', 'Bank Transfer', 'Invoice'],
- 'currenciesAccepted' => 'GBP',
- 'openingHours' => 'Mo-Fr 09:00-17:30',
- 'areaServed' => [
- '@type' => 'City',
- 'name' => $city,
- 'containedInPlace' => [
- '@type' => 'AdministrativeArea',
- 'name' => $region,
- 'containedInPlace' => [
- '@type' => 'Country',
- 'name' => 'United Kingdom'
- ]
- ]
- ],
- 'parentOrganization' => [
- '@type' => 'Organization',
- '@id' => $baseUrl . '/#organization',
- 'name' => 'UK Data Services'
- ],
- 'image' => $baseUrl . '/assets/images/ukds-main-logo.png',
- 'sameAs' => [
- 'https://www.linkedin.com/company/ukdataservices',
- 'https://twitter.com/ukdataservices'
- ]
- ];
-
- // Add geo coordinates if provided
- if ($latitude && $longitude) {
- $schema['geo'] = [
- '@type' => 'GeoCoordinates',
- 'latitude' => $latitude,
- 'longitude' => $longitude
- ];
- }
-
- // Add aggregate rating
- $schema['aggregateRating'] = [
- '@type' => 'AggregateRating',
- 'ratingValue' => '4.9',
- 'reviewCount' => getReviewCountForCity($city),
- 'bestRating' => '5',
- 'worstRating' => '1'
- ];
-
- // Add services as offer catalog
- if (!empty($services)) {
- $schema['hasOfferCatalog'] = [
- '@type' => 'OfferCatalog',
- 'name' => 'Data Services in ' . $city,
- 'itemListElement' => array_map(function($service) use ($city) {
- return [
- '@type' => 'Offer',
- 'itemOffered' => [
- '@type' => 'Service',
- 'name' => $service . ' ' . $city
- ]
- ];
- }, $services)
- ];
- }
-
- return '';
-}
-
-/**
- * Get estimated review count for a city (for schema purposes)
- */
-function getReviewCountForCity($city) {
- $reviewCounts = [
- 'London' => 87,
- 'Manchester' => 45,
- 'Birmingham' => 38,
- 'Edinburgh' => 25,
- 'Cardiff' => 18
- ];
- return $reviewCounts[$city] ?? 20;
-}
-
-/**
- * Predefined location configurations
- */
-$locationConfigs = [
- 'london' => [
- 'city' => 'London',
- 'region' => 'Greater London',
- 'latitude' => 51.5074,
- 'longitude' => -0.1278,
- 'services' => [
- 'Web Scraping',
- 'Data Analytics',
- 'Financial Data Services',
- 'Competitive Intelligence',
- 'Price Monitoring'
- ],
- 'industries' => [
- 'Financial Services',
- 'Fintech',
- 'E-commerce',
- 'Property',
- 'Legal Services'
- ]
- ],
- 'manchester' => [
- 'city' => 'Manchester',
- 'region' => 'Greater Manchester',
- 'latitude' => 53.4808,
- 'longitude' => -2.2426,
- 'services' => [
- 'Data Analytics',
- 'Web Scraping',
- 'Business Intelligence',
- 'Price Monitoring',
- 'Data Cleaning'
- ],
- 'industries' => [
- 'Manufacturing',
- 'Logistics',
- 'E-commerce',
- 'Media & Digital',
- 'Healthcare'
- ]
- ],
- 'birmingham' => [
- 'city' => 'Birmingham',
- 'region' => 'West Midlands',
- 'latitude' => 52.4862,
- 'longitude' => -1.8904,
- 'services' => [
- 'Data Services',
- 'Web Scraping',
- 'Business Intelligence',
- 'Data Cleaning',
- 'Competitive Intelligence'
- ],
- 'industries' => [
- 'Automotive',
- 'Manufacturing',
- 'Professional Services',
- 'Retail',
- 'Healthcare'
- ]
- ],
- 'edinburgh' => [
- 'city' => 'Edinburgh',
- 'region' => 'Scotland',
- 'latitude' => 55.9533,
- 'longitude' => -3.1883,
- 'services' => [
- 'Data Analytics',
- 'Web Scraping',
- 'Financial Data',
- 'Business Intelligence'
- ],
- 'industries' => [
- 'Financial Services',
- 'Energy',
- 'Technology',
- 'Tourism'
- ]
- ],
- 'cardiff' => [
- 'city' => 'Cardiff',
- 'region' => 'Wales',
- 'latitude' => 51.4816,
- 'longitude' => -3.1791,
- 'services' => [
- 'Data Services',
- 'Web Scraping',
- 'Business Intelligence',
- 'Data Cleaning'
- ],
- 'industries' => [
- 'Public Sector',
- 'Financial Services',
- 'Media',
- 'Manufacturing'
- ]
- ]
-];
-
-// If $locationData is set, output the schema automatically
-if (isset($locationData) && is_array($locationData)) {
- echo generateLocalBusinessSchema(
- $locationData['city'],
- $locationData['region'],
- $locationData['services'] ?? [],
- $locationData['latitude'] ?? null,
- $locationData['longitude'] ?? null
- );
-}
diff --git a/includes.bak.20260210/includes/schema/organization-schema.php b/includes.bak.20260210/includes/schema/organization-schema.php
deleted file mode 100644
index 2766e87..0000000
--- a/includes.bak.20260210/includes/schema/organization-schema.php
+++ /dev/null
@@ -1,108 +0,0 @@
- of every page
- *
- */
-
-$organizationSchema = [
- '@context' => 'https://schema.org',
- '@type' => 'Organization',
- '@id' => 'https://ukdataservices.co.uk/#organization',
- 'name' => 'UK Data Services',
- 'legalName' => 'UK Data Services Limited',
- 'url' => 'https://ukdataservices.co.uk',
- 'logo' => [
- '@type' => 'ImageObject',
- 'url' => 'https://ukdataservices.co.uk/assets/images/ukds-main-logo.png',
- 'width' => 300,
- 'height' => 100
- ],
- 'image' => 'https://ukdataservices.co.uk/assets/images/ukds-main-logo.png',
- 'description' => 'Enterprise web scraping and data analytics services for UK businesses. Specialising in competitive intelligence, price monitoring, and GDPR-compliant data extraction.',
- 'telephone' => '+44 1692 689150',
- 'email' => 'info@ukdataservices.co.uk',
- 'address' => [
- '@type' => 'PostalAddress',
- 'streetAddress' => 'Professional Data Services Centre',
- 'addressLocality' => 'London',
- 'addressRegion' => 'England',
- 'postalCode' => 'EC1A 1BB',
- 'addressCountry' => 'GB'
- ],
- 'geo' => [
- '@type' => 'GeoCoordinates',
- 'latitude' => 51.5074,
- 'longitude' => -0.1278
- ],
- 'areaServed' => [
- [
- '@type' => 'Country',
- 'name' => 'United Kingdom'
- ],
- [
- '@type' => 'City',
- 'name' => 'London'
- ],
- [
- '@type' => 'City',
- 'name' => 'Manchester'
- ],
- [
- '@type' => 'City',
- 'name' => 'Birmingham'
- ],
- [
- '@type' => 'City',
- 'name' => 'Edinburgh'
- ],
- [
- '@type' => 'City',
- 'name' => 'Cardiff'
- ]
- ],
- 'sameAs' => [
- 'https://www.linkedin.com/company/ukdataservices',
- 'https://twitter.com/ukdataservices'
- ],
- 'contactPoint' => [
- [
- '@type' => 'ContactPoint',
- 'telephone' => '+44 1692 689150',
- 'contactType' => 'sales',
- 'availableLanguage' => 'English',
- 'areaServed' => 'GB',
- 'hoursAvailable' => [
- '@type' => 'OpeningHoursSpecification',
- 'dayOfWeek' => ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
- 'opens' => '09:00',
- 'closes' => '17:30'
- ]
- ],
- [
- '@type' => 'ContactPoint',
- 'email' => 'info@ukdataservices.co.uk',
- 'contactType' => 'customer service',
- 'availableLanguage' => 'English',
- 'areaServed' => 'GB'
- ]
- ],
- 'foundingDate' => '2018',
- 'numberOfEmployees' => [
- '@type' => 'QuantitativeValue',
- 'value' => '15'
- ],
- 'aggregateRating' => [
- '@type' => 'AggregateRating',
- 'ratingValue' => '4.9',
- 'reviewCount' => '127',
- 'bestRating' => '5',
- 'worstRating' => '1'
- ]
-];
-?>
-
diff --git a/includes.bak.20260210/includes/schema/review-schema.php b/includes.bak.20260210/includes/schema/review-schema.php
deleted file mode 100644
index bec907d..0000000
--- a/includes.bak.20260210/includes/schema/review-schema.php
+++ /dev/null
@@ -1,196 +0,0 @@
- 'John Smith', 'reviewBody' => 'Great service!', 'ratingValue' => 5],
- * ['author' => 'Jane Doe', 'reviewBody' => 'Excellent work', 'ratingValue' => 5]
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/review-schema.php');
- */
-
-/**
- * Generate Review Schema JSON-LD with AggregateRating
- *
- * @param array $reviews Array of review data
- * @param string $itemName Name of the item being reviewed
- * @param string $itemType Schema type (Organization, Service, Product, etc.)
- * @param string|null $itemUrl URL of the item being reviewed
- * @return string JSON-LD script tag
- */
-function generateReviewSchema($reviews, $itemName = 'UK Data Services', $itemType = 'Organization', $itemUrl = null) {
- if (empty($reviews)) {
- return '';
- }
-
- $baseUrl = 'https://ukdataservices.co.uk';
-
- // Calculate aggregate rating
- $totalRating = 0;
- $reviewCount = count($reviews);
- foreach ($reviews as $review) {
- $totalRating += $review['ratingValue'] ?? 5;
- }
- $averageRating = round($totalRating / $reviewCount, 1);
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => $itemType,
- 'name' => $itemName,
- 'url' => $itemUrl ?? $baseUrl,
- 'aggregateRating' => [
- '@type' => 'AggregateRating',
- 'ratingValue' => number_format($averageRating, 1),
- 'reviewCount' => $reviewCount,
- 'bestRating' => '5',
- 'worstRating' => '1'
- ],
- 'review' => array_map(function($review) {
- $reviewSchema = [
- '@type' => 'Review',
- 'author' => [
- '@type' => 'Person',
- 'name' => $review['author']
- ],
- 'reviewRating' => [
- '@type' => 'Rating',
- 'ratingValue' => $review['ratingValue'] ?? 5,
- 'bestRating' => '5',
- 'worstRating' => '1'
- ],
- 'reviewBody' => $review['reviewBody']
- ];
-
- // Add date if provided
- if (isset($review['datePublished'])) {
- $reviewSchema['datePublished'] = $review['datePublished'];
- }
-
- // Add job title/role if provided
- if (isset($review['authorRole'])) {
- $reviewSchema['author']['jobTitle'] = $review['authorRole'];
- }
-
- return $reviewSchema;
- }, $reviews)
- ];
-
- return '';
-}
-
-/**
- * Generate standalone AggregateRating schema (without individual reviews)
- */
-function generateAggregateRatingSchema($itemName, $itemType, $ratingValue, $reviewCount, $itemUrl = null) {
- $baseUrl = 'https://ukdataservices.co.uk';
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => $itemType,
- 'name' => $itemName,
- 'url' => $itemUrl ?? $baseUrl,
- 'aggregateRating' => [
- '@type' => 'AggregateRating',
- 'ratingValue' => number_format($ratingValue, 1),
- 'reviewCount' => $reviewCount,
- 'bestRating' => '5',
- 'worstRating' => '1'
- ]
- ];
-
- return '';
-}
-
-/**
- * Predefined testimonials for the homepage and service pages
- */
-$siteTestimonials = [
- [
- 'author' => 'James Mitchell',
- 'authorRole' => 'Retail Director, London Fashion Group',
- 'reviewBody' => 'UK Data Services transformed our competitor analysis process. Their web scraping accuracy and speed helped us make better pricing decisions. We\'ve seen a 23% improvement in our market positioning since working with them.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-09-15'
- ],
- [
- 'author' => 'Sarah Chen',
- 'authorRole' => 'Head of Strategy, City Fintech Ltd',
- 'reviewBody' => 'Outstanding data analytics service. They helped us understand our market position and identify opportunities we\'d completely missed. The team\'s expertise in financial data and GDPR compliance gave us complete confidence.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-08-22'
- ],
- [
- 'author' => 'Michael Thompson',
- 'authorRole' => 'Managing Partner, London Property Advisors',
- 'reviewBody' => 'Professional, GDPR-compliant, and incredibly responsive. Their property data extraction service has become essential to our London operations. The 99.8% accuracy rate they promised was actually exceeded in our experience.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-07-10'
- ],
- [
- 'author' => 'Emma Williams',
- 'authorRole' => 'CEO, Manchester Logistics Solutions',
- 'reviewBody' => 'Exceptional service quality. The data cleaning and validation work they did on our supply chain database saved us thousands in operational costs. Highly recommend for any Manchester business.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-06-28'
- ],
- [
- 'author' => 'David Brown',
- 'authorRole' => 'Director of Analytics, Birmingham Manufacturing Co',
- 'reviewBody' => 'We needed complex automotive parts pricing data across multiple European suppliers. UK Data Services delivered beyond expectations with excellent accuracy and compliance documentation.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-05-15'
- ],
- [
- 'author' => 'Laura Johnson',
- 'authorRole' => 'Marketing Director, Scottish Energy Corp',
- 'reviewBody' => 'Their competitive intelligence service gave us insights into market movements we couldn\'t have obtained otherwise. Professional team with deep technical expertise.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-04-20'
- ]
-];
-
-/**
- * Service-specific testimonials
- */
-$serviceTestimonials = [
- 'web-scraping' => [
- [
- 'author' => 'Robert Harris',
- 'authorRole' => 'CTO, E-commerce Solutions Ltd',
- 'reviewBody' => 'Their web scraping capabilities are world-class. They handled complex JavaScript-rendered pages with ease and delivered clean, accurate data exactly as specified.',
- 'ratingValue' => 5
- ]
- ],
- 'price-monitoring' => [
- [
- 'author' => 'Sophie Turner',
- 'authorRole' => 'Pricing Manager, UK Retail Chain',
- 'reviewBody' => 'The price monitoring alerts have revolutionized how we respond to competitor pricing. We now react in hours instead of days.',
- 'ratingValue' => 5
- ]
- ],
- 'data-cleaning' => [
- [
- 'author' => 'Mark Stevens',
- 'authorRole' => 'Data Manager, Healthcare Analytics',
- 'reviewBody' => 'They cleaned and standardized over 2 million patient records with 99.9% accuracy. The improvement in our data quality has been transformational.',
- 'ratingValue' => 5
- ]
- ]
-];
-
-// If $reviews is set, output the schema automatically
-if (isset($reviews) && is_array($reviews)) {
- echo generateReviewSchema(
- $reviews,
- $reviewItemName ?? 'UK Data Services',
- $reviewItemType ?? 'Organization',
- $reviewItemUrl ?? null
- );
-}
diff --git a/includes.bak.20260210/includes/schema/service-schema.php b/includes.bak.20260210/includes/schema/service-schema.php
deleted file mode 100644
index c79ed45..0000000
--- a/includes.bak.20260210/includes/schema/service-schema.php
+++ /dev/null
@@ -1,223 +0,0 @@
- 'Web Scraping Services',
- * 'description' => 'Professional web scraping services...',
- * 'url' => 'https://ukdataservices.co.uk/services/web-scraping',
- * 'serviceType' => 'Web Scraping',
- * 'priceRange' => '500-50000',
- * 'features' => ['Feature 1', 'Feature 2']
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/service-schema.php');
- */
-
-/**
- * Generate Service Schema JSON-LD
- *
- * @param string $serviceName The name of the service
- * @param string $serviceDescription A detailed description of the service
- * @param string $serviceUrl The canonical URL of the service page
- * @param string $serviceType The type/category of service
- * @param string|null $priceRange Optional price range (e.g., "500-50000")
- * @param array $features Optional array of service features
- * @return string JSON-LD script tag
- */
-function generateServiceSchema($serviceName, $serviceDescription, $serviceUrl, $serviceType, $priceRange = null, $features = []) {
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'Service',
- '@id' => $serviceUrl . '#service',
- 'name' => $serviceName,
- 'description' => $serviceDescription,
- 'url' => $serviceUrl,
- 'serviceType' => $serviceType,
- 'provider' => [
- '@type' => 'Organization',
- '@id' => 'https://ukdataservices.co.uk/#organization',
- 'name' => 'UK Data Services',
- 'url' => 'https://ukdataservices.co.uk'
- ],
- 'areaServed' => [
- '@type' => 'Country',
- 'name' => 'United Kingdom'
- ],
- 'availableChannel' => [
- '@type' => 'ServiceChannel',
- 'serviceUrl' => 'https://ukdataservices.co.uk/quote',
- 'servicePhone' => '+44 1692 689150',
- 'availableLanguage' => 'English'
- ]
- ];
-
- // Add price specification if provided
- if ($priceRange) {
- $prices = explode('-', $priceRange);
- $schema['offers'] = [
- '@type' => 'Offer',
- 'priceCurrency' => 'GBP',
- 'priceSpecification' => [
- '@type' => 'PriceSpecification',
- 'minPrice' => (float)$prices[0],
- 'maxPrice' => isset($prices[1]) ? (float)$prices[1] : null,
- 'priceCurrency' => 'GBP'
- ],
- 'availability' => 'https://schema.org/InStock',
- 'validFrom' => date('Y-m-d')
- ];
- }
-
- // Add features/service output if provided
- if (!empty($features)) {
- $schema['hasOfferCatalog'] = [
- '@type' => 'OfferCatalog',
- 'name' => $serviceName . ' Features',
- 'itemListElement' => array_map(function($feature) {
- return [
- '@type' => 'Offer',
- 'itemOffered' => [
- '@type' => 'Service',
- 'name' => $feature
- ]
- ];
- }, $features)
- ];
- }
-
- return '';
-}
-
-/**
- * Predefined service configurations for consistency
- */
-$serviceConfigs = [
- 'web-scraping' => [
- 'name' => 'Web Scraping Services UK',
- 'description' => 'Professional web scraping and data extraction services for UK businesses. Automated data collection from websites with 99.8% accuracy and full GDPR compliance.',
- 'url' => 'https://ukdataservices.co.uk/services/web-scraping',
- 'serviceType' => 'Web Scraping',
- 'priceRange' => '500-50000',
- 'features' => [
- 'Automated data extraction',
- 'Real-time monitoring',
- 'GDPR-compliant collection',
- 'Custom API delivery',
- 'Multi-format output'
- ]
- ],
- 'competitive-intelligence' => [
- 'name' => 'Competitive Intelligence Services UK',
- 'description' => 'Strategic competitive intelligence and market analysis services. Monitor competitors, track market trends, and gain actionable business insights.',
- 'url' => 'https://ukdataservices.co.uk/services/competitive-intelligence',
- 'serviceType' => 'Competitive Intelligence',
- 'priceRange' => '1000-25000',
- 'features' => [
- 'Competitor monitoring',
- 'Market trend analysis',
- 'Price tracking',
- 'Product intelligence',
- 'Strategic reporting'
- ]
- ],
- 'price-monitoring' => [
- 'name' => 'Price Monitoring Services UK',
- 'description' => 'Real-time price monitoring and competitor price tracking services. E-commerce pricing intelligence for UK retailers and brands.',
- 'url' => 'https://ukdataservices.co.uk/services/price-monitoring',
- 'serviceType' => 'Price Monitoring',
- 'priceRange' => '500-15000',
- 'features' => [
- 'Real-time price tracking',
- 'Competitor price alerts',
- 'MAP monitoring',
- 'Historical price analysis',
- 'Automated reporting'
- ]
- ],
- 'data-cleaning' => [
- 'name' => 'Data Cleaning & Validation Services UK',
- 'description' => 'Professional data cleaning, validation, and standardisation services. Transform messy data into accurate, structured datasets.',
- 'url' => 'https://ukdataservices.co.uk/services/data-cleaning',
- 'serviceType' => 'Data Cleaning',
- 'priceRange' => '500-20000',
- 'features' => [
- 'Duplicate removal',
- 'Data standardisation',
- 'Format validation',
- 'Error correction',
- 'Quality assurance'
- ]
- ],
- 'data-analytics' => [
- 'name' => 'Data Analytics Services UK',
- 'description' => 'Business intelligence and data analytics solutions for UK enterprises. Transform raw data into actionable insights.',
- 'url' => 'https://ukdataservices.co.uk/services/data-analytics',
- 'serviceType' => 'Data Analytics',
- 'priceRange' => '1000-30000',
- 'features' => [
- 'Business intelligence',
- 'Predictive analytics',
- 'Custom dashboards',
- 'Data visualisation',
- 'Strategic insights'
- ]
- ],
- 'api-development' => [
- 'name' => 'API Development Services UK',
- 'description' => 'Custom API development and data integration services. Build robust APIs to connect your systems and automate data workflows.',
- 'url' => 'https://ukdataservices.co.uk/services/api-development',
- 'serviceType' => 'API Development',
- 'priceRange' => '2000-40000',
- 'features' => [
- 'Custom API design',
- 'System integration',
- 'Real-time data feeds',
- 'Authentication systems',
- 'Documentation'
- ]
- ],
- 'property-data-extraction' => [
- 'name' => 'UK Property Data Extraction Services',
- 'description' => 'Professional property data extraction from UK property portals including Rightmove, Zoopla, and OnTheMarket. GDPR-compliant property market intelligence.',
- 'url' => 'https://ukdataservices.co.uk/services/property-data-extraction',
- 'serviceType' => 'Property Data Extraction',
- 'priceRange' => '1000-25000',
- 'features' => [
- 'Property portal data extraction',
- 'Market analysis',
- 'Investment research data',
- 'Rental market intelligence',
- 'Commercial property data'
- ]
- ],
- 'financial-data-services' => [
- 'name' => 'Financial Data Services UK',
- 'description' => 'FCA-aware financial data services for hedge funds, asset managers, and investment firms. Market data extraction and alternative data solutions.',
- 'url' => 'https://ukdataservices.co.uk/services/financial-data-services',
- 'serviceType' => 'Financial Data Services',
- 'priceRange' => '5000-100000',
- 'features' => [
- 'Market data extraction',
- 'Alternative data feeds',
- 'Securities monitoring',
- 'Compliance-aware collection',
- 'API delivery'
- ]
- ]
-];
-
-// If $serviceData is set, output the schema automatically
-if (isset($serviceData) && is_array($serviceData)) {
- echo generateServiceSchema(
- $serviceData['name'],
- $serviceData['description'],
- $serviceData['url'],
- $serviceData['serviceType'],
- $serviceData['priceRange'] ?? null,
- $serviceData['features'] ?? []
- );
-}
diff --git a/includes.bak.20260210/includes/url-config.php b/includes.bak.20260210/includes/url-config.php
deleted file mode 100644
index 784d355..0000000
--- a/includes.bak.20260210/includes/url-config.php
+++ /dev/null
@@ -1,233 +0,0 @@
- '/',
- 'about' => '/about',
- 'quote' => '/quote',
- 'faq' => '/faq',
- 'blog' => '/blog',
- 'contact' => '/#contact',
- 'project-types' => '/project-types',
- 'case-studies' => '/case-studies',
-
- // Services
- 'services' => [
- 'index' => '/#services',
- 'web-scraping' => '/services/web-scraping',
- 'competitive-intelligence' => '/services/competitive-intelligence',
- 'price-monitoring' => '/services/price-monitoring',
- 'data-cleaning' => '/services/data-cleaning',
- 'data-analytics' => '/services/data-analytics',
- 'api-development' => '/services/api-development',
- 'property-data-extraction' => '/services/property-data-extraction',
- 'financial-data-services' => '/services/financial-data-services'
- ],
-
- // Locations
- 'locations' => [
- 'index' => '/locations',
- 'london' => '/locations/london',
- 'manchester' => '/locations/manchester',
- 'birmingham' => '/locations/birmingham',
- 'edinburgh' => '/locations/edinburgh',
- 'cardiff' => '/locations/cardiff'
- ],
-
- // Blog categories
- 'blog-categories' => [
- 'web-scraping' => '/blog/categories/web-scraping',
- 'data-analytics' => '/blog/categories/data-analytics',
- 'business-intelligence' => '/blog/categories/business-intelligence',
- 'compliance' => '/blog/categories/compliance',
- 'industry-insights' => '/blog/categories/industry-insights',
- 'technology' => '/blog/categories/technology',
- 'case-studies' => '/blog/categories/case-studies'
- ],
-
- // Legal pages
- 'legal' => [
- 'privacy-policy' => '/privacy-policy',
- 'terms-of-service' => '/terms-of-service',
- 'cookie-policy' => '/cookie-policy',
- 'gdpr-compliance' => '/gdpr-compliance'
- ]
-];
-
-/**
- * Service metadata for internal linking and SEO
- */
-$serviceData = [
- 'web-scraping' => [
- 'url' => '/services/web-scraping',
- 'title' => 'Web Scraping Services',
- 'shortTitle' => 'Web Scraping',
- 'description' => 'Professional web scraping and data extraction services',
- 'icon' => 'icon-web-scraping-v2.svg'
- ],
- 'competitive-intelligence' => [
- 'url' => '/services/competitive-intelligence',
- 'title' => 'Competitive Intelligence',
- 'shortTitle' => 'Competitive Intelligence',
- 'description' => 'Market analysis and competitor monitoring services',
- 'icon' => 'icon-analytics.svg'
- ],
- 'price-monitoring' => [
- 'url' => '/services/price-monitoring',
- 'title' => 'Price Monitoring',
- 'shortTitle' => 'Price Monitoring',
- 'description' => 'Real-time price tracking and competitor pricing alerts',
- 'icon' => 'icon-price-monitoring.svg'
- ],
- 'data-cleaning' => [
- 'url' => '/services/data-cleaning',
- 'title' => 'Data Cleaning & Validation',
- 'shortTitle' => 'Data Cleaning',
- 'description' => 'Professional data cleaning and quality assurance',
- 'icon' => 'icon-data-processing.svg'
- ],
- 'data-analytics' => [
- 'url' => '/services/data-analytics',
- 'title' => 'Data Analytics',
- 'shortTitle' => 'Analytics',
- 'description' => 'Business intelligence and data analytics solutions',
- 'icon' => 'icon-analytics.svg'
- ],
- 'api-development' => [
- 'url' => '/services/api-development',
- 'title' => 'API Development',
- 'shortTitle' => 'API Development',
- 'description' => 'Custom API development and system integration',
- 'icon' => 'icon-automation.svg'
- ],
- 'property-data-extraction' => [
- 'url' => '/services/property-data-extraction',
- 'title' => 'Property Data Extraction',
- 'shortTitle' => 'Property Data',
- 'description' => 'UK property market data from Rightmove, Zoopla, OnTheMarket',
- 'icon' => 'icon-property.svg'
- ],
- 'financial-data-services' => [
- 'url' => '/services/financial-data-services',
- 'title' => 'Financial Data Services',
- 'shortTitle' => 'Financial Data',
- 'description' => 'FCA-compliant financial and market data extraction',
- 'icon' => 'icon-financial.svg'
- ]
-];
-
-/**
- * Location metadata for internal linking
- */
-$locationData = [
- 'london' => [
- 'url' => '/locations/london',
- 'title' => 'London',
- 'region' => 'Greater London',
- 'description' => 'Web scraping and data analytics services in London'
- ],
- 'manchester' => [
- 'url' => '/locations/manchester',
- 'title' => 'Manchester',
- 'region' => 'Greater Manchester',
- 'description' => 'Data analytics and web scraping services in Manchester'
- ],
- 'birmingham' => [
- 'url' => '/locations/birmingham',
- 'title' => 'Birmingham',
- 'region' => 'West Midlands',
- 'description' => 'Data services and business intelligence in Birmingham'
- ],
- 'edinburgh' => [
- 'url' => '/locations/edinburgh',
- 'title' => 'Edinburgh',
- 'region' => 'Scotland',
- 'description' => 'Data analytics and web scraping services in Edinburgh'
- ],
- 'cardiff' => [
- 'url' => '/locations/cardiff',
- 'title' => 'Cardiff',
- 'region' => 'Wales',
- 'description' => 'Data services and business intelligence in Cardiff'
- ]
-];
-
-/**
- * Related services mapping for cross-linking
- */
-$relatedServices = [
- 'web-scraping' => ['competitive-intelligence', 'price-monitoring', 'data-cleaning'],
- 'competitive-intelligence' => ['web-scraping', 'price-monitoring', 'data-analytics'],
- 'price-monitoring' => ['web-scraping', 'competitive-intelligence', 'data-analytics'],
- 'data-cleaning' => ['web-scraping', 'data-analytics', 'api-development'],
- 'data-analytics' => ['competitive-intelligence', 'data-cleaning', 'api-development'],
- 'api-development' => ['web-scraping', 'data-cleaning', 'data-analytics'],
- 'property-data-extraction' => ['web-scraping', 'data-cleaning', 'competitive-intelligence'],
- 'financial-data-services' => ['web-scraping', 'data-analytics', 'api-development']
-];
-
-/**
- * Get full URL with base URL
- *
- * @param string $path Relative path
- * @return string Full URL
- */
-function getFullUrl($path) {
- global $baseUrl;
- return $baseUrl . $path;
-}
-
-/**
- * Get service URL by key
- *
- * @param string $serviceKey Service identifier
- * @return string Service URL
- */
-function getServiceUrl($serviceKey) {
- global $urlMap;
- return $urlMap['services'][$serviceKey] ?? '/#services';
-}
-
-/**
- * Get location URL by key
- *
- * @param string $locationKey Location identifier
- * @return string Location URL
- */
-function getLocationUrl($locationKey) {
- global $urlMap;
- return $urlMap['locations'][$locationKey] ?? '/';
-}
-
-/**
- * Get related services for a given service
- *
- * @param string $serviceKey Current service key
- * @return array Array of related service data
- */
-function getRelatedServices($serviceKey) {
- global $relatedServices, $serviceData;
-
- $related = $relatedServices[$serviceKey] ?? [];
- $result = [];
-
- foreach ($related as $relatedKey) {
- if (isset($serviceData[$relatedKey])) {
- $result[] = $serviceData[$relatedKey];
- }
- }
-
- return $result;
-}
diff --git a/includes.bak.20260210/meta-tags.php b/includes.bak.20260210/meta-tags.php
deleted file mode 100644
index c54ca9c..0000000
--- a/includes.bak.20260210/meta-tags.php
+++ /dev/null
@@ -1,164 +0,0 @@
- 'Page Title',
- * 'description' => 'Page description...',
- * 'canonicalUrl' => 'https://ukdataservices.co.uk/page',
- * 'ogImage' => '/assets/images/og-image.jpg',
- * 'type' => 'website', // or 'article'
- * 'articleData' => [...] // optional for articles
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/meta-tags.php');
- */
-
-/**
- * Generate complete meta tags for a page
- *
- * @param string $title Page title (will append brand if not already included)
- * @param string $description Meta description (max 160 chars recommended)
- * @param string $canonicalUrl Canonical URL for the page
- * @param string|null $ogImage Open Graph image URL
- * @param array|null $articleData Article-specific data for blog posts
- * @param string $type Page type (website, article, service)
- * @return string HTML meta tags
- */
-function generateMetaTags($title, $description, $canonicalUrl, $ogImage = null, $articleData = null, $type = 'website') {
- $baseUrl = 'https://ukdataservices.co.uk';
- $siteName = 'UK Data Services';
- $defaultImage = $baseUrl . '/assets/images/ukds-main-logo.png';
- $twitterHandle = '@ukdataservices';
-
- // Ensure title includes brand name
- $fullTitle = $title;
- if (strpos(strtolower($title), 'uk data services') === false) {
- $fullTitle = $title . ' | UK Data Services';
- }
-
- // Truncate description if too long
- if (strlen($description) > 160) {
- $description = substr($description, 0, 157) . '...';
- }
-
- // Use provided image or default
- $imageUrl = $ogImage ? (strpos($ogImage, 'http') === 0 ? $ogImage : $baseUrl . $ogImage) : $defaultImage;
-
- $output = '';
-
- // Basic meta tags
- $output .= '
' . htmlspecialchars($fullTitle) . ' ' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
-
- // Open Graph tags
- $output .= "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
-
- // Twitter Card tags
- $output .= "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
-
- // Article-specific tags
- if ($articleData && $type === 'article') {
- $output .= "\n \n";
- if (isset($articleData['datePublished'])) {
- $output .= '
' . "\n";
- }
- if (isset($articleData['dateModified'])) {
- $output .= '
' . "\n";
- }
- if (isset($articleData['author'])) {
- $output .= '
' . "\n";
- }
- if (isset($articleData['section'])) {
- $output .= '
' . "\n";
- }
- if (isset($articleData['tags']) && is_array($articleData['tags'])) {
- foreach ($articleData['tags'] as $tag) {
- $output .= '
' . "\n";
- }
- }
- }
-
- return $output;
-}
-
-/**
- * Generate geo meta tags for location pages
- */
-function generateGeoMetaTags($city, $region, $latitude, $longitude) {
- $output = "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- return $output;
-}
-
-/**
- * Generate hreflang tags (for potential future internationalization)
- */
-function generateHreflangTags($canonicalUrl) {
- $output = "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- return $output;
-}
-
-/**
- * Output standard favicon and manifest links
- */
-function generateFaviconTags() {
- $output = "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- return $output;
-}
-
-/**
- * Generate preconnect/prefetch hints for performance
- */
-function generateResourceHints() {
- $output = "\n \n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- $output .= '
' . "\n";
- return $output;
-}
-
-// If $metaData is set, output meta tags automatically
-if (isset($metaData) && is_array($metaData)) {
- echo generateMetaTags(
- $metaData['title'],
- $metaData['description'],
- $metaData['canonicalUrl'],
- $metaData['ogImage'] ?? null,
- $metaData['articleData'] ?? null,
- $metaData['type'] ?? 'website'
- );
-}
diff --git a/includes.bak.20260210/schema/article-schema.php b/includes.bak.20260210/schema/article-schema.php
deleted file mode 100644
index 04ce1c5..0000000
--- a/includes.bak.20260210/schema/article-schema.php
+++ /dev/null
@@ -1,198 +0,0 @@
- 'Article Title',
- * 'description' => 'Article description...',
- * 'datePublished' => '2024-01-15',
- * 'dateModified' => '2024-01-20',
- * 'authorName' => 'John Smith',
- * 'imageUrl' => 'https://example.com/image.jpg',
- * 'articleUrl' => 'https://example.com/article'
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/article-schema.php');
- */
-
-/**
- * Generate Article Schema JSON-LD
- *
- * @param string $title Article title
- * @param string $description Article description/excerpt
- * @param string $datePublished Publication date (Y-m-d format)
- * @param string $dateModified Last modified date (Y-m-d format)
- * @param string $authorName Author's name
- * @param string $imageUrl Featured image URL
- * @param string $articleUrl Canonical article URL
- * @param string $category Optional article category
- * @param array $keywords Optional array of keywords
- * @return string JSON-LD script tag
- */
-function generateArticleSchema($title, $description, $datePublished, $dateModified, $authorName, $imageUrl, $articleUrl, $category = null, $keywords = []) {
- $baseUrl = 'https://ukdataservices.co.uk';
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'Article',
- '@id' => $articleUrl . '#article',
- 'headline' => $title,
- 'description' => $description,
- 'url' => $articleUrl,
- 'datePublished' => $datePublished . 'T09:00:00+00:00',
- 'dateModified' => $dateModified . 'T09:00:00+00:00',
- 'author' => [
- '@type' => 'Person',
- 'name' => $authorName,
- 'url' => $baseUrl . '/about'
- ],
- 'publisher' => [
- '@type' => 'Organization',
- '@id' => $baseUrl . '/#organization',
- 'name' => 'UK Data Services',
- 'logo' => [
- '@type' => 'ImageObject',
- 'url' => $baseUrl . '/assets/images/ukds-main-logo.png'
- ]
- ],
- 'image' => [
- '@type' => 'ImageObject',
- 'url' => $imageUrl,
- 'width' => 1200,
- 'height' => 630
- ],
- 'mainEntityOfPage' => [
- '@type' => 'WebPage',
- '@id' => $articleUrl
- ],
- 'isPartOf' => [
- '@type' => 'Blog',
- '@id' => $baseUrl . '/blog/#blog',
- 'name' => 'UK Data Services Blog',
- 'publisher' => [
- '@id' => $baseUrl . '/#organization'
- ]
- ],
- 'inLanguage' => 'en-GB'
- ];
-
- // Add category if provided
- if ($category) {
- $schema['articleSection'] = $category;
- }
-
- // Add keywords if provided
- if (!empty($keywords)) {
- $schema['keywords'] = implode(', ', $keywords);
- }
-
- // Add word count estimate based on description length (rough estimate)
- $schema['wordCount'] = max(500, strlen($description) * 5);
-
- return '';
-}
-
-/**
- * Generate BlogPosting Schema (more specific than Article)
- */
-function generateBlogPostingSchema($title, $description, $datePublished, $dateModified, $authorName, $imageUrl, $articleUrl, $category = null, $keywords = []) {
- $baseUrl = 'https://ukdataservices.co.uk';
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'BlogPosting',
- '@id' => $articleUrl . '#blogposting',
- 'headline' => $title,
- 'description' => $description,
- 'url' => $articleUrl,
- 'datePublished' => $datePublished . 'T09:00:00+00:00',
- 'dateModified' => $dateModified . 'T09:00:00+00:00',
- 'author' => [
- '@type' => 'Person',
- 'name' => $authorName,
- 'url' => $baseUrl . '/about',
- 'worksFor' => [
- '@type' => 'Organization',
- '@id' => $baseUrl . '/#organization'
- ]
- ],
- 'publisher' => [
- '@type' => 'Organization',
- '@id' => $baseUrl . '/#organization',
- 'name' => 'UK Data Services',
- 'logo' => [
- '@type' => 'ImageObject',
- 'url' => $baseUrl . '/assets/images/ukds-main-logo.png',
- 'width' => 300,
- 'height' => 100
- ]
- ],
- 'image' => [
- '@type' => 'ImageObject',
- 'url' => $imageUrl,
- 'width' => 1200,
- 'height' => 630
- ],
- 'mainEntityOfPage' => [
- '@type' => 'WebPage',
- '@id' => $articleUrl
- ],
- 'isPartOf' => [
- '@type' => 'Blog',
- '@id' => $baseUrl . '/blog/#blog',
- 'name' => 'UK Data Services Blog'
- ],
- 'inLanguage' => 'en-GB'
- ];
-
- if ($category) {
- $schema['articleSection'] = $category;
- }
-
- if (!empty($keywords)) {
- $schema['keywords'] = implode(', ', $keywords);
- }
-
- return '';
-}
-
-/**
- * Author configurations for the site
- */
-$authorProfiles = [
- 'uk-data-services-team' => [
- 'name' => 'UK Data Services Team',
- 'role' => 'Data Intelligence Experts',
- 'description' => 'Our team of certified data professionals and engineers providing expert guidance on web scraping, data analytics, and business intelligence.'
- ],
- 'technical-team' => [
- 'name' => 'UK Data Services Technical Team',
- 'role' => 'Senior Data Engineers',
- 'description' => 'Expert engineers specializing in web scraping technologies, data pipelines, and enterprise data solutions.'
- ],
- 'compliance-team' => [
- 'name' => 'UK Data Services Compliance Team',
- 'role' => 'Data Protection Specialists',
- 'description' => 'Specialists in GDPR compliance, data protection, and regulatory requirements for data collection.'
- ]
-];
-
-// If $articleData is set, output the schema automatically
-if (isset($articleData) && is_array($articleData)) {
- echo generateArticleSchema(
- $articleData['title'],
- $articleData['description'],
- $articleData['datePublished'],
- $articleData['dateModified'] ?? $articleData['datePublished'],
- $articleData['authorName'] ?? 'UK Data Services Team',
- $articleData['imageUrl'],
- $articleData['articleUrl'],
- $articleData['category'] ?? null,
- $articleData['keywords'] ?? []
- );
-}
diff --git a/includes.bak.20260210/schema/faq-schema.php b/includes.bak.20260210/schema/faq-schema.php
deleted file mode 100644
index d6d75bf..0000000
--- a/includes.bak.20260210/schema/faq-schema.php
+++ /dev/null
@@ -1,151 +0,0 @@
- 'What is web scraping?', 'answer' => 'Web scraping is...'],
- * ['question' => 'How much does it cost?', 'answer' => 'Pricing varies...']
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/faq-schema.php');
- */
-
-/**
- * Generate FAQPage Schema JSON-LD
- *
- * @param array $faqs Array of Q&A pairs with 'question' and 'answer' keys
- * @param string|null $pageUrl Optional canonical URL for the FAQ page
- * @param string|null $pageName Optional name for the FAQ page
- * @return string JSON-LD script tag
- */
-function generateFAQSchema($faqs, $pageUrl = null, $pageName = null) {
- if (empty($faqs)) {
- return '';
- }
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'FAQPage'
- ];
-
- // Add page identifier if URL provided
- if ($pageUrl) {
- $schema['@id'] = $pageUrl . '#faqpage';
- $schema['url'] = $pageUrl;
- }
-
- // Add page name if provided
- if ($pageName) {
- $schema['name'] = $pageName;
- }
-
- // Build main entity array
- $schema['mainEntity'] = array_map(function($faq) {
- return [
- '@type' => 'Question',
- 'name' => $faq['question'],
- 'acceptedAnswer' => [
- '@type' => 'Answer',
- 'text' => $faq['answer']
- ]
- ];
- }, $faqs);
-
- return '';
-}
-
-/**
- * Common FAQs for different page types
- */
-$commonFAQs = [
- 'general' => [
- [
- 'question' => 'What is web scraping and how can it benefit my business?',
- 'answer' => 'Web scraping is the automated process of extracting data from websites. It benefits businesses by providing competitive intelligence, automating data collection, enabling real-time price monitoring, and supporting strategic decision-making with accurate market data.'
- ],
- [
- 'question' => 'Is web scraping legal in the UK?',
- 'answer' => 'Yes, web scraping is legal in the UK when conducted properly. We ensure full compliance with UK Data Protection Act 2018, GDPR, website terms of service, and industry best practices. We only collect publicly available data and respect robots.txt directives.'
- ],
- [
- 'question' => 'How do you ensure data accuracy?',
- 'answer' => 'We maintain a 99.8% accuracy rate through advanced validation algorithms, multi-layer verification processes, regular monitoring, and comprehensive testing before delivery. Each dataset undergoes rigorous quality assurance checks.'
- ],
- [
- 'question' => 'What data formats do you provide?',
- 'answer' => 'We deliver data in multiple formats including Excel (XLSX/XLS), CSV, JSON, XML, SQL database dumps, and custom formats. We also offer real-time data feeds and API access for ongoing projects.'
- ],
- [
- 'question' => 'How much do your services cost?',
- 'answer' => 'Pricing varies based on project complexity: Simple extraction projects start from £500-£2,000, medium complexity projects range from £2,000-£10,000, and enterprise solutions are £10,000+. We provide custom quotes based on your specific requirements.'
- ]
- ],
- 'pricing' => [
- [
- 'question' => 'What factors affect the cost of web scraping services?',
- 'answer' => 'Costs depend on several factors: the number and complexity of target websites, data volume required, frequency of updates, anti-bot measures to navigate, data cleaning requirements, and delivery format preferences.'
- ],
- [
- 'question' => 'Do you offer monthly retainer packages?',
- 'answer' => 'Yes, we offer flexible monthly retainer packages for ongoing data collection needs. These include regular updates, priority support, and often provide better value than one-off projects for continuous monitoring requirements.'
- ],
- [
- 'question' => 'Is there a minimum project value?',
- 'answer' => 'Our minimum project value is £500. This ensures we can deliver quality work with proper attention to accuracy, compliance, and client requirements.'
- ]
- ],
- 'compliance' => [
- [
- 'question' => 'How do you handle GDPR compliance?',
- 'answer' => 'GDPR compliance is central to our operations. We only collect personal data when legally justified, follow data minimisation principles, implement robust security measures, maintain clear data retention policies, and respect data subject rights.'
- ],
- [
- 'question' => 'Do you scrape personal data?',
- 'answer' => 'We only collect personal data when there is a legitimate legal basis, such as legitimate business interests or consent. We follow strict GDPR guidelines and advise clients on compliant data collection strategies.'
- ],
- [
- 'question' => 'What security measures do you have in place?',
- 'answer' => 'We implement enterprise-grade security including encrypted data transfer (SSL/TLS), secure data storage, access controls, and regular security audits.'
- ]
- ],
- 'property-data' => [
- [
- 'question' => 'Can you extract data from Rightmove and Zoopla?',
- 'answer' => 'Yes, we can extract publicly available property data from UK property portals including Rightmove, Zoopla, OnTheMarket, and others. We ensure compliance with each platform\'s terms of service and UK data protection laws.'
- ],
- [
- 'question' => 'What property data can you collect?',
- 'answer' => 'We can collect property listings, prices, property features, location data, historical price changes, rental yields, local area information, and market trends. Custom data requirements can be discussed during consultation.'
- ],
- [
- 'question' => 'How often can property data be updated?',
- 'answer' => 'We offer daily, weekly, or monthly property data updates depending on your needs. Real-time monitoring is also available for time-sensitive market intelligence requirements.'
- ]
- ],
- 'financial-data' => [
- [
- 'question' => 'Do you provide FCA-compliant financial data services?',
- 'answer' => 'Yes, our financial data services are designed with FCA regulations in mind. We help hedge funds, asset managers, and investment firms collect market data while maintaining compliance with applicable financial regulations.'
- ],
- [
- 'question' => 'What types of alternative data do you provide?',
- 'answer' => 'We provide various alternative data sources including web traffic data, sentiment analysis, pricing data, job posting trends, satellite imagery analysis, and custom data feeds tailored to investment strategies.'
- ],
- [
- 'question' => 'Can you provide historical financial data?',
- 'answer' => 'Yes, we can extract and compile historical financial data where publicly available. This includes historical pricing, company filings, news archives, and market trend data for backtesting and analysis purposes.'
- ]
- ]
-];
-
-// If $faqs is set, output the schema automatically
-if (isset($faqs) && is_array($faqs)) {
- echo generateFAQSchema(
- $faqs,
- $faqPageUrl ?? null,
- $faqPageName ?? null
- );
-}
diff --git a/includes.bak.20260210/schema/local-business-schema.php b/includes.bak.20260210/schema/local-business-schema.php
deleted file mode 100644
index b9f33f1..0000000
--- a/includes.bak.20260210/schema/local-business-schema.php
+++ /dev/null
@@ -1,233 +0,0 @@
- 'London',
- * 'region' => 'Greater London',
- * 'latitude' => 51.5074,
- * 'longitude' => -0.1278,
- * 'services' => ['Web Scraping', 'Data Analytics']
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/local-business-schema.php');
- */
-
-/**
- * Generate LocalBusiness Schema JSON-LD for city/location pages
- *
- * @param string $city The city name
- * @param string $region The region/county name
- * @param array $services Array of service names offered in this location
- * @param float|null $latitude Optional latitude coordinate
- * @param float|null $longitude Optional longitude coordinate
- * @return string JSON-LD script tag
- */
-function generateLocalBusinessSchema($city, $region, $services = [], $latitude = null, $longitude = null) {
- $baseUrl = 'https://ukdataservices.co.uk';
- $citySlug = strtolower(str_replace(' ', '-', $city));
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'LocalBusiness',
- '@id' => $baseUrl . '/locations/' . $citySlug . '#localbusiness',
- 'name' => 'UK Data Services - ' . $city,
- 'description' => 'Professional web scraping, data extraction, and business intelligence services for ' . $city . ' businesses. GDPR-compliant data solutions across ' . $region . '.',
- 'url' => $baseUrl . '/locations/' . $citySlug,
- 'telephone' => '+44 1692 689150',
- 'email' => 'info@ukdataservices.co.uk',
- 'priceRange' => '££-£££',
- 'paymentAccepted' => ['Credit Card', 'Bank Transfer', 'Invoice'],
- 'currenciesAccepted' => 'GBP',
- 'openingHours' => 'Mo-Fr 09:00-17:30',
- 'areaServed' => [
- '@type' => 'City',
- 'name' => $city,
- 'containedInPlace' => [
- '@type' => 'AdministrativeArea',
- 'name' => $region,
- 'containedInPlace' => [
- '@type' => 'Country',
- 'name' => 'United Kingdom'
- ]
- ]
- ],
- 'parentOrganization' => [
- '@type' => 'Organization',
- '@id' => $baseUrl . '/#organization',
- 'name' => 'UK Data Services'
- ],
- 'image' => $baseUrl . '/assets/images/ukds-main-logo.png',
- 'sameAs' => [
- 'https://www.linkedin.com/company/ukdataservices',
- 'https://twitter.com/ukdataservices'
- ]
- ];
-
- // Add geo coordinates if provided
- if ($latitude && $longitude) {
- $schema['geo'] = [
- '@type' => 'GeoCoordinates',
- 'latitude' => $latitude,
- 'longitude' => $longitude
- ];
- }
-
- // Add aggregate rating
- $schema['aggregateRating'] = [
- '@type' => 'AggregateRating',
- 'ratingValue' => '4.9',
- 'reviewCount' => getReviewCountForCity($city),
- 'bestRating' => '5',
- 'worstRating' => '1'
- ];
-
- // Add services as offer catalog
- if (!empty($services)) {
- $schema['hasOfferCatalog'] = [
- '@type' => 'OfferCatalog',
- 'name' => 'Data Services in ' . $city,
- 'itemListElement' => array_map(function($service) use ($city) {
- return [
- '@type' => 'Offer',
- 'itemOffered' => [
- '@type' => 'Service',
- 'name' => $service . ' ' . $city
- ]
- ];
- }, $services)
- ];
- }
-
- return '';
-}
-
-/**
- * Get estimated review count for a city (for schema purposes)
- */
-function getReviewCountForCity($city) {
- $reviewCounts = [
- 'London' => 87,
- 'Manchester' => 45,
- 'Birmingham' => 38,
- 'Edinburgh' => 25,
- 'Cardiff' => 18
- ];
- return $reviewCounts[$city] ?? 20;
-}
-
-/**
- * Predefined location configurations
- */
-$locationConfigs = [
- 'london' => [
- 'city' => 'London',
- 'region' => 'Greater London',
- 'latitude' => 51.5074,
- 'longitude' => -0.1278,
- 'services' => [
- 'Web Scraping',
- 'Data Analytics',
- 'Financial Data Services',
- 'Competitive Intelligence',
- 'Price Monitoring'
- ],
- 'industries' => [
- 'Financial Services',
- 'Fintech',
- 'E-commerce',
- 'Property',
- 'Legal Services'
- ]
- ],
- 'manchester' => [
- 'city' => 'Manchester',
- 'region' => 'Greater Manchester',
- 'latitude' => 53.4808,
- 'longitude' => -2.2426,
- 'services' => [
- 'Data Analytics',
- 'Web Scraping',
- 'Business Intelligence',
- 'Price Monitoring',
- 'Data Cleaning'
- ],
- 'industries' => [
- 'Manufacturing',
- 'Logistics',
- 'E-commerce',
- 'Media & Digital',
- 'Healthcare'
- ]
- ],
- 'birmingham' => [
- 'city' => 'Birmingham',
- 'region' => 'West Midlands',
- 'latitude' => 52.4862,
- 'longitude' => -1.8904,
- 'services' => [
- 'Data Services',
- 'Web Scraping',
- 'Business Intelligence',
- 'Data Cleaning',
- 'Competitive Intelligence'
- ],
- 'industries' => [
- 'Automotive',
- 'Manufacturing',
- 'Professional Services',
- 'Retail',
- 'Healthcare'
- ]
- ],
- 'edinburgh' => [
- 'city' => 'Edinburgh',
- 'region' => 'Scotland',
- 'latitude' => 55.9533,
- 'longitude' => -3.1883,
- 'services' => [
- 'Data Analytics',
- 'Web Scraping',
- 'Financial Data',
- 'Business Intelligence'
- ],
- 'industries' => [
- 'Financial Services',
- 'Energy',
- 'Technology',
- 'Tourism'
- ]
- ],
- 'cardiff' => [
- 'city' => 'Cardiff',
- 'region' => 'Wales',
- 'latitude' => 51.4816,
- 'longitude' => -3.1791,
- 'services' => [
- 'Data Services',
- 'Web Scraping',
- 'Business Intelligence',
- 'Data Cleaning'
- ],
- 'industries' => [
- 'Public Sector',
- 'Financial Services',
- 'Media',
- 'Manufacturing'
- ]
- ]
-];
-
-// If $locationData is set, output the schema automatically
-if (isset($locationData) && is_array($locationData)) {
- echo generateLocalBusinessSchema(
- $locationData['city'],
- $locationData['region'],
- $locationData['services'] ?? [],
- $locationData['latitude'] ?? null,
- $locationData['longitude'] ?? null
- );
-}
diff --git a/includes.bak.20260210/schema/organization-schema.php b/includes.bak.20260210/schema/organization-schema.php
deleted file mode 100644
index 2766e87..0000000
--- a/includes.bak.20260210/schema/organization-schema.php
+++ /dev/null
@@ -1,108 +0,0 @@
- of every page
- *
- */
-
-$organizationSchema = [
- '@context' => 'https://schema.org',
- '@type' => 'Organization',
- '@id' => 'https://ukdataservices.co.uk/#organization',
- 'name' => 'UK Data Services',
- 'legalName' => 'UK Data Services Limited',
- 'url' => 'https://ukdataservices.co.uk',
- 'logo' => [
- '@type' => 'ImageObject',
- 'url' => 'https://ukdataservices.co.uk/assets/images/ukds-main-logo.png',
- 'width' => 300,
- 'height' => 100
- ],
- 'image' => 'https://ukdataservices.co.uk/assets/images/ukds-main-logo.png',
- 'description' => 'Enterprise web scraping and data analytics services for UK businesses. Specialising in competitive intelligence, price monitoring, and GDPR-compliant data extraction.',
- 'telephone' => '+44 1692 689150',
- 'email' => 'info@ukdataservices.co.uk',
- 'address' => [
- '@type' => 'PostalAddress',
- 'streetAddress' => 'Professional Data Services Centre',
- 'addressLocality' => 'London',
- 'addressRegion' => 'England',
- 'postalCode' => 'EC1A 1BB',
- 'addressCountry' => 'GB'
- ],
- 'geo' => [
- '@type' => 'GeoCoordinates',
- 'latitude' => 51.5074,
- 'longitude' => -0.1278
- ],
- 'areaServed' => [
- [
- '@type' => 'Country',
- 'name' => 'United Kingdom'
- ],
- [
- '@type' => 'City',
- 'name' => 'London'
- ],
- [
- '@type' => 'City',
- 'name' => 'Manchester'
- ],
- [
- '@type' => 'City',
- 'name' => 'Birmingham'
- ],
- [
- '@type' => 'City',
- 'name' => 'Edinburgh'
- ],
- [
- '@type' => 'City',
- 'name' => 'Cardiff'
- ]
- ],
- 'sameAs' => [
- 'https://www.linkedin.com/company/ukdataservices',
- 'https://twitter.com/ukdataservices'
- ],
- 'contactPoint' => [
- [
- '@type' => 'ContactPoint',
- 'telephone' => '+44 1692 689150',
- 'contactType' => 'sales',
- 'availableLanguage' => 'English',
- 'areaServed' => 'GB',
- 'hoursAvailable' => [
- '@type' => 'OpeningHoursSpecification',
- 'dayOfWeek' => ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
- 'opens' => '09:00',
- 'closes' => '17:30'
- ]
- ],
- [
- '@type' => 'ContactPoint',
- 'email' => 'info@ukdataservices.co.uk',
- 'contactType' => 'customer service',
- 'availableLanguage' => 'English',
- 'areaServed' => 'GB'
- ]
- ],
- 'foundingDate' => '2018',
- 'numberOfEmployees' => [
- '@type' => 'QuantitativeValue',
- 'value' => '15'
- ],
- 'aggregateRating' => [
- '@type' => 'AggregateRating',
- 'ratingValue' => '4.9',
- 'reviewCount' => '127',
- 'bestRating' => '5',
- 'worstRating' => '1'
- ]
-];
-?>
-
diff --git a/includes.bak.20260210/schema/review-schema.php b/includes.bak.20260210/schema/review-schema.php
deleted file mode 100644
index bec907d..0000000
--- a/includes.bak.20260210/schema/review-schema.php
+++ /dev/null
@@ -1,196 +0,0 @@
- 'John Smith', 'reviewBody' => 'Great service!', 'ratingValue' => 5],
- * ['author' => 'Jane Doe', 'reviewBody' => 'Excellent work', 'ratingValue' => 5]
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/review-schema.php');
- */
-
-/**
- * Generate Review Schema JSON-LD with AggregateRating
- *
- * @param array $reviews Array of review data
- * @param string $itemName Name of the item being reviewed
- * @param string $itemType Schema type (Organization, Service, Product, etc.)
- * @param string|null $itemUrl URL of the item being reviewed
- * @return string JSON-LD script tag
- */
-function generateReviewSchema($reviews, $itemName = 'UK Data Services', $itemType = 'Organization', $itemUrl = null) {
- if (empty($reviews)) {
- return '';
- }
-
- $baseUrl = 'https://ukdataservices.co.uk';
-
- // Calculate aggregate rating
- $totalRating = 0;
- $reviewCount = count($reviews);
- foreach ($reviews as $review) {
- $totalRating += $review['ratingValue'] ?? 5;
- }
- $averageRating = round($totalRating / $reviewCount, 1);
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => $itemType,
- 'name' => $itemName,
- 'url' => $itemUrl ?? $baseUrl,
- 'aggregateRating' => [
- '@type' => 'AggregateRating',
- 'ratingValue' => number_format($averageRating, 1),
- 'reviewCount' => $reviewCount,
- 'bestRating' => '5',
- 'worstRating' => '1'
- ],
- 'review' => array_map(function($review) {
- $reviewSchema = [
- '@type' => 'Review',
- 'author' => [
- '@type' => 'Person',
- 'name' => $review['author']
- ],
- 'reviewRating' => [
- '@type' => 'Rating',
- 'ratingValue' => $review['ratingValue'] ?? 5,
- 'bestRating' => '5',
- 'worstRating' => '1'
- ],
- 'reviewBody' => $review['reviewBody']
- ];
-
- // Add date if provided
- if (isset($review['datePublished'])) {
- $reviewSchema['datePublished'] = $review['datePublished'];
- }
-
- // Add job title/role if provided
- if (isset($review['authorRole'])) {
- $reviewSchema['author']['jobTitle'] = $review['authorRole'];
- }
-
- return $reviewSchema;
- }, $reviews)
- ];
-
- return '';
-}
-
-/**
- * Generate standalone AggregateRating schema (without individual reviews)
- */
-function generateAggregateRatingSchema($itemName, $itemType, $ratingValue, $reviewCount, $itemUrl = null) {
- $baseUrl = 'https://ukdataservices.co.uk';
-
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => $itemType,
- 'name' => $itemName,
- 'url' => $itemUrl ?? $baseUrl,
- 'aggregateRating' => [
- '@type' => 'AggregateRating',
- 'ratingValue' => number_format($ratingValue, 1),
- 'reviewCount' => $reviewCount,
- 'bestRating' => '5',
- 'worstRating' => '1'
- ]
- ];
-
- return '';
-}
-
-/**
- * Predefined testimonials for the homepage and service pages
- */
-$siteTestimonials = [
- [
- 'author' => 'James Mitchell',
- 'authorRole' => 'Retail Director, London Fashion Group',
- 'reviewBody' => 'UK Data Services transformed our competitor analysis process. Their web scraping accuracy and speed helped us make better pricing decisions. We\'ve seen a 23% improvement in our market positioning since working with them.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-09-15'
- ],
- [
- 'author' => 'Sarah Chen',
- 'authorRole' => 'Head of Strategy, City Fintech Ltd',
- 'reviewBody' => 'Outstanding data analytics service. They helped us understand our market position and identify opportunities we\'d completely missed. The team\'s expertise in financial data and GDPR compliance gave us complete confidence.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-08-22'
- ],
- [
- 'author' => 'Michael Thompson',
- 'authorRole' => 'Managing Partner, London Property Advisors',
- 'reviewBody' => 'Professional, GDPR-compliant, and incredibly responsive. Their property data extraction service has become essential to our London operations. The 99.8% accuracy rate they promised was actually exceeded in our experience.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-07-10'
- ],
- [
- 'author' => 'Emma Williams',
- 'authorRole' => 'CEO, Manchester Logistics Solutions',
- 'reviewBody' => 'Exceptional service quality. The data cleaning and validation work they did on our supply chain database saved us thousands in operational costs. Highly recommend for any Manchester business.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-06-28'
- ],
- [
- 'author' => 'David Brown',
- 'authorRole' => 'Director of Analytics, Birmingham Manufacturing Co',
- 'reviewBody' => 'We needed complex automotive parts pricing data across multiple European suppliers. UK Data Services delivered beyond expectations with excellent accuracy and compliance documentation.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-05-15'
- ],
- [
- 'author' => 'Laura Johnson',
- 'authorRole' => 'Marketing Director, Scottish Energy Corp',
- 'reviewBody' => 'Their competitive intelligence service gave us insights into market movements we couldn\'t have obtained otherwise. Professional team with deep technical expertise.',
- 'ratingValue' => 5,
- 'datePublished' => '2024-04-20'
- ]
-];
-
-/**
- * Service-specific testimonials
- */
-$serviceTestimonials = [
- 'web-scraping' => [
- [
- 'author' => 'Robert Harris',
- 'authorRole' => 'CTO, E-commerce Solutions Ltd',
- 'reviewBody' => 'Their web scraping capabilities are world-class. They handled complex JavaScript-rendered pages with ease and delivered clean, accurate data exactly as specified.',
- 'ratingValue' => 5
- ]
- ],
- 'price-monitoring' => [
- [
- 'author' => 'Sophie Turner',
- 'authorRole' => 'Pricing Manager, UK Retail Chain',
- 'reviewBody' => 'The price monitoring alerts have revolutionized how we respond to competitor pricing. We now react in hours instead of days.',
- 'ratingValue' => 5
- ]
- ],
- 'data-cleaning' => [
- [
- 'author' => 'Mark Stevens',
- 'authorRole' => 'Data Manager, Healthcare Analytics',
- 'reviewBody' => 'They cleaned and standardized over 2 million patient records with 99.9% accuracy. The improvement in our data quality has been transformational.',
- 'ratingValue' => 5
- ]
- ]
-];
-
-// If $reviews is set, output the schema automatically
-if (isset($reviews) && is_array($reviews)) {
- echo generateReviewSchema(
- $reviews,
- $reviewItemName ?? 'UK Data Services',
- $reviewItemType ?? 'Organization',
- $reviewItemUrl ?? null
- );
-}
diff --git a/includes.bak.20260210/schema/service-schema.php b/includes.bak.20260210/schema/service-schema.php
deleted file mode 100644
index c79ed45..0000000
--- a/includes.bak.20260210/schema/service-schema.php
+++ /dev/null
@@ -1,223 +0,0 @@
- 'Web Scraping Services',
- * 'description' => 'Professional web scraping services...',
- * 'url' => 'https://ukdataservices.co.uk/services/web-scraping',
- * 'serviceType' => 'Web Scraping',
- * 'priceRange' => '500-50000',
- * 'features' => ['Feature 1', 'Feature 2']
- * ];
- * include($_SERVER['DOCUMENT_ROOT'] . '/includes/schema/service-schema.php');
- */
-
-/**
- * Generate Service Schema JSON-LD
- *
- * @param string $serviceName The name of the service
- * @param string $serviceDescription A detailed description of the service
- * @param string $serviceUrl The canonical URL of the service page
- * @param string $serviceType The type/category of service
- * @param string|null $priceRange Optional price range (e.g., "500-50000")
- * @param array $features Optional array of service features
- * @return string JSON-LD script tag
- */
-function generateServiceSchema($serviceName, $serviceDescription, $serviceUrl, $serviceType, $priceRange = null, $features = []) {
- $schema = [
- '@context' => 'https://schema.org',
- '@type' => 'Service',
- '@id' => $serviceUrl . '#service',
- 'name' => $serviceName,
- 'description' => $serviceDescription,
- 'url' => $serviceUrl,
- 'serviceType' => $serviceType,
- 'provider' => [
- '@type' => 'Organization',
- '@id' => 'https://ukdataservices.co.uk/#organization',
- 'name' => 'UK Data Services',
- 'url' => 'https://ukdataservices.co.uk'
- ],
- 'areaServed' => [
- '@type' => 'Country',
- 'name' => 'United Kingdom'
- ],
- 'availableChannel' => [
- '@type' => 'ServiceChannel',
- 'serviceUrl' => 'https://ukdataservices.co.uk/quote',
- 'servicePhone' => '+44 1692 689150',
- 'availableLanguage' => 'English'
- ]
- ];
-
- // Add price specification if provided
- if ($priceRange) {
- $prices = explode('-', $priceRange);
- $schema['offers'] = [
- '@type' => 'Offer',
- 'priceCurrency' => 'GBP',
- 'priceSpecification' => [
- '@type' => 'PriceSpecification',
- 'minPrice' => (float)$prices[0],
- 'maxPrice' => isset($prices[1]) ? (float)$prices[1] : null,
- 'priceCurrency' => 'GBP'
- ],
- 'availability' => 'https://schema.org/InStock',
- 'validFrom' => date('Y-m-d')
- ];
- }
-
- // Add features/service output if provided
- if (!empty($features)) {
- $schema['hasOfferCatalog'] = [
- '@type' => 'OfferCatalog',
- 'name' => $serviceName . ' Features',
- 'itemListElement' => array_map(function($feature) {
- return [
- '@type' => 'Offer',
- 'itemOffered' => [
- '@type' => 'Service',
- 'name' => $feature
- ]
- ];
- }, $features)
- ];
- }
-
- return '';
-}
-
-/**
- * Predefined service configurations for consistency
- */
-$serviceConfigs = [
- 'web-scraping' => [
- 'name' => 'Web Scraping Services UK',
- 'description' => 'Professional web scraping and data extraction services for UK businesses. Automated data collection from websites with 99.8% accuracy and full GDPR compliance.',
- 'url' => 'https://ukdataservices.co.uk/services/web-scraping',
- 'serviceType' => 'Web Scraping',
- 'priceRange' => '500-50000',
- 'features' => [
- 'Automated data extraction',
- 'Real-time monitoring',
- 'GDPR-compliant collection',
- 'Custom API delivery',
- 'Multi-format output'
- ]
- ],
- 'competitive-intelligence' => [
- 'name' => 'Competitive Intelligence Services UK',
- 'description' => 'Strategic competitive intelligence and market analysis services. Monitor competitors, track market trends, and gain actionable business insights.',
- 'url' => 'https://ukdataservices.co.uk/services/competitive-intelligence',
- 'serviceType' => 'Competitive Intelligence',
- 'priceRange' => '1000-25000',
- 'features' => [
- 'Competitor monitoring',
- 'Market trend analysis',
- 'Price tracking',
- 'Product intelligence',
- 'Strategic reporting'
- ]
- ],
- 'price-monitoring' => [
- 'name' => 'Price Monitoring Services UK',
- 'description' => 'Real-time price monitoring and competitor price tracking services. E-commerce pricing intelligence for UK retailers and brands.',
- 'url' => 'https://ukdataservices.co.uk/services/price-monitoring',
- 'serviceType' => 'Price Monitoring',
- 'priceRange' => '500-15000',
- 'features' => [
- 'Real-time price tracking',
- 'Competitor price alerts',
- 'MAP monitoring',
- 'Historical price analysis',
- 'Automated reporting'
- ]
- ],
- 'data-cleaning' => [
- 'name' => 'Data Cleaning & Validation Services UK',
- 'description' => 'Professional data cleaning, validation, and standardisation services. Transform messy data into accurate, structured datasets.',
- 'url' => 'https://ukdataservices.co.uk/services/data-cleaning',
- 'serviceType' => 'Data Cleaning',
- 'priceRange' => '500-20000',
- 'features' => [
- 'Duplicate removal',
- 'Data standardisation',
- 'Format validation',
- 'Error correction',
- 'Quality assurance'
- ]
- ],
- 'data-analytics' => [
- 'name' => 'Data Analytics Services UK',
- 'description' => 'Business intelligence and data analytics solutions for UK enterprises. Transform raw data into actionable insights.',
- 'url' => 'https://ukdataservices.co.uk/services/data-analytics',
- 'serviceType' => 'Data Analytics',
- 'priceRange' => '1000-30000',
- 'features' => [
- 'Business intelligence',
- 'Predictive analytics',
- 'Custom dashboards',
- 'Data visualisation',
- 'Strategic insights'
- ]
- ],
- 'api-development' => [
- 'name' => 'API Development Services UK',
- 'description' => 'Custom API development and data integration services. Build robust APIs to connect your systems and automate data workflows.',
- 'url' => 'https://ukdataservices.co.uk/services/api-development',
- 'serviceType' => 'API Development',
- 'priceRange' => '2000-40000',
- 'features' => [
- 'Custom API design',
- 'System integration',
- 'Real-time data feeds',
- 'Authentication systems',
- 'Documentation'
- ]
- ],
- 'property-data-extraction' => [
- 'name' => 'UK Property Data Extraction Services',
- 'description' => 'Professional property data extraction from UK property portals including Rightmove, Zoopla, and OnTheMarket. GDPR-compliant property market intelligence.',
- 'url' => 'https://ukdataservices.co.uk/services/property-data-extraction',
- 'serviceType' => 'Property Data Extraction',
- 'priceRange' => '1000-25000',
- 'features' => [
- 'Property portal data extraction',
- 'Market analysis',
- 'Investment research data',
- 'Rental market intelligence',
- 'Commercial property data'
- ]
- ],
- 'financial-data-services' => [
- 'name' => 'Financial Data Services UK',
- 'description' => 'FCA-aware financial data services for hedge funds, asset managers, and investment firms. Market data extraction and alternative data solutions.',
- 'url' => 'https://ukdataservices.co.uk/services/financial-data-services',
- 'serviceType' => 'Financial Data Services',
- 'priceRange' => '5000-100000',
- 'features' => [
- 'Market data extraction',
- 'Alternative data feeds',
- 'Securities monitoring',
- 'Compliance-aware collection',
- 'API delivery'
- ]
- ]
-];
-
-// If $serviceData is set, output the schema automatically
-if (isset($serviceData) && is_array($serviceData)) {
- echo generateServiceSchema(
- $serviceData['name'],
- $serviceData['description'],
- $serviceData['url'],
- $serviceData['serviceType'],
- $serviceData['priceRange'] ?? null,
- $serviceData['features'] ?? []
- );
-}
diff --git a/includes.bak.20260210/url-config.php b/includes.bak.20260210/url-config.php
deleted file mode 100644
index 784d355..0000000
--- a/includes.bak.20260210/url-config.php
+++ /dev/null
@@ -1,233 +0,0 @@
- '/',
- 'about' => '/about',
- 'quote' => '/quote',
- 'faq' => '/faq',
- 'blog' => '/blog',
- 'contact' => '/#contact',
- 'project-types' => '/project-types',
- 'case-studies' => '/case-studies',
-
- // Services
- 'services' => [
- 'index' => '/#services',
- 'web-scraping' => '/services/web-scraping',
- 'competitive-intelligence' => '/services/competitive-intelligence',
- 'price-monitoring' => '/services/price-monitoring',
- 'data-cleaning' => '/services/data-cleaning',
- 'data-analytics' => '/services/data-analytics',
- 'api-development' => '/services/api-development',
- 'property-data-extraction' => '/services/property-data-extraction',
- 'financial-data-services' => '/services/financial-data-services'
- ],
-
- // Locations
- 'locations' => [
- 'index' => '/locations',
- 'london' => '/locations/london',
- 'manchester' => '/locations/manchester',
- 'birmingham' => '/locations/birmingham',
- 'edinburgh' => '/locations/edinburgh',
- 'cardiff' => '/locations/cardiff'
- ],
-
- // Blog categories
- 'blog-categories' => [
- 'web-scraping' => '/blog/categories/web-scraping',
- 'data-analytics' => '/blog/categories/data-analytics',
- 'business-intelligence' => '/blog/categories/business-intelligence',
- 'compliance' => '/blog/categories/compliance',
- 'industry-insights' => '/blog/categories/industry-insights',
- 'technology' => '/blog/categories/technology',
- 'case-studies' => '/blog/categories/case-studies'
- ],
-
- // Legal pages
- 'legal' => [
- 'privacy-policy' => '/privacy-policy',
- 'terms-of-service' => '/terms-of-service',
- 'cookie-policy' => '/cookie-policy',
- 'gdpr-compliance' => '/gdpr-compliance'
- ]
-];
-
-/**
- * Service metadata for internal linking and SEO
- */
-$serviceData = [
- 'web-scraping' => [
- 'url' => '/services/web-scraping',
- 'title' => 'Web Scraping Services',
- 'shortTitle' => 'Web Scraping',
- 'description' => 'Professional web scraping and data extraction services',
- 'icon' => 'icon-web-scraping-v2.svg'
- ],
- 'competitive-intelligence' => [
- 'url' => '/services/competitive-intelligence',
- 'title' => 'Competitive Intelligence',
- 'shortTitle' => 'Competitive Intelligence',
- 'description' => 'Market analysis and competitor monitoring services',
- 'icon' => 'icon-analytics.svg'
- ],
- 'price-monitoring' => [
- 'url' => '/services/price-monitoring',
- 'title' => 'Price Monitoring',
- 'shortTitle' => 'Price Monitoring',
- 'description' => 'Real-time price tracking and competitor pricing alerts',
- 'icon' => 'icon-price-monitoring.svg'
- ],
- 'data-cleaning' => [
- 'url' => '/services/data-cleaning',
- 'title' => 'Data Cleaning & Validation',
- 'shortTitle' => 'Data Cleaning',
- 'description' => 'Professional data cleaning and quality assurance',
- 'icon' => 'icon-data-processing.svg'
- ],
- 'data-analytics' => [
- 'url' => '/services/data-analytics',
- 'title' => 'Data Analytics',
- 'shortTitle' => 'Analytics',
- 'description' => 'Business intelligence and data analytics solutions',
- 'icon' => 'icon-analytics.svg'
- ],
- 'api-development' => [
- 'url' => '/services/api-development',
- 'title' => 'API Development',
- 'shortTitle' => 'API Development',
- 'description' => 'Custom API development and system integration',
- 'icon' => 'icon-automation.svg'
- ],
- 'property-data-extraction' => [
- 'url' => '/services/property-data-extraction',
- 'title' => 'Property Data Extraction',
- 'shortTitle' => 'Property Data',
- 'description' => 'UK property market data from Rightmove, Zoopla, OnTheMarket',
- 'icon' => 'icon-property.svg'
- ],
- 'financial-data-services' => [
- 'url' => '/services/financial-data-services',
- 'title' => 'Financial Data Services',
- 'shortTitle' => 'Financial Data',
- 'description' => 'FCA-compliant financial and market data extraction',
- 'icon' => 'icon-financial.svg'
- ]
-];
-
-/**
- * Location metadata for internal linking
- */
-$locationData = [
- 'london' => [
- 'url' => '/locations/london',
- 'title' => 'London',
- 'region' => 'Greater London',
- 'description' => 'Web scraping and data analytics services in London'
- ],
- 'manchester' => [
- 'url' => '/locations/manchester',
- 'title' => 'Manchester',
- 'region' => 'Greater Manchester',
- 'description' => 'Data analytics and web scraping services in Manchester'
- ],
- 'birmingham' => [
- 'url' => '/locations/birmingham',
- 'title' => 'Birmingham',
- 'region' => 'West Midlands',
- 'description' => 'Data services and business intelligence in Birmingham'
- ],
- 'edinburgh' => [
- 'url' => '/locations/edinburgh',
- 'title' => 'Edinburgh',
- 'region' => 'Scotland',
- 'description' => 'Data analytics and web scraping services in Edinburgh'
- ],
- 'cardiff' => [
- 'url' => '/locations/cardiff',
- 'title' => 'Cardiff',
- 'region' => 'Wales',
- 'description' => 'Data services and business intelligence in Cardiff'
- ]
-];
-
-/**
- * Related services mapping for cross-linking
- */
-$relatedServices = [
- 'web-scraping' => ['competitive-intelligence', 'price-monitoring', 'data-cleaning'],
- 'competitive-intelligence' => ['web-scraping', 'price-monitoring', 'data-analytics'],
- 'price-monitoring' => ['web-scraping', 'competitive-intelligence', 'data-analytics'],
- 'data-cleaning' => ['web-scraping', 'data-analytics', 'api-development'],
- 'data-analytics' => ['competitive-intelligence', 'data-cleaning', 'api-development'],
- 'api-development' => ['web-scraping', 'data-cleaning', 'data-analytics'],
- 'property-data-extraction' => ['web-scraping', 'data-cleaning', 'competitive-intelligence'],
- 'financial-data-services' => ['web-scraping', 'data-analytics', 'api-development']
-];
-
-/**
- * Get full URL with base URL
- *
- * @param string $path Relative path
- * @return string Full URL
- */
-function getFullUrl($path) {
- global $baseUrl;
- return $baseUrl . $path;
-}
-
-/**
- * Get service URL by key
- *
- * @param string $serviceKey Service identifier
- * @return string Service URL
- */
-function getServiceUrl($serviceKey) {
- global $urlMap;
- return $urlMap['services'][$serviceKey] ?? '/#services';
-}
-
-/**
- * Get location URL by key
- *
- * @param string $locationKey Location identifier
- * @return string Location URL
- */
-function getLocationUrl($locationKey) {
- global $urlMap;
- return $urlMap['locations'][$locationKey] ?? '/';
-}
-
-/**
- * Get related services for a given service
- *
- * @param string $serviceKey Current service key
- * @return array Array of related service data
- */
-function getRelatedServices($serviceKey) {
- global $relatedServices, $serviceData;
-
- $related = $relatedServices[$serviceKey] ?? [];
- $result = [];
-
- foreach ($related as $relatedKey) {
- if (isset($serviceData[$relatedKey])) {
- $result[] = $serviceData[$relatedKey];
- }
- }
-
- return $result;
-}
diff --git a/includes.bak.20260210/article-footer.php b/includes/article-footer.php.bak.20260222
similarity index 100%
rename from includes.bak.20260210/article-footer.php
rename to includes/article-footer.php.bak.20260222
diff --git a/index.php b/index.php
index 11b294d..5b48bb1 100644
--- a/index.php
+++ b/index.php
@@ -18,7 +18,7 @@ header('Content-Security-Policy: default-src \'self\'; script-src \'self\' \'uns
// SEO and performance optimizations
$page_title = "Web Scraping Services UK | Get Your Free Quote Today";
-$page_description = "GDPR-compliant web scraping & data analytics for UK businesses. 99.8% accuracy, competitive pricing data. Get your free quote today.";
+$page_description = "Custom web scraping & data extraction for UK businesses. Competitor prices, property listings, market data — delivered clean, structured, on schedule. No contract. Free quote.";
$canonical_url = "https://ukdataservices.co.uk/";
$keywords = "web scraping services UK, data analytics London, web scraping UK, data extraction services, business intelligence, competitive analysis, price monitoring, data analytics Manchester, market research, web data mining, GDPR compliant scraping, enterprise data solutions, automated data collection UK";
$author = "UK Data Services";
diff --git a/sitemap-blog.xml b/sitemap-blog.xml
index 791358a..d81109b 100644
--- a/sitemap-blog.xml
+++ b/sitemap-blog.xml
@@ -1,311 +1,250 @@
-
-
-
- https://ukdataservices.co.uk/blog/
- 2025-08-08
- weekly
- 0.9
-
-
-
-
- https://ukdataservices.co.uk/blog/search.php
- 2025-06-08
- weekly
- 0.6
-
-
-
-
- https://ukdataservices.co.uk/blog/categories/web-scraping.php
- 2025-06-08
- weekly
- 0.7
-
-
- https://ukdataservices.co.uk/blog/categories/data-analytics.php
- 2025-06-08
- weekly
- 0.7
-
-
- https://ukdataservices.co.uk/blog/categories/business-intelligence.php
- 2025-06-08
- weekly
- 0.7
-
-
- https://ukdataservices.co.uk/blog/categories/compliance.php
- 2025-06-08
- weekly
- 0.7
-
-
- https://ukdataservices.co.uk/blog/categories/technology.php
- 2025-06-08
- weekly
- 0.7
-
-
- https://ukdataservices.co.uk/blog/categories/case-studies.php
- 2025-06-08
- weekly
- 0.7
-
-
- https://ukdataservices.co.uk/blog/categories/industry-insights.php
- 2025-06-08
- weekly
- 0.7
-
-
-
-
- https://ukdataservices.co.uk/blog/articles/web-scraping-compliance-uk-guide.php
- 2025-06-08
- monthly
- 0.9
-
-
- https://ukdataservices.co.uk/blog/articles/ai-powered-data-extraction.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/business-intelligence-dashboard-design.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/cloud-native-scraping-architecture.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/competitive-intelligence-roi-metrics.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/data-automation-strategies-uk-businesses.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/data-protection-impact-assessments.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/data-quality-validation-pipelines.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/data-subject-rights-management.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/database-optimization-big-data.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/ecommerce-trends-uk-2025.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/financial-services-data-transformation.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/fintech-market-analysis-uk.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/gdpr-data-minimisation-practices.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/handling-captchas-scraping.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/healthcare-research-data-collection.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/international-data-transfers-uk.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/javascript-heavy-sites-scraping.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/kubernetes-scraping-deployment.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/manufacturing-data-transformation.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/manufacturing-supply-chain-optimization.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/media-content-aggregation-platform.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/predictive-analytics-customer-churn.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/property-data-aggregation-success.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/python-data-pipeline-tools-2025.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/python-scrapy-enterprise-guide.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/real-time-analytics-streaming-data.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/real-time-analytics-streaming.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/retail-competitor-monitoring-case.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/retail-price-monitoring-strategies.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/selenium-vs-playwright-comparison.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/sql-analytics-advanced-techniques.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/uk-cookie-law-compliance.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/uk-property-market-data-trends.php
- 2025-06-08
- monthly
- 0.8
-
-
- https://ukdataservices.co.uk/blog/articles/web-scraping-rate-limiting.php
- 2025-06-08
- monthly
- 0.8
-
-
-
-
- https://ukdataservices.co.uk/blog/articles/web-scraping-services-uk-complete-buyers-guide.php
- 2025-08-08
- monthly
- 0.9
-
-
- https://ukdataservices.co.uk/blog/articles/data-analytics-companies-london-top-providers-compared.php
- 2025-08-08
- monthly
- 0.9
-
-
- https://ukdataservices.co.uk/blog/articles/business-intelligence-consultants-uk-selection-guide.php
- 2025-08-08
- monthly
- 0.9
-
-
- https://ukdataservices.co.uk/blog/articles/competitor-price-monitoring-software-build-vs-buy-analysis.php
- 2025-08-08
- monthly
- 0.9
-
-
- https://ukdataservices.co.uk/blog/articles/real-time-data-extraction-technical-guide-uk-businesses.php
- 2025-08-08
- monthly
- 0.9
-
-
-
\ No newline at end of file
+ xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">
+
+ https://ukdataservices.co.uk/blog/articles/ai-powered-data-extraction
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/business-intelligence-consultants-uk-selection-guide
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/business-intelligence-dashboard-design
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/cloud-native-scraping-architecture
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/competitive-intelligence-roi-metrics
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/competitor-price-monitoring-software-build-vs-buy-analysis
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/data-analytics-companies-london-top-providers-compared
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/data-automation-strategies-uk-businesses
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/data-protection-impact-assessments
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/data-quality-validation-pipelines
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/data-subject-rights-management
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/database-optimization-big-data
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/ecommerce-trends-uk-2025
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/financial-services-data-transformation
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/fintech-market-analysis-uk
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/free-web-scraping-tools-launch
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/gdpr-data-minimisation-practices
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/handling-captchas-scraping
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/healthcare-research-data-collection
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/international-data-transfers-uk
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/javascript-heavy-sites-scraping
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/kubernetes-scraping-deployment
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/manufacturing-data-transformation
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/manufacturing-supply-chain-optimization
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/media-content-aggregation-platform
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/predictive-analytics-customer-churn
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/property-data-aggregation-success
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/python-data-pipeline-tools-2025
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/python-scrapy-enterprise-guide
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/real-time-analytics-streaming-data
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/real-time-analytics-streaming
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/real-time-data-extraction-technical-guide-uk-businesses
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/retail-competitor-monitoring-case
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/retail-price-monitoring-strategies
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/selenium-vs-playwright-comparison
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/sql-analytics-advanced-techniques
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/uk-cookie-law-compliance
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/uk-property-market-data-trends
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/web-scraping-compliance-uk-guide
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/web-scraping-rate-limiting
+ 2026-02-22
+ monthly
+ 0.7
+
+
+ https://ukdataservices.co.uk/blog/articles/web-scraping-services-uk-complete-buyers-guide
+ 2026-02-22
+ monthly
+ 0.7
+
+