Skip to content
← Back to Functions
Code

Breadcrumb Schema Builder

Builds breadcrumb JSON-LD from route hierarchy.

Function signature

ogBuildBreadcrumbSchemaData(breadcrumbs = array(), options = array())

Categories

  • Database Integrity

Parameters

breadcrumbsOrdered breadcrumb rows with names and URLs.optionsOptional documented policy controls for the helper.

Return value

Public-safe status string returned by the function for controller branching or logging.

  • success
  • message
  • data

Compatibility

Existing function name, slug, path, and call order preserved; advertised metadata corrected to the actual source behavior.

Minimum PHP version: 7.4

Security notes

Use caller-owned allowlists and context-specific escaping; validate file paths, routes, email tokens, cart totals, discount rules, and tax-region rules before production use.

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.
 */

/**
 * Builds breadcrumb JSON-LD from route hierarchy.
 *
 * Primary use case: SEO breadcrumbs.
 * Typical inputs: breadcrumb labels and URLs.
 * Typical output: schema array.
 *
 * Implementation note: Keep visible breadcrumbs and schema consistent.
 *
 * @return array Structured result data with success, message, and data keys.
 */
function ogBuildBreadcrumbSchemaData($breadcrumbs = array(), $options = array()) {
	$result = array(
		'success' => false,
		'message' => '',
		'data' => array()
	);

	if (!is_array($breadcrumbs)) {
		$result['message'] = 'Breadcrumbs must be supplied as an array.';
		return $result;
	}
	if (!is_array($options)) {
		$options = array();
	}

	$items = array();
	$position = 1;
	foreach ($breadcrumbs as $breadcrumb) {
		if (!is_array($breadcrumb)) {
			continue;
		}
		$name = '';
		if (!empty($breadcrumb['name'])) {
			$name = trim(strip_tags((string)$breadcrumb['name']));
		}
		$url = '';
		if (!empty($breadcrumb['url'])) {
			$url = trim((string)$breadcrumb['url']);
		}
		if (empty($name) || empty($url)) {
			continue;
		}
		if (!preg_match('/^(\/\/|https:\/\/)/i', $url)) {
			continue;
		}

		$items[] = array(
			'@type' => 'ListItem',
			'position' => $position,
			'name' => $name,
			'item' => $url
		);
		$position++;
	}

	if (empty($items)) {
		$result['message'] = 'No valid breadcrumb entries were supplied.';
		return $result;
	}

	$schema = array(
		'@context' => 'https://schema.org',
		'@type' => 'BreadcrumbList',
		'itemListElement' => $items
	);

	$result['success'] = true;
	$result['message'] = 'Breadcrumb schema data built.';
	$result['data'] = array('schema' => $schema);

	return $result;
}