2.3.5

New Features

  • Remote Work Filter: New search filter that lets visitors narrow the job board to roles allowing remote work, with remote_work_allowed added to normalized job meta. Configurable from the Elementor widget, the Bricks widget, and the shortcode generator.
  • Google JobPosting Schema Validation: A built-in schema validator that surfaces the structured-data health of every listing directly in the Jobs tab.
  • Status badge on each job row, shown whenever schema output is enabled.
  • Per-listing breakdown of exactly which required fields are missing.
  • Click-to-preview of the generated schema, so you can inspect what Google receives without leaving the dashboard.
  • Selective Job Sync: New single-job sync action in the Jobs tab, backed by a dedicated endpoint, allowing an individual listing to be refreshed on demand instead of triggering a full sync.
  • Sync Mode Switcher: New setting to select the synchronization mode, letting the sync strategy be matched to listing volume and update frequency.
  • Template Version Tracking: Template files now carry version markers, enabling detection of outdated theme overrides after a plugin update.
  • Auto-Select Phone Country: New setting that defaults the apply form’s phone country to the individual listing’s country code from raw job meta, taking precedence over the site-wide default phone region.

Improvements

  • Duplicate Job Prevention: Added MySQL-level source job locking to eliminate duplicate listings created by concurrent inserts.
  • Post-sync dedupe pass to catch any duplicates that slip through.
  • Deterministic base slug generation with dedupe slug normalization, so recurring listings retain stable, clean URLs across removal and re-posting.
  • New limestaff_job_base_slug filter for developers needing custom slug logic.
  • Sync Queue Watchdog: The queue process now detects stalls and automatically re-spawns after 15 minutes, allowing an interrupted sync to recover without manual intervention.
  • Taxonomy Term Recount: Added a term recount step to the sync process, keeping job category and location counts accurate as listings are added and removed.
  • Normalized Location Output: Job locations are now built into a single normalized address (city, full state name, country), cached in meta, and used consistently across search results, single job templates, and schema output.
  • Application Log Retention: Automatic cleanup now covers pending and failed logs as well as successful ones, retaining them for twice the configured retention window so failures remain available for review.
  • Company Visibility Control: Single job templates now honor the per-listing company_hidden value alongside the global company toggle.
  • Default Sort Order: Job listings now default to descending published date.
  • Webhook Teardown Safety: Added locking and a failure queue around webhook deletion to prevent conflicts when a teardown fails partway through.
  • Clean Code Maintenance: Added a migration helper with step logging for smoother upgrades, separated the apply form JavaScript cache-busting version so script updates reach visitors immediately, and resolved a deprecated null-handling warning in the inline style helper.

Fixes

  • Payload Serialization: Resolved an issue where certain characters in the Loxo payload caused raw meta serialization to fail, silently breaking the affected listings.
  • Schema Hiring Organization: Corrected a null-coalescence misuse that left the hiringOrganization field empty in the generated JobPosting schema.
  • Hierarchy Field Validation: Dynamic hierarchy fields on the apply form now validate against the topmost options container, eliminating false validation errors on nested selections.
  • Application Error Output: Removed extraneous error detail rendered to candidates when an application submission failed.
  • Elementor Widget Styling: Fixed the parent job wrapper overriding button styles, corrected apply button hover text specificity, and fixed an incorrect CSS target for the button background hover state.
  • Bricks Widget Styling: Improved style specificity so widget styling is no longer overridden by theme defaults.
  • Plugin Activation Failure: Fixed a fatal error on activation on hosts where a relative autoloader path could resolve to an unrelated Composer autoloader, leaving the plugin’s own classes unloadable. Plugin requires are now anchored to the plugin directory.
All Releases