{"id":390551,"date":"2026-10-25T12:08:21","date_gmt":"2026-10-25T12:08:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kraan-media-seo-ai-meta-filler\/"},"modified":"2026-11-06T20:05:15","modified_gmt":"2026-11-06T20:05:15","slug":"kraan-media-seo-ai-meta-filler","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/kraan-media-seo-ai-meta-filler\/","author":75142,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.6","stable_tag":"2.1.6","tested":"7.1.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Kraan Media SEO & AI Meta Filler","header_author":"Marcel Kraan","header_description":"Automatically fill media library meta tags (alt, title, description) for SEO and AI discoverability using batch processing.","assets_banners_color":"7198ac","last_updated":"2026-11-06 20:05:15","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.paypal.com\/cgi-bin\/webscr?cmd=_donations&business=marcel@kraan.net&item_name=Kraan+Media+SEO+Plugin&currency_code=EUR","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":274,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.4":{"tag":"2.1.4","author":"marcelkraan","date":"2026-10-25 12:08:11","revision":3764489},"2.1.6":{"tag":"2.1.6","author":"marcelkraan","date":"2026-11-06 20:05:15","revision":3788638}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3764489,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3764489,"resolution":"772x250","location":"assets","locale":"","width":722,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.1.4","2.1.6"],"block_files":[],"assets_screenshots":{"screenshot-0.png":{"filename":"screenshot-0.png","revision":3764489,"resolution":"0","location":"assets","locale":"","width":1794,"height":1446},"screenshot-1.png":{"filename":"screenshot-1.png","revision":3764489,"resolution":"1","location":"assets","locale":"","width":1750,"height":1668},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3764489,"resolution":"2","location":"assets","locale":"","width":1800,"height":1670}},"screenshots":{"1":"The Bulk SEO Monitor in action.","2":"Plugin configuration settings."}},"plugin_section":[],"plugin_tags":[2353,17214,6357,233,186],"plugin_category":[55],"plugin_contributors":[281337],"plugin_business_model":[],"class_list":["post-390551","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-alt-text","plugin_tags-image-seo","plugin_tags-media-library","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-marcelkraan","plugin_committers-marcelkraan"],"banners":{"banner":"https:\/\/ps.w.org\/kraan-media-seo-ai-meta-filler\/assets\/banner-772x250.png?rev=3764489","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kraan-media-seo-ai-meta-filler\/assets\/icon-256x256.png?rev=3764489","icon_2x":"https:\/\/ps.w.org\/kraan-media-seo-ai-meta-filler\/assets\/icon-256x256.png?rev=3764489","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kraan-media-seo-ai-meta-filler\/assets\/screenshot-0.png?rev=3764489","caption":""},{"src":"https:\/\/ps.w.org\/kraan-media-seo-ai-meta-filler\/assets\/screenshot-1.png?rev=3764489","caption":"The Bulk SEO Monitor in action."},{"src":"https:\/\/ps.w.org\/kraan-media-seo-ai-meta-filler\/assets\/screenshot-2.png?rev=3764489","caption":"Plugin configuration settings."}],"raw_content":"<!--section=description-->\n<p>Kraan Media SEO &amp; AI Meta Filler is a WordPress plugin designed to bulk-process your media library. It helps to ensure images on your website are optimized by automatically generating Alt-texts, Titles, and Captions.<\/p>\n\n<p>You can choose between two generation methods:<\/p>\n\n<ol>\n<li><strong>Parse from Filename (Local):<\/strong> Cleans up your current filenames (e.g., <code>red-mercedes-c180.jpg<\/code> becomes \"Red Mercedes C180\") and applies them to your SEO meta tags.<\/li>\n<li><strong>AI Vision API (Remote):<\/strong> Utilizes the external OpenAI API (gpt-4o-mini Vision model) to analyze images and write descriptive Alt-texts.<\/li>\n<\/ol>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>Automated Background Cronjob:<\/strong> Enable the hourly cron to process up to 50 new media uploads in the background.<\/li>\n<li><strong>Fallback System:<\/strong> If the OpenAI API fails, hits a rate limit, or rejects an image, the plugin falls back to the local 'Parse from Filename' method to prevent the bulk process from stopping.<\/li>\n<li><strong>Bulk Dashboard:<\/strong> An AJAX-powered dashboard with live ETA, processing speed metrics, and a dynamic progress bar.<\/li>\n<li><strong>Overwrite Mode:<\/strong> Optionally force the plugin to overwrite existing media tags in your library.<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin can connect to an external API (OpenAI) to generate alternative text for images when the \"AI Vision API\" method is enabled in the settings.<\/p>\n\n<ul>\n<li><strong>Service Used:<\/strong> OpenAI API (https:\/\/platform.openai.com)<\/li>\n<li><strong>Purpose:<\/strong> To analyze image content via the gpt-4o-mini Vision model and return a short, descriptive string of text in Dutch to be used as an Alt tag.<\/li>\n<li><strong>Data Transmitted:<\/strong> When the AI method is active, the plugin sends a direct URL of the image thumbnail (or the full image URL if no thumbnail exists) alongside a static text prompt to the OpenAI API servers. This process only occurs when explicitly initiated by the user.<\/li>\n<li><strong>Terms of Use:<\/strong> <a href=\"https:\/\/openai.com\/policies\/terms-of-use\">OpenAI Terms of Use<\/a><\/li>\n<li><strong>Privacy Policy:<\/strong> <a href=\"https:\/\/openai.com\/policies\/privacy-policy\">OpenAI Privacy Policy<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>kraan-media-seo<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Navigate to <strong>Settings &gt; Kraan Media SEO<\/strong> (or via the Media menu).<\/li>\n<li>Select your preferred Generation Method.<\/li>\n<li>If using the OpenAI Vision API, you must provide your own API Key (starts with <code>sk-<\/code>).<\/li>\n<li>Click <strong>Start<\/strong> to begin the bulk optimization.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"i%20am%20getting%20an%20%22insufficient_quota%22%20or%20%22billing%22%20error%20from%20openai.%20what%20do%20i%20do%3F\"><h3>I am getting an \"insufficient_quota\" or \"Billing\" error from OpenAI. What do I do?<\/h3><\/dt>\n<dd><p>OpenAI's API is a prepaid service and is not included in a ChatGPT Plus subscription. You must add a minimum balance to your OpenAI developer account at <code>platform.openai.com\/settings\/organization\/billing\/overview<\/code>.<\/p><\/dd>\n<dt id=\"will%20the%20ai%20reject%20certain%20images%3F\"><h3>Will the AI reject certain images?<\/h3><\/dt>\n<dd><p>Yes. OpenAI has a safety filter and may reject certain content. If this happens, the plugin will catch the error, bypass the AI, and safely fall back to the filename-parsing method for that specific image. Your bulk process will continue.<\/p><\/dd>\n<dt id=\"does%20the%20cronjob%20slow%20down%20my%20website%3F\"><h3>Does the Cronjob slow down my website?<\/h3><\/dt>\n<dd><p>No. The automatic cronjob is limited to processing a maximum of 50 empty images per hour in the background.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.4<\/h4>\n\n<ul>\n<li>Resolved Plugin Check requirements: Replaced inline scripts and styles with wp_enqueue_script and wp_enqueue_style hooks.<\/li>\n<li>Formatted SQL prepare statements to meet automated scanner requirements.<\/li>\n<li>Added mandatory documentation regarding 3rd Party External Services (OpenAI) to the readme file.<\/li>\n<li>Removed promotional superlatives from the description to comply with repository guidelines.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Fixed missing JavaScript variables that caused the UI to hang on Initialization.<\/li>\n<\/ul>\n\n<h4>2.0.9<\/h4>\n\n<ul>\n<li>Migrated from heavy SQL JOIN queries to ultra-fast PHP array comparisons to prevent database timeouts on large media libraries.<\/li>\n<\/ul>\n\n<h4>2.0.7<\/h4>\n\n<ul>\n<li>Added dynamic fallback processing for broken images (e.g. 404 errors) to prevent batch stops.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>UI completely translated to English. Added Automated Hourly Cronjob and \"Overwrite Existing Tags\" functionalities.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Initial implementation of the AJAX batch processing engine.<\/li>\n<\/ul>","raw_excerpt":"Automatically fill media library meta tags (Alt, Title, Description) for SEO discoverability using bulk processing and OpenAI Vision.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/390551","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=390551"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/marcelkraan"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=390551"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=390551"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=390551"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=390551"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=390551"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=390551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}