EventUpsert System
Comprehensive event upsert architecture that intelligently creates or updates event posts based on event identity. Searches for existing events by (title, venue, startDate) and updates if found, creates if new, or skips if data unchanged.
Overview
The EventUpsert system replaces traditional Publisher logic with smarter create/update operations. It provides field-by-field change detection, taxonomy management, and comprehensive event data handling while maintaining data integrity and preventing duplicates.
Location
inc/Steps/Upsert/Events/EventUpsert.php
Key Features
Intelligent Event Matching
Finds existing events using title + venue + start date combination for accurate deduplication.
Change Detection
Compares existing and incoming event data to determine if updates are needed.
Taxonomy Management
Handles venue and promoter taxonomy assignment with custom handlers.
Engine Data Integration
Merges engine snapshot data with AI-provided parameters, prioritizing engine data.
Architecture Components
Core Classes
- EventUpsert: Main handler extending
UpdateHandler - Venue: Venue taxonomy assignment utilities
- Promoter: Promoter taxonomy assignment utilities
- EventSchemaProvider: Schema.org data generation
- VenueParameterProvider: Venue data extraction
Key Workflows
- Identity Resolution: Extract title, venue, startDate for matching
- Existence Check: Query for existing events using identity fields
- Change Detection: Compare current vs incoming data
- Create/Update/Skip: Execute appropriate action based on findings
- Taxonomy Assignment: Handle venue and promoter relationships
- Image Processing: Download and attach featured images
- Metadata Sync: Ensure datetime meta stays current
Key Methods
executeUpdate(array $parameters, array $handler_config): array
Main entry point for event upsert operations.
Parameters:
$parameters: AI-provided event data (title, venue, startDate, etc.)$handler_config: Handler configuration (post status, taxonomy settings, etc.)
Returns: Success response with action type and post data
Actions:
'created': New event post created'updated': Existing event updated'no_change': Event exists with identical data
findExistingEvent(string $title, string $venue, string $startDate): ?int
Locates existing events by identity criteria.
Matching Logic:
- Query by exact title match
- Filter by start date (LIKE comparison)
- Verify venue match if venue specified
- Return post ID or null
hasDataChanged(array $existing, array $incoming): bool
Performs field-by-field comparison of event data.
Compared Fields:
- Date/time fields (startDate, endDate, startTime, endTime)
- Location fields (venue, address)
- Commerce fields (price, ticketUrl)
- Schema.org fields (performer, organizer, eventStatus)
- Content fields (description)
createEventPost(array $parameters, array $handler_config, EngineData $engine, array $engine_parameters): int|WP_Error
Creates new event posts with full data population.
Process:
- Resolve post status and author from settings
- Build merged event data (engine + AI parameters)
- Generate Event Details block content
- Create post with block content
- Process featured images
- Assign venue and promoter taxonomies
- Update engine data with post information
updateEventPost(int $post_id, array $parameters, array $handler_config, EngineData $engine, array $engine_parameters): void
Updates existing event posts with changed data.
Process:
- Build merged event data
- Update post title and content
- Process featured images
- Reassign taxonomies
- Maintain existing relationships
Taxonomy Handlers
Venue Taxonomy Handler
- Custom handler registered for
venuetaxonomy - Extracts venue data from parameters and engine context
- Creates/finds venue terms with metadata
- Assigns venue relationships to events
Promoter Taxonomy Handler
- Custom handler for
promotertaxonomy - Maps Schema.org "organizer" field to promoter terms
- Default Handling: If no promoter configuration is provided in the handler settings, the system defaults to
skip, ensuring no unintended promoter terms are attached. - Supports configurable assignment modes (AI-decided, term-specific, skip)
- Handles promoter metadata (URL, type)
Global Event Filtering
- "Closed" Event Skipping: All events with "closed" in the title (case-insensitive) are automatically skipped by the import handlers. This prevents venue closure notices from being created as event posts.
Data Merging Logic
Engine Data Priority
Engine parameters take precedence over AI-provided values since AI tool parameters are filtered at definition time to exclude already-known data.
Parameter Resolution Order
- Engine snapshot data (highest priority)
- AI-provided parameters
- Handler configuration overrides
- System defaults (lowest priority)
Featured Image Processing
Engine-Based Images
- Retrieves image paths from engine data
- Downloads and attaches images using
WordPressPublishHelper - Respects handler
include_imagessetting
Configuration-Based Images
- Falls back to handler
eventImagesetting - Supports both URLs and file paths
Block Content Generation
Event Details Block
Generates complete Event Details block content with all attributes:
[
'startDate', 'endDate', 'startTime', 'endTime',
'venue', 'address', 'price', 'ticketUrl',
'performer', 'performerType', 'organizer', 'organizerType',
'eventStatus', 'priceCurrency', 'offerAvailability'
]
Inner Block Processing
Converts HTML descriptions to paragraph blocks for rich content support.
Error Handling
- Validates required parameters (title)
- Handles post creation failures
- Logs taxonomy assignment issues
- Provides detailed error responses
Integration Points
- Data Machine Engine: Receives engine snapshots and merges data
- WordPress Taxonomy System: Manages venue and promoter relationships
- Event Details Block: Generates block content for frontend display
- Schema.org: Provides structured data through block attributes
- Meta Storage: Ensures datetime metadata stays synchronized
Configuration Options
Post Settings
post_status: Draft, pending, or publishpost_author: Default author fallback
Taxonomy Settings
taxonomy_venue_selection: Venue assignment modetaxonomy_promoter_selection: Promoter assignment mode (ai_decides, term_id, skip)
Image Settings
include_images: Enable/disable image processingeventImage: Fallback image URL/path
Performance Considerations
- Efficient existence queries using post meta indexes
- Minimal database operations for unchanged events
- Batch taxonomy operations where possible
- Memory-efficient block parsing and generation
Logging and Monitoring
- Debug logging for identity resolution
- Info logging for create/update operations
- Error logging for failed operations
- Context-rich log messages for troubleshooting
Migration from Publisher
The EventUpsert system replaces the legacy Publisher with:
- Smarter duplicate detection
- Change-based update logic
- Better taxonomy handling
- Enhanced error reporting
- Improved data merging logic