{"id":69846,"date":"2017-06-06T13:20:02","date_gmt":"2017-06-06T13:20:02","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/speechkit\/"},"modified":"2026-09-04T12:44:36","modified_gmt":"2026-09-04T12:44:36","slug":"speechkit","status":"publish","type":"plugin","link":"https:\/\/kk.wordpress.org\/plugins\/speechkit\/","author":15437046,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"7.1.0","stable_tag":"7.1.0","tested":"7.1","requires":"6.6","requires_php":"8.0","requires_plugins":null,"header_name":"BeyondWords - AI audio for publishers","header_author":"BeyondWords","header_description":"Enables voice on your posts through speechkit.io","assets_banners_color":"bb3be6","last_updated":"2026-09-04 12:44:36","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/beyondwords.io","header_plugin_uri":"https:\/\/beyondwords.io","header_author_uri":"https:\/\/beyondwords.io","rating":3.6,"author_block_rating":0,"active_installs":800,"downloads":98551,"num_ratings":27,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"4.0.0":{"tag":"4.0.0","author":"stuartmcalpine","date":"2023-07-26 14:25:00","revision":2943742},"4.0.1":{"tag":"4.0.1","author":"stuartmcalpine","date":"2023-07-29 23:31:03","revision":2944953},"4.0.2":{"tag":"4.0.2","author":"stuartmcalpine","date":"2023-08-03 19:23:37","revision":2947411},"4.0.3":{"tag":"4.0.3","author":"stuartmcalpine","date":"2023-08-04 14:26:51","revision":2947765},"4.0.4":{"tag":"4.0.4","author":"stuartmcalpine","date":"2023-08-17 13:03:37","revision":2954950},"4.0.5":{"tag":"4.0.5","author":"stuartmcalpine","date":"2023-08-24 12:32:49","revision":2957873},"4.0.6":{"tag":"4.0.6","author":"stuartmcalpine","date":"2023-09-07 17:37:43","revision":2964235},"4.1.0":{"tag":"4.1.0","author":"stuartmcalpine","date":"2023-09-15 15:35:10","revision":2967566},"4.1.1":{"tag":"4.1.1","author":"stuartmcalpine","date":"2023-09-15 16:28:40","revision":2967580},"4.1.2":{"tag":"4.1.2","author":"stuartmcalpine","date":"2023-09-21 12:32:55","revision":2969729},"4.2.0":{"tag":"4.2.0","author":"stuartmcalpine","date":"2023-10-10 11:03:54","revision":2976978},"4.2.1":{"tag":"4.2.1","author":"stuartmcalpine","date":"2023-10-12 12:28:10","revision":2978120},"4.2.2":{"tag":"4.2.2","author":"stuartmcalpine","date":"2023-10-27 11:53:00","revision":2984910},"4.2.3":{"tag":"4.2.3","author":"stuartmcalpine","date":"2023-11-02 11:21:03","revision":2988003},"4.2.4":{"tag":"4.2.4","author":"stuartmcalpine","date":"2023-11-15 21:11:02","revision":2996696},"4.3.0":{"tag":"4.3.0","author":"stuartmcalpine","date":"2023-12-07 15:19:31","revision":3006884},"4.4.0":{"tag":"4.4.0","author":"stuartmcalpine","date":"2024-01-11 09:48:22","revision":3020238},"4.5.0":{"tag":"4.5.0","author":"stuartmcalpine","date":"2024-03-01 10:55:04","revision":3043577},"4.5.1":{"tag":"4.5.1","author":"stuartmcalpine","date":"2024-03-14 18:19:30","revision":3051282},"4.6.0":{"tag":"4.6.0","author":"stuartmcalpine","date":"2024-03-28 12:22:08","revision":3060518},"4.6.1":{"tag":"4.6.1","author":"stuartmcalpine","date":"2024-03-28 18:24:42","revision":3060749},"4.6.2":{"tag":"4.6.2","author":"stuartmcalpine","date":"2024-04-11 09:05:05","revision":3068866},"4.7.0":{"tag":"4.7.0","author":"stuartmcalpine","date":"2024-05-02 10:30:55","revision":3080268},"5.0.0":{"tag":"5.0.0","author":"stuartmcalpine","date":"2024-10-15 10:50:57","revision":3169191},"5.1.0":{"tag":"5.1.0","author":"stuartmcalpine","date":"2024-11-11 14:45:11","revision":3185806},"5.2.0":{"tag":"5.2.0","author":"stuartmcalpine","date":"2024-11-22 12:59:09","revision":3194965},"5.2.1":{"tag":"5.2.1","author":"stuartmcalpine","date":"2024-11-28 08:29:46","revision":3198687},"5.2.2":{"tag":"5.2.2","author":"stuartmcalpine","date":"2024-12-10 18:35:15","revision":3205903},"5.3.0":{"tag":"5.3.0","author":"stuartmcalpine","date":"2025-02-03 07:41:46","revision":3233685},"5.3.1":{"tag":"5.3.1","author":"stuartmcalpine","date":"2025-02-11 20:44:30","revision":3238940},"5.4.0":{"tag":"5.4.0","author":"stuartmcalpine","date":"2025-04-22 18:56:09","revision":3279379},"5.5.0":{"tag":"5.5.0","author":"stuartmcalpine","date":"2025-07-02 14:26:54","revision":3321286},"6.0.0":{"tag":"6.0.0","author":"stuartmcalpine","date":"2025-11-10 17:15:00","revision":3393083},"6.0.1":{"tag":"6.0.1","author":"stuartmcalpine","date":"2025-11-26 13:30:09","revision":3403395},"6.0.2":{"tag":"6.0.2","author":"stuartmcalpine","date":"2025-12-03 13:57:18","revision":3409610},"6.0.3":{"tag":"6.0.3","author":"stuartmcalpine","date":"2025-12-16 10:29:00","revision":3420880},"6.0.4":{"tag":"6.0.4","author":"stuartmcalpine","date":"2026-01-07 17:37:34","revision":3434569},"6.1.0":{"tag":"6.1.0","author":"stuartmcalpine","date":"2026-03-02 23:40:47","revision":3473147},"6.2.0":{"tag":"6.2.0","author":"stuartmcalpine","date":"2026-03-11 23:48:27","revision":3480710},"6.3.0":{"tag":"6.3.0","author":"stuartmcalpine","date":"2026-04-12 21:25:19","revision":3504704},"7.0.0":{"tag":"7.0.0","author":"stuartmcalpine","date":"2026-08-12 09:46:22","revision":3643135},"7.1.0":{"tag":"7.1.0","author":"stuartmcalpine","date":"2026-09-04 12:44:36","revision":3681229}},"upgrade_notice":[],"ratings":{"1":7,"2":2,"3":2,"4":0,"5":16},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3643072,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3643072,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3643072,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3643072,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["4.0.0","4.0.1","4.0.2","4.0.3","4.0.4","4.0.5","4.0.6","4.1.0","4.1.1","4.1.2","4.2.0","4.2.1","4.2.2","4.2.3","4.2.4","4.3.0","4.4.0","4.5.0","4.5.1","4.6.0","4.6.1","4.6.2","4.7.0","5.0.0","5.1.0","5.2.0","5.2.1","5.2.2","5.3.0","5.3.1","5.4.0","5.5.0","6.0.0","6.0.1","6.0.2","6.0.3","6.0.4","6.1.0","6.2.0","6.3.0","7.0.0","7.1.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2353,452,16722,1449,226061],"plugin_category":[50],"plugin_contributors":[205671,188564],"plugin_business_model":[],"class_list":["post-69846","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-audio","plugin_tags-text-to-speech","plugin_tags-tts","plugin_tags-voice-cloning","plugin_category-media","plugin_contributors-beyondwords","plugin_contributors-stuartmcalpine","plugin_committers-speechkit","plugin_committers-stuartmcalpine"],"banners":{"banner":"https:\/\/ps.w.org\/speechkit\/assets\/banner-772x250.png?rev=3643072","banner_2x":"https:\/\/ps.w.org\/speechkit\/assets\/banner-1544x500.png?rev=3643072","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/speechkit\/assets\/icon-128x128.png?rev=3643072","icon_2x":"https:\/\/ps.w.org\/speechkit\/assets\/icon-256x256.png?rev=3643072","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Turn WordPress articles into audio as you publish, with tools for distribution, monetization, and analytics.<\/p>\n\n<h4>Let audiences listen to your articles<\/h4>\n\n<p>BeyondWords turns selected WordPress posts and pages into audio automatically.<\/p>\n\n<p>Your editors keep working in WordPress. BeyondWords generates the audio, adds a customizable player, and automatically update audio when articles changes.<\/p>\n\n<p>Choose from premade voices, generate a voice from a prompt, or create Instant and Professional voice clones. Voices are powered by ElevenLabs.<\/p>\n\n<h4>What you can do<\/h4>\n\n<ul>\n<li>Choose which posts and pages become audio<\/li>\n<li>Create full audio articles or shorter audio summaries<\/li>\n<li>Add a customizable player with automatic word highlighting<\/li>\n<li>Correct pronunciations and review audio before publishing<\/li>\n<li>Build playlists and podcast feeds<\/li>\n<li>Monetize listening through advertising and subscriptions<\/li>\n<li>Measure plays, engagement, listening time, and completion<\/li>\n<\/ul>\n\n<h4>Distribute in WordPress and beyond<\/h4>\n\n<p>Embed audio in your articles, create playlists, publish podcast feeds to services such as Spotify and Apple Podcasts, share audio via URL, or share and download audio files.<\/p>\n\n<h4>Built for WordPress workflows<\/h4>\n\n<p>Set defaults for your publication, then override them on individual posts.<\/p>\n\n<p>BeyondWords can regenerate audio when an article changes. You can also use WordPress bulk actions to generate audio for existing articles.<\/p>\n\n<p>For page-builder setups such as Elementor, Magic Embed provides an alternative to the standard REST API integration.<\/p>\n\n<h4>Monetize listening<\/h4>\n\n<p>Make audio a subscriber benefit with full, ad-free listening, while using previews or ad-supported audio to encourage other readers to register or subscribe.<\/p>\n\n<p>Upload your own audio ads or connect your existing ad server through VAST, the common standard for audio advertising.<\/p>\n\n<h4>What publishers say<\/h4>\n\n<blockquote>\n  <p>\"We've had great customer feedback and the team have been quick to make adjustments based on our suggestions.\"<\/p>\n  \n  <p>Kenneth Creamer, Creamer Media<\/p>\n<\/blockquote>\n\n<h4>Get started<\/h4>\n\n<p>Book a demo and we'll help you choose the right setup, voices, player, and monetization options for your publication.<\/p>\n\n<p><a href=\"https:\/\/beyondwords.io\/book-a-demo\/\">Book a demo<\/a><\/p>\n\n<p>For questions or support, email <a href=\"mailto:support@beyondwords.io\">&#115;&#117;&#x70;p&#111;&#x72;&#x74;&#064;&#098;&#x65;y&#111;&#x6e;&#x64;&#119;&#111;&#x72;&#x64;&#115;&#x2e;&#x69;&#111;<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the BeyondWords plugin.<\/li>\n<li>Connect it to your BeyondWords project.<\/li>\n<li>Choose which posts and pages should become audio.<\/li>\n<li>Set your default voice and player preferences.<\/li>\n<li>Publish as usual.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20i%20choose%20which%20articles%20become%20audio%3F\"><h3>Can I choose which articles become audio?<\/h3><\/dt>\n<dd><p>Yes. Set defaults for posts and pages, then change the settings for individual articles from the WordPress editor.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20update%20an%20article%3F\"><h3>What happens when I update an article?<\/h3><\/dt>\n<dd><p>BeyondWords can regenerate the audio using the updated article text. You can also keep the existing audio when an update doesn't require a new version.<\/p><\/dd>\n<dt id=\"can%20we%20use%20our%20own%20voices%3F\"><h3>Can we use our own voices?<\/h3><\/dt>\n<dd><p>Yes. You can create Instant or Professional voice clones for journalists, authors, analysts, presenters, or other speakers. You must have the speaker's permission.<\/p>\n\n<p>You can also choose a premade voice or generate a voice from a prompt.<\/p><\/dd>\n<dt id=\"can%20we%20monetize%20the%20audio%3F\"><h3>Can we monetize the audio?<\/h3><\/dt>\n<dd><p>Yes. Upload your own audio ads, connect an existing ad server, or use access tiers to create different listening experiences for visitors, registered readers, and subscribers.<\/p><\/dd>\n<dt id=\"can%20we%20publish%20the%20audio%20as%20a%20podcast%3F\"><h3>Can we publish the audio as a podcast?<\/h3><\/dt>\n<dd><p>Yes. BeyondWords lets you create podcast feeds for services such as Spotify and Apple Podcasts.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20elementor%20and%20other%20page%20builders%3F\"><h3>Does it work with Elementor and other page builders?<\/h3><\/dt>\n<dd><p>Yes. The plugin normally connects WordPress to BeyondWords through our REST API. For Elementor and other page-builder setups where that approach isn\u2019t suitable, Magic Embed uses a script on your site to extract and sync the article content instead.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>7.1.0<\/h4>\n\n<p>Release date: 4th September 2026<\/p>\n\n<p><strong>Enhancements<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/626\">#626<\/a> Import Tool: only offer to import to post types BeyondWords supports, and say why each skipped record was skipped.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/623\">#623<\/a> Per-block language and voice in the block editor.<\/li>\n<\/ul>\n\n<p><strong>Fixes<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/627\">#627<\/a> Give audio creates a longer timeout, and recover the content ID when a create still times out after the API accepted it.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/626\">#626<\/a> Debug Tool: fix the fatal error raised when activating the plugin.\n\n<ul>\n<li>Download the updated ZIP from this release \u2014 every earlier build fails on activation.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/623\">#623<\/a> Fix \"Generation disabled\" being ignored on blocks nested inside a Group, Columns or other container.\n\n<ul>\n<li>Audio regenerated for an affected post no longer includes those blocks.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/621\">#621<\/a> Fix the fatal error shown when the plugin is replaced with a different version from the Plugins screen.\n\n<ul>\n<li>Switching away from an existing 7.0.0 install still shows it once; the version being replaced has to be 7.1.0 or later for the fix to apply.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<p><strong>Deprecations<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/626\">#626<\/a> Removed the SpeechKit Export Tool, which only exported post meta the plugin stopped writing in v4.0.\n\n<ul>\n<li>Site Health and the editor's Inspect panel report the same data for current installs.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<p><strong>Compatibility<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/626\">#626<\/a> Debug Tool: request logging is now switched off on WordPress VIP, where it could not append to its log file safely.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/624\">#624<\/a> Tested up to WordPress 7.1.<\/li>\n<\/ul>\n\n<p><strong>Codebase Enhancements<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/626\">#626<\/a> Install and smoke-test the extension plugins in CI, and document them in <code>doc\/extension-plugins.md<\/code>.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/624\">#624<\/a> Turn off Cypress web security so the block editor specs run on WordPress 7.1.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/629\">#629<\/a> Finalise the 7.1.0 release notes.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/628\">#628<\/a> Dependency upgrades.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/625\">#625<\/a> Mount the plugin at a fixed <code>speechkit<\/code> slug in the local wp-env environments.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/622\">#622<\/a> Correct the 7.0.0 changelog entry for the \"Add Player\" block preview.<\/li>\n<\/ul>\n\n<h4>7.0.0<\/h4>\n\n<p>Release date: 12th August 2026<\/p>\n\n<p><strong>Enhancements<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/566\">#566<\/a> Poll the content status before embedding the player.\n\n<ul>\n<li>The block and classic editor previews now wait until content has finished processing \u2014 showing a loading spinner meanwhile \u2014 instead of embedding the player immediately and caching a 404 when the audio or video isn't ready yet.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/520\">#520<\/a> New settings page and project-wide rewrite.\n\n<ul>\n<li>Simplifies the plugin settings \u2014 removing many tabs, fields and options \u2014 so that audio\/video generation and player display are managed from your BeyondWords project settings.<\/li>\n<li>Standardises the codebase to WordPress VIP coding standards and migrates CI tooling from Yarn to npm.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/527\">#527<\/a> BeyondWords editor redesign for the block and classic editors.\n\n<ul>\n<li>New Content (Source, Script template), Format (Output, Video template, Video size), Voice (Language, Model, Voice) and Player (Embed) settings, available in both editors.<\/li>\n<li>The Player \"Embed\" setting replaces the \"Display player\" checkbox \u2014 choose \"None\" to hide the player on a post.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/536\">#536<\/a> Wire up the Player \"Embed\" setting.\n\n<ul>\n<li>The Embed choice (audio\/video \u00d7 post\/script) now controls the rendered player, rather than only showing or hiding it.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/537\">#537<\/a> Opt-in \"Customize\" voice and language controls.\n\n<ul>\n<li>A per-post \"Customize\" toggle (off by default) reveals the Language and Voice pickers; the project's default language is pre-selected when enabled.<\/li>\n<li>The Voice and Language settings are consolidated into the plugin sidebar.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/558\">#558<\/a> Reorder the voice picker to Language \u2192 Model \u2192 Voice.\n\n<ul>\n<li>\"Model\" is now a language-level filter that narrows the Voice list.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/557\">#557<\/a> Preselect \"Generate audio\" by taxonomy term.\n\n<ul>\n<li>Reinstates preselecting audio generation for posts assigned specific terms, now across all hierarchical taxonomies and without marking posts as having unsaved changes.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/555\">#555<\/a> Live player preview for the \"Add Player\" block. (Reverted in <a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/568\">#568<\/a> before 7.0.0 shipped \u2014 the block shows a static placeholder in the editor; the player still renders on the front end.)<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/563\">#563<\/a> State-reflecting generation labels and \"Legacy\" model rename.\n\n<ul>\n<li>The \"Generate audio\" toggle now reads \"Generation enabled\" \/ \"Generation disabled\"; the \"Standard\" voice model bucket is relabelled \"Legacy\".<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/532\">#532<\/a> Cache API reads and defer audio generation on WordPress VIP.\n\n<ul>\n<li>Editor dropdown data is cached in 15-minute transients; on VIP, audio create\/update is deferred to WP-Cron so the save request returns immediately.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/598\">#598<\/a> Send taxonomy terms as <code>tags<\/code>.\n\n<ul>\n<li>Breaking: the <code>metadata<\/code> param is no longer sent. Code hooking <code>beyondwords_content_params<\/code> to write <code>$params['metadata']<\/code> must append to <code>$params['tags']<\/code> instead, or it will raise a fatal error.<\/li>\n<\/ul><\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/611\">#611<\/a> Tidy the classic editor metabox spacing and Content ID layout.<\/li>\n<\/ul>\n\n<p><strong>Fixes<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/618\">#618<\/a> Poll content status before embedding the block-editor Preview panel player, so a still-processing post (more likely with a customised voice\/model) no longer shows a broken preview.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/613\">#613<\/a> Fix author names with an ampersand showing as <code>Smith &amp;amp; Sons<\/code> in the BeyondWords dashboard.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/612\">#612<\/a> Fix tags with an ampersand showing as <code>r&amp;amp;d<\/code> in the BeyondWords dashboard.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/610\">#610<\/a> Stop the bulk \"Generate audio\" notice counting skipped posts as failures.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/606\">#606<\/a> Fix posts published with no player when two saves race to create audio.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/564\">#564<\/a> Sweep the paired <code>_transient_timeout_beyondwords_*<\/code> rows on uninstall, so no orphaned option rows are left behind.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/540\">#540<\/a> Escape the player <code>onload<\/code> attribute to prevent stored XSS via the Content ID.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/539\">#539<\/a> Add capability checks to the bulk-edit AJAX handler.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/541\">#541<\/a> Prevent a player SDK error from clobbering saved content on Fetch.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/554\">#554<\/a> Return JSON from the bulk-edit AJAX handler and catch delete errors.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/553\">#553<\/a> Resolve the post ID in <code>Content::get_content_without_excluded_blocks<\/code>.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/551\">#551<\/a> Track live meta for the Inspect panel Remove button.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/550\">#550<\/a> Coerce non-string API error messages to avoid a fatal <code>TypeError<\/code>.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/543\">#543<\/a> Guard a null languages API result in the classic editor voice select.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/542\">#542<\/a> Surface a <code>WP_Error<\/code> from <code>get_content()<\/code> instead of a fatal <code>TypeError<\/code>.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/588\">#588<\/a> Ship <code>symfony\/dom-crawler<\/code> 5.4.52 to fix CVE-2026-45071 (XXE \/ local file disclosure).\n\n<ul>\n<li>The composer constraint now floors at the patched release, so a vulnerable version can no longer be bundled.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<p><strong>Deprecations<\/strong><\/p>\n\n<ul>\n<li>Removed the <code>beyondwords_player_style<\/code>, <code>beyondwords_player_content<\/code>, <code>beyondwords_title_voice_id<\/code>, <code>beyondwords_summary_voice_id<\/code> and <code>beyondwords_disabled<\/code> post meta keys.\n\n<ul>\n<li>Existing values are preserved in the database and only removed on full uninstall; <code>beyondwords_disabled<\/code> is migrated to the new \"Embed\" setting on upgrade.<\/li>\n<\/ul><\/li>\n<li>The <code>beyondwords-*<\/code> <code>&lt;head&gt;<\/code> meta tags are now only emitted for the client-side (Magic Embed) integration.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/601\">#601<\/a> Removed the \"Script\" option from the post Source setting, which now offers \"Post\" or \"Post + script\".\n\n<ul>\n<li>Posts saved as \"Script\" are migrated to \"Post + script\" on upgrade, and keep embedding their script asset.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<p><strong>Compatibility<\/strong><\/p>\n\n<ul>\n<li>Tested up to WordPress 7.0.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/515\">#515<\/a> PHP 8.5 support.\n\n<ul>\n<li>Run unit and e2e tests against PHP 8.0 and PHP 8.5 in GitHub Actions.<\/li>\n<li>Bumped <code>phpVersion<\/code> in wp-env to 8.5.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<p><strong>Codebase Enhancements<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/619\">#619<\/a> Run the Cypress suite with pretty permalinks, fixing the block editor Preview panel content-status poll spec.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/591\">#591<\/a> Refresh the developer documentation in <code>doc\/<\/code> against the v7 codebase.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/608\">#608<\/a> Fix the intermittent detached-DOM failures in the block editor Cypress specs.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/607\">#607<\/a> Update two PHPUnit tests left stale by the Script-only Source removal.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/602\">#602<\/a> Align the player-visibility docs and Cypress specs with the \"Embed\" setting.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/600\">#600<\/a> Add must-follow documentation and changelog rules to <code>AGENTS.md<\/code>, with <code>CLAUDE.md<\/code> and Copilot pointer files.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/533\">#533<\/a> Fix failing Cypress tests for v7.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/538\">#538<\/a> Remove the unused <code>updatePostMeta<\/code> util from the Inspect panel.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/562\">#562<\/a> Re-enable Plugin Check on <code>plugin-check-action<\/code> v1.1.7.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/560\">#560<\/a> Cancel superseded CI runs via a concurrency group.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/516\">#516<\/a> Remove <code>environment<\/code> from the GitHub workflows.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/517\">#517<\/a>, <a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/535\">#535<\/a> Update GitHub Actions dependencies.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/514\">#514<\/a>, <a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/529\">#529<\/a>, <a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/534\">#534<\/a>, <a href=\"https:\/\/github.com\/beyondwords-io\/wordpress-plugin\/pull\/616\">#616<\/a> Dependency upgrades.<\/li>\n<li>Various dependency updates to clear Dependabot security warnings.<\/li>\n<\/ul>\n\n\n\n<p><a href=\"https:\/\/plugins.trac.wordpress.org\/browser\/speechkit\/trunk\/changelog.txt\">See the previous changelogs here<\/a>.<\/p>","raw_excerpt":"Turn WordPress articles into audio as you publish, with tools for distribution, monetization, and analytics.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/69846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=69846"}],"author":[{"embeddable":true,"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/speechkit"}],"wp:attachment":[{"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=69846"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=69846"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=69846"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=69846"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=69846"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=69846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}