🗄️
wp_options Autoload Bloat
Every WooCommerce page load queries all autoloaded rows from wp_options. Deactivated plugins leave orphaned autoloaded data. Active plugins like Elementor, WooCommerce sessions, and translation plugins accumulate thousands of rows — all loaded on every page request regardless of whether they are needed.
Audit autoloaded data with SELECT option_name, length(option_value) FROM wp_options WHERE autoload='yes' ORDER BY 2 DESC. Set non-essential rows to autoload=no. Configure Redis object caching to serve frequently accessed options from memory, bypassing the autoload query entirely.
⚡
Elementor on Product Pages
Elementor loads its complete CSS bundle globally — typically 280–400KB — including styles for widgets used nowhere on the current page. On WooCommerce product pages this stacks with WooCommerce's own scripts to produce LCP scores of 4 to 7 seconds on UAE mobile networks. The DOM size exceeds 3,000 nodes on complex product pages, triggering Google's "avoid excessive DOM size" warning.
Replace Elementor product and category page templates with custom PHP templates using WooCommerce's woocommerce/templates/ override system in the child theme. Eliminate Elementor render dependency on these specific pages, reducing CSS payload to under 60KB and DOM nodes below 1,000.
🔗
Faceted Navigation URL Proliferation
WooCommerce filter plugins — WOOF, FacetWP, JetSmartFilters — each generate URLs differently. WOOF appends query strings: ?filter_color=black&filter_size=m. FacetWP rewrites to pretty permalinks: /shop/colour/black/size/medium/. Both create hundreds of near-duplicate category URLs consuming crawl budget and fragmenting category ranking equity.
WOOF: add filter parameters to robots.txt Disallow rules and configure Google Search Console URL parameter handling. FacetWP: inject a JavaScript canonical tag update firing on filter change events, pointing filtered URLs to the canonical category page. Both: exclude all filtered URLs from sitemap.xml.
🔀
Duplicate and Conflicting Schema
A typical WooCommerce store with Yoast SEO active produces three simultaneous schema outputs: WooCommerce's native woocommerce_structured_data_product filter generates Product JSON-LD; Yoast generates its own Product graph; and if a separate schema plugin like Schema Pro is active, a third JSON-LD block fires. Google's Rich Results Test flags duplicate entities as validation errors.
Disable WooCommerce native schema via add_filter('woocommerce_structured_data_product', '__return_false'). Configure Yoast to handle only Organization and breadcrumb schema. Inject complete Product, Offer, AggregateRating, and FAQPage JSON-LD via a dedicated custom plugin — single source, validated on every deploy.
📦
Product Revision and Meta Accumulation
WordPress stores unlimited post revisions by default. An actively managed WooCommerce store with 500 products, each updated monthly over two years, accumulates 12,000+ revision rows in wp_posts — alongside thousands of associated rows in wp_postmeta. Variable products with 20+ variations add 200+ postmeta rows per product. Combined, these tables slow every product query on the site.
Set define('WP_POST_REVISIONS', 5) in wp-config.php. Run a one-time cleanup of existing revision accumulation via WP-CLI: wp post delete $(wp post list --post_type='revision' --format=ids). Implement scheduled wp_scheduled_delete for expired transients and orphaned postmeta from deleted products.
🌐
WPML Hreflang Misconfiguration
WPML generates hreflang tags for product and category URLs automatically — but product URL structure changes, custom permalink configurations, and WooCommerce attribute archive pages frequently cause WPML to generate mismatched or missing hreflang pairs. Google Search Console's International Targeting report shows these as "hreflang alternate URL not indexed" errors, meaning neither the English nor Arabic version receives correct language-targeted serving.
Audit all hreflang pairs against the Search Console International Targeting report. Fix mismatches via WPML's XML sitemap configuration and the wpml_hreflang_languages filter for custom URL structures. Add x-default hreflang pointing to the English canonical. Validate Arabic product pages have Arabic-language schema data — not just translated content without corresponding schema updates.