{"id":393817,"date":"2026-11-10T13:15:32","date_gmt":"2026-11-10T13:15:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/asb-post-thumbnail\/"},"modified":"2026-11-10T19:33:50","modified_gmt":"2026-11-10T19:33:50","slug":"asb-post-thumbnail","status":"publish","type":"plugin","link":"https:\/\/en-gb.wordpress.org\/plugins\/asb-post-thumbnail\/","author":23542924,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"4.4.5","stable_tag":"4.4.5","tested":"7.1.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"ASB Post Thumbnail","header_author":"Asobit LLC","header_description":"Automatically generates high-quality featured images from post titles and categories, with image layers, custom fonts, and rule-based design.","last_updated":"2026-11-10 19:33:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/asb-post-thumbnail\/","header_author_uri":"https:\/\/asobit.jp\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":98,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"4.4.3":{"tag":"4.4.3","author":"asobit","date":"2026-11-10 13:15:01","revision":3794464},"4.4.4":{"tag":"4.4.4","author":"asobit","date":"2026-11-10 13:43:45","revision":3794510},"4.4.5":{"tag":"4.4.5","author":"asobit","date":"2026-11-10 19:33:50","revision":3795118}},"upgrade_notice":{"4.4.5":"<p>Fixes the rule preview on the settings screen, removes -br- from the browser tab title and from new post addresses, and names the default choice in the post editor.<\/p>","4.4.4":"<p>The ASB family card links to the plugin&#039;s WordPress.org page. Nothing else changes.<\/p>","4.4.3":"<p>Hardens output escaping in the title, featured-image and feed filters. Recommended for all users.<\/p>","4.4.2":"<p>Security and reliability release: images can only be drawn from your Media Library and the plugin&#039;s own files, custom font upload works again, and unexpected input no longer causes fatal errors. Recommended for all users.<\/p>","4.4.0":"<p>Adds hooks for other plugins (generate now, change the drawing config, know when an image is done). Nothing changes on your site unless another plugin uses them.<\/p>","4.3.0":"<p>Fixes per-post sidebar settings not being saved, and auto-generation not running when switched on in the same save as publishing. Images the plugin generated are now refreshed when the title or design changes; images you chose are never replaced.<\/p>","4.1.0":"<p>Adds optional WebP and AVIF copies for faster pages. Off by default; the featured image itself is unchanged. Safe to update.<\/p>","4.0.0":"<p>The Pro version is gone and all of its features are now part of this free plugin. Nothing to buy, no key to enter. Your existing settings are kept.<\/p>","3.1.7":"<p>Important update with security fixes and major performance improvements. Auto-generation now works when publishing from Gutenberg. Recommended for all users.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3794463,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3794463,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3794463,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3794463,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["4.4.3","4.4.4","4.4.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3794463,"resolution":"1","location":"assets","locale":"","width":1440,"height":1050},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3794463,"resolution":"2","location":"assets","locale":"","width":1440,"height":1050},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3794463,"resolution":"3","location":"assets","locale":"","width":1440,"height":1050},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3794463,"resolution":"4","location":"assets","locale":"","width":1200,"height":630}},"screenshots":{"1":"Main settings screen with live preview","2":"Layout settings tab","3":"Individual settings panel in the Gutenberg sidebar","4":"Example of a generated featured image"}},"plugin_section":[],"plugin_tags":[1795,52195,26918,2894,1540],"plugin_category":[],"plugin_contributors":[276744],"plugin_business_model":[],"class_list":["post-393817","plugin","type-plugin","status-publish","hentry","plugin_tags-featured-image","plugin_tags-image-generator","plugin_tags-ogp","plugin_tags-post-thumbnail","plugin_tags-social-sharing","plugin_contributors-asobit","plugin_committers-asobit"],"banners":{"banner":"https:\/\/ps.w.org\/asb-post-thumbnail\/assets\/banner-772x250.png?rev=3794463","banner_2x":"https:\/\/ps.w.org\/asb-post-thumbnail\/assets\/banner-1544x500.png?rev=3794463","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/asb-post-thumbnail\/assets\/icon-128x128.png?rev=3794463","icon_2x":"https:\/\/ps.w.org\/asb-post-thumbnail\/assets\/icon-256x256.png?rev=3794463","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/asb-post-thumbnail\/assets\/screenshot-1.png?rev=3794463","caption":"Main settings screen with live preview"},{"src":"https:\/\/ps.w.org\/asb-post-thumbnail\/assets\/screenshot-2.png?rev=3794463","caption":"Layout settings tab"},{"src":"https:\/\/ps.w.org\/asb-post-thumbnail\/assets\/screenshot-3.png?rev=3794463","caption":"Individual settings panel in the Gutenberg sidebar"},{"src":"https:\/\/ps.w.org\/asb-post-thumbnail\/assets\/screenshot-4.png?rev=3794463","caption":"Example of a generated featured image"}],"raw_content":"<!--section=description-->\n<p>ASB Post Thumbnail automatically generates a featured image for each post by combining the post title, categories, author name or any custom text with a design template. Images are generated when a post is saved, so every article gets a polished OGP image for social sharing \u2014 no design work required.<\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong>High-quality rendering engine<\/strong> \u2014 Uses ImageMagick (Imagick) for beautifully anti-aliased text when available, and falls back to the GD library automatically.<\/li>\n<li><strong>Full Gutenberg integration<\/strong> \u2014 Live preview and one-click generation from a sidebar panel in the block editor.<\/li>\n<li><strong>Three-layer layout<\/strong> \u2014 Place the post title, excerpt, category, author name, date or custom text freely on the top, middle and bottom layers.<\/li>\n<li><strong>Bundled Japanese font<\/strong> \u2014 Noto Sans JP (Regular &amp; Bold, SIL Open Font License 1.1) is included, so Japanese and Latin titles render beautifully out of the box.<\/li>\n<li><strong>Japanese line-breaking rules (kinsoku)<\/strong> \u2014 Automatic word wrapping that keeps punctuation off the start of a line.<\/li>\n<li><strong>Lightweight display copies (WebP \/ AVIF)<\/strong> \u2014 optional. Your pages serve a much smaller copy while the featured image itself stays a JPEG, so social cards, feeds and other plugins are untouched. Browsers that cannot read the copy fall back to the JPEG on their own.<\/li>\n<li><strong>OGP-optimized size<\/strong> \u2014 1200 x 630 by default, ideal for X (Twitter) and Facebook sharing.<\/li>\n<li><strong>Live preview on the settings screen<\/strong> \u2014 See exactly what generated images will look like while you tweak the design.<\/li>\n<\/ul>\n\n<h4>Security and Performance<\/h4>\n\n<ul>\n<li>REST API input is sanitized in multiple layers (SSRF and path traversal protection).<\/li>\n<li>Duplicate save_post calls from Gutenberg are suppressed with a static flag.<\/li>\n<li>Preview images are cleaned up by a daily cron job; previously auto-generated featured images are removed when a new one is generated (manually chosen images are never touched).<\/li>\n<li>The Imagick instance is reused during generation, keeping long titles fast to render.<\/li>\n<\/ul>\n\n<h4>Design Control<\/h4>\n\n<p>Everything below is included \u2014 there is no paid edition.<\/p>\n\n<ul>\n<li><strong>Custom font upload<\/strong> (.ttf \/ .otf)<\/li>\n<li><strong>Downloadable extra Japanese fonts<\/strong> (M PLUS Rounded 1c, Kaisei Tokumin, Sawarabi Mincho, Shippori Mincho, RocknRoll One, Noto Serif JP)<\/li>\n<li><strong>Image layers<\/strong> \u2014 place a logo or any image on a layer<\/li>\n<li><strong>Multiple background images<\/strong> with random or sequential rotation<\/li>\n<li><strong>Overlay<\/strong> (semi-transparent color layer)<\/li>\n<li><strong>Text stroke (outline), Y-axis offset and line-height fine-tuning<\/strong><\/li>\n<li><strong>Stack layout mode<\/strong><\/li>\n<li><strong>Custom post type support<\/strong><\/li>\n<li><strong>Synchronous generation mode<\/strong> (required for Jetpack social image integrations)<\/li>\n<li><strong>Per-category \/ per-tag \/ per-post override rules<\/strong> (disable generation or apply a different design)<\/li>\n<li><strong>Per-post setting overrides<\/strong><\/li>\n<li><strong>Permission settings tab<\/strong><\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>The plugin connects to one third-party service, and only when an administrator asks it to.<\/p>\n\n<h4>Google Fonts (fonts.gstatic.com)<\/h4>\n\n<p>The settings screen offers a few optional Japanese fonts (listed under \"Credits\" below). When an administrator clicks \"Download\" next to one of them, your server downloads that font file from a fixed address on fonts.gstatic.com and saves it in the uploads folder, so the font can be used for generated images. Nothing is requested before the button is clicked, and nothing is requested again afterwards.<\/p>\n\n<p>What is sent: an ordinary download request for that one file. Like any request WordPress makes, it carries your server's IP address and your site's address (WordPress's standard User-Agent header). No post content, no user data and no visitor data are sent. Generated images are made on your own server and are never uploaded anywhere.<\/p>\n\n<p>Terms of service: https:\/\/developers.google.com\/fonts\/terms\nPrivacy policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h3>Source Code<\/h3>\n\n<p>This plugin ships with a compiled JavaScript bundle for the block-editor sidebar\nUI: <code>build\/index.js<\/code>, <code>build\/index.css<\/code> and <code>build\/index-rtl.css<\/code>. These are\ngenerated from React\/JSX source using the standard WordPress build toolchain\n(<code>@wordpress\/scripts<\/code>, i.e. webpack under the hood).<\/p>\n\n<p><strong>The human-readable source is included in this plugin<\/strong>, under <code>editor-src\/<\/code>:<\/p>\n\n<ul>\n<li><code>editor-src\/src\/index.js<\/code> \u2014 the React\/JSX source of the sidebar panel<\/li>\n<li><code>editor-src\/src\/index.scss<\/code> \u2014 its styles<\/li>\n<li><code>editor-src\/package.json<\/code> \u2014 build scripts and the single dev dependency<\/li>\n<li><code>editor-src\/babel.config.js<\/code> \u2014 the Babel settings used by the build<\/li>\n<li><code>editor-src\/package-lock.json<\/code> \u2014 the exact dependency tree<\/li>\n<li><code>editor-src\/README.md<\/code> \u2014 build instructions and a note on the shipped bundle<\/li>\n<\/ul>\n\n<p>To rebuild, run <code>npm install<\/code> then <code>npm run build<\/code> inside <code>editor-src\/<\/code>\n(development watch build: <code>npm start<\/code>), and copy the resulting <code>build\/<\/code> files\nover the plugin's own <code>build\/<\/code> directory.<\/p>\n\n<p>No third-party analytics, tracking or obfuscation is applied to the bundle.<\/p>\n\n<h3>Credits<\/h3>\n\n<ul>\n<li>Bundled font: Noto Sans JP (SIL Open Font License 1.1)<\/li>\n<li>Select2 4.1.0 (MIT License), bundled unmodified in <code>vendor\/select2\/<\/code> together with its unminified files (<code>select2.js<\/code>, <code>select2.css<\/code>): https:\/\/select2.org\/ \u2014 source: https:\/\/github.com\/select2\/select2\/tree\/4.1.0<\/li>\n<li>Downloadable fonts: M PLUS Rounded 1c, Kaisei Tokumin, Sawarabi Mincho, Shippori Mincho, RocknRoll One, Noto Serif JP (SIL Open Font License 1.1), fetched from the Google Fonts CDN on request.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Go to Plugins &gt; Add New in your WordPress admin and search for \"ASB Post Thumbnail\", or upload the plugin ZIP via Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open the \"ASB Post Thumbnail\" menu in the admin sidebar and configure the design settings.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20on%20servers%20without%20imagemagick%3F\"><h3>Does it work on servers without ImageMagick?<\/h3><\/dt>\n<dd><p>Yes. When the Imagick PHP extension is not available, the plugin automatically falls back to the GD library. ImageMagick renders text with higher quality, so we recommend it when available.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20posts%20that%20already%20have%20a%20featured%20image%3F\"><h3>What happens to posts that already have a featured image?<\/h3><\/dt>\n<dd><p>\"Disable auto-generation for posts that already have a featured image\" is enabled by default, so a featured image you chose yourself is never replaced by auto-generation.<\/p><\/dd>\n<dt id=\"can%20i%20control%20where%20the%20title%20wraps%20inside%20the%20image%3F\"><h3>Can I control where the title wraps inside the image?<\/h3><\/dt>\n<dd><p>Yes. Type <code>-br-<\/code> in the post title where you want the line to break in the generated image (for example, <code>Big product announcement-br-here is what changed<\/code>). The marker is removed automatically when the title is displayed on your site, from the browser tab title, and from the web address that WordPress makes from the title when the post is published (addresses that are already set are not changed).<\/p><\/dd>\n<dt id=\"can%20it%20generate%20webp%20or%20avif%3F\"><h3>Can it generate WebP or AVIF?<\/h3><\/dt>\n<dd><p>Yes, as lightweight copies used for display. Turn on \"Lightweight Display Copies\" on the settings screen and the plugin writes a WebP (and, if you choose, an AVIF) next to each generated image and serves them through a <code>&lt;picture&gt;<\/code> element.<\/p>\n\n<p>The featured image itself deliberately stays a JPEG. og:image, RSS feeds, e-mail and notification plugins all read that one file, and several of them cannot read AVIF \u2014 a site can look faster and still have blank social cards. Browsers that cannot read the copy fall back to the JPEG automatically; no JavaScript and no browser detection is involved.<\/p>\n\n<p>The settings screen reports what your server can actually encode. It does not take the PHP extension's word for it: it encodes a small test image and inspects the result, because some builds of GD advertise AVIF support and then produce nothing.<\/p><\/dd>\n<dt id=\"i%20already%20use%20a%20plugin%20that%20converts%20images%20to%20webp\"><h3>I already use a plugin that converts images to WebP<\/h3><\/dt>\n<dd><p>Then leave this setting off. A caching or optimization plugin that already builds and serves modern formats does the same job for every image on the site, not just the generated ones, and running both simply writes the same picture twice.<\/p><\/dd>\n<dt id=\"my%20existing%20featured%20images%20have%20no%20webp%20or%20avif%20copies\"><h3>My existing featured images have no WebP or AVIF copies<\/h3><\/dt>\n<dd><p>Copies are written at generation time. Images that already exist get theirs the next time they are regenerated \u2014 for example by opening the post and using \"Generate &amp; Set Now\" in the editor sidebar.<\/p><\/dd>\n<dt id=\"which%20image%20formats%20can%20be%20used%20as%20backgrounds%20and%20image%20layers%3F\"><h3>Which image formats can be used as backgrounds and image layers?<\/h3><\/dt>\n<dd><p>JPEG, PNG, GIF and WebP images from your Media Library, and the images bundled with the plugin. AVIF is used only when the server's image library (Imagick, or GD on PHP 8.1 and later) can read it, and HEIC files that WordPress did not convert to JPEG are not used. An image that cannot be drawn is skipped and the next background is used instead.<\/p><\/dd>\n<dt id=\"which%20post%20types%20are%20supported%3F\"><h3>Which post types are supported?<\/h3><\/dt>\n<dd><p>Posts, pages and any public custom post type. Choose them on the settings screen.<\/p><\/dd>\n<dt id=\"does%20uninstalling%20remove%20my%20data%3F\"><h3>Does uninstalling remove my data?<\/h3><\/dt>\n<dd><p>Yes. Deleting the plugin removes its settings, post meta, preview images, and the fonts you uploaded or downloaded through it. Featured images that were already generated and stored in your media library are kept.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20translated%3F\"><h3>Is the plugin translated?<\/h3><\/dt>\n<dd><p>The interface is in English and fully prepared for translation. Translations are provided through translate.wordpress.org, and WordPress installs them automatically for your site's language. Contributions are welcome there.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20call%20any%20external%20services%3F\"><h3>Does the plugin call any external services?<\/h3><\/dt>\n<dd><p>Only when you ask it to. The one outbound request is the optional font download from Google Fonts, made when an administrator clicks \"Download\" next to a font. Nothing is sent anywhere otherwise. See \"External services\" below.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>4.4.5<\/h4>\n\n<p>Fixed\n* Settings screen: while editing an override rule, the live preview drew fields left empty (meaning \"use the default\") as 0 \u2014 for example with a font size of 0. Empty fields now follow the default in the preview too, just as they already did in the generated image.\n* \"Remove -br- from post titles\" now also removes the marker from the browser tab title (the title tag, including titles set by SEO plugins) and from the web address WordPress makes from the title when a post is first published. Web addresses that are already set, or that you typed yourself, are not changed.\n* Post editor: the \"(Follow default: \u2026)\" choice showed the setting's internal value (such as \"stack\" or \"title\"). It now shows the same name as the choices below it.<\/p>\n\n<p>Changed\n* The ASB family card now also links to the shop page of ASB Connect for LINE, now that its Pro version is on sale.<\/p>\n\n<h4>4.4.4<\/h4>\n\n<p>Changed\n* The ASB family card in the sidebar now links to this plugin's page on WordPress.org and invites a review, now that the plugin is listed there.<\/p>\n\n<h4>4.4.3<\/h4>\n\n<p>Security\n* A title changed by \"Remove -br- from post titles\" is passed through wp_kses_post() before it is returned. Titles the plugin does not change are left exactly as WordPress gives them.\n* The <code>&lt;picture&gt;<\/code> element for the WebP \/ AVIF display copies is filtered through wp_kses() before it is returned, keeping the image's srcset and sizes.\n* The featured image added to RSS and Atom feeds is escaped value by value where it is printed.\n* On saving a post, the classic editor's request to replace the featured image is accepted only with that post's edit nonce.<\/p>\n\n<h4>4.4.2<\/h4>\n\n<p>Security\n* Backgrounds and image layers can only use the plugin's own bundled images and Media Library images that the user is allowed to view \u2014 whether they are chosen on the settings screen, in the post editor or by another plugin. Other files on the server can no longer be drawn into a generated image, and an image attached to a private post can no longer end up in a public featured image.\n* Font settings accept only a font file name from the plugin's font folders.\n* Only users who can change the main settings can preview unsaved site-wide settings, and \"Generate &amp; Set Now\" also needs permission to upload files.\n* Per-post settings are no longer shown in the public REST API. The editor receives only the settings it uses, and the rule search lists only posts the user can read.\n* A value sent in an unexpected form (such as an array) no longer causes a fatal error on saving or previewing; it falls back to its default.\n* The Permissions tab accepts only the four listed capabilities. An invalid saved value is reset to its default (Administrator for the main settings, Contributor and above for per-post settings), so nobody can be locked out of the settings.\n* File names, image addresses and search terms are inserted on the settings screen as plain text, and only .ttf and .otf files can be deleted from the font list.<\/p>\n\n<p>Fixed\n* English and other space-separated text was broken in the middle of a word at the end of a line (\"title fo \/ r preview\"). Words now move to the next line whole; Japanese line breaking is unchanged.\n* Choosing a layout template stopped with a script error (\"Maximum call stack size exceeded\") caused by the colour pickers, and the preview was then labelled \"New Rule\".\n* The colour pickers of a newly added rule did not open until the settings were saved and the page reloaded.\n* When a background image could not be drawn, the featured image came out with a plain white background. The plugin now moves on to the next image \u2014 the per-post background, then the rule's, then the site's, and finally the bundled default \u2014 so the preview and the generated image always match.\n* \"Sequence\" backgrounds keep the same picture for every post that already had one, and the editor preview shows the right picture for each post.\n* AVIF images work as backgrounds and image layers wherever the server's image library can read them, and images WordPress converted from HEIC to JPEG are drawn.\n* The image, display size and padding chosen for an image layer in the post editor were lost when the post was saved, so automatic generation ignored them.\n* An image layer set in a rule by its address alone showed the default layer image instead.\n* On the very first save, every checkbox (and each rule's \"Disable auto-generation\") could switch itself on.\n* Uploading a custom .ttf or .otf font always failed with \"Sorry, you are not allowed to upload this file type.\" It now also works on servers whose file-type detection does not recognise fonts, and Japanese font file names keep all their characters.\n* Deleting a font that was already gone gave no message.\n* A font download that was cut off stayed marked \"Installed\". Downloads are now checked before they are kept, a damaged file can be downloaded again, and the listed font sizes are accurate.\n* Saving the settings removed the bundled default background image.\n* \"Settings saved.\" and the font upload and delete messages never appeared on the settings screen.\n* Pressing Enter in a field could ask to delete an added font.\n* Titles and names were drawn with HTML entities (for example \"\u2026\" or \"&amp;\"), private and protected posts got a \"Private:\" or \"Protected:\" prefix, and \"-br-\" line breaks were ignored when the image was made in the background.\n* Adding a password to a post now regenerates its featured image, so text drawn before the password was set does not stay on it.\n* Regenerating an image no longer deletes the old one when another post uses it as its featured image.\n* The settings screen failed on servers without GLOB_BRACE (Alpine and other musl-based systems).\n* On servers that do not allow \"Options\" in .htaccess, the plugin's upload folders could answer with a 500 error. Existing .htaccess files are updated.\n* Deprecation notices from imagedestroy() and finfo_close() on PHP 8.5.<\/p>\n\n<p>Changed\n* <code>asbptp_generate_for_post()<\/code> no longer replaces a featured image chosen by hand while \"Disable auto-generation for posts that already have a featured image\" is on. Pass <code>array( 'replace' =&gt; true )<\/code> to replace it.\n* On servers without Imagick, text outlines are limited to 20px and drawn within a time budget, so very long text can no longer tie up the server. WebP images now work as backgrounds and image layers there too.\n* The settings screen no longer prints inline style blocks; all of its styles are in the plugin's stylesheet.\n* Every global name now uses the plugin's own prefix. The admin-menu grouping helper is now <code>asbptp_family_group_admin_menu()<\/code>.\n* The \"View on WordPress.org\" link and the review card appear once the plugin is listed there.\n* The bundled Select2 is updated to 4.1.0, and its unminified files are included.\n* The protective files in the plugin's upload folders are written with the WordPress filesystem API, and the plugin no longer clears PHP's opcode cache itself (WordPress does this when it updates a plugin).\n* Removed leftover references to the former Pro edition from comments, styles and the font license notice.<\/p>\n\n<h4>4.4.1<\/h4>\n\n<ul>\n<li>The sidebar's list of other ASB plugins follows their current names and listings.<\/li>\n<\/ul>\n\n<h4>4.4.0<\/h4>\n\n<ul>\n<li>Added (for developers): three hooks so that other plugins can give a post its featured image even when nobody is logged in \u2014 for example a post written by a background job, which the automatic generation on save never sees.<\/li>\n<li><code>asbptp_generate_for_post( $post_id )<\/code> makes the featured image right away with the site's settings and returns the attachment ID (or a WP_Error). It respects the per-post switch, the enabled post types and the rules, and also works for drafts.<\/li>\n<li>The <code>asbptp_generation_config<\/code> filter changes what is drawn \u2014 for example a background picture chosen for this post, or a shorter title with <code>-br-<\/code> line breaks. Saving, the background job, the preview and the \"is the image still current\" check all read through it.<\/li>\n<li>The <code>asbptp_thumbnail_generated<\/code> action fires after a featured image has been generated and set, with the post ID and the attachment ID.<\/li>\n<li>Fixed: PHP 8.1 and later printed \"Implicit conversion from float to int\" notices while drawing text with GD. The text position is now rounded to whole pixels first; the image looks the same.<\/li>\n<\/ul>\n\n<h4>4.3.0<\/h4>\n\n<ul>\n<li>Fixed: per-post settings made in the editor sidebar were lost when you saved. The settings were registered with two types at once (object or array), and WordPress quietly leaves such meta out of the REST API that the block editor saves through \u2014 so the editor never received the saved values and whatever it sent back was discarded. Background image, sizes, colours and layer settings for a single post now survive \"Save draft\" and page reloads, and the generated image uses them.<\/li>\n<li>Fixed: turning on \"Enable auto-generation for this post\" and publishing in the same save did nothing. Generation was decided on <code>save_post<\/code>, which the block editor fires before it writes the post's meta and categories, so the switch still read as off. Generation now waits for <code>wp_after_insert_post<\/code>, after everything from that save is stored.<\/li>\n<li>Changed: a featured image this plugin generated is refreshed when the title, categories, sidebar settings or design change. Until now any existing featured image \u2014 including one the plugin had made itself \u2014 stopped generation for good, so edits after publishing never reached the image. An image you chose yourself is still never replaced (with \"Disable auto-generation for posts that already have a featured image\" on), and saving with nothing changed does not make a new image.<\/li>\n<li>Improved: the sidebar says when the image will be made (on publish for drafts), when a featured image you chose is being kept, and \u2014 in asynchronous mode \u2014 shows the image as soon as the background job finishes, without reloading the editor.<\/li>\n<\/ul>\n\n<h4>4.2.0<\/h4>\n\n<ul>\n<li>Added: the featured image is now part of the site's feeds. WordPress's RSS and Atom feeds never mention it, so anything that reposts from the feed \u2014 RSS-to-social services such as dlvr.it, Zapier or IFTTT, feed readers, a static site whose feed is built from a private WordPress \u2014 had no picture to show, and Instagram-style targets refused the post. Each item now carries an RSS enclosure and Media RSS content\/thumbnail elements (an enclosure link in Atom) pointing at the full-size JPEG that og:image uses, not the WebP\/AVIF display copies. Password-protected posts are left without an image. <code>add_filter( 'asbptp_feed_featured_image', '__return_false' )<\/code> turns it off.<\/li>\n<\/ul>\n\n<h4>4.1.0<\/h4>\n\n<ul>\n<li>Added: optional WebP and AVIF copies for display. The generated featured image stays a JPEG \u2014 og:image, feeds and notification plugins all read that one file and not all of them understand AVIF \u2014 and the plugin writes lighter copies beside it, offering them through a <code>&lt;picture&gt;<\/code> element. Browsers that cannot read them fall back to the JPEG on their own. On a 1200 x 630 image the WebP is typically about a quarter of the JPEG, and the AVIF about a tenth.<\/li>\n<li>Added: the settings screen reports which formats this server can really produce. It encodes a test image and inspects the bytes rather than trusting the extension's own claim, because some builds of GD advertise AVIF support and then write an empty file.<\/li>\n<li>A format is offered to the browser only when every size in that image's srcset has a copy. A half-mapped srcset makes the browser ask for a file that is not there and show nothing at all \u2014 and only at the widths that happen to be missing, which is the kind of fault that never reproduces where it was built.<\/li>\n<li>Copies are deleted together with the attachment they belong to, and when the plugin is uninstalled.<\/li>\n<\/ul>\n\n<h4>4.0.3<\/h4>\n\n<ul>\n<li>Fixed: the sample \"Custom Text\" introduced in 4.0.1 also appeared in the preview inside the post editor's sidebar, where a layer with nothing typed into it used to show nothing at all. That preview is a promise about one particular post, so words nobody wrote do not belong in it. The sample is now shown only on the plugin's own settings screen, where there is no post behind the picture and something has to be visible to judge the font, size and colour by.<\/li>\n<\/ul>\n\n<h4>4.0.2<\/h4>\n\n<ul>\n<li>Fixed: the live preview could show the <em>previous<\/em> choice \u2014 pick \"Custom Text\" and the picture stayed as it was, switch back to \"(None)\" and the custom text appeared. Nothing was reversed: the preview was simply a step behind. Choosing from a dropdown now redraws at once instead of waiting out a delay, an answer that arrives late can no longer paint over a newer one, and the old picture is dimmed while the new one is being drawn, so a stale image is never mistaken for the result.<\/li>\n<li>Fixed: a layer with no font selected painted no text at all \u2014 the empty selection resolved to the fonts <em>folder<\/em> instead of a font file, and the drawing step then failed without a word. It now falls back to the bundled Noto Sans JP, as it always did for a font that had been removed.<\/li>\n<li>Fixed: after updating the plugin, the preview could keep showing pictures drawn by the previous version, because they were cached by settings alone. The plugin version is now part of that cache key.<\/li>\n<\/ul>\n\n<h4>4.0.1<\/h4>\n\n<ul>\n<li>Fixed: setting a layer's content to \"Custom Text\" left the live preview blank until you typed something into the field, so there was nothing to judge the font, size, colour, stroke or position by \u2014 the settings looked as if they did nothing. The preview now shows a sample \"Custom Text\" in that layer, and the field itself carries the same words as a placeholder. Generated images are unchanged: an empty custom text still paints nothing on them.<\/li>\n<li>Fixed: the live preview followed the page for one screenful and then scrolled out of sight, which is where the longest settings are. It now stays in view all the way down the settings column. On narrow screens, where the two columns stack, the preview sits above the settings and stays pinned there instead of being buried below everything.<\/li>\n<\/ul>\n\n<h4>4.0.0<\/h4>\n\n<ul>\n<li>There is no longer a Pro version. Everything that used to be paid \u2014 custom font upload, downloadable Japanese fonts, image layers, multiple and rotating backgrounds, overlay, text stroke, stack layout, custom post types, synchronous generation, per-category \/ per-tag \/ per-post override rules and the permission settings \u2014 is in this single free plugin, unlocked, with no key to enter.<\/li>\n<li>Removed: the licence screen and everything that went with it. The plugin contacts no licence server, and no setting is greyed out or held back. Licence data left over from 3.5.x is cleared when the plugin is uninstalled.<\/li>\n<li>Settings you already saved are kept as they are.<\/li>\n<\/ul>\n\n<h4>3.5.9<\/h4>\n\n<ul>\n<li>Fixed: for a password-protected post, the generated featured image could have the opening of the post's text painted onto it. The image is an ordinary file in your uploads folder \u2014 no password stands in front of a PNG \u2014 so the text was readable by anyone with the link, and by anything that follows links. Protected posts still get their image; the excerpt layer is simply left blank on it, and the title, author and category layers are unaffected.<\/li>\n<\/ul>\n\n<h4>3.5.3<\/h4>\n\n<ul>\n<li>Security: hardened the local-image path resolver against directory-boundary and traversal edge cases when reading background \/ layer images.<\/li>\n<li>Security: generated-image dimensions are now clamped (per-side and total pixels) to prevent resource-exhaustion from extreme values.<\/li>\n<li>Reliability: automatic generation now re-checks the post state right before it runs, so a featured image you set manually right after publishing is never overwritten.<\/li>\n<li>Reliability: orphaned image files are cleaned up when attachment registration fails; scheduled cleanup events are removed on deactivate\/uninstall.<\/li>\n<li>Library: bundled Select2 updated from a release candidate to the stable 4.0.13.<\/li>\n<\/ul>\n\n<h4>3.1.7<\/h4>\n\n<ul>\n<li>Security: fixed an SSRF vulnerability in the REST API (external URL downloads are now blocked).<\/li>\n<li>Security: multi-layer sanitization of REST input and stronger path traversal protection.<\/li>\n<li>Security: thorough output escaping on the settings screen and safer nonce verification for font upload and deletion.<\/li>\n<li>Compatibility: auto-generation now also runs when publishing from Gutenberg; duplicate save_post calls are suppressed with a static flag.<\/li>\n<li>Performance: the Imagick instance is reused (up to ~60x faster with long titles) and getimagesize results are cached.<\/li>\n<li>Performance: cron arguments are reduced to the post ID only to prevent wp_options bloat; preview images older than 24 hours are cleaned up by a daily cron job.<\/li>\n<li>Improvement: old auto-generated featured images are removed when a new one is generated (manually replaced images are protected).<\/li>\n<li>Improvement: the bundled default-bg.jpg is used as the initial background, Select2 is bundled locally instead of loaded from a CDN, and index.php\/.htaccess hardening files are placed in the upload directories.<\/li>\n<\/ul>\n\n<h4>3.0.3<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Automatically generates beautiful featured images (OGP-ready) from post titles, categories and design templates.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393817","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=393817"}],"author":[{"embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/asobit"}],"wp:attachment":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393817"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393817"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393817"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393817"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393817"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}