- canonical_url: sanitize via sanitizeUrl() (scheme allowlist) instead of
bare trim() — closes stored-XSS via addHeadLink() on the public frontend
- AI endpoint: replace die('Invalid Token') with a clean event result,
and strip_tags + truncate article_title to 200 chars before use
- SitemapBuilder: whitelist changefreq against the sitemap spec enum,
intval() noindex IDs, strict in_array comparison
- MokoOG: log a WARNING when sitemap.xml write fails instead of ignoring it
- Custom JSON-LD schema builder: per-article textarea for arbitrary
structured data with JSON validation. Closes#70
- AI-powered meta generation: Generate with AI buttons for OG title
and description, supports Claude and OpenAI APIs. Closes#71
- XML sitemap: auto-generates sitemap.xml on article save, respects
noindex directives. Closes#72
- Per-platform image resizing: Twitter 1200x600, Pinterest 1000x1500,
WhatsApp 400x400 alongside default Facebook 1200x630. Closes#74
- DB migration 01.05.00: adds custom_schema column
- Only emit og:video:secure_url for HTTPS URLs (review #1)
- Only emit og:video:width/height for direct files, not embeds (review #2)
- Add server-side http/https scheme validation on og_video save (review #3)
- Consolidate duplicate com_mokoshop product blocks into one (review #4)
- Fix stale com_virtuemart reference in SQL comment (review #5)
- Use COM_MOKOOG_* language keys in tag.xml instead of plugin keys (review #6)
- Add og:video meta tags with per-article video URL field and auto
MIME type detection for YouTube/Vimeo/direct files. Includes DB
migration for og_video column. (closes#59)
- Add Pinterest rich pin tags: article:tag from Joomla content tags
on article pages, product:availability from MokoSuiteShop stock
quantity on product pages. (closes#60)
- Add fediverse:creator meta tag for Mastodon/Fediverse author
attribution — first extension on any CMS to support this (closes#57)
- Add live character count indicators with green/yellow/red color
coding on OG title, description, SEO title, and meta description
fields in the article/menu editor (closes#58)
- Add LinkedIn social preview card alongside existing Facebook and
Twitter/X previews in the editor (closes#61)
- Add missing language field to batch-generated records
- Wrap batch insert in try-catch to handle duplicate key races
- Add logging to all empty catch blocks (script.php, MokoOG license check)
- Guard loadShopProduct() with try-catch for missing MokoSuiteShop tables
- Guard reviews query in JsonLdBuilder for missing #__mokoshop_reviews
- Add missing Factory::getDbo() in findImage() category fallback — would
cause fatal error on article pages with no images (found in PR review)
- Pass cached product to JsonLdBuilder::buildProduct() to avoid duplicate
DB query (same pattern as buildArticle with cachedArticle)
- Fix orphaned PHPDoc block for getImageDimensions()
- Add loadArticle() with static per-request cache for article data
- Refactor getArticleDate(), getArticleAuthor() to use cached article
- Refactor findImage() for com_content to use cached article
- Pass cached article to JsonLdBuilder::buildArticle() to skip its query
- Reduces article page DB queries from 5 to 1 for OG tag generation
- Detect com_mokoshop product views and set og:type to 'product'
- Auto-generate OG tags from CRM product data (name, description, image)
- Add product:price:amount and product:price:currency meta tags
- Add JSON-LD Product schema with offers, SKU, and aggregate ratings
- Load product images from linked #__content article images
- Cache product DB lookups to avoid duplicate queries per request
- Add TagsController extending AdminController for admin list
delete/publish/unpublish operations (#48)
- Add language filter to loadOgDataByType() and loadOgDataByMenu()
matching the pattern already used in loadOgData() (#47)
- Replace direct $doc->_links access with getHeadData()/setHeadData()
public API for Joomla forward compatibility (#39)
- Update ISSUES.md with full 2026-06-21 assessment
- Rename project source directory from src/ to source/
- Update CI workflows (ci-joomla, pr-check, repo-health) to check
source/ first, falling back to src/ and htdocs/ for compat
- Update .gitignore vendor exception path
- manifest.xml entry-point already updated
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>