{"id":312596,"date":"2026-07-15T20:27:48","date_gmt":"2026-07-15T20:27:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ezalt-ai-automated-image-seo-accessibility\/"},"modified":"2026-08-09T06:53:07","modified_gmt":"2026-08-09T06:53:07","slug":"altmagic-ai-image-alt-text","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/altmagic-ai-image-alt-text\/","author":23454448,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.20","stable_tag":"1.2.20","tested":"7.0.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"EzAlt AI \u2013 Automated Image SEO & Accessibility","header_author":"Lidor Asulin","header_description":"Automatically generate SEO-friendly and accessibility-focused alt text for WordPress images using AI.","assets_banners_color":"a9c6d1","last_updated":"2026-08-09 06:53:07","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/ezalt.ez-site.com\/","header_author_uri":"https:\/\/profiles.wordpress.org\/lidor132\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":290,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.12":{"tag":"1.2.12","author":"lidor132","date":"2026-08-05 09:00:56"},"1.2.19":{"tag":"1.2.19","author":"lidor132","date":"2026-08-06 19:49:52"},"1.2.20":{"tag":"1.2.20","author":"lidor132","date":"2026-08-09 06:53:07"},"1.2.8":{"tag":"1.2.8","author":"lidor132","date":"2026-07-15 20:27:24"}},"upgrade_notice":{"1.2.13":"<p>Security hardening (per-attachment permission checks) and cron cleanup on deactivation. Recommended for all users.<\/p>","1.2.12":"<p>Documentation and packaging alignment for WordPress.org.<\/p>","1.2.11":"<p>Important security hardening for generation permissions, attachment handling, and purchase binding.<\/p>","1.2.8":"<p>Fixes fatal error on activation (Freemius require.php bootstrap).<\/p>","1.2.7":"<p>Fixes Freemius SDK fatal error on plugin activation.<\/p>","1.2.3":"<p>WordPress.org review fixes: Freemius dependency isolation, secure webhooks.<\/p>","1.2.2":"<p>WordPress.org review compliance: Media submenu, external services docs, Media Library integration.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3610043,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3610043,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3610043,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.12","1.2.19","1.2.20","1.2.8"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"EzAlt AI dashboard under Media","2":"Credits remaining and missing alt count","3":"Bulk generation progress","4":"Per-image generate button in Media Library"}},"plugin_section":[],"plugin_tags":[1953,2353,17214,163,186],"plugin_category":[34,50,55],"plugin_contributors":[271761],"plugin_business_model":[],"class_list":["post-312596","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-ai","plugin_tags-alt-text","plugin_tags-images","plugin_tags-seo","plugin_category-accessibility","plugin_category-media","plugin_category-seo-and-marketing","plugin_contributors-lidor132","plugin_committers-lidor132"],"banners":{"banner":"https:\/\/ps.w.org\/altmagic-ai-image-alt-text\/assets\/banner-772x250.png?rev=3610043","banner_2x":"https:\/\/ps.w.org\/altmagic-ai-image-alt-text\/assets\/banner-1544x500.png?rev=3610043","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/altmagic-ai-image-alt-text\/assets\/icon-256x256.png?rev=3610043","icon_2x":"https:\/\/ps.w.org\/altmagic-ai-image-alt-text\/assets\/icon-256x256.png?rev=3610043","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>EzAlt AI<\/strong> (by <a href=\"https:\/\/profiles.wordpress.org\/lidor132\/\">Lidor Asulin<\/a>) improves SEO and accessibility by generating descriptive alt text for images with AI.<\/p>\n\n<p>All plugin features are included. AI generation uses an external service with 5 free starter credits; optional credit packs add quota only \u2014 they do not unlock hidden features.<\/p>\n\n<h4>Highlights<\/h4>\n\n<ul>\n<li>Context-aware alt text (parent post title, content type, taxonomies \u2014 including WooCommerce product price, SKU, and attributes)<\/li>\n<li>Bulk generation for images missing alt text<\/li>\n<li>Bulk run report \u2014 generated count, failures, credits used, and timing<\/li>\n<li>Per-image generation from the Media Library<\/li>\n<li>Optional automatic generation on upload<\/li>\n<li>Does not overwrite existing alt text<\/li>\n<li>Credits deducted only after successful generation<\/li>\n<li>Idempotent API requests \u2014 retries never double-charge<\/li>\n<li>Purchase-intent routing so bought credits reach the correct WordPress site<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin relies on external services to generate alt text. By activating or using this plugin, you agree to the terms and privacy policies listed below.<\/p>\n\n<h4>EzAlt Proxy API<\/h4>\n\n<p>The plugin sends requests to the EzAlt proxy API at <strong>https:\/\/ezalt.ez-site.com<\/strong>.<\/p>\n\n<p><strong>Used for:<\/strong> AI alt text generation, credit balance sync, and purchase-intent registration.<\/p>\n\n<p><strong>Data sent and when:<\/strong><\/p>\n\n<ul>\n<li><strong>On alt text generation<\/strong> (bulk, auto-upload, or Media Library): base64-encoded image content (HTTPS), filename, MIME type, site URL, Freemius install ID (when available), unique request ID, site language, and optional parent-post context (title, categories; for WooCommerce products also price, SKU, and attribute values).<\/li>\n<li><strong>On credit sync<\/strong> (admin dashboard load and periodic polling): site URL and Freemius install ID.<\/li>\n<li><strong>On \u201cBuy Credits\u201d click only<\/strong> (before Freemius checkout opens): site URL, Freemius user ID, Freemius install ID (when available), and selected plan ID. No payment or card data is sent by the plugin.<\/li>\n<li><strong>Only if you submit the in-plugin feedback form<\/strong> (\u201cNot happy? Tell us why\u201d): your typed message, the reply email you optionally provide, site URL, Freemius install ID (when available), and WordPress\/PHP\/plugin version \u2014 used solely to review your feedback and, if you left an email, to reply.<\/li>\n<\/ul>\n\n<p><strong>Service URL:<\/strong> https:\/\/ezalt.ez-site.com\/ezalt-api\/<\/p>\n\n<p><strong>Privacy Policy:<\/strong> https:\/\/ezalt.ez-site.com\/privacy-policy<\/p>\n\n<p><strong>Terms of Service:<\/strong> https:\/\/ezalt.ez-site.com\/terms<\/p>\n\n<h4>OpenRouter API (AI Image Analysis)<\/h4>\n\n<p>Image data received by the EzAlt proxy is forwarded to OpenRouter, which routes requests to vision AI models to produce descriptive alt text.<\/p>\n\n<p><strong>Data sent:<\/strong> Image content and generation parameters forwarded by the EzAlt proxy during alt text requests only.<\/p>\n\n<p><strong>Service URL:<\/strong> https:\/\/openrouter.ai<\/p>\n\n<p><strong>Privacy Policy:<\/strong> https:\/\/openrouter.ai\/privacy<\/p>\n\n<p><strong>Terms of Service:<\/strong> https:\/\/openrouter.ai\/terms<\/p>\n\n<h4>Freemius (Checkout for Optional Credit Packs)<\/h4>\n\n<p>Freemius handles checkout for optional one-time credit packs. Freemius is not required to use the free starter credits or built-in features.<\/p>\n\n<p><strong>Data sent:<\/strong> Standard Freemius licensing\/checkout data when you interact with credit purchase flows.<\/p>\n\n<p><strong>Service URL:<\/strong> https:\/\/freemius.com<\/p>\n\n<p><strong>Privacy Policy:<\/strong> https:\/\/freemius.com\/privacy\/<\/p>\n\n<p><strong>Terms of Service:<\/strong> https:\/\/freemius.com\/terms\/<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/ezalt-ai-image-alt-text\/<\/code><\/li>\n<li>Activate the plugin under <strong>Plugins<\/strong><\/li>\n<li>Open <strong>Media \u2192 EzAlt AI<\/strong><\/li>\n<li>Use your free starter credits, enable auto-upload, or start bulk generation<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20any%20feature%20locked%20behind%20a%20paid%20plan%3F\"><h3>Is any feature locked behind a paid plan?<\/h3><\/dt>\n<dd><p>No. Bulk, auto-upload, and Media Library generation work with the free starter credits. Credit packs only add external AI service quota (WordPress.org Guideline 6 serviceware).<\/p><\/dd>\n<dt id=\"does%20it%20overwrite%20existing%20alt%20text%3F\"><h3>Does it overwrite existing alt text?<\/h3><\/dt>\n<dd><p>No. Images that already have alt text are skipped.<\/p><\/dd>\n<dt id=\"can%20it%20generate%20alt%20text%20automatically%20on%20upload%3F\"><h3>Can it generate alt text automatically on upload?<\/h3><\/dt>\n<dd><p>Yes. Enable \u201cEnable automatic AI alt text generation on upload\u201d under <strong>Media \u2192 EzAlt AI<\/strong>.<\/p><\/dd>\n<dt id=\"can%20i%20generate%20alt%20text%20for%20one%20image%3F\"><h3>Can I generate alt text for one image?<\/h3><\/dt>\n<dd><p>Yes. Open an image in the Media Library and use <strong>Generate alt text<\/strong> in the EzAlt AI field.<\/p><\/dd>\n<dt id=\"how%20do%20purchased%20credits%20reach%20my%20site%3F\"><h3>How do purchased credits reach my site?<\/h3><\/dt>\n<dd><p>Click a <strong>Buy Credits<\/strong> button on <strong>Media \u2192 EzAlt AI<\/strong> before completing Freemius checkout. That registers a purchase intent so credits apply to the correct site.<\/p><\/dd>\n<dt id=\"does%20bulk%20generation%20require%20action%20scheduler%20or%20woocommerce%3F\"><h3>Does bulk generation require Action Scheduler or WooCommerce?<\/h3><\/dt>\n<dd><p>No. EzAlt AI uses WordPress built-in cron.<\/p><\/dd>\n<dt id=\"are%20images%20sent%20to%20an%20external%20server%3F\"><h3>Are images sent to an external server?<\/h3><\/dt>\n<dd><p>Yes. See the <strong>External Services<\/strong> section below.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.20<\/h4>\n\n<ul>\n<li>Changed: New sites receive 5 free starter credits (was 1) so merchants can properly try the product<\/li>\n<\/ul>\n\n<h4>1.2.19<\/h4>\n\n<ul>\n<li>Fix: Rate EzAlt card always stays on the plugin page (testing a rating no longer hides it forever)<\/li>\n<li>Fix: WordPress.org review link uses the live slug <code>altmagic-ai-image-alt-text<\/code><\/li>\n<\/ul>\n\n<h4>1.2.18<\/h4>\n\n<ul>\n<li>New: Credit Pack 5000 ($79.99) and Credit Pack 10000 ($129.99)<\/li>\n<\/ul>\n\n<h4>1.2.17<\/h4>\n\n<ul>\n<li>New: Credit Pack 500 ($14.99) available in Buy Credits<\/li>\n<\/ul>\n\n<h4>1.2.16<\/h4>\n\n<ul>\n<li>Improved: credit packs are driven from a single catalog (easier to add Freemius add-ons)<\/li>\n<li>Prepared slots for three new packs: 500 \/ 5000 \/ 10000 credits (activate after creating them in Freemius)<\/li>\n<li>Fix guidance: always install\/upload the plugin folder as <code>ezalt-ai-image-alt-text<\/code> (never include the version in the folder name \u2014 that causes false Plugin Check text-domain errors)<\/li>\n<\/ul>\n\n<h4>1.2.15<\/h4>\n\n<ul>\n<li>New: interactive 1\u20135 star rating on the EzAlt admin page (and in the timed review notice) \u2014 4\u20135 stars open WordPress.org to finish a public review; 1\u20133 stars open a private feedback form instead<\/li>\n<li>Improved: review ask is available anytime on the plugin page, not only as a reminder notice<\/li>\n<\/ul>\n\n<h4>1.2.14<\/h4>\n\n<ul>\n<li>New: tasteful, dismissible review prompt shown after real usage (5+ successful generations, 3+ days active) \u2014 never nags on every screen<\/li>\n<li>New: \"Not happy? Tell us why\" in-plugin feedback form \u2014 sends suggestions or complaints straight to the developer instead of a public review<\/li>\n<li>Privacy: feedback is optional and anonymous unless you choose to add a reply email<\/li>\n<\/ul>\n\n<h4>1.2.13<\/h4>\n\n<ul>\n<li>New: bulk generation report \u2014 images generated, failures, credits used, total time, and average time per image<\/li>\n<li>New: richer WooCommerce context \u2014 product price, SKU, and attributes are sent to the AI for more accurate product alt text<\/li>\n<li>Security: verify per-attachment edit permission and validate attachment type in Media Library AJAX generation<\/li>\n<li>Security: sanitize unexpected error details before returning them to the admin UI<\/li>\n<li>Fix: clear scheduled bulk cron workers on plugin deactivation and uninstall (previously left orphaned events)<\/li>\n<li>Code quality: full WordPress Coding Standards (WPCS 3.4) compliance \u2014 zero PHPCS errors and warnings<\/li>\n<\/ul>\n\n<h4>1.2.12<\/h4>\n\n<ul>\n<li>Refresh readme for consistency with current features and WordPress.org packaging<\/li>\n<li>Align Stable tag with Version 1.2.12<\/li>\n<li>Clarify installation path: <code>ezalt-ai-image-alt-text<\/code><\/li>\n<\/ul>\n\n<h4>1.2.11<\/h4>\n\n<ul>\n<li>Security: harden capability checks for generation and admin actions<\/li>\n<li>Security: tighten attachment handling and outbound request safety<\/li>\n<li>Security: improve credit\/purchase binding so credits cannot be spoofed across sites<\/li>\n<li>Security: reduce abuse surfaces on auth and generation flows<\/li>\n<\/ul>\n\n<h4>1.2.10<\/h4>\n\n<ul>\n<li>Improve bulk job reliability and progress handling<\/li>\n<li>Harden admin AJAX error paths<\/li>\n<\/ul>\n\n<h4>1.2.9<\/h4>\n\n<ul>\n<li>Align plugin version with WordPress.org 1.2.x series<\/li>\n<li>Refresh and reorganize readme documentation<\/li>\n<\/ul>\n\n<h4>1.2.8<\/h4>\n\n<ul>\n<li>Fix Freemius bootstrap: load start.php directly; require require.php in vendor-prefixed<\/li>\n<li>Guard Freemius calls when SDK is unavailable<\/li>\n<\/ul>\n\n<h4>1.2.7<\/h4>\n\n<ul>\n<li>Fix fatal error on activation: include missing Freemius require.php in vendor-prefixed\/<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>Fix credit purchase when Freemius opt-in was skipped (checkout uses site URL)<\/li>\n<li>Document thank-you redirect URL for Freemius (ezalt.ez-site.com)<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Fix credit purchase when Freemius opt-in was skipped \u2014 checkout uses site URL<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Deferred Freemius and plugin bootstrap to plugins_loaded to prevent activation output warnings<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Freemius SDK managed via Composer and loaded from prefixed vendor-prefixed\/ path<\/li>\n<li>Webhook handler: Freemius HMAC verification, idempotency, server-authoritative credit sync<\/li>\n<li>Privacy\/Terms URLs verified at https:\/\/ezalt.ez-site.com<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Moved admin page under Media menu (WordPress admin hierarchy best practice)<\/li>\n<li>Removed inline CSS; all styles enqueued via admin.css<\/li>\n<li>Added Media Library per-image generation<\/li>\n<li>Clarified Guideline 6 serviceware model: all features included, credits are external service quota<\/li>\n<li>Expanded External Services documentation in readme<\/li>\n<li>Auto-upload enabled by default for new installs (uses free starter credits)<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Rebranded to EzAlt AI<\/li>\n<li>Fixed credit delivery after Freemius checkout<\/li>\n<li>Improved admin error messages and automatic credit sync<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Purchase intent + webhook credit sync<\/li>\n<li>REST endpoint for server-push cache invalidation<\/li>\n<li>HMAC webhook verification<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed credit balance sync after bulk processing<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Improved queue handling and API validation<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Automatically generate SEO-friendly and accessibility-focused alt text for WordPress images using AI.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/312596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=312596"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lidor132"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=312596"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=312596"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=312596"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=312596"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=312596"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=312596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}