From aeea65423c3f892f485673ff3dc90b49e24b41c6 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Tue, 23 Jun 2026 11:24:56 -0500 Subject: [PATCH] feat: add VideoObject JSON-LD schema for video content Outputs VideoObject structured data when an article has a video URL set, enabling Google video rich results. Closes #67 --- .../src/Extension/MokoOG.php | 8 +++++ .../src/Helper/JsonLdBuilder.php | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/source/packages/plg_system_mokoog/src/Extension/MokoOG.php b/source/packages/plg_system_mokoog/src/Extension/MokoOG.php index e65971f..e3fbb0e 100644 --- a/source/packages/plg_system_mokoog/src/Extension/MokoOG.php +++ b/source/packages/plg_system_mokoog/src/Extension/MokoOG.php @@ -282,6 +282,14 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface $doc->addCustomTag(JsonLdBuilder::toScriptTag($schema)); } + if (!empty($ogData->og_video)) { + $videoSchema = JsonLdBuilder::buildVideo($ogData->og_video, $title, $description, $imageUrl); + + if ($videoSchema) { + $doc->addCustomTag(JsonLdBuilder::toScriptTag($videoSchema)); + } + } + if ($this->params->get('jsonld_breadcrumbs', 1)) { $breadcrumbs = JsonLdBuilder::buildBreadcrumbs(); diff --git a/source/packages/plg_system_mokoog/src/Helper/JsonLdBuilder.php b/source/packages/plg_system_mokoog/src/Helper/JsonLdBuilder.php index 7f0598a..1f304af 100644 --- a/source/packages/plg_system_mokoog/src/Helper/JsonLdBuilder.php +++ b/source/packages/plg_system_mokoog/src/Helper/JsonLdBuilder.php @@ -248,6 +248,40 @@ class JsonLdBuilder return $schema; } + /** + * Build VideoObject schema for pages with a video URL. + * + * @param string $videoUrl Video URL (e.g. YouTube, Vimeo, or direct) + * @param string $title Video title + * @param string $description Video description + * @param string $imageUrl Thumbnail image URL (absolute) + * + * @return array|null + */ + public static function buildVideo(string $videoUrl, string $title, string $description, string $imageUrl): ?array + { + if (empty($videoUrl)) { + return null; + } + + $schema = [ + '@context' => 'https://schema.org', + '@type' => 'VideoObject', + 'name' => $title, + 'description' => $description, + 'thumbnailUrl' => $imageUrl, + 'contentUrl' => $videoUrl, + 'uploadDate' => Factory::getDate()->toISO8601(), + ]; + + // Add embedUrl for YouTube and Vimeo + if (preg_match('/youtube\.com|youtu\.be|vimeo\.com/i', $videoUrl)) { + $schema['embedUrl'] = $videoUrl; + } + + return $schema; + } + /** * Encode a schema array to a JSON-LD script tag string. *