Skip to content
← Back to Snippets
Code

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']);