Live demo: see this module on the live demo store - demo.alexwaha.com/module-microdata
Schema.org Structured Data for OpenCart v2.3 - 3.x
- Module Information
- Key Features
- Technical Specifications
- Installation Instructions
- Configuration
- 5.1 Diagnostics Tab
- 5.2 General Settings
- 5.3 Organization
- 5.4 Products
- 5.5 Categories & Lists
- 5.6 Content Pages
- 5.7 OpenGraph
- 5.8 Advanced / Tricks
- 5.9 Import / Export
- Supported Schema Types
- How It Works (Events Architecture)
- Troubleshooting
- License & Contact
AW Microdata is a professional module for OpenCart that automatically generates Schema.org structured data (JSON-LD) for all pages of your online store. The module uses OpenCart's built-in Events system to inject markup, making it completely template-independent and requiring no OCMOD modifications.
Structured data helps search engines better understand your website content, which can lead to rich snippets in search results (star ratings, prices, availability, FAQ accordions, breadcrumbs, and more).
- 25+ Schema.org Types - Product, Organization, FAQPage, ContactPage, BreadcrumbList, WebSite, BlogPosting, and many more
- Template-Independent - Uses OpenCart Events system, no OCMOD modifications required
- Built-in Diagnostics - Validates event registration, detects duplicate markup, checks config completeness
- OpenGraph & Twitter Cards - Full OG and Twitter meta tag generation
- VideoObject Auto-Detection - Automatically finds YouTube/Vimeo videos in product and blog descriptions
- ImageObject Extraction - Extracts images from descriptions and generates ImageObject schema
- ItemList / Carousel - Generates ItemList schema for category pages (Google product carousel)
- Related Products - Includes related/recommended products as
isRelatedToin Product schema - Attribute Mapping - Maps OpenCart attributes to Schema.org properties (color, material, size, gender)
- Rating & Review Boost - Configurable fake rating/review count boost for SEO
- Competitor sameAs Injection - Grey-hat SEO: associate competitor brand searches with your site
- Custom JSON-LD Injection - Insert any custom JSON-LD block on every page
- Import/Export Settings - Backup and restore module configuration as JSON
- No External API Dependencies - Everything works locally, no third-party API calls
- Multi-language Support - English, Russian, Ukrainian
- Author: Alexander Vakhovski (AlexWaha)
- Website: https://alexwaha.com
- License: GPLv3
- Compatibility: OpenCart 2.3.x - 3.x (ocStore supported)
- Dependency: AwCore library
- Module Code:
aw_microdata - Architecture: Events-based (
view/*/after) - Output Format: JSON-LD only (Google recommended)
- PHP Requirement: 7.4+
- Additional Database Tables: None
- OCMOD Modifications: None
- File Count: ~20 files
- Code Style: PSR-12
-
Make sure you have the aw_core_oc2.3-3.x.ocmod.zip module installed
Important: This is auxiliary functionality required for all AlexWaha modules
-
For OpenCart 2.3.x, make sure you have a module that disables FTP uploading of extensions, or you have correct FTP settings in your store settings
Note: Not required for OpenCart 3.x
Link to module disabling FTP upload (for OpenCart v2.3 only)
-
Install the aw_microdata_oc2.3-3.x.ocmod.zip archive through the site admin panel
- Go to Extensions -> Installer
- Upload the module archive
- Wait for installation to complete
-
Refresh the modification cache
- Go to Extensions -> Modifications
- Click the Refresh button
-
In Extensions -> Modules section find and enable the module:
alexwaha.com - Microdata
Important: When enabled, the module will automatically register 12 event handlers and set up access permissions. No database tables are created - all configuration is stored in the shared
aw_module_configtable managed by AwCore.
Verify correct installation:
- Module is present in the extensions list
- Module settings page opens without errors
- Diagnostics tab shows all 12 events with status "OK"
- No duplicate Schema.org markup warnings
Go to module settings: Extensions -> Modules -> alexwaha.com - Microdata
The module settings page contains 9 tabs:
- Diagnostics
- General
- Organization
- Products
- Categories & Lists
- Content Pages
- OpenGraph
- Advanced / Tricks
- Import / Export
The Diagnostics tab provides a comprehensive health check for the module. It runs automatically when you open it and displays results in three categories.
Checks whether all 12 event handlers are correctly registered in the OpenCart event system. Each event is listed individually with its status:
| Event Trigger | Purpose | Expected Status |
|---|---|---|
catalog/view/common/header/after |
OpenGraph meta tags injection into <head> |
OK |
catalog/view/common/footer/after |
Organization JSON-LD injection before </body> |
OK |
catalog/view/common/home/after |
WebSite + CollectionPage schema on the homepage | OK |
catalog/view/product/product/after |
Product + BreadcrumbList schema | OK |
catalog/view/product/category/after |
CollectionPage + BreadcrumbList schema | OK |
catalog/view/product/search/after |
SearchResultsPage + BreadcrumbList schema | OK |
catalog/view/product/manufacturer_info/after |
CollectionPage + Brand + BreadcrumbList schema | OK |
catalog/view/product/special/after |
CollectionPage + BreadcrumbList schema | OK |
catalog/view/information/information/after |
Article schema for information pages | OK |
catalog/view/information/contact/after |
ContactPage schema | OK |
catalog/view/blog/article/after |
BlogPosting schema for blog articles | OK |
catalog/view/blog/category/after |
Blog schema for blog category pages | OK |
If any event shows "MISSING", reinstall the module (disable and enable again in Extensions -> Modules).
Scans all .twig template files in the catalog/view/theme/ directory for hardcoded <script type="application/ld+json"> blocks that are not generated by AW Microdata. If found, these duplicates can conflict with the module's output and should be removed from the templates.
Validates that recommended fields are filled in:
- Logo (Organization tab) - required for Organization and Publisher schemas
- Phones (Organization tab) - required for
telephoneandcontactPoint - Address (Organization tab) - required for
PostalAddress - Email (Organization tab) - required for Organization schema
Missing fields are listed with a direct link to the relevant settings tab.
Provides pre-configured links to Google's Rich Results Test for your key pages:
- Homepage
- First active product
- First active category
- Contact page
Click these links to validate your structured data directly with Google.
- Enabled - Module is active and injects structured data on all pages
- Disabled - Module is completely disabled, no structured data is generated
Currently supports JSON-LD only (recommended by Google). JSON-LD is injected as <script type="application/ld+json"> blocks.
The name of your website as it should appear in the WebSite schema. Configured per language. If left empty, the store name from OpenCart settings is used.
An alternative name for your website (e.g., abbreviation or popular name). Maps to alternateName in the WebSite schema.
URL template for the site search action. Used to generate the SearchAction in the WebSite schema, which enables the search box in Google search results.
Default: {shop_url}/index.php?route=product/search&search={search_term_string}
Tip: If you have a custom search page URL, enter it here. The
{search_term_string}placeholder is required by Google.
Fallback image used when a page does not have its own image. Applies to OpenGraph tags and Schema.org markup.
The Organization tab configures the structured data for your business entity. This data appears on every page as an Organization (or subtype) schema.
Select the Schema.org type that best describes your business. Available options include:
Store(default)OnlineStoreLocalBusinessLiquorStoreClothingStoreElectronicsStoreFurnitureStoreGardenStoreGroceryStoreHardwareStoreHobbyShopHomeGoodsStoreJewelryStoreMusicStoreOfficeEquipmentStorePetStoreShoeStoreSportingGoodsStoreTireShopToyStoreWholesaleStoreAutoPartsStoreBikeStoreBookStoreComputerStoreConvenienceStoreDepartmentStoreFloristOpticianOutletStore- And more (30+ options)
Recommendation: Choose the most specific type that matches your business.
OnlineStoreis a good default for e-commerce.
The official legal name of your organization. Configured per language. Maps to legalName in the schema. If left empty, the store name is used as fallback.
Business email address. Maps to email in the Organization schema.
One or more phone numbers for your business. Click "Add" to add additional numbers. Maps to telephone in the schema. The first phone number is also used for the contactPoint property.
URLs to your social media profiles (Facebook, Instagram, Twitter/X, YouTube, Telegram, etc.). Each URL is added as a sameAs value in the Organization schema. Click "Add" to add more links.
Physical address of your business, configured per language:
- Street - Street address (maps to
streetAddress) - City - City/locality (maps to
addressLocality) - Region - State/province/region (maps to
addressRegion) - ZIP Code - Postal code (maps to
postalCode) - Country - Country code, e.g., UA, US, DE (maps to
addressCountry). If left empty, the country from OpenCart store settings is used.
Latitude and longitude of your business location. Maps to GeoCoordinates in the schema.
Format: Decimal degrees (e.g., 50.4501 for latitude, 30.5234 for longitude)
Tip: You can find coordinates using Google Maps - right-click on your location and copy the coordinates.
URL or path to your organization's logo image. If left empty, the store logo from OpenCart settings is used. Maps to both logo and image in the Organization schema.
Schedule for each day of the week (Monday through Sunday). For each day, configure:
- Open - Opening time (e.g.,
09:00) - Close - Closing time (e.g.,
20:00) - Closed - Check to mark the day as a day off
Maps to openingHoursSpecification in the schema.
The currency accepted by your business (e.g., UAH, USD, EUR). Defaults to the store's default currency. Maps to currenciesAccepted.
A price range indicator using the dollar-sign convention:
$- Budget$$- Moderate$$$- Expensive$$$$- Premium
Maps to priceRange in the Organization schema.
Accepted payment methods (free text). Maps to paymentAccepted in the schema.
Example: Cash, Credit Card, PayPal, Bank Transfer
Areas where you deliver goods (free text). Maps to areaServed in the schema.
Example: Kyiv, Kharkiv, Odesa, Nationwide
The Products tab configures Schema.org Product markup for product pages.
Toggle to enable/disable Product schema generation on product pages. Enabled by default.
When enabled, includes aggregateRating in the Product schema based on product reviews. Enabled by default.
Determines which reviews are used for the Product schema:
- Product reviews only - Uses only reviews for the specific product
- Store reviews only - Uses store-level reviews (from the AW Reviews module)
- Both - Combines product and store reviews
Recommendation: Use "Product reviews only" for the most accurate representation. "Store reviews" or "Both" can be useful if individual products have few reviews.
Minimum number of reviews required before aggregateRating is included in the schema. Default: 1.
Minimum average rating required before aggregateRating is included. Default: 1.
When enabled, adds UnitPriceSpecification to the product offer. Useful for products sold by weight, volume, or other units.
The unit measurement code according to the UN/CEFACT standard:
LTR- LiterKGM- KilogramMTR- MeterCMT- CentimeterGRM- Gram
The reference quantity for unit pricing. Default: 1.
The condition of products in your store:
NewCondition(default) - Brand new productsUsedCondition- Second-hand productsRefurbishedCondition- Refurbished productsDamagedCondition- Damaged products
Where to get the brand name for products:
- Manufacturer (default) - Uses the product's manufacturer name
- Store name - Uses the store name as brand
Maps OpenCart stock statuses to Schema.org availability values. For each stock status in your store, you can assign the corresponding Schema.org value:
https://schema.org/InStockhttps://schema.org/OutOfStockhttps://schema.org/PreOrderhttps://schema.org/BackOrderhttps://schema.org/SoldOuthttps://schema.org/LimitedAvailability
When enabled, adds shippingDetails with deliveryTime to the product offer.
- Min days - Minimum delivery time in days (default:
1) - Max days - Maximum delivery time in days (default:
3)
When enabled, adds hasMerchantReturnPolicy to the product offer.
- Return days - Number of days for returns (default:
14) - Return type - Schema.org return policy category:
MerchantReturnFiniteReturnWindow(default) - Returns accepted within a specific timeframeMerchantReturnNotPermitted- No returns acceptedMerchantReturnUnlimitedWindow- Unlimited return period
When enabled, adds shipping details to the product offer schema.
When enabled, adds the product weight to the Product schema as a QuantitativeValue.
When enabled, adds product dimensions (length, width, height) to the Product schema.
When enabled, all product images (not just the main one) are included in the Product schema. Enabled by default.
When enabled, all product attributes are included as additionalProperty (PropertyValue) in the Product schema.
Map specific OpenCart attributes to Schema.org product properties:
- Attribute for Color - Select the attribute that represents product color (maps to
color) - Attribute for Material - Select the attribute that represents product material (maps to
material) - Attribute for Size - Select the attribute that represents product size (maps to
size) - Target Gender - Select the target audience gender:
- Male
- Female
- Unisex
Tip: Leave as "Not mapped" if your products don't have these attributes.
When enabled, includes related/recommended products from the product page as isRelatedTo in the Product schema.
When enabled, automatically detects YouTube and Vimeo video links in product descriptions and generates VideoObject schema for each video. Works without any external API calls - video thumbnails are generated from video IDs.
When enabled, extracts <img> tags from product descriptions and generates ImageObject schema for each image.
The Listing Pages tab configures structured data for all pages that display product listings: categories, search results, manufacturer pages, specials/sales, landing pages, and the homepage.
All listing pages share a common schema structure: CollectionPage (or configured type) with AggregateOffer (price range), optional AggregateRating (composite rating), optional delivery and return policy info, and optional ItemList carousel.
Toggle to enable/disable category page schema generation. Enabled by default.
The Schema.org type for category pages:
CollectionPage(default) - A page that collects itemsItemList- A list of itemsOfferCatalog- A catalog of offers
Recommendation:
CollectionPageis the most semantically correct for category pages.
Toggle to enable/disable SearchResultsPage schema generation on search result pages. Includes AggregateOffer with price range for matching products. Enabled by default.
Toggle to enable/disable CollectionPage schema generation on manufacturer product pages. Includes AggregateOffer with price range and a Brand property with the manufacturer name. Enabled by default.
Toggle to enable/disable CollectionPage schema generation on special offers pages. Uses special/discounted prices (not regular prices) for the AggregateOffer price range. Enabled by default.
When enabled, generates a CollectionPage schema on the homepage with an AggregateOffer containing the price range across all active products in the store. Disabled by default.
Note: This is in addition to the
WebSiteschema already generated on the homepage.
When enabled, queries the database for the lowest and highest product prices and generates an AggregateOffer with lowPrice, highPrice, and offerCount. Applies to all listing page types.
When enabled, includes the total number of active products in the listing.
When enabled, calculates a composite aggregate rating combining product reviews (from review table) and store reviews (from aw_review table) and includes aggregateRating in the listing schema. This provides a richer rating signal even when individual pages have few reviews.
Note: The composite rating is used on all listing pages (categories, search, manufacturer, specials, landing pages, homepage). Fake rating boost settings from the Advanced tab also apply.
When enabled, adds shippingDetails with deliveryTime to the AggregateOffer on all listing pages. Uses the same Min days and Max days values configured in the Products tab.
When enabled, adds hasMerchantReturnPolicy to the AggregateOffer on all listing pages. Uses the same Return days and Return type values configured in the Products tab.
When enabled, generates an ItemList schema for products displayed in the listing. Google may display this as a product carousel in search results.
Each product is listed as a ListItem with position, URL, and name.
When enabled, generates CollectionPage schema for landing pages (if AW Landing Pages module is installed). Includes price range for products on the landing page.
When enabled, uses the landing page title as the areaServed value. Useful for location-based landing pages (e.g., "Delivery in Kyiv").
The Content Pages tab configures structured data for various types of content pages: information pages, blog, FAQ, reviews, calculator, and contacts.
Toggle to enable/disable Article schema for OpenCart information pages. Enabled by default.
The Schema.org type for information pages:
Article(default) - General articleNewsArticle- News articleTechArticle- Technical articleScholarlyArticle- Academic article
The author name for articles. If left empty, the store name is used with Organization type.
The author's URL. Used together with Author Name for the author property.
When enabled, generates BlogPosting (or selected type) schema for blog article pages (requires a blog module).
The Schema.org type for blog articles:
BlogPosting(default) - Standard blog postArticle- General articleNewsArticle- News articleSocialMediaPosting- Social media post
When enabled, calculates and includes the wordCount property in blog article schema.
When enabled, generates FAQPage schema on pages that contain FAQ data (requires AW FAQ module). Questions and answers are pulled from the aw_faq and aw_faq_description tables.
The generated schema follows Google's FAQ rich result requirements:
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is your return policy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "We accept returns within 14 days."
}
}
]
}When enabled, generates Organization schema with aggregateRating and individual review entries on the reviews page. Pulls data from store reviews (AW Reviews module).
When enabled, generates WebApplication schema for calculator pages (e.g., AW Moonshine Calculator).
- Application Category:
UtilitiesApplication(default) - Price: Free (Offer with price 0)
When enabled, also generates a HowTo schema alongside the WebApplication, with step-by-step instructions for using the calculator.
When enabled, generates ContactPage schema on the contact page, with LocalBusiness organization data as mainEntity. Includes address, phone, working hours, and other organization details.
The OpenGraph tab configures Open Graph and Twitter Card meta tags for social media sharing.
Toggle to enable/disable OpenGraph meta tag generation. When enabled, the following tags are injected into <head>:
og:title- Page titleog:description- Page description (from meta description or content)og:url- Canonical page URLog:site_name- Store nameog:locale- Current language localeog:image- Page image (product image, article image, or logo)og:type- Content type (auto-detected:productfor products,articlefor articles, configurable default for other pages)
For product pages, additional tags are generated:
product:price:amount- Product priceproduct:price:currency- Currency code
The default Open Graph type for pages that don't have a specific type:
website(default) - General websitearticle- Articleproduct- Product
Your Facebook Application ID for Facebook Insights integration. Optional.
Your Facebook Page ID(s). Optional.
The type of Twitter Card to generate:
summary_large_image(default) - Large image summary cardsummary- Standard summary card
Your Twitter/X username (e.g., @yourusername). Used for the twitter:site meta tag.
Fallback image for OpenGraph when a page doesn't have its own image. If not set, the store logo is used.
Warning: These settings can affect your SEO positively or negatively. Use with caution.
When enabled, injects AggregateRating into the Organization schema on all pages, not just product pages. This means your store's aggregate rating appears site-wide.
Use case: Useful if you want star ratings to appear in Google for your homepage or any page.
A static number added to the real review count in Schema markup. For example, if you have 5 real reviews and set this to 10, Google will see 15 reviews.
Set to 0 to disable.
Warning: This is a grey-hat SEO technique. Google may penalize sites that misrepresent review data.
A decimal value (0.0-5.0) added to the real average rating. For example, if your real average is 4.5 and you set this to 0.4, the schema will show 4.9. The maximum is capped at 5.0.
Set to 0 to disable.
Warning: Same as above - use at your own risk.
When enabled, all products are shown as https://schema.org/InStock in the schema regardless of actual stock status.
Use case: Useful for stores that always have products available but don't track stock in OpenCart.
URLs of competitor websites added to your Organization's sameAs property. Google may associate competitor brand searches with your site.
Warning: This is a grey-hat SEO technique. Google's algorithms may or may not respond to this. Leave empty if unsure.
Click "Add" to add more URLs.
A raw JSON-LD block injected into every page of your store. Must be valid JSON. Useful for adding custom schemas that the module doesn't generate natively.
Example:
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Summer Sale",
"startDate": "2025-06-01",
"endDate": "2025-08-31"
}When enabled, adds the speakable property to Article schemas, indicating which parts of the content are suitable for text-to-speech.
When enabled globally, auto-detects YouTube and Vimeo video links in product and blog descriptions. For each detected video, a VideoObject schema is generated with:
name- Video title (derived from page title)thumbnailUrl- Auto-generated from video ID (YouTube) or VimeoembedUrl- Embed URLcontentUrl- Direct video URL
No external API calls are made - video metadata is constructed from the URL patterns.
Click the Export button to download your current module configuration as a JSON file. The filename includes the current date and time:
aw_microdata_settings_2025-01-15_14-30-00.json
Tip: Export your settings before making major changes as a backup.
Upload a previously exported JSON file to restore settings.
- Click Choose File and select a
.jsonfile - Click Import
- The page will reload with the imported settings
Warning: Importing will overwrite ALL current settings. This action cannot be undone. Always export a backup first.
| Schema Type | Page | Description |
|---|---|---|
WebSite |
Homepage | Site name, search action, publisher |
Organization / subtypes |
Every page (footer) | Business info, address, contacts, working hours |
Product |
Product page | Name, price, images, brand, SKU, availability, reviews |
Offer |
Product page | Price, currency, availability, delivery, return policy |
AggregateOffer |
Category, Search, Manufacturer, Special, Landing, Homepage | Price range (low/high), product count, delivery, return policy |
AggregateRating |
Product / Organization / All listing pages | Average rating, review count (composite: product + store reviews) |
Review |
Product / Organization | Individual reviews with author, rating, text |
Brand |
Product page | Product manufacturer/brand |
BreadcrumbList |
Product, Category, Information, Contact, Blog | Navigation breadcrumbs |
CollectionPage |
Category, Manufacturer, Special, Landing, Homepage | Listing page with products, price range, rating |
SearchResultsPage |
Search results page | Search listing with products, price range, rating |
ItemList |
All listing pages | Product carousel/list |
Article |
Information page | Headline, description, author, publisher |
BlogPosting |
Blog article page | Blog post with author, date, content |
Blog |
Blog category page | Blog listing |
FAQPage |
FAQ page | Questions and answers |
ContactPage |
Contact page | Contact information with LocalBusiness |
LocalBusiness |
Contact page | Full business info with address, hours |
WebApplication |
Calculator page | Application schema with offer |
HowTo |
Calculator page | Step-by-step instructions |
VideoObject |
Product / Blog pages | Auto-detected videos from descriptions |
ImageObject |
Product / Blog pages | Extracted images from descriptions |
PostalAddress |
Organization / Contact | Business address |
GeoCoordinates |
Organization / Contact | Business location coordinates |
OpeningHoursSpecification |
Organization / Contact | Working hours per day |
ContactPoint |
Organization | Customer service contact |
PropertyValue |
Product page | Product attributes |
QuantitativeValue |
Product page | Weight, dimensions |
UnitPriceSpecification |
Product page | Unit pricing |
ShippingDeliveryTime |
Product + all listing pages | Delivery lead time |
MerchantReturnPolicy |
Product + all listing pages | Return policy details |
Rating |
Product / Organization | Individual review rating |
PeopleAudience |
Product page | Target gender |
SearchAction |
Homepage | Site search box |
AW Microdata uses OpenCart's Event system to inject structured data, making it completely independent of your store's template/theme. This means:
- No template files are modified
- No OCMOD modifications are needed
- Works with any OpenCart 2.3-3.x theme
- Updating your theme won't break the structured data
The module registers 12 event handlers that listen to view/*/after events. When OpenCart renders a page template, the event handler fires and injects the appropriate markup into the HTML output.
JSON-LD is injected before </body> (for most schemas) or before </head> (for OpenGraph meta tags).
1. User requests a product page
2. OpenCart renders product/product.twig
3. Event fires: catalog/view/product/product/after
4. Event handler calls:
- microdata/getProduct($data) -> Product JSON-LD
- microdata/getBreadcrumbs($data) -> BreadcrumbList JSON-LD
5. JSON-LD blocks are inserted before </body>
6. Simultaneously, header event injects OG tags before </head>
| Event | Handler | Schemas Generated |
|---|---|---|
view/common/header/after |
viewHeaderAfter |
OpenGraph + Twitter Card meta tags |
view/common/footer/after |
viewFooterAfter |
Organization |
view/common/home/after |
viewHomeAfter |
WebSite + SearchAction + CollectionPage |
view/product/product/after |
viewProductAfter |
Product + BreadcrumbList |
view/product/category/after |
viewCategoryAfter |
CollectionPage + BreadcrumbList |
view/product/search/after |
viewSearchAfter |
SearchResultsPage + BreadcrumbList |
view/product/manufacturer_info/after |
viewManufacturerAfter |
CollectionPage + Brand + BreadcrumbList |
view/product/special/after |
viewSpecialAfter |
CollectionPage + BreadcrumbList |
view/information/information/after |
viewInformationAfter |
Article + BreadcrumbList |
view/information/contact/after |
viewContactAfter |
ContactPage + BreadcrumbList |
view/blog/article/after |
viewBlogArticleAfter |
BlogPosting + BreadcrumbList |
view/blog/category/after |
viewBlogCategoryAfter |
Blog |
The module pulls data from multiple sources:
- Template data (
$data) - Product info, breadcrumbs, images, attributes passed to the template - OpenCart config - Store name, URL, logo, currency, country
- Module config - All settings from the AW Microdata configuration
- Database queries - Price ranges, review aggregates, FAQ items, product identifiers (SKU, EAN, MPN)
Symptom: Diagnostics tab shows missing events.
Solution:
- Go to Extensions -> Modules
- Find alexwaha.com - Microdata
- Click the red minus button to disable
- Click the green plus button to enable again
- Check Diagnostics tab - all events should show "OK"
Symptom: Diagnostics tab shows duplicate Schema.org markup in templates.
Solution:
- Note the template files listed in the warning
- Open each file and remove any hardcoded
<script type="application/ld+json">blocks - Refresh the modification cache
These duplicates typically come from other SEO modules or template customizations.
Symptom: No structured data appears in the page source.
Checklist:
- Is the module status Enabled in General settings?
- Is the specific schema type enabled (e.g., Product Schema for product pages)?
- Are all events registered (check Diagnostics)?
- Check for PHP errors in OpenCart error log
- View page source and search for
application/ld+json
Symptom: Organization schema is missing fields.
Solution: Fill in all fields in the Organization tab: logo, phones, email, address. Check the Diagnostics tab for missing fields.
Symptom: No og: meta tags in page source.
Checklist:
- Is OpenGraph enabled in the OpenGraph tab?
- Is the
catalog/view/common/header/afterevent registered? - Check that the header template contains
</head>(required for injection)
Symptom: Prices in structured data don't match displayed prices.
Explanation: The module reads formatted prices from the template data and parses them. Special/sale prices take priority over regular prices. Ensure your product prices are correctly configured in OpenCart.
Symptom: FAQPage schema is not generated.
Checklist:
- Is FAQ Page Schema enabled in Content Pages tab?
- Is the AW FAQ module installed and configured?
- Are there active FAQ items with both question and answer filled in?
- Are the
aw_faqandaw_faq_descriptiontables present in the database?
Use the links in the Diagnostics tab to test your pages with Google's Rich Results Test:
https://search.google.com/test/rich-results
You can also use the Schema.org Validator:
- License: GPLv3
- Author: Alexander Vakhovski (AlexWaha)
- Website: https://alexwaha.com
- Email: support@alexwaha.com
- Telegram: @alexwaha_dev