Fixed: Finalise step still failing after v1.0.13. Root cause: wcem_ajax_extract_start wrote the complete entity list (~23 MB) to entities-snapshot.json, then finalise loaded both that snapshot AND the fresh draft file at the same time, pushing peak PHP memory to ~125 MB — above the 128 MB limit common on shared hosts. Fix: extract_start now writes a compact snapshot containing only manually-created entities and manually-added (non-auto-suggested) relations. For sites where all content is auto-extracted the compact snapshot is ~100 bytes. Finalise loads the compact snapshot first (tiny), then the draft, keeping peak memory well under any reasonable limit. Pass-by-reference added to suggest_relations_for_set and suggest_relations to avoid a second copy of the entity array during relation suggestion.
1.0.13
Fixed: Finalise step was failing with a 500 error on sites with more than ~500 entities. The root cause was wcem_persist_entities() serializing the full entity array (~40 MB for 5,634 entities) and attempting a MySQL INSERT via $wpdb->replace(). MySQL’s default max_allowed_packet (16 MB) rejects the write, which on PHP 8.x corrupts the AJAX response and returns HTTP 500. Entities are now persisted to the JSON file only when the set exceeds 500 — the DB write is skipped. wcem_get_entities_raw() already reads from the file first, so nothing changes for callers.
1.0.12
Fixed: Finalise step was timing out on large sites because suggest_relations_for_set made 2 DB queries per entity (11,268 queries for a 5,634-post site). Replaced with a single bulk SQL join across all post IDs.
Fixed: Added 512M memory limit and 300s time limit to the finalise handler.
1.0.11
Fixed: Existing entity snapshot in extract_start was written to a transient (same MySQL size problem as the batch buffer). Now written to a JSON file on disk, eliminating the 500 error on sites with large existing entity sets.
1.0.10
Fixed: Chunked extraction now writes each batch directly to a draft JSON file on disk instead of accumulating in a WordPress transient. This eliminates the silent failure at ~2300 entities caused by MySQL max_allowed_packet limits on the growing transient row.
Fixed: Relation suggestion now runs across the full merged entity set at finalise time, so cross-batch tag/category relationships are correctly detected on large sites.
1.0.9
Fixed: Use PHP 8 spread operator for $wpdb->prepare() on variable post type lists (cleaner than call_user_func_array)
Updated minimum PHP requirement to 8.0
1.0.8
Fix: Removed non-ASCII characters (UTF-8 box-drawing and arrow glyphs) from PHP comments — these caused parse errors on PHP 7.4 hosts without full mbstring support.
1.0.7
Fix: PHP 7.4 compatibility — removed spread operator and null coalescing shorthand that caused parse errors on PHP 7.4 hosts.
1.0.6
Fix: Extract start now uses a direct COUNT SQL query instead of WP_Query — eliminates 500 errors on large sites caused by memory exhaustion on the very first AJAX call.
Fix: Each extraction batch now raises memory limit to 256M and time limit to 60s as a safety net on constrained hosts.
Fix: Diagnose output now shows robots.txt status (directive present/missing/not writable) directly on screen.
1.0.5
Fix: Plugin now auto-refreshes rewrite rules and robots.txt after any update method — FTP, WP-CLI, or WP admin — without requiring deactivate/reactivate.
1.0.4
Fix: EntityMap directive now written to physical robots.txt files on disk (previously only the virtual WordPress robots.txt was updated).
Fix: Re-extraction no longer times out on large sites — extraction now runs in sequential batches of 50 posts per request instead of one blocking call.
Tweak: Validate & Publish also refreshes the robots.txt directive.
1.0.3
Initial release.
Auto-extraction of entities from posts and pages.
SEO meta description support (Yoast, RankMath, All in One SEO).
Relation auto-suggestion from shared tags and categories.
Built-in validator against EntityMap v1.0 spec.
Admin interface for reviewing and editing entities, chunks, and relations.
Live serving of entitymap.json and entitymap.html via WordPress rewrite rules.
Discovery signal injection: head link tag, robots.txt directive, footer reference.