{"id":297294,"date":"2026-04-29T19:55:09","date_gmt":"2026-04-29T19:55:09","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/presswell-alt-text-generator\/"},"modified":"2026-04-30T16:21:45","modified_gmt":"2026-04-30T16:21:45","slug":"presswell-alt-text-generator","status":"publish","type":"plugin","link":"https:\/\/dzo.wordpress.org\/plugins\/presswell-alt-text-generator\/","author":15825846,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.0","stable_tag":"1.0.0","tested":"6.9.4","requires":"6.1","requires_php":"","requires_plugins":null,"header_name":"Presswell Alt Text Generator","header_author":"Presswell","header_description":"Generate AI-powered alt text for WordPress media.","assets_banners_color":"58345b","last_updated":"2026-04-30 16:21:45","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/presswell-alt-text-generator","header_author_uri":"https:\/\/presswell.co","rating":0,"author_block_rating":0,"active_installs":0,"downloads":96,"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":"presswell","date":"2026-04-30 16:21:45"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3518854,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3518854,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3518854,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3518854,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3518854,"resolution":"1","location":"assets","locale":""},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3518854,"resolution":"2","location":"assets","locale":""},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3518854,"resolution":"3","location":"assets","locale":""},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3518854,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"Settings screen with provider, model, prompt, and API key controls.","2":"Bulk generator queue with progress and retry status.","3":"Alt text generation controls on media edit screen.","4":"Alt text generation controls in media modal."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[1953,2353,17214,6357,233],"plugin_category":[34],"plugin_contributors":[150450,155512],"plugin_business_model":[],"class_list":["post-297294","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-ai","plugin_tags-alt-text","plugin_tags-image-seo","plugin_tags-media-library","plugin_category-accessibility","plugin_contributors-benplum","plugin_contributors-presswell","plugin_committers-presswell"],"banners":{"banner":"https:\/\/ps.w.org\/presswell-alt-text-generator\/assets\/banner-772x250.jpg?rev=3518854","banner_2x":"https:\/\/ps.w.org\/presswell-alt-text-generator\/assets\/banner-1544x500.jpg?rev=3518854","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/presswell-alt-text-generator\/assets\/icon-128x128.png?rev=3518854","icon_2x":"https:\/\/ps.w.org\/presswell-alt-text-generator\/assets\/icon-256x256.png?rev=3518854","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/presswell-alt-text-generator\/assets\/screenshot-1.jpg?rev=3518854","caption":"Settings screen with provider, model, prompt, and API key controls."},{"src":"https:\/\/ps.w.org\/presswell-alt-text-generator\/assets\/screenshot-2.jpg?rev=3518854","caption":"Bulk generator queue with progress and retry status."},{"src":"https:\/\/ps.w.org\/presswell-alt-text-generator\/assets\/screenshot-3.jpg?rev=3518854","caption":"Alt text generation controls on media edit screen."},{"src":"https:\/\/ps.w.org\/presswell-alt-text-generator\/assets\/screenshot-4.jpg?rev=3518854","caption":"Alt text generation controls in media modal."}],"raw_content":"<!--section=description-->\n<p>Presswell Alt Text Generator helps teams reduce accessibility backlog by generating descriptive alt text for new and existing images. Connect a provider, choose a model, and run generation workflows directly inside wp-admin.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Supports OpenAI, Anthropic Claude, and Google Gemini multimodal models<\/li>\n<li>Generates alt text for individual images in the Media Library and media modal<\/li>\n<li>Processes missing-alt backlogs in batches with a dedicated bulk queue<\/li>\n<li>Handles provider rate limits with automatic cooldown locks<\/li>\n<li>Adds a Media Library column with quick generate\/regenerate actions<\/li>\n<li>Provides a customizable prompt seed for output consistency<\/li>\n<\/ul>\n\n<p><strong><em>Media Library Tools<\/em><\/strong><\/p>\n\n<p>Inline actions let you generate or regenerate alt text directly from each image row. When an image has no alt text, the column displays a \"Generate Alt Text\" link that triggers the AJAX workflow and replaces itself with the result.<\/p>\n\n<p><strong><em>Bulk Generator<\/em><\/strong><\/p>\n\n<p>The Bulk page counts images missing alt text, allows regeneration preferences, and runs batches while surfacing progress, failures, and rate-limit pauses.<\/p>\n\n<h4>Documentation<\/h4>\n\n<p><strong>Filters<\/strong><\/p>\n\n<ul>\n<li><code>pwatg_available_services<\/code> \u2014 Modify the available AI providers<\/li>\n<li><code>pwatg_available_models<\/code> \u2014 Modify the available models for each provider<\/li>\n<li><code>pwatg_provider_registry<\/code> \u2014 Map provider slugs to custom service classes<\/li>\n<\/ul>\n\n<p><strong>WP-CLI<\/strong><\/p>\n\n<p>If WP-CLI is available, you can run single-image generation, bulk generation, and missing-alt counts from the command line:<\/p>\n\n<ul>\n<li><code>wp pwatg generate &lt;attachment-id&gt;<\/code><\/li>\n<li><code>wp pwatg bulk-generate<\/code><\/li>\n<li><code>wp pwatg count-missing<\/code><\/li>\n<li><code>wp pwatg network-bulk-generate<\/code><\/li>\n<\/ul>\n\n<p>Optional CLI flags:<\/p>\n\n<ul>\n<li><code>wp pwatg generate &lt;attachment-id&gt; --force<\/code><\/li>\n<li><code>wp pwatg bulk-generate --force<\/code><\/li>\n<li><code>wp pwatg bulk-generate --limit=&lt;int&gt;<\/code><\/li>\n<li><code>wp pwatg bulk-generate --missing-only<\/code><\/li>\n<li><code>wp pwatg network-bulk-generate --force<\/code><\/li>\n<li><code>wp pwatg network-bulk-generate --limit=&lt;int&gt;<\/code><\/li>\n<li><code>wp pwatg network-bulk-generate --missing-only<\/code><\/li>\n<li><code>wp pwatg network-bulk-generate --sites=&lt;id,id,...&gt;<\/code><\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin sends image-derived payloads to the AI provider you choose when generating alt text (OpenAI, Anthropic, or Google Gemini). API keys are stored in WordPress options on your site and used only for outbound provider requests initiated by your server.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to external AI services only when you use alt text generation features or test provider connectivity. Only the provider selected in plugin settings is contacted for a given request. This plugin sends the follow data:<\/p>\n\n<ul>\n<li>API key (in Authorization header)<\/li>\n<li>Selected model name<\/li>\n<li>Prompt text (including your prompt seed and filename context)\n\n<ul>\n<li>For alt-text generation: image MIME type and image binary content encoded as base64<\/li>\n<li>For Test Connection: a short text prompt (\"Reply with: OK\")<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>OpenAI API<\/h4>\n\n<ul>\n<li>Terms: https:\/\/openai.com\/policies\/terms-of-use<\/li>\n<li>Privacy: https:\/\/openai.com\/policies\/privacy-policy<\/li>\n<\/ul>\n\n<h4>Anthropic API<\/h4>\n\n<ul>\n<li>Terms: https:\/\/www.anthropic.com\/legal\/commercial-terms<\/li>\n<li>Privacy: https:\/\/www.anthropic.com\/privacy<\/li>\n<\/ul>\n\n<h4>Google Gemini API<\/h4>\n\n<ul>\n<li>Terms: https:\/\/ai.google.dev\/terms<\/li>\n<li>Privacy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<!--section=installation-->\n<p>Install via the WordPress plugin installer, or manually upload the plugin directory to <code>wp-content\/plugins\/<\/code>.<\/p>\n\n<p><strong>Configuration<\/strong><\/p>\n\n<ol>\n<li>Activate the plugin.<\/li>\n<li>Visit <em>Settings -&gt; Alt Text Generator<\/em> to enter your API key and choose a model.<\/li>\n<li>(Optional) Enable auto-generate-on-upload if you want every new image to receive alt text automatically.<\/li>\n<li>Use the Bulk tool under <em>Media -&gt; Alt Text Bulk Generator<\/em> or inline Media Library actions.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20providers%20are%20supported%3F\"><h3>Which providers are supported?<\/h3><\/dt>\n<dd><p>OpenAI (GPT-4.1, GPT-4o), Anthropic Claude (3.5 Haiku\/Sonnet, 3 Opus), and Google Gemini (2.0 Flash, 1.5 Flash\/Pro). You can extend the provider registry to add more.<\/p><\/dd>\n<dt id=\"where%20are%20api%20keys%20stored%3F\"><h3>Where are API keys stored?<\/h3><\/dt>\n<dd><p>Keys are stored in the site options table. They are used only when calling the selected provider from your server.<\/p><\/dd>\n<dt id=\"can%20i%20regenerate%20specific%20images%20without%20affecting%20others%3F\"><h3>Can I regenerate specific images without affecting others?<\/h3><\/dt>\n<dd><p>Yes. Use the inline \"Regenerate Alt Text\" link in the Media Library or media modal to update a single attachment without affecting the rest of the queue, or run <code>wp pwatg generate &lt;attachment-id&gt; --force<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20run%20generation%20from%20wp-cli%3F\"><h3>Can I run generation from WP-CLI?<\/h3><\/dt>\n<dd><p>Yes. Use <code>wp pwatg generate &lt;attachment-id&gt;<\/code> for one image, <code>wp pwatg bulk-generate<\/code> for a batch run, and <code>wp pwatg count-missing<\/code> to check remaining backlog.<\/p><\/dd>\n<dt id=\"can%20i%20run%20bulk%20generation%20network-wide%20on%20multisite%3F\"><h3>Can I run bulk generation network-wide on Multisite?<\/h3><\/dt>\n<dd><p>Yes. Use <code>wp pwatg network-bulk-generate<\/code> to process all sites in the network, or pass <code>--sites=&lt;id,id,...&gt;<\/code> to target specific site IDs.<\/p><\/dd>\n<dt id=\"how%20does%20rate%20limiting%20work%3F\"><h3>How does rate limiting work?<\/h3><\/dt>\n<dd><p>If a provider responds with a retry-after header, the plugin sets a transient lock and pauses both single and bulk runs until the cooldown expires.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release with provider integrations, Media Library tools, and bulk generator.<\/li>\n<\/ul>","raw_excerpt":"Generate accessible image alt text in WordPress with OpenAI, Anthropic, and Google Gemini.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/297294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=297294"}],"author":[{"embeddable":true,"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/presswell"}],"wp:attachment":[{"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=297294"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=297294"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=297294"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=297294"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=297294"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/dzo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=297294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}