Canonical URL Conflict Audit
Finds conflicting canonical URLs across route records before a deploy publishes duplicate canonical signals.
Purpose
Finds conflicting canonical URLs across route records before a deploy publishes duplicate canonical signals.
Snippet details
ContextSeoLevelAdvancedCopy-and-paste statusMarked safe after review.Categories
- Security
Code
<?php
/*
* Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
* Free for personal and internal use. Paid project use requires visible credit
* to Jeffery L. Paris. Corporate use requires a paid license fee unless a
* separate written license states otherwise.
*/
/**
* Canonical URL Conflict Audit.
*
* Purpose:
* Finds conflicting canonical URLs across route records before a deploy publishes duplicate canonical signals.
*
* @param array $route_rows Route rows containing slug and canonical values.
* @return array Conflict report grouped by canonical URL.
*/
function ogSnippetCanonicalUrlConflictAudit(array $route_rows): array {
$canonical_map = array();
$conflicts = array();
$missing = array();
foreach ($route_rows as $route_row) {
$slug = '';
if (isset($route_row['slug'])) {
$slug = trim((string) $route_row['slug']);
}
$canonical = '';
if (isset($route_row['canonical'])) {
$canonical = trim((string) $route_row['canonical']);
}
if ($canonical === '') {
$missing[] = $slug;
continue;
}
if (!isset($canonical_map[$canonical])) {
$canonical_map[$canonical] = array();
}
$canonical_map[$canonical][] = $slug;
}
foreach ($canonical_map as $canonical => $slugs) {
if (count($slugs) > 1) {
$conflicts[$canonical] = $slugs;
}
}
return array(
'conflicts' => $conflicts,
'missing_canonical_slugs' => $missing,
'checked_count' => count($route_rows)
);
}
$voyager_routes = array(
array('slug' => 'delta-quadrant-map', 'canonical' => '//example.com/delta-quadrant-map'),
array('slug' => 'astrometrics-index', 'canonical' => '//example.com/delta-quadrant-map'),
array('slug' => 'warp-core-notes', 'canonical' => '')
);
$audit_report = ogSnippetCanonicalUrlConflictAudit($voyager_routes);
echo 'Canonical conflicts found: '.count($audit_report['conflicts']);