- Behavior change: Post revisions are no longer exported by default. Previously
revisionwas included in the default post types, which filled the_drafts/folder with duplicate copies of every post. To restore the old behavior, re-add'revision'via thejekyll_export_post_typesfilter - Broadened the
convert_content()fallback to catch anyThrowable(not justInvalidArgumentException) from the HTML-to-Markdown converter, so an unexpected converter error falls back to the post's raw HTML instead of aborting the entire export - Emit a
WP_DEBUG-gated warning when a public custom field shadows a reserved front matter key (e.g.layout,image,date), surfacing silent overrides. The override behavior itself is unchanged - Internal: de-duplicated the raw-HTML fallback filters in
convert_content()and the reflection boilerplate inColspanTableConverter
- Stream the export zip to the browser in 8 KB chunks instead of loading the entire archive into memory in
send(), so large exports no longer hitmemory_limitafter a successful build zip_folder()now throwsRuntimeExceptioninstead of callingwp_die()directly, so the existingexport()try/catch renders a friendly error and runscleanup()on partial temp files- Added
jekyll_export_html_converterfilter so integrations (and tests) can swap in a custom HTML-to-Markdown converter - Gated the v4.0.3 fallback
error_log()call behindWP_DEBUG - Hardened sanitization of
$_GET['type']in the export callback - Added regression tests for the v4.0.3
Invalid HTML was providedfallback and for the newzip_folder()throw behavior
- Catch
InvalidArgumentExceptionfromleague/html-to-markdowninconvert_content()and fall back to the post's raw HTML for that single post instead of aborting the entire export with "Jekyll Export failed: Invalid HTML was provided" (#400)
- Add shutdown handler to surface fatal errors (memory exhaustion, max execution time) during export with actionable error messages instead of a generic WordPress critical error page
- Add proactive
memory_limitpre-flight check (warns when below 64MB) invalidate_environment() - Display admin error notice on Tools → Export when environment validation fails, before the user clicks Export
- Security: Use cryptographically secure randomness (
wp_generate_password) instead ofmd5(time())for the export temp directory name to prevent symlink/TOCTOU attacks on shared hosts (CWE-330/377) - Security: Reject non-CLI access in deprecated
jekyll-export-cli.phpbefore bootstrapping WordPress (CWE-665) - Security: Sanitize each path segment of page filenames as defense-in-depth against path traversal (CWE-22)
- Fix stale
$upload_basedircache incopy_recursive()on multisite by keying it on the current blog ID
- Breaking: Minimum PHP version bumped from 7.2.5 to 8.2
- Breaking: Minimum WordPress version bumped from 4.4 to 6.4
- Updated
symfony/yamlfrom ^5.4 to ^7.0 - Updated PHPUnit from ~8.0 to ~9.6
- Removed
symfony/polyfill-php80(no longer needed) - Added PHPStan static analysis at level 5
- Fixed
get_posts()to return integer IDs instead of strings - Fixed PHPDoc type annotations throughout codebase
- Deprecated legacy
jekyll-export-cli.phpin favor oflib/cli.php - Improved CI pipeline with PHPStan job and vendor consistency checks