Klaar om je Joomla-site sneller, vindbaarder en moderner te maken?
Binnen vijf minuten staan je meta tags, sitemap en WebP-afbeeldingen op orde. Alles wat je Joomla-site nodig heeft voor technische SEO, in één plug-in.
Scorpion SEO Optimize is dé Joomla 6 system-plug-in die in één klap zorgt voor sterke meta tags, snelle afbeeldingen, een correcte sitemap en schone structured data. Geen losse extensies meer combineren, geen template hacks — gewoon installeren, inschakelen en je site is technisch SEO-proof.
Waarom Scorpion SEO Optimize?
- Native Joomla 6 — gebouwd volgens de moderne service-provider architectuur, met PHP 8.2+ en zonder legacy ballast.
- Werkt out-of-the-box — standaardinstellingen zijn veilig en zinvol, zodat je site direct beter scoort zonder eindeloos te tweaken.
- Volledig configureerbaar — elke functie is met één schakelaar aan of uit te zetten, met slimme `showon`-condities zodat je nooit verdwaalt in irrelevante opties.
- Meertalig beheerpaneel — Nederlands, Engels, Duits en Frans.
Wat doet de plug-in voor je site?
Meta tags & social sharing
- Automatische canonical URL's op iedere pagina.
- Open Graph en Twitter Cards op basis van je artikelen, menu-items en globale configuratie — je content ziet er meteen goed uit op Facebook, LinkedIn, X en WhatsApp.
- Afdwingen van de juiste `<html lang="…">` declaratie.
Sitemap & robots.txt
- Genereert automatisch een sitemap.xml uit gepubliceerde menu-items en artikelen — inclusief sitemap-index voor grotere sites.
- Slimme server-side caching met stale-while-revalidate, zodat je sitemap altijd snel én actueel is.
- Maakt een robots.txt met Joomla-specifieke Disallow-regels als die nog niet bestaat, en voegt automatisch de `Sitemap:`-directive toe.
Afbeeldingsoptimalisatie
- Lazy loading voor afbeeldingen onder de vouw, eager loading + `fetchpriority="high"` voor de eerste afbeeldingen — direct winst op je Core Web Vitals (LCP).
- Automatische WebP-conversie en compressie van geüploade en in content gebruikte afbeeldingen, met `<picture>`-rewrite voor maximale browsercompatibiliteit.
- Bulk WebP-knop: in één klik een `.webp` naast elk bestaand JPG/PNG in `/images` — originelen blijven onaangetast.
Structured data (JSON-LD)
- Volgens Schema.org: WebSite, Organization, Article / BlogPosting / NewsArticle, BreadcrumbList en ContactPage — zodat Google je content beter begrijpt en je vaker in rich results verschijnt.
Beïnvloed AI zoekresultaten met een automatisch gegenereerd llms.txt bestand
- Ingebouwde llms.txt-workflow voor AI-vindbaarheid: genereer een gestructureerd llms.txt-bestand, voeg een aparte CONTACT-sectie toe op basis van een geselecteerde Joomla-contactpersoon en importeer bestaande llms-inhoud vanuit de site-root of via upload van een lokaal bestand.
- Slim importgedrag voor llms.txt dat bekende velden automatisch mapt (titel, samenvatting, links en identity) en alle overige inhoud opslaat als aanvullende context, zodat bestaande uitgebreide AI-richtlijnen met minimale handmatige opschoning hergebruikt kunnen worden.
Meertalige sites
- Automatische **`hreflang`**-tags via `com_associations`, inclusief `x-default`. Eindelijk een Joomla-plug-in die multilingual SEO écht serieus neemt.
Veiligheid & nette HTML
- Voegt `rel="noopener noreferrer"` toe aan externe links die in een nieuw tabblad openen — beter voor security én voor je Lighthouse-score.
Voor wie?
Voor Joomla-bouwers, ondernemers en marketeers die hun site écht goed willen neerzetten, zonder een SEO-bureau in te schakelen voor wat je technisch gewoon zelf kunt regelen. Of je nu één corporate site beheert of tientallen klantsites onderhoudt: Scorpion SEO Optimize bespaart je uren werk per site.
Compatible met Joomla! 5 & 6
Laatste versie: v1.4.2
Changelog
- Opgeloste Fouten Fixed external-link host detection regexes that could trigger PHP warnings like preg_match(): Unknown modifier ] when processing protocol-relative or absolute HTTP(S) links. External link hardening now parses those host patterns safely again.
- Taal Added new translation keys in en-GB, nl-NL, de-DE and fr-FR for the llms contact selector, import controls, and overwrite-confirmation messages.
- Taal Expanded the llms explanatory note text in nl-NL and aligned the same extended guidance in en-GB, de-DE and fr-FR.
- Nieuwe Functies llms.txt generation now supports a CONTACT section based on a selected Joomla contact. A new llms setting lets administrators select a published contact from com_contact.
- Nieuwe Functies When a contact is selected, generated llms.txt now includes Contact and Address blocks with available fields only (name, email, phone, website link, street, postal code, city, state/province and country).
- Nieuwe Functies The llms configuration tab now includes import controls to populate plugin fields from either the existing site-root /llms.txt file or an uploaded local .txt/.md file.
- Wijzigingen Relative contact webpage values are now normalized to absolute frontend URLs for WebsiteContact in llms.txt. Protocol-relative URLs are converted to HTTPS URLs.
- Wijzigingen llms.txt CONTACT address output now includes a State field when a state/province value is available in the selected Joomla contact record.
- Wijzigingen Import processing now supports both classic llms description parsing and content under an AI INTERPRETATION NOTES section. The import UI also asks for confirmation before overwriting existing llms field values.
- Wijzigingen llms import parsing now recognises heading-driven llms variants more robustly (including single-# headings and decorative separator lines), and routes all non-mapped content to Additional context.
- Wijzigingen Imported Additional context now preserves compact line flow without inserting a blank line after each imported line.
- Taal Added new translation keys in en-GB, nl-NL, de-DE and fr-FR for the llms.txt configuration tab and its fields.
- Taal Added and aligned translation keys in en-GB, nl-NL, de-DE and fr-FR for the plugin configuration UI.
- Nieuwe Functies New llms.txt tab in the plugin configuration. Administrators can now generate a curated root-level /llms.txt file for AI tools and LLMs with a title, summary, extra context, primary links and optional links.
- Nieuwe Functies If a /llms.txt file already exists and the new fields are still empty, the plugin now tries to import the existing title, summary, description and link lists automatically so the administrator does not need to re-enter them.
- Nieuwe Functies Improved plugin configuration localization by replacing remaining hard-coded field labels with translatable language constants across all supported locales.
- Wijzigingen Standardized the plugin's configuration text and field labels to match the Scorpion Joomla extension conventions more closely.
- Wijzigingen When canonical URLs are enabled, generated llms.txt now includes a Canonical Source line. It uses the configured canonical URL when set, otherwise it falls back to the site root URL.
- Wijzigingen Generated llms.txt now includes a Website line with the site's absolute root URL.
- Wijzigingen Generated llms.txt now includes a PrimaryLanguage line based on Joomla's configured default site language (with fallback to the active language tag).
- Wijzigingen When structured data is enabled and an organization name is set, generated llms.txt now includes a Company line using that organization name.
- Wijzigingen If llms.txt is deleted after it was created before, the plugin now recreates it automatically from saved plugin settings.
- Opgeloste Fouten JAMSS false-positive on iframe lazy-load processing reduced: the iframe pass no longer relies on a literal iframe regex pattern and now uses a safer tag-scan routine while preserving behavior.
- Opgeloste Fouten Joomla framework compatibility hardened by replacing legacy-style isSite() checks with direct isClient('site') checks in the system plugin event flow.
- Taal Added new translation keys (en-GB, nl-NL, de-DE, fr-FR) for the frontend on-demand WebP controls and the two new tuning fields.
- Taal Normalized line endings of all plugin language files to Unix LF format to match Joomla packaging and scanner expectations.
- Nieuwe Functies New optional frontend fallback for WebP generation: when a local JPG/PNG image is rendered without an existing WebP variant, the plugin can generate it on demand during HTML rewrite and reuse it on subsequent requests.
- Nieuwe Functies New tuning options for frontend on-demand conversion: image_frontend_webp_lock_timeout (wait time for an existing conversion lock, default 1 second) and image_frontend_webp_max_pixels (optional hard pixel cap, default 0 = automatic memory-based cap).
- Nieuwe Functies New macOS-compatible build script build.sh added next to build.ps1, producing the same Joomla-ready zip naming and exclusion behavior when PowerShell is not available.
- Wijzigingen WebP detection now recognises both sibling naming styles: image.png.webp and pre-existing image.webp. This prevents duplicate WebP files when another extension already generated a basename-only WebP variant.
- Wijzigingen HTML rewrite now prefers whichever WebP variant exists for a local image and keeps URL query/hash suffixes intact.
- Wijzigingen Bulk WebP generation, single-file optimization, and SEO Health WebP coverage checks now all use the same variant detection logic, so existing image.webp files are counted as covered and are no longer regenerated as image.ext.webp.
- Wijzigingen Frontend on-demand WebP conversion includes safety guards (only inside /images, lock file per image to prevent concurrent duplicate work, skip-marker handling, memory-based pixel pre-check) so first-hit conversion remains controlled on shared hosting.
- Notitie This release consolidates all post-1.2.0 hardening and packaging updates into the 1.3.0 line.
- Opgeloste Fouten SEO Health dashboard threw TypeError: Unsupported operand types: int + string when rendering the WebP coverage detail line, because the helper used the + operator to append an optional + suffix to the scanned-image count (cap-reached marker). Under PHP 8 int + '' is a hard type error; the entire dashboard would fall back to its red error alert. Fixed by switching to string concatenation (.) so the suffix is appended correctly and the WebP detail renders as e.g. 123 with .webp, 4 skipped, 500+ scanned.
- Taal New translations (en-GB, nl-NL, de-DE, fr-FR) for the SEO Health tab: fieldset title + intro note, status badges, per-check labels and all OK/WARN/FAIL/INFO messages (76 keys per locale).
- Taal New translations (en-GB, nl-NL, de-DE, fr-FR) for the Site-verification fieldset (note + label/description for the master switch and the five engine-specific key fields).
- Taal New translations (en-GB, nl-NL, de-DE, fr-FR) for the Generator-meta-tag fieldset, the structured-data warning note and all related labels/descriptions.
- Taal Language strings for the new Sitemap accessibility note contained a multi-line value (a literal <pre> block with line breaks inside the quoted string). Joomla parses .ini files with INI_SCANNER_RAW, which does not support multi-line values: the first syntax error aborts the parser, which is why every tab label and field label fell back to the raw PLG_SYSTEM_* constant after upgrading to 1.1.0. The value is now stored on a single line with <br> separators inside the <pre>, and the same single-line discipline is applied to the new structured-data warning and Generator-tab strings, so the parser keeps loading and all labels render correctly.
- Nieuwe Functies New SEO Health dashboard at the top of the Plugin tab. Adds a live overview with 14 checks (HTTPS, sitemap, robots.txt, canonical, language declaration, Open Graph, Twitter Cards, lazy loading, external links, structured data, hreflang, generator meta tag, site verification, WebP coverage), a colour-coded score 0–100 with grade A–F, per-status counters and per-check OK / WARN / FAIL / INFO badges. New SeoHealthHelper + seohealth form-field render the dashboard server-side on every tab open — no AJAX endpoint, no background load. WebP coverage scans up to 500 JPG/PNG files under /images and counts existing .webp siblings and .webp.skip markers.
- Nieuwe Functies New Site verification tab. Adds a built-in replacement for the standalone Scorpion Site Verification plugin: enter the verification keys for Google Search Console, Bing Webmaster Tools, Yandex Webmaster, Yahoo Site Explorer and (legacy) Alexa, and the plugin emits the matching <meta name="..." content="..."> tags in <head> via Joomla's Document::setMetaData(). New SiteVerificationHelper hooked on onBeforeCompileHead; master switch defaults to off, empty fields are skipped, no overhead when disabled.
- Nieuwe Functies New Generator meta tag tab. Adds a built-in replacement for the standalone Scorpion Meta Generator plugin: choose between keeping the Joomla default <meta name="generator">, replacing its content with a custom string (default Website created by ScorpionComputers.nl) or removing the tag entirely. Replace mode automatically inserts the tag before </head> if Joomla did not emit one, and a hard newline + tab is appended after the replacement so subsequent <head> elements stay on their own line. New GeneratorTagHelper hooked on onAfterRender; only runs when the mode is not "keep", so zero overhead by default.
- Nieuwe Functies New Basic tab on the plugin configuration screen with an info note explaining how to verify that sitemap.xml is publicly accessible (open https://[your-domain]/sitemap.xml in a browser).
- Nieuwe Functies The note documents two ways to unblock the file when .htaccess or Admin Tools rejects it: (1) add /sitemap.xml under Allow direct access to these files in Admin Tools' htaccess Maker and regenerate, or (2) manually prepend a small Apache rewrite block for sitemap.xml, sitemap_index.xml, robots.txt, ads.txt, humans.txt, generic .xml/.xsl feeds and the /.well-known/ directory.
- Nieuwe Functies New warning note at the top of the Structured data tab explaining that activating JSON-LD without filling in Organization name, Organization logo and sameAs URLs can have a negative SEO effect (Google may flag incomplete markup). Includes links to the Google Rich Results Test and the Schema.org Validator.
- Nieuwe Functies JSON-LD structured data is now disabled by default on fresh installations (enable_structured_data default 0 instead of 1). Existing installations keep their previously-saved value and are not affected.
- Nieuwe Functies Major roadmap expansion in DESIGN.md §4: Sitemap extensions, Structured-data extensions, Dublin Core & metadata standards (DCES + DCMI Terms, profile-link, multilanguage, RDFa mode, OAI-PMH endpoint, government presets), Performance & Core Web Vitals, robots/crawler-control, IndexNow integration (proactive crawler notification with `IndexNowHelper`, key file, recent-submissions log, edge cases), Heading-structure & on-page semantics (auto-promote first H2 to H1, scope toggle page/component, context blacklist with wildcards, multi-H1 detector, admin-only debug overlays), Internationalisation & hreflang, Analytics & reporting, Security & privacy hardening, 3rd-party integrations, Developer experience, R&D and Out-of-scope.
- Opgeloste Fouten SEF URL generation in sitemap.xml now always goes through the site router (Joomla\CMS\Router\Router::getInstance('site')) instead of Route::_(). Without this, pressing the new "Regenerate sitemap now" button from the admin UI produced non-SEF URLs even when SEF was selected, because the admin router does not know frontend routes. The output URL is also stripped of any /administrator prefix and rebuilt against the live frontend base.
- Nieuwe Functies Optional VirtueMart integration for the sitemap. New VirtueMartHelper detects an installed and enabled VirtueMart component (verified against #__extensions and the presence of the core #__virtuemart_products table) and contributes URLs for published categories, products and (optionally) manufacturers to sitemap.xml.
- Nieuwe Functies Per-record <lastmod> derived from VirtueMart's modified_on/created_on columns.
- Nieuwe Functies Configurable per-VirtueMart changefreq and priority (default weekly / 0.7) so shop URLs can outrank generic content URLs in the sitemap.
- Nieuwe Functies Optional "in-stock products only" filter (product_in_stock > 0) to keep the sitemap free of out-of-stock items.
- Nieuwe Functies New plugin parameters under Sitemap & robots.txt: sitemap_include_virtuemart (master switch, default off), sitemap_vm_categories, sitemap_vm_products, sitemap_vm_manufacturers, sitemap_vm_only_in_stock, sitemap_vm_changefreq, sitemap_vm_priority. All gated via showon so they only appear when the master switch is on.
- Nieuwe Functies New sitemap_url_mode parameter (default sef) lets the administrator choose between SEF URLs (rendered through the site router) and raw Joomla query URLs for every entry in sitemap.xml, including the VirtueMart entries.
- Nieuwe Functies New "Regenerate sitemap now" button on the Sitemap & robots.txt tab. Forces a fresh build of sitemap.xml regardless of TTL, clears any stale lockfile, and reports the resulting URL count and file size. Useful after toggling the URL format or the VirtueMart options. Backed by a new com_ajax sub-task task=regenerate_sitemap and SitemapHelper::forceRegenerate().
- Nieuwe Functies Translations (en-GB, nl-NL, de-DE, fr-FR) for every new label, description and spacer.
- Wijzigingen Sitemap generation now extends gracefully: when VirtueMart is missing, disabled or throws an unexpected DB error, the standard menu/article sitemap is still emitted unchanged.
- Notitie The VirtueMart integration is opt-in. Existing installations behave identically to 1.0.2 until "Include VirtueMart content" is enabled in the plugin configuration.
- Opgeloste Fouten Bulk WebP AJAX endpoint returned an HTML login page instead of JSON when the Joomla session was new: the Session::checkToken() call was triggering a redirect. The endpoint now performs an explicit token check on the POST input and emits a JSON error response on failure.
- Opgeloste Fouten Bulk WebP AJAX endpoint produced an empty HTTP 500 on PHP fatals because display_errors was off: a register_shutdown_function now clears output buffers and emits a JSON error payload describing the fatal, so the JS layer can surface it in the UI.
- Opgeloste Fouten Bulk WebP generator no longer emits PHP 8.5 deprecation notices for imagedestroy(); all calls have been replaced with unset() which is the documented replacement.
- Opgeloste Fouten Bulk WebP generator no longer loops indefinitely on images that previously failed: .webp.skip markers are now counted as already_skipped and excluded from the remaining queue.
- Nieuwe Functies Bulk WebP generator: new image_bulk_batch_size parameter (default 5) so the job processes a small batch per AJAX call and the browser polls until done. Prevents PHP timeouts and OOM on shared hosting.
- Nieuwe Functies Bulk WebP generator: dynamic per-image pixel cap derived from the live PHP memory_limit, so oversized images are skipped pre-flight instead of crashing the process.
- Nieuwe Functies Bulk WebP generator: .webp.skip markers are written next to images that cannot be converted (too large, GD error, unwritable target). Marked files are silently skipped on subsequent runs so the job no longer loops on the same failures.
- Nieuwe Functies Bulk WebP UI: status line now reports "already WebP X, previously skipped Y", plus a collapsible "Show details" panel listing each failed/skipped file with its reason.
- Nieuwe Functies Bulk WebP UI: new "Reset skip markers" button (with confirmation dialog) that removes all *.webp.skip files under /images, so previously-skipped images can be re-attempted after raising limits or replacing oversized originals.
- Nieuwe Functies New com_ajax sub-task task=reset_skips on the bulk endpoint, backed by ImageOptimizerHelper::resetSkipMarkers().
- Nieuwe Functies Language strings (en-GB, nl-NL, de-DE, fr-FR) for the new counters, reset button, confirm dialog and result messages.
- Opgeloste Fouten Fixed a bug where the plugin would emit invalid JSON-LD for breadcrumbs that have no URL. Crumbs without a URL are now omitted entirely (the ListItem is skipped) and the position numbering of the remaining items is kept sequential, matching Schema.org and Google Search Console expectations.
- Wijzigingen BreadcrumbList JSON-LD: skip the entire ListItem for crumbs that have no URL, and renumber the remaining position values sequentially so the list stays valid.
- Taal Language declaration (<html lang="…">) enforcement when missing or empty.
- Nieuwe Functies Canonical URL injection with fallback to the site base URL.
- Nieuwe Functies Open Graph & Twitter Card meta tag generation based on Joomla content (com_content articles, menu items, global config).
- Nieuwe Functies Automatic generation of sitemap.xml when absent, based on published menu items and articles.
- Nieuwe Functies Automatic generation of robots.txt when absent, with Joomla-specific Disallow rules.
- Nieuwe Functies Automatic injection of the Sitemap: directive into robots.txt when missing.
- Nieuwe Functies Lazy loading of images below the fold (loading="lazy"), eager loading and fetchpriority="high" for the first N images.
- Nieuwe Functies Adds rel="noopener noreferrer" to external links opening in a new tab.
- Nieuwe Functies Structured data (JSON-LD Schema.org): WebSite, Organization, Article/BlogPosting/NewsArticle, BreadcrumbList, ContactPage.
- Nieuwe Functies hreflang tag generation for multilingual Joomla sites via com_associations, including x-default.
- Nieuwe Functies Image compression and WebP conversion for uploads and content images, with <picture> HTML rewrite.
- Nieuwe Functies Server-side sitemap caching with stale-while-revalidate semantics and automatic sitemap index for large sites.
- Nieuwe Functies Added a "Bulk WebP for existing images" button in the Image optimization tab. Recursively scans /images and generates a .webp next to every existing JPG/PNG that does not already have one. Originals are not modified.
- Nieuwe Functies New com_ajax endpoint (onAjaxScorpionseooptimize) gated on core.admin + form token; powers the bulk button.
- Wijzigingen Merged the separate Sitemap, Robots.txt and Sitemap cache tabs into one combined "Sitemap & robots.txt" tab, grouped with spacer headers.
- Wijzigingen Added showon conditions to every dependent sub-field so options only appear when their master toggle is enabled.
- Wijzigingen Swapped option order to JNO/JYES for all radio switchers (off is now the first option).
- Wijzigingen Cache-related fields now also depend on enable_sitemap, in addition to sitemap_cache_enabled.
- Notitie Requires Joomla 6.x and PHP 8.2 or higher.

