{"id":359509,"date":"2026-08-31T15:18:47","date_gmt":"2026-08-31T15:18:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/altcraft-ai-image-seo-auto-alt-text-generator\/"},"modified":"2026-08-31T15:18:22","modified_gmt":"2026-08-31T15:18:22","slug":"altcraft-ai-image-seo","status":"publish","type":"plugin","link":"https:\/\/fuc.wordpress.org\/plugins\/altcraft-ai-image-seo\/","author":17765647,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"AltCraft AI \u2013 Image SEO & Auto Alt Text Generator","header_author":"Cubixsol","header_description":"AI-written image ALT text, titles and captions (Google Gemini or OpenAI) with a Media SEO table, bulk scanner, nightly cron, WebP copies and WooCommerce context.","assets_banners_color":"2c1862","last_updated":"2026-08-31 15:18:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/cubixsol.com\/products\/","header_author_uri":"https:\/\/cubixsol.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":50,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"cubixsol","date":"2026-08-31 15:18:22","revision":3674544}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3674581,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3674581,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3674581,"resolution":"1","location":"assets","locale":"","width":1920,"height":1758},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3674581,"resolution":"2","location":"assets","locale":"","width":1920,"height":2296},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3674581,"resolution":"3","location":"assets","locale":"","width":1920,"height":1512},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3674581,"resolution":"5","location":"assets","locale":"","width":1920,"height":1612},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3674581,"resolution":"6","location":"assets","locale":"","width":1600,"height":695},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3674581,"resolution":"7","location":"assets","locale":"","width":1920,"height":1501},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3674581,"resolution":"8","location":"assets","locale":"","width":1600,"height":699}},"screenshots":{"1":"Settings \u2013 choose the WordPress AI Client or a direct Google Gemini \/ OpenAI key, pick a model and test the connection with a built-in image.","2":"Automation &amp; SEO Rules \u2013 what the AI looks at, generate on upload, overwrite rules, title and caption sync, output language, ALT style and the nightly background scan.","3":"WebP \u2013 create .webp copies of every image size and optionally serve them to visitors.","4":"WooCommerce \u2013 product context (title, categories, SKU) and store\/brand keywords.","5":"Advanced \u2013 request timeout, uninstall cleanup, server capabilities and developer hooks.","6":"Media SEO Table \u2013 every image with inline-editable ALT text, title and caption, status tabs, search and a \"no image uploaded\" guard.","7":"Bulk Vision Scanner \u2013 process the whole library with live progress, counters and a log."}},"plugin_section":[],"plugin_tags":[1953,17214,6357,15376,286],"plugin_category":[34,45],"plugin_contributors":[271535],"plugin_business_model":[],"class_list":["post-359509","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-alt-text","plugin_tags-image-seo","plugin_tags-webp","plugin_tags-woocommerce","plugin_category-accessibility","plugin_category-ecommerce","plugin_contributors-cubixsol","plugin_committers-cubixsol"],"banners":{"banner":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/banner-772x250.png?rev=3674581","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/icon-256x256.png?rev=3674581","icon_2x":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/icon-256x256.png?rev=3674581","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/screenshot-1.png?rev=3674581","caption":"Settings \u2013 choose the WordPress AI Client or a direct Google Gemini \/ OpenAI key, pick a model and test the connection with a built-in image."},{"src":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/screenshot-2.png?rev=3674581","caption":"Automation &amp; SEO Rules \u2013 what the AI looks at, generate on upload, overwrite rules, title and caption sync, output language, ALT style and the nightly background scan."},{"src":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/screenshot-3.png?rev=3674581","caption":"WebP \u2013 create .webp copies of every image size and optionally serve them to visitors."},{"src":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/screenshot-5.png?rev=3674581","caption":"Advanced \u2013 request timeout, uninstall cleanup, server capabilities and developer hooks."},{"src":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/screenshot-6.png?rev=3674581","caption":"Media SEO Table \u2013 every image with inline-editable ALT text, title and caption, status tabs, search and a \"no image uploaded\" guard."},{"src":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/screenshot-7.png?rev=3674581","caption":"Bulk Vision Scanner \u2013 process the whole library with live progress, counters and a log."},{"src":"https:\/\/ps.w.org\/altcraft-ai-image-seo\/assets\/screenshot-8.png?rev=3674581","caption":""}],"raw_content":"<!--section=description-->\n<p><strong>AltCraft AI<\/strong> looks at every image in your Media Library and writes accurate, natural ALT text for it \u2013 the kind that helps screen-reader users and ranks in Google Images. Bring your own Google Gemini or OpenAI API key; everything else is included, with no upsells.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>Generate on upload<\/strong> \u2013 new images get ALT text (and optionally a title and caption) during the upload, so it is already there when you insert the image in the editor.<\/li>\n<li><strong>Media SEO Table<\/strong> \u2013 a dedicated screen listing every image with its ALT text, title and caption. Edit inline, filter by <em>Missing ALT<\/em> \/ <em>Optimized<\/em> \/ <em>WooCommerce<\/em>, search the whole library, and paginate through thousands of images.<\/li>\n<li><strong>Bulk Vision Scanner<\/strong> \u2013 process the entire library from one screen with a live progress bar, counters and a log. Stops cleanly, retries when the provider rate-limits you, and skips images that already have manual ALT text (or rewrites everything, if you ask it to).<\/li>\n<li><strong>Media Library integration<\/strong> \u2013 an <em>AI Alt Text<\/em> column with a Generate button in the list view, and a <em>Generate ALT text with AI<\/em> button inside the media modal and the attachment edit screen.<\/li>\n<li><strong>Nightly background scan<\/strong> \u2013 WP-Cron quietly fixes images that are still missing ALT text, in small batches that respect shared-hosting time limits.<\/li>\n<li><strong>WebP copies<\/strong> \u2013 creates a lighter <code>.webp<\/code> version of the original and every thumbnail size (originals are never modified) and can optionally serve them to browsers that support WebP. Copies are removed when you delete the image.<\/li>\n<li><strong>WooCommerce context<\/strong> \u2013 product images are described with the product title, categories and SKU in mind (featured image and gallery images are both detected). Add store or brand keywords and the AI uses them only where they fit.<\/li>\n<li><strong>Your rules<\/strong> \u2013 choose what the AI looks at (the image and its filename, the image only, or the filename only without ever sending the image), the ALT style (concise SEO, descriptive accessibility or keyword focused), the output language (30+ languages) and whether existing ALT text may be overwritten.<\/li>\n<li><strong>Works with the WordPress AI Client<\/strong> \u2013 on WordPress 7.0+ the plugin can use the provider and API key your site already has under <em>Settings \u2192 Connectors<\/em> (Google, OpenAI, Anthropic or any provider plugin), so you configure AI once for every plugin and this plugin stores no credentials at all.<\/li>\n<li><strong>Or bring your own key<\/strong> \u2013 direct Google Gemini (3.7 \/ 3.6 \/ 3.5 Flash, Flash-Lite, 2.5) and OpenAI (GPT-5.6 Sol \/ Terra \/ Luna and older models) integrations for sites on WordPress 6.2\u20136.9 or for a dedicated key, with a custom model field so you are never stuck when a provider retires a model, plus a <em>Test connection<\/em> button that sends a real test image.<\/li>\n<li><strong>Developer friendly<\/strong> \u2013 filters for the prompt, the result, the context, the model and the image size; an action after every generation.<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>Only a downscaled copy of the image (max 1024 px) and a little context (the related product\/post title, product categories and SKU, your brand keywords, the filename) is sent to the AI provider you choose. In \"Filename only\" mode the image itself is never sent. No user data, no site URL and no other content leaves your site. Nothing is sent until you add an API key. The plugin does not phone home to Cubixsol and contains no tracking.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin sends images to an AI service to describe them. It only does so once a provider has been set up and only when ALT text is generated (on upload, from the Generate buttons, from the bulk scanner or from the nightly cron). There are three ways to set up a provider:<\/p>\n\n<p><strong>WordPress AI Client<\/strong> (WordPress 7.0+) \u2013 when this option is selected, the request is handed to the WordPress core AI Client, which routes it to whichever AI provider the site owner has configured under <em>Settings \u2192 Connectors<\/em> (for example the official AI Provider for Google \/ OpenAI \/ Anthropic plugins). This plugin does not store or transmit credentials in this mode; the terms and privacy policy of the provider configured there apply.<\/p>\n\n<p><strong>Google Gemini API<\/strong> (Google LLC) \u2013 used when \"Google Gemini\" is the selected provider. The plugin sends a resized copy of the image (omitted in \"Filename only\" mode), the generation prompt (including the related post\/product title, categories, SKU, brand keywords and filename hint) and your API key to <code>https:\/\/generativelanguage.googleapis.com\/<\/code>.\n<a href=\"https:\/\/ai.google.dev\/gemini-api\/terms\">Terms of service<\/a> \u00b7 <a href=\"https:\/\/policies.google.com\/privacy\">Privacy policy<\/a><\/p>\n\n<p><strong>OpenAI API<\/strong> (OpenAI, L.L.C.) \u2013 used when \"OpenAI\" is the selected provider. The plugin sends the same data to <code>https:\/\/api.openai.com\/<\/code>. Requests are made with <code>store: false<\/code>, so OpenAI does not retain them for its stored-responses feature.\n<a href=\"https:\/\/openai.com\/policies\/terms-of-use\">Terms of use<\/a> \u00b7 <a href=\"https:\/\/openai.com\/policies\/privacy-policy\">Privacy policy<\/a><\/p>\n\n<p>You are responsible for the usage costs and for complying with the provider's terms.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>altcraft-ai-image-seo<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the plugin through the WordPress Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>AltCraft AI \u2192 Settings &amp; API<\/strong>, choose a provider, paste your API key, click <em>Test connection<\/em> and save.<\/li>\n<li>Upload an image \u2013 or open <strong>AltCraft AI \u2192 Bulk Scanner<\/strong> to fix your existing library.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"should%20i%20use%20the%20wordpress%20ai%20client%20or%20my%20own%20api%20key%3F\"><h3>Should I use the WordPress AI Client or my own API key?<\/h3><\/dt>\n<dd><p>On WordPress 7.0 or newer, the WordPress AI Client is the recommended choice: install one of the official <em>AI Provider<\/em> plugins (Google, OpenAI or Anthropic), add the key once under <em>Settings \u2192 Connectors<\/em>, and every AI-capable plugin on the site \u2013 including this one \u2013 uses it. Choose Google Gemini or OpenAI directly if your site runs an older WordPress version or you want a separate key and billing for image ALT text.<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20an%20api%20key%3F\"><h3>Where do I get an API key?<\/h3><\/dt>\n<dd><p>Google Gemini keys are created in Google AI Studio (aistudio.google.com\/apikey) and include a free tier. OpenAI keys are created at platform.openai.com\/api-keys and are billed per use.<\/p><\/dd>\n<dt id=\"does%20it%20overwrite%20alt%20text%20i%20wrote%20myself%3F\"><h3>Does it overwrite ALT text I wrote myself?<\/h3><\/dt>\n<dd><p>Not unless you tell it to. Automatic generation (upload and nightly cron) only fills empty ALT text by default. Turn on <em>Overwrite existing ALT<\/em> in the settings, or choose <em>Every image<\/em> in the bulk scanner, to rewrite everything. The Generate buttons always regenerate the image you clicked.<\/p><\/dd>\n<dt id=\"which%20image%20is%20sent%20to%20the%20ai%3F\"><h3>Which image is sent to the AI?<\/h3><\/dt>\n<dd><p>A copy no larger than 1024 px on its longest side, usually one of the thumbnail sizes WordPress already created. Your original file is never uploaded. Use the <code>altcraft_ai_max_image_dimension<\/code> filter to change the size.<\/p><\/dd>\n<dt id=\"can%20i%20avoid%20sending%20my%20images%20to%20the%20ai%20at%20all%3F\"><h3>Can I avoid sending my images to the AI at all?<\/h3><\/dt>\n<dd><p>Yes. Set <em>What the AI looks at<\/em> to <em>Filename only<\/em>. The plugin then sends just the cleaned-up filename and the related post\/product title, so the AI can only describe what the name implies. Descriptive filenames (<code>red-leather-handbag.jpg<\/code>) work well; camera names (<code>IMG_4821.jpg<\/code>) on images that are not attached to anything are skipped with a clear message.<\/p><\/dd>\n<dt id=\"i%20get%20%22the%20ai%20provider%20did%20not%20respond%20within%2060%20seconds%22.\"><h3>I get \"The AI provider did not respond within 60 seconds\".<\/h3><\/dt>\n<dd><p>The image upload from your server to the provider took too long, usually because the image is large and the hosting has limited outbound bandwidth. The plugin normally sends a small thumbnail; if WordPress could not create thumbnails for that image (common with very large PNGs on low-memory hosting) the original file is sent instead. Raise the request timeout under <em>Settings \u2192 Advanced<\/em>, regenerate thumbnails for the image, or upload a smaller copy.<\/p><\/dd>\n<dt id=\"the%20bulk%20scanner%20says%20%22model%20not%20found%22.\"><h3>The bulk scanner says \"model not found\".<\/h3><\/dt>\n<dd><p>The provider retired the model you selected. Open the settings, pick a newer model from the list (or enter any model ID in the custom field), test the connection and save.<\/p><\/dd>\n<dt id=\"i%20get%20%22curl%20error%2028%20%E2%80%A6%20timed%20out%22%20but%20the%20connection%20test%20works.\"><h3>I get \"cURL error 28 \u2026 timed out\" but the connection test works.<\/h3><\/dt>\n<dd><p>Real generation uploads a copy of your image; normally a 768\u20131024 px thumbnail. When WordPress could not create thumbnails for an image (large PNGs on hosts with a low memory limit, or servers without GD\/Imagick) the plugin sends the original instead, which can be several megabytes and may not upload within the timeout. Check <em>Settings \u2192 Advanced \u2192 Server capabilities<\/em>, regenerate thumbnails for the affected images (or raise the PHP memory limit), or increase <em>Request timeout<\/em> under Advanced. The connection test now sends a small image through the same pipeline, so a passing test means the key, model and vision support are all fine.<\/p><\/dd>\n<dt id=\"does%20webp%20delivery%20work%20with%20caching%20plugins%20and%20cdns%3F\"><h3>Does WebP delivery work with caching plugins and CDNs?<\/h3><\/dt>\n<dd><p>WebP copies are always created safely. <em>Serving<\/em> them swaps image URLs when the visitor's browser sends <code>Accept: image\/webp<\/code>, so a full-page cache must vary its cache by the Accept header (the plugin sends a <code>Vary: Accept<\/code> header to help). If your CDN already converts images to WebP, leave delivery off.<\/p><\/dd>\n<dt id=\"can%20i%20hard-code%20the%20api%20key%20in%20wp-config.php%3F\"><h3>Can I hard-code the API key in wp-config.php?<\/h3><\/dt>\n<dd><p>Yes: <code>add_filter( 'altcraft_ai_api_key', function ( $key, $provider ) { return 'gemini' === $provider ? 'YOUR-KEY' : $key; }, 10, 2 );<\/code><\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%20the%20plugin%3F\"><h3>What happens when I uninstall the plugin?<\/h3><\/dt>\n<dd><p>Settings, transients and scheduled events are always removed. Generated ALT text, titles and captions stay in your Media Library. WebP copies and generation logs are deleted only if you enable <em>Clean up on uninstall<\/em> in the Advanced tab first.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"AI-written image ALT text, titles and captions (Google Gemini or OpenAI) with a bulk scanner, nightly cron, WebP copies and WooCommerce context.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/359509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=359509"}],"author":[{"embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/cubixsol"}],"wp:attachment":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=359509"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=359509"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=359509"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=359509"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=359509"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=359509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}