- 3.15.2: Readmes are now compiled from the portfolio and the plugin header, so the legacy readme.txt, readme.md and CHANGELOG.md are removed from the plugin. The reconstruction check passed: the overview, usage, abilities and changelog content now live in the lh-save-down portfolio entry, and versions 2.00 to 3.13 were backfilled into its changelog. Obsolete readme content was dropped deliberately: the FAQ's download URLs, which used the wrong feed names and predate signed export links; the support-forum, custom-work and live-example notes; and the claim that only post content is saved, which document-region exports superseded. The header now declares Requires at least: 6.2 (the navigation link rendering uses WP_HTML_Tag_Processor) and Requires PHP: 8.1 (matching composer.json); the old readme claimed WordPress 5.0.
- 3.15.1: List items in the plain text export are no longer separated by blank lines. Whitespace in the HTML between list items, which block markup puts between list item blocks, is now dropped before the text is built, so each item sits on its own line directly under the one before.
- 3.15.0: Exports now show what the page shows. When the block template that displays a post marks a document region (the block with className lh-md-content), the HTML, PDF, text and EPUB exports render that region, found through LH Content Converter's shared document-region resolver (2.3.0 or later), instead of the title followed by the post content; the region carries its own title, so no extra heading is printed, while the PDF and EPUB document titles and file names still come from the post title. Posts whose template marks no region, sites without a block template, and sites without LH Content Converter export as before. Templates overridden in a theme are left unchanged. The plain text export is now readable: paragraphs, headings and list items each end their line, list items start with a dash, definition terms are followed by a colon, and HTML entities such as apostrophes are decoded instead of appearing as codes.
- 3.14.1: Export links now work for posts that are not public, such as restricted governance documents. Previously a valid download link for a post with a non-public status returned 404, because WordPress dropped the post from the request before the link's token was checked. A request carrying a token for one of the export formats now finds the post whatever its status; a post that is not publicly viewable is kept only when the token is valid for that post and format, and is otherwise refused with a 404 as before, so a valid link is still the only way in. Exports of posts that are not publicly viewable are now sent with no-cache headers and excluded from the LiteSpeed page cache, and refused export requests are no longer cached either. PDF and Epub exports now send their own download headers instead of the PDF and Epub libraries' public cache headers.
- 3.14.0: Save Down links now work in navigation blocks. Plain HTML, Plain Text, PDF and Epub are available by name in a navigation block's inserter; when the navigation is shown on a single post or page, each link points at a signed download of that page in its format, with rel=nofollow, and on other pages (archives, BuddyPress screens) it is left out entirely, as the classic menu links already were. Classic menu links and navigation links now build their addresses the same way. The plugin header now carries its licence, and the version is read from the header.
- 3.13: Export links are now signed with a self-contained, expiring HMAC token (the lh_save_down-token query argument, replacing lh_save_down-nonce) that depends only on the post, the format and the expiry time, so a link works for whoever has it until it expires. Nonce links had worked only for the user and session that created them. Links last 24 hours by default (lh_save_down_token_ttl filter). All four exports send noindex, nofollow and a canonical Link header, and the text and EPUB exports now answer a failed check with a 404 like HTML and PDF.
- 3.12: Fixed a fatal error on ability registration: the ability category and ability name used the underscored namespace, which ability names may not contain. Both now use the hyphenated text domain (lh-save-down).
- 3.11: Fixed the Plain Text menu link, which pointed at feed/lh-save_down.txt while the feed is registered as lh-save_down.text, so it returned 404. All four menu links now take their slug from get_feed_slug().
- 3.10: Added the get-export-url MCP ability, which returns a download URL for a post in text, HTML, PDF or EPUB format, and get_feed_slug() as the single source of the four registered feed slugs.
- 3.01: Template overrides now work per format: get_template_location() always returned the HTML template, which silently broke the plain text export and the PDF template override. HTML, PDF and text each use their own template; EPUB reuses the HTML template by design. Added plugin_name() and renamed return_plugin_version() to plugin_version(). The site-language filter is renamed lh_save_down_get_site_lang (was lh_save_down_site_lang). The EPUB title uses wp_strip_all_tags().
- 3.00: mPDF and PHPePub are now Composer dependencies (mpdf/mpdf ^8.3, grandt/phpepub ^4.0.7) instead of hand-vendored copies, and mPDF moves from an untagged 8.1-era snapshot to 8.3.1, restoring official PHP 8.4 support. PHP 8.1 or later is required. HTML and PDF exports declare the site language (lh_save_down_site_lang filter), the PDF selects a font for that language automatically (autoLangToFont), and mPDF's costly per-character script detection stays off unless the lh_save_down_auto_script_to_lang filter turns it on. EPUB exports declare the site language too. Added index.php guards to the plugin root and templates/.
- 2.20: Updated the PDF library for PHP 8.0.
- 2.13: Added basic EPUB support.
- 2.12: Added a class_exists() check.
- 2.11: Uses isset() checks.
- 2.10: Added a PDF download option.
- 2.00: Object-oriented rewrite.