Changeset 3317623
- Timestamp:
- 06/25/2025 12:09:46 PM (9 months ago)
- Location:
- alttext-ai/trunk
- Files:
-
- 6 edited
-
README.txt (modified) (2 diffs)
-
admin/class-atai-settings.php (modified) (5 diffs)
-
admin/js/admin.js (modified) (1 diff)
-
atai.php (modified) (2 diffs)
-
changelog.txt (modified) (1 diff)
-
includes/class-atai-attachment.php (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
alttext-ai/trunk/README.txt
r3307656 r3317623 2 2 Contributors: alttextai,junaidkbr 3 3 Donate link: https://alttext.ai/ 4 Tags: image alt text, AI, accessibility, alternative text, image to text4 Tags: image alt text, AI, accessibility, alternative text, image to text 5 5 Requires PHP: 7.0 6 6 Requires at least: 4.7 7 7 Tested up to: 6.7 8 Stable tag: 1.10. 08 Stable tag: 1.10.1 9 9 WC requires at least: 3.3 10 10 WC tested up to: 9.2.3 … … 69 69 70 70 == Changelog == 71 = 1.10.1 - 2025-06-24 = 72 * Fix potential bulk generation lockups on small images 73 71 74 = 1.10.0 - 2025-06-06 = 72 75 * Added: Configurable admin menu capability - Site admins can now control which user roles can access the AltText.ai admin menu -
alttext-ai/trunk/admin/class-atai-settings.php
r3307656 r3317623 90 90 $capability, 91 91 'atai', 92 array( $this, 'render_settings_page' ),92 array( $this, 'render_settings_page' ), 93 93 'dashicons-format-image' 94 ); 95 94 ); 95 96 // Settings submenu item 96 97 $hook_suffix = add_submenu_page( 97 98 'atai', 98 __( ' AltText.ai WordPressSettings', 'alttext-ai' ),99 __( 'Settings', 'alttext-ai' ), 99 100 __( 'Settings', 'alttext-ai' ), 100 101 $capability, 101 'atai' 102 ); 103 add_action("admin_head-{$hook_suffix}", array($this, 'enqueue_styles') ); 104 105 // Bulk Generate Page 102 'atai', 103 array( $this, 'render_settings_page' ), 104 10 105 ); 106 add_action( "admin_head-{$hook_suffix}", array( $this, 'enqueue_styles' ) ); 107 108 // Bulk Generate submenu item 106 109 if ( ATAI_Utility::get_api_key() ) { 107 110 $hook_suffix = add_submenu_page( … … 111 114 $capability, 112 115 'atai-bulk-generate', 113 array( $this, 'render_bulk_generate_page' ) 116 array( $this, 'render_bulk_generate_page' ), 117 20 114 118 ); 115 116 add_action("admin_head-{$hook_suffix}", array($this, 'enqueue_styles') ); 117 } 118 119 // History Page 119 add_action( "admin_head-{$hook_suffix}", array( $this, 'enqueue_styles' ) ); 120 } 121 122 // History submenu item 120 123 if ( ATAI_Utility::get_api_key() ) { 121 124 $hook_suffix = add_submenu_page( … … 125 128 $capability, 126 129 'atai-history', 127 array( $this, 'render_history_page' ) 130 array( $this, 'render_history_page' ), 131 30 128 132 ); 129 130 add_action("admin_head-{$hook_suffix}", array($this, 'enqueue_styles') ); 131 } 132 133 // CSV Import Page 133 add_action( "admin_head-{$hook_suffix}", array( $this, 'enqueue_styles' ) ); 134 } 135 136 // Sync Library page 134 137 $hook_suffix = add_submenu_page( 135 138 'atai', … … 138 141 $capability, 139 142 'atai-csv-import', 140 array( $this, 'render_csv_import_page' ) 141 );142 143 add_action( "admin_head-{$hook_suffix}", array($this, 'enqueue_styles') );143 array( $this, 'render_csv_import_page' ), 144 40 145 ); 146 add_action( "admin_head-{$hook_suffix}", array( $this, 'enqueue_styles' ) ); 144 147 } 145 148 … … 292 295 'sanitize_callback' => array( $this, 'sanitize_yes_no_checkbox' ), 293 296 'default' => 'no', 297 ) 298 ); 299 300 register_setting( 301 'atai-settings', 302 'atai_admin_capability', 303 array( 304 'sanitize_callback' => 'sanitize_key', 305 'default' => 'manage_options', 294 306 ) 295 307 ); -
alttext-ai/trunk/admin/js/admin.js
r3274972 r3317623 1 !function(){"use strict";const{__:e}=wp.i18n;function t(e,t,a={}){const n={timestamp:(new Date).toISOString(),functionName:e||"Unknown Function",message:t?.message||"No error message provided",stack:t?.stack||"No stack trace available",url:window.location.href,userAgent:navigator.userAgent,additionalContext:{...a}};console.groupCollapsed(`[AltText.ai Error] ${e}`),console.error("Error Message:",n.message),console.error("Stack Trace:",n.stack),console.info("Timestamp:",n.timestamp),console.info("Function:",e),console.info("URL:",n.url),console.info("User Agent:",n.userAgent),a?.requestDetails&&console.info("Request Details:",a.requestDetails),a?.responseDetails&&console.info("Response Details:",a.responseDetails),console.info("Additional Context:",a),console.groupEnd()}function a(a,n=[]){if(!a){const i=new Error(e("Attachment ID is missing","alttext-ai"));return t("singleGenerateAJAX",i,{attachmentId:a,keywords:n}),Promise.reject(i)}return new Promise(((e,i)=>{jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_single_generate",security:wp_atai.security_single_generate,attachment_id:a,keywords:n},url:wp_atai.ajax_url,success:function(t){e(t)},error:function(e){const r=new Error("AJAX request failed");t("singleGenerateAJAX",r,{response:e,attachmentId:a,keywords:n}),i(r)}})}))}function n(){jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_bulk_generate",security:wp_atai.security_bulk_generate,posts_per_page:window.atai.postsPerPage,last_post_id:window.atai.lastPostId,keywords:window.atai.bulkGenerateKeywords,negativeKeywords:window.atai.bulkGenerateNegativeKeywords,mode:window.atai.bulkGenerateMode,onlyAttached:window.atai.bulkGenerateOnlyAttached,onlyNew:window.atai.bulkGenerateOnlyNew,wcProducts:window.atai.bulkGenerateWCProducts,wcOnlyFeatured:window.atai.bulkGenerateWCOnlyFeatured,batchId:window.atai.bulkGenerateBatchId},url:wp_atai.ajax_url,success:function(a){try{window.atai.progressCurrent+=a.process_count,window.atai.progressSuccessful+=a.success_count, window.atai.lastPostId=a.last_post_id,window.atai.progressBarEl.data("current",window.atai.progressCurrent),window.atai.progressLastPostId.text(window.atai.lastPostId),window.atai.progressCurrentEl.text(window.atai.progressCurrent),window.atai.progressSuccessfulEl.text(window.atai.progressSuccessful);const t=100*window.atai.progressCurrent/window.atai.progressMax;window.atai.progressBarEl.css("width",t+"%"),window.atai.progressPercent.text(t.toFixed(2)+"%"),a.recursive?setTimeout((()=>{n()}),500):(window.atai.progressButtonCancel.hide(),window.atai.progressBarWrapper.hide(),window.atai.progressButtonFinished.show(),window.atai.progressHeading.text(e("Update complete!","alttext-ai")),window.atai.redirectUrl=a?.redirect_url)}catch(a){t("bulkGenerateAJAX",a),alert(e("An error occurred during bulk generation.","alttext-ai"))}},error:function(a){t("bulkGenerateAJAX",new Error("AJAX request failed during bulk generation"),{currentProgress:window.atai.progressCurrent,responseDetails:{status:a.status,statusText:a.statusText,responseBody:a.responseText}}),window.atai.progressButtonCancel.hide(),window.atai.progressBarWrapper.hide(),window.atai.progressButtonFinished.show(),window.atai.progressHeading.text(e("The update was stopped due to a server error. Restart the update to pick up where it left off.","alttext-ai"))}})}function i(e){return e.split(",").map((function(e){return e.trim()})).filter((function(e){return e.length>0})).slice(0,6)}function r(e){e=e.replace(/[[]/,"\\[").replace(/[\]]/,"\\]");let t=new RegExp("[\\?&]"+e+"=([^&#]*)").exec(window.location.search);return null===t?"":decodeURIComponent(t[1].replace(/\+/g," "))}function s(e,t,a){let n=document.getElementById(e);if(!n)return!1;let i=document.getElementById(t+"-"+a);if(i&&i.remove(),!window.location.href.includes("upload.php"))return!1;let r=o(t,a,"modal"),s=n.parentNode;return s&&s.replaceChild(r,n),!0}function o(t,n,r){const s=new URL(window.location.href);s.searchParams.set("atai_action","generate");const o=t+"-"+n,c=document.createElement("div");c.setAttribute("id",o),c.classList.add("description"),c.classList.add("atai-generate-button");const d=document.createElement("a");d.setAttribute("id",o+"-anchor"),d.setAttribute("href",s),d.className="button-secondary button-large atai-generate-button__anchor";const l=document.createElement("div");l.setAttribute("id",o+"-checkbox-wrapper"),l.classList.add("atai-generate-button__keywords-checkbox-wrapper");const u=document.createElement("input");u.setAttribute("type","checkbox"),u.setAttribute("id",o+"-keywords-checkbox"),u.setAttribute("name","atai-generate-button-keywords-checkbox"),u.className="atai-generate-button__keywords-checkbox";const p=document.createElement("label");p.htmlFor="atai-generate-button-keywords-checkbox",p.innerText="Add SEO keywords";const w=document.createElement("div");w.setAttribute("id",o+"-textfield-wrapper"),w.className="atai-generate-button__keywords-textfield-wrapper",w.style.display="none";const g=document.createElement("input");g.setAttribute("type","text"),g.setAttribute("id",o+"-textfield"),g.className="atai-generate-button__keywords-textfield",g.setAttribute("name","atai-generate-button-keywords"),g.size=40,l.appendChild(u),l.appendChild(p),w.appendChild(g),u.addEventListener("change",(function(){this.checked?(w.style.display="block",g.setSelectionRange(0,0),g.focus()):w.style.display="none"}));wp_atai.can_user_upload_files?(e=>{jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_check_image_eligibility",security:wp_atai.security_check_attachment_eligibility,attachment_id:e},url:wp_atai.ajax_url,success:function(e){if("success"!==e.status){const e=document.querySelector(`#${o}-anchor`),t=document.querySelector(`#${o}-keywords-checkbox`);e?e.classList.add("disabled"):d.classList.add("disabled"),t?t.classList.add("disabled"):u.classList.add("disabled")}}})})(n):(d.classList.add("disabled"),u.disabled=!0),d.title=e("AltText.ai: Update alt text for this single image","alttext-ai"),d.onclick=function(){this.classList.add("disabled");let t=this.querySelector("span");t&&(t.innerText=e("Processing...","alttext-ai"))};const h=document.createElement("img");h.src=wp_atai.icon_button_generate,h.alt=e("Update Alt Text with AltText.ai","alttext-ai"),d.appendChild(h);const y=document.createElement("span");y.innerText=e("Update Alt Text","alttext-ai"),d.appendChild(y),c.appendChild(d),c.appendChild(l),c.appendChild(w);const m=document.createElement("span");return m.classList.add("atai-update-notice"),c.appendChild(m),d.addEventListener("click",(async function(t){t.preventDefault(),wp_atai.has_api_key||(window.location.href=wp_atai.settings_page_url+"&api_key_missing=1");const s="single"==r?document.getElementById("title"):document.querySelector('[data-setting="title"] input'),o="single"==r?document.getElementById("attachment_caption"):document.querySelector('[data-setting="caption"] textarea'),c="single"==r?document.getElementById("attachment_content"):document.querySelector('[data-setting="description"] textarea'),l="single"==r?document.getElementById("attachment_alt"):document.querySelector('[data-setting="alt"] textarea'),p=u.checked?i(g.value):[];m&&(m.innerText="",m.classList.remove("atai-update-notice--success","atai-update-notice--error"));const w=await a(n,p);if("success"===w.status)l.value=w.alt_text,"yes"===wp_atai.should_update_title&&(s.value=w.alt_text,"single"==r&&s.previousElementSibling.classList.add("screen-reader-text")),"yes"===wp_atai.should_update_caption&&(o.value=w.alt_text),"yes"===wp_atai.should_update_description&&(c.value=w.alt_text),m.innerText=e("Updated","alttext-ai"),m.classList.add("atai-update-notice--success"),setTimeout((()=>{m.classList.remove("atai-update-notice--success")}),3e3);else{let t=e("Unable to generate alt text. Check error logs for details.","alttext-ai");w?.message&&(t=w.message),m.innerText=t,m.classList.add("atai-update-notice--error")}d.classList.remove("disabled"),d.querySelector("span").innerText=e("Update Alt Text","alttext-ai")})),c}function c(e,t,a){try{if(e.querySelector("#atai-generate-button-"+t+", .atai-generate-button"))return!0;let n,i=!1;const r=e.querySelector("p#alt-text-description");if(r&&r.parentNode&&(n=o("atai-generate-button",t,a),r.parentNode.replaceChild(n,r),i=!0),!i){const r=e.querySelector('[data-setting="alt"] input, [data-setting="alt"] textarea');r&&r.parentNode&&(n=o("atai-generate-button",t,a),r.parentNode.insertBefore(n,r.nextSibling),i=!0)}if(!i){const r=e.querySelector(".attachment-details, .media-attachment-details");r&&(n=o("atai-generate-button",t,a),r.appendChild(n),i=!0)}return i||(n=o("atai-generate-button",t,a),e.appendChild(n),i=!0),i}catch(e){return console.error("[AltText.ai] Error injecting button:",e),!1}}function d(e,t,a){if("button-click"===t&&!e.target.matches(".media-modal .right, .media-modal .left"))return;const n=new URLSearchParams(window.location.search).get("item");n&&s("alt-text-description",a,n)}window.atai=window.atai||{postsPerPage:1,lastPostId:0,intervals:{},redirectUrl:""},jQuery("[data-edit-history-trigger]").on("click",(async function(){const a=this,n=a.dataset.attachmentId,i=document.getElementById("edit-history-input-"+n).value.replace(/\n/g,"");a.disabled=!0;try{const a=await function(a,n=""){if(!a){const i=new Error(e("Attachment ID is missing","alttext-ai"));return t("editHistoryAJAX",i,{attachmentId:a,altText:n}),Promise.reject(i)}return new Promise(((e,i)=>{jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_edit_history",security:wp_atai.security_edit_history,attachment_id:a,alt_text:n},url:wp_atai.ajax_url,success:function(t){e(t)},error:function(e){const r=new Error("AJAX request failed");t("editHistoryAJAX",r,{response:e,attachmentId:a,altText:n}),i(r)}})}))}(n,i);"success"!==a.status&&alert(e("Unable to update alt text for this image.","alttext-ai"));const r=document.getElementById("edit-history-success-"+n);r.classList.remove("hidden"),setTimeout((()=>{r.classList.add("hidden")}),2e3)}catch(t){alert(e("An error occurred while updating the alt text.","alttext-ai"))}finally{a.disabled=!1}})),jQuery("[data-bulk-generate-start]").on("click",(function(){const t=r("atai_action")||"normal",a=r("atai_batch_id")||0;"bulk-select-generate"!==t||a||alert(e("Invalid batch ID","alttext-ai")),window.atai.bulkGenerateKeywords=i(jQuery("[data-bulk-generate-keywords]").val()??""),window.atai.bulkGenerateNegativeKeywords=i(jQuery("[data-bulk-generate-negative-keywords]").val()??""),window.atai.progressWrapperEl=jQuery("[data-bulk-generate-progress-wrapper]"),window.atai.progressHeading=jQuery("[data-bulk-generate-progress-heading]"),window.atai.progressBarWrapper=jQuery("[data-bulk-generate-progress-bar-wrapper]"),window.atai.progressBarEl=jQuery("[data-bulk-generate-progress-bar]"),window.atai.progressPercent=jQuery("[data-bulk-generate-progress-percent]"),window.atai.progressLastPostId=jQuery("[data-bulk-generate-last-post-id]"),window.atai.progressCurrentEl=jQuery("[data-bulk-generate-progress-current]"),window.atai.progressCurrent=window.atai.progressBarEl.data("current"),window.atai.progressSuccessfulEl=jQuery("[data-bulk-generate-progress-successful]"),window.atai.progressSuccessful=window.atai.progressBarEl.data("successful"),window.atai.progressMax=window.atai.progressBarEl.data("max"),window.atai.progressButtonCancel=jQuery("[data-bulk-generate-cancel]"),window.atai.progressButtonFinished=jQuery("[data-bulk-generate-finished]"),"bulk-select-generate"===t?(window.atai.bulkGenerateMode="bulk-select",window.atai.bulkGenerateBatchId=a):(window.atai.bulkGenerateMode=jQuery("[data-bulk-generate-mode-all]").is(":checked")?"all":"missing",window.atai.bulkGenerateOnlyAttached=jQuery("[data-bulk-generate-only-attached]").is(":checked")?"1":"0",window.atai.bulkGenerateOnlyNew=jQuery("[data-bulk-generate-only-new]").is(":checked")?"1":"0",window.atai.bulkGenerateWCProducts=jQuery("[data-bulk-generate-wc-products]").is(":checked")?"1":"0",window.atai.bulkGenerateWCOnlyFeatured=jQuery("[data-bulk-generate-wc-only-featured]").is(":checked")?"1":"0"),jQuery("#bulk-generate-form").hide(),window.atai.progressWrapperEl.show(),n()})),jQuery("[data-bulk-generate-mode-all]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-bulk-generate-only-attached]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-bulk-generate-only-new]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-bulk-generate-wc-products]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-bulk-generate-wc-only-featured]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-post-bulk-generate]").on("click",(async function(a){if("#atai-bulk-generate"!==this.getAttribute("href"))return;if(a.preventDefault(),function(){try{if(window.wp&&wp.data&&wp.blocks)return wp.data.select("core/editor").isEditedPostDirty()}catch(e){return t("isPostDirty",e,{context:"Checking if post is dirty in Gutenberg editor"}),!0}return!0}()){if(!confirm(e("[AltText.ai] Make sure to save any changes before proceeding -- any unsaved changes will be lost. Are you sure you want to continue?","alttext-ai")))return}const n=document.getElementById("post_ID")?.value,r=this.querySelector("span"),s=this.nextElementSibling,o=r.innerText,c=document.querySelector("[data-post-bulk-generate-overwrite]")?.checked||!1,d=document.querySelector("[data-post-bulk-generate-process-external]")?.checked||!1,l=document.querySelector("[data-post-bulk-generate-keywords-checkbox]"),u=document.querySelector("[data-post-bulk-generate-keywords]"),p=l?.checked?i(u?.value):[];if(!n)return s.innerText=e("This is not a valid post.","alttext-ai"),void s.classList.add("atai-update-notice--error");try{this.classList.add("disabled"),r.innerText=e("Processing...","alttext-ai");const a=await function(a,n=!1,i=!1,r=[]){if(!a){const s=new Error(e("Post ID is missing","alttext-ai"));return t("enrichPostContentAJAX",s,{postId:a,overwrite:n,processExternal:i,keywords:r}),Promise.reject(s)}return new Promise(((e,s)=>{jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_enrich_post_content",security:wp_atai.security_enrich_post_content,post_id:a,overwrite:n,process_external:i,keywords:r},url:wp_atai.ajax_url,success:function(t){e(t)},error:function(e){const o=new Error("AJAX request failed");t("enrichPostContentAJAX",o,{response:e,postId:a,overwrite:n,processExternal:i,keywords:r}),s(o)}})}))}(n,c,d,p);if(!a.success)throw new Error(e("Unable to generate alt text. Check error logs for details.","alttext-ai"));window.location.reload()}catch(t){s.innerText=t.message||e("An error occurred.","alttext-ai"),s.classList.add("atai-update-notice--error")}finally{this.classList.remove("disabled"),r.innerText=o}})),document.addEventListener("DOMContentLoaded",(()=>{wp?.blocks&&jQuery.ajax({url:wp_atai.ajax_url,type:"GET",data:{action:"atai_check_enrich_post_content_transient",security:wp_atai.security_enrich_post_content_transient},success:function(e){e?.success&&wp.data.dispatch("core/notices").createNotice("success",e.data.message,{isDismissible:!0})}})})),jQuery('[name="handle_api_key"]').on("click",(function(){"Clear API Key"===this.value&&jQuery('[name="atai_api_key"]').val("")})),jQuery(".notice--atai.is-dismissible").on("click",".notice-dismiss",(function(){jQuery.ajax(wp_atai.ajax_url,{type:"POST",data:{action:"atai_expire_insufficient_credits_notice",security:wp_atai.security_insufficient_credits_notice}})})),document.addEventListener("DOMContentLoaded",(async()=>{const e=window.location.href.includes("post.php")&&jQuery("body").hasClass("post-type-attachment"),t=window.location.href.includes("post-new.php")||window.location.href.includes("post.php")&&!jQuery("body").hasClass("post-type-attachment"),a=window.location.href.includes("upload.php");let n=null,i="atai-generate-button";if(e){if(n=r("post"),!n)return!1;if(n=parseInt(n,10),!n)return;let e=document.getElementsByClassName("attachment-alt-text")[0];if(e){let t=o(i,n,"single");setTimeout((()=>{!function(e,t){if(e.hasChildNodes()){for(const a of e.childNodes)if("BUTTON"==a.nodeName)return void e.replaceChild(t,a);e.appendChild(t)}else e.appendChild(t)}(e,t)}),200)}}else{if(!a&&!t)return!1;if(n=r("item"),jQuery(document).on("click","ul.attachments li.attachment",(function(){let e=jQuery(this);e.attr("data-id")&&(n=parseInt(e.attr("data-id"),10),n&&s("alt-text-description",i,n))})),document.addEventListener("click",(function(e){d(e,"button-click",i)})),document.addEventListener("keydown",(function(e){"ArrowRight"!==e.key&&"ArrowLeft"!==e.key||d(e,"keyboard",i)})),!n)return!1}})),document.addEventListener("DOMContentLoaded",(()=>{jQuery('.tablenav .bulkactions select option[value="alttext_options"]').attr("disabled","disabled")}));function l(){const t=wp.media.view.Attachment.Details;wp.media.view.Attachment.Details=t.extend({ATAICheckboxToggle:function(e){const t=e.currentTarget,a=t.parentNode.nextElementSibling,n=a.querySelector(".atai-generate-button__keywords-textfield");t.checked?(a.style.display="block",n.setSelectionRange(0,0),n.focus()):a.style.display="none"},ATAIAnchorClick:async function(t){t.preventDefault();const n=this.model.id,r=t.currentTarget,s=r.closest(".attachment-details"),o=r.closest(".atai-generate-button"),c=o.querySelector(".atai-generate-button__keywords-checkbox"),d=o.querySelector(".atai-generate-button__keywords-textfield"),l=o.querySelector(".atai-update-notice");r.classList.add("disabled");const u=r.querySelector("span");u&&(u.innerText=e("Processing...","alttext-ai")),wp_atai.has_api_key||(window.location.href=wp_atai.settings_page_url+"&api_key_missing=1");const p=s.querySelector('[data-setting="title"] input'),w=s.querySelector('[data-setting="caption"] textarea'),g=s.querySelector('[data-setting="description"] textarea'),h=s.querySelector('[data-setting="alt"] textarea'),y=c.checked?i(d.value):[];l&&(l.innerText="",l.classList.remove("atai-update-notice--success","atai-update-notice--error"));const m=await a(n,y);if("success"===m.status)h.value=m.alt_text,"yes"===wp_atai.should_update_title&&(p.value=m.alt_text),"yes"===wp_atai.should_update_caption&&(w.value=m.alt_text),"yes"===wp_atai.should_update_description&&(g.value=m.alt_text),l.innerText=e("Updated","alttext-ai"),l.classList.add("atai-update-notice--success"),setTimeout((()=>{l.classList.remove("atai-update-notice--success")}),3e3);else{let t=e("Unable to generate alt text. Check error logs for details.","alttext-ai");m?.message&&(t=m.message),l.innerText=t,l.classList.add("atai-update-notice--error")}r.classList.remove("disabled"),u.innerText=e("Update Alt Text","alttext-ai")},events:{...t.prototype.events,"change .atai-generate-button__keywords-checkbox":"ATAICheckboxToggle","click .atai-generate-button__anchor":"ATAIAnchorClick"},template:function(e){const a=t.prototype.template.apply(this,arguments),n=document.createElement("div");return n.innerHTML=a,c(n,e.model.id,"modal"),n.innerHTML}})}(()=>{if(wp?.media?.view?.Attachment?.Details?.prototype?.render){const e=wp.media.view.Attachment.Details.prototype.render;wp.media.view.Attachment.Details.prototype.render=function(){const t=e.apply(this,arguments),a=this.$el?this.$el[0]:null;if(a){this._ataiObserver&&(this._ataiObserver.disconnect(),delete this._ataiObserver);let e=null;const t=()=>{e&&clearTimeout(e),e=setTimeout((()=>{a.querySelector(".atai-generate-button")||c(a,this.model.get("id"),"modal"),this._ataiObserver&&(this._ataiObserver.disconnect(),delete this._ataiObserver)}),50)};this._ataiObserver=new MutationObserver(t),this._ataiObserver.observe(a,{childList:!0,subtree:!0,attributes:!1,characterData:!1}),setTimeout((()=>{a.querySelector(".atai-generate-button")||c(a,this.model.get("id"),"modal")}),10)}return t}}})(),document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("form#alttextai-csv-import");if(e){const t=e.querySelector('input[type="file"]');t&&t.addEventListener("change",(t=>{e.dataset.fileLoaded=t.target.files?.length>0?"true":"false"}))}})),document.addEventListener("DOMContentLoaded",(()=>{wp?.media?.view?.Attachment?.Details&&setTimeout(l,500)}))}();1 !function(){"use strict";const{__:e}=wp.i18n;function t(e,t,a={}){const n={timestamp:(new Date).toISOString(),functionName:e||"Unknown Function",message:t?.message||"No error message provided",stack:t?.stack||"No stack trace available",url:window.location.href,userAgent:navigator.userAgent,additionalContext:{...a}};console.groupCollapsed(`[AltText.ai Error] ${e}`),console.error("Error Message:",n.message),console.error("Stack Trace:",n.stack),console.info("Timestamp:",n.timestamp),console.info("Function:",e),console.info("URL:",n.url),console.info("User Agent:",n.userAgent),a?.requestDetails&&console.info("Request Details:",a.requestDetails),a?.responseDetails&&console.info("Response Details:",a.responseDetails),console.info("Additional Context:",a),console.groupEnd()}function a(a,n=[]){if(!a){const i=new Error(e("Attachment ID is missing","alttext-ai"));return t("singleGenerateAJAX",i,{attachmentId:a,keywords:n}),Promise.reject(i)}return new Promise(((e,i)=>{jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_single_generate",security:wp_atai.security_single_generate,attachment_id:a,keywords:n},url:wp_atai.ajax_url,success:function(t){e(t)},error:function(e){const r=new Error("AJAX request failed");t("singleGenerateAJAX",r,{response:e,attachmentId:a,keywords:n}),i(r)}})}))}function n(){jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_bulk_generate",security:wp_atai.security_bulk_generate,posts_per_page:window.atai.postsPerPage,last_post_id:window.atai.lastPostId,keywords:window.atai.bulkGenerateKeywords,negativeKeywords:window.atai.bulkGenerateNegativeKeywords,mode:window.atai.bulkGenerateMode,onlyAttached:window.atai.bulkGenerateOnlyAttached,onlyNew:window.atai.bulkGenerateOnlyNew,wcProducts:window.atai.bulkGenerateWCProducts,wcOnlyFeatured:window.atai.bulkGenerateWCOnlyFeatured,batchId:window.atai.bulkGenerateBatchId},url:wp_atai.ajax_url,success:function(a){try{window.atai.progressCurrent+=a.process_count,window.atai.progressSuccessful+=a.success_count,void 0!==a.skipped_count&&(window.atai.progressSkipped=(window.atai.progressSkipped||0)+a.skipped_count,window.atai.progressSkippedEl&&window.atai.progressSkippedEl.text(window.atai.progressSkipped)),window.atai.lastPostId=a.last_post_id,window.atai.progressBarEl.data("current",window.atai.progressCurrent),window.atai.progressLastPostId.text(window.atai.lastPostId),window.atai.progressCurrentEl.text(window.atai.progressCurrent),window.atai.progressSuccessfulEl.text(window.atai.progressSuccessful);const t=100*window.atai.progressCurrent/window.atai.progressMax;window.atai.progressBarEl.css("width",t+"%"),window.atai.progressPercent.text(t.toFixed(2)+"%"),a.recursive?setTimeout((()=>{n()}),500):(window.atai.progressButtonCancel.hide(),window.atai.progressBarWrapper.hide(),window.atai.progressButtonFinished.show(),window.atai.progressHeading.text(a.message||e("Update complete!","alttext-ai")),window.atai.redirectUrl=a?.redirect_url)}catch(a){t("bulkGenerateAJAX",a),alert(e("An error occurred during bulk generation.","alttext-ai"))}},error:function(a){t("bulkGenerateAJAX",new Error("AJAX request failed during bulk generation"),{currentProgress:window.atai.progressCurrent,responseDetails:{status:a.status,statusText:a.statusText,responseBody:a.responseText}}),window.atai.progressButtonCancel.hide(),window.atai.progressBarWrapper.hide(),window.atai.progressButtonFinished.show(),window.atai.progressHeading.text(e("The update was stopped due to a server error. Restart the update to pick up where it left off.","alttext-ai"))}})}function i(e){return e.split(",").map((function(e){return e.trim()})).filter((function(e){return e.length>0})).slice(0,6)}function r(e){e=e.replace(/[[]/,"\\[").replace(/[\]]/,"\\]");let t=new RegExp("[\\?&]"+e+"=([^&#]*)").exec(window.location.search);return null===t?"":decodeURIComponent(t[1].replace(/\+/g," "))}function s(e,t,a){let n=document.getElementById(e);if(!n)return!1;let i=document.getElementById(t+"-"+a);if(i&&i.remove(),!window.location.href.includes("upload.php"))return!1;let r=o(t,a,"modal"),s=n.parentNode;return s&&s.replaceChild(r,n),!0}function o(t,n,r){const s=new URL(window.location.href);s.searchParams.set("atai_action","generate");const o=t+"-"+n,c=document.createElement("div");c.setAttribute("id",o),c.classList.add("description"),c.classList.add("atai-generate-button");const d=document.createElement("a");d.setAttribute("id",o+"-anchor"),d.setAttribute("href",s),d.className="button-secondary button-large atai-generate-button__anchor";const l=document.createElement("div");l.setAttribute("id",o+"-checkbox-wrapper"),l.classList.add("atai-generate-button__keywords-checkbox-wrapper");const u=document.createElement("input");u.setAttribute("type","checkbox"),u.setAttribute("id",o+"-keywords-checkbox"),u.setAttribute("name","atai-generate-button-keywords-checkbox"),u.className="atai-generate-button__keywords-checkbox";const p=document.createElement("label");p.htmlFor="atai-generate-button-keywords-checkbox",p.innerText="Add SEO keywords";const w=document.createElement("div");w.setAttribute("id",o+"-textfield-wrapper"),w.className="atai-generate-button__keywords-textfield-wrapper",w.style.display="none";const g=document.createElement("input");g.setAttribute("type","text"),g.setAttribute("id",o+"-textfield"),g.className="atai-generate-button__keywords-textfield",g.setAttribute("name","atai-generate-button-keywords"),g.size=40,l.appendChild(u),l.appendChild(p),w.appendChild(g),u.addEventListener("change",(function(){this.checked?(w.style.display="block",g.setSelectionRange(0,0),g.focus()):w.style.display="none"}));wp_atai.can_user_upload_files?(e=>{jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_check_image_eligibility",security:wp_atai.security_check_attachment_eligibility,attachment_id:e},url:wp_atai.ajax_url,success:function(e){if("success"!==e.status){const e=document.querySelector(`#${o}-anchor`),t=document.querySelector(`#${o}-keywords-checkbox`);e?e.classList.add("disabled"):d.classList.add("disabled"),t?t.classList.add("disabled"):u.classList.add("disabled")}}})})(n):(d.classList.add("disabled"),u.disabled=!0),d.title=e("AltText.ai: Update alt text for this single image","alttext-ai"),d.onclick=function(){this.classList.add("disabled");let t=this.querySelector("span");t&&(t.innerText=e("Processing...","alttext-ai"))};const h=document.createElement("img");h.src=wp_atai.icon_button_generate,h.alt=e("Update Alt Text with AltText.ai","alttext-ai"),d.appendChild(h);const y=document.createElement("span");y.innerText=e("Update Alt Text","alttext-ai"),d.appendChild(y),c.appendChild(d),c.appendChild(l),c.appendChild(w);const m=document.createElement("span");return m.classList.add("atai-update-notice"),c.appendChild(m),d.addEventListener("click",(async function(t){t.preventDefault(),wp_atai.has_api_key||(window.location.href=wp_atai.settings_page_url+"&api_key_missing=1");const s="single"==r?document.getElementById("title"):document.querySelector('[data-setting="title"] input'),o="single"==r?document.getElementById("attachment_caption"):document.querySelector('[data-setting="caption"] textarea'),c="single"==r?document.getElementById("attachment_content"):document.querySelector('[data-setting="description"] textarea'),l="single"==r?document.getElementById("attachment_alt"):document.querySelector('[data-setting="alt"] textarea'),p=u.checked?i(g.value):[];m&&(m.innerText="",m.classList.remove("atai-update-notice--success","atai-update-notice--error"));const w=await a(n,p);if("success"===w.status)l.value=w.alt_text,"yes"===wp_atai.should_update_title&&(s.value=w.alt_text,"single"==r&&s.previousElementSibling.classList.add("screen-reader-text")),"yes"===wp_atai.should_update_caption&&(o.value=w.alt_text),"yes"===wp_atai.should_update_description&&(c.value=w.alt_text),m.innerText=e("Updated","alttext-ai"),m.classList.add("atai-update-notice--success"),setTimeout((()=>{m.classList.remove("atai-update-notice--success")}),3e3);else{let t=e("Unable to generate alt text. Check error logs for details.","alttext-ai");w?.message&&(t=w.message),m.innerText=t,m.classList.add("atai-update-notice--error")}d.classList.remove("disabled"),d.querySelector("span").innerText=e("Update Alt Text","alttext-ai")})),c}function c(e,t,a){try{if(e.querySelector("#atai-generate-button-"+t+", .atai-generate-button"))return!0;let n,i=!1;const r=e.querySelector("p#alt-text-description");if(r&&r.parentNode&&(n=o("atai-generate-button",t,a),r.parentNode.replaceChild(n,r),i=!0),!i){const r=e.querySelector('[data-setting="alt"] input, [data-setting="alt"] textarea');r&&r.parentNode&&(n=o("atai-generate-button",t,a),r.parentNode.insertBefore(n,r.nextSibling),i=!0)}if(!i){const r=e.querySelector(".attachment-details, .media-attachment-details");r&&(n=o("atai-generate-button",t,a),r.appendChild(n),i=!0)}return i||(n=o("atai-generate-button",t,a),e.appendChild(n),i=!0),i}catch(e){return console.error("[AltText.ai] Error injecting button:",e),!1}}function d(e,t,a){if("button-click"===t&&!e.target.matches(".media-modal .right, .media-modal .left"))return;const n=new URLSearchParams(window.location.search).get("item");n&&s("alt-text-description",a,n)}window.atai=window.atai||{postsPerPage:1,lastPostId:0,intervals:{},redirectUrl:""},jQuery("[data-edit-history-trigger]").on("click",(async function(){const a=this,n=a.dataset.attachmentId,i=document.getElementById("edit-history-input-"+n).value.replace(/\n/g,"");a.disabled=!0;try{const a=await function(a,n=""){if(!a){const i=new Error(e("Attachment ID is missing","alttext-ai"));return t("editHistoryAJAX",i,{attachmentId:a,altText:n}),Promise.reject(i)}return new Promise(((e,i)=>{jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_edit_history",security:wp_atai.security_edit_history,attachment_id:a,alt_text:n},url:wp_atai.ajax_url,success:function(t){e(t)},error:function(e){const r=new Error("AJAX request failed");t("editHistoryAJAX",r,{response:e,attachmentId:a,altText:n}),i(r)}})}))}(n,i);"success"!==a.status&&alert(e("Unable to update alt text for this image.","alttext-ai"));const r=document.getElementById("edit-history-success-"+n);r.classList.remove("hidden"),setTimeout((()=>{r.classList.add("hidden")}),2e3)}catch(t){alert(e("An error occurred while updating the alt text.","alttext-ai"))}finally{a.disabled=!1}})),jQuery("[data-bulk-generate-start]").on("click",(function(){const t=r("atai_action")||"normal",a=r("atai_batch_id")||0;"bulk-select-generate"!==t||a||alert(e("Invalid batch ID","alttext-ai")),window.atai.bulkGenerateKeywords=i(jQuery("[data-bulk-generate-keywords]").val()??""),window.atai.bulkGenerateNegativeKeywords=i(jQuery("[data-bulk-generate-negative-keywords]").val()??""),window.atai.progressWrapperEl=jQuery("[data-bulk-generate-progress-wrapper]"),window.atai.progressHeading=jQuery("[data-bulk-generate-progress-heading]"),window.atai.progressBarWrapper=jQuery("[data-bulk-generate-progress-bar-wrapper]"),window.atai.progressBarEl=jQuery("[data-bulk-generate-progress-bar]"),window.atai.progressPercent=jQuery("[data-bulk-generate-progress-percent]"),window.atai.progressLastPostId=jQuery("[data-bulk-generate-last-post-id]"),window.atai.progressCurrentEl=jQuery("[data-bulk-generate-progress-current]"),window.atai.progressCurrent=window.atai.progressBarEl.data("current"),window.atai.progressSuccessfulEl=jQuery("[data-bulk-generate-progress-successful]"),window.atai.progressSuccessful=window.atai.progressBarEl.data("successful"),window.atai.progressMax=window.atai.progressBarEl.data("max"),window.atai.progressButtonCancel=jQuery("[data-bulk-generate-cancel]"),window.atai.progressButtonFinished=jQuery("[data-bulk-generate-finished]"),"bulk-select-generate"===t?(window.atai.bulkGenerateMode="bulk-select",window.atai.bulkGenerateBatchId=a):(window.atai.bulkGenerateMode=jQuery("[data-bulk-generate-mode-all]").is(":checked")?"all":"missing",window.atai.bulkGenerateOnlyAttached=jQuery("[data-bulk-generate-only-attached]").is(":checked")?"1":"0",window.atai.bulkGenerateOnlyNew=jQuery("[data-bulk-generate-only-new]").is(":checked")?"1":"0",window.atai.bulkGenerateWCProducts=jQuery("[data-bulk-generate-wc-products]").is(":checked")?"1":"0",window.atai.bulkGenerateWCOnlyFeatured=jQuery("[data-bulk-generate-wc-only-featured]").is(":checked")?"1":"0"),jQuery("#bulk-generate-form").hide(),window.atai.progressWrapperEl.show(),n()})),jQuery("[data-bulk-generate-mode-all]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-bulk-generate-only-attached]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-bulk-generate-only-new]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-bulk-generate-wc-products]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-bulk-generate-wc-only-featured]").on("change",(function(){window.location.href=this.dataset.url})),jQuery("[data-post-bulk-generate]").on("click",(async function(a){if("#atai-bulk-generate"!==this.getAttribute("href"))return;if(a.preventDefault(),function(){try{if(window.wp&&wp.data&&wp.blocks)return wp.data.select("core/editor").isEditedPostDirty()}catch(e){return t("isPostDirty",e,{context:"Checking if post is dirty in Gutenberg editor"}),!0}return!0}()){if(!confirm(e("[AltText.ai] Make sure to save any changes before proceeding -- any unsaved changes will be lost. Are you sure you want to continue?","alttext-ai")))return}const n=document.getElementById("post_ID")?.value,r=this.querySelector("span"),s=this.nextElementSibling,o=r.innerText,c=document.querySelector("[data-post-bulk-generate-overwrite]")?.checked||!1,d=document.querySelector("[data-post-bulk-generate-process-external]")?.checked||!1,l=document.querySelector("[data-post-bulk-generate-keywords-checkbox]"),u=document.querySelector("[data-post-bulk-generate-keywords]"),p=l?.checked?i(u?.value):[];if(!n)return s.innerText=e("This is not a valid post.","alttext-ai"),void s.classList.add("atai-update-notice--error");try{this.classList.add("disabled"),r.innerText=e("Processing...","alttext-ai");const a=await function(a,n=!1,i=!1,r=[]){if(!a){const s=new Error(e("Post ID is missing","alttext-ai"));return t("enrichPostContentAJAX",s,{postId:a,overwrite:n,processExternal:i,keywords:r}),Promise.reject(s)}return new Promise(((e,s)=>{jQuery.ajax({type:"post",dataType:"json",data:{action:"atai_enrich_post_content",security:wp_atai.security_enrich_post_content,post_id:a,overwrite:n,process_external:i,keywords:r},url:wp_atai.ajax_url,success:function(t){e(t)},error:function(e){const o=new Error("AJAX request failed");t("enrichPostContentAJAX",o,{response:e,postId:a,overwrite:n,processExternal:i,keywords:r}),s(o)}})}))}(n,c,d,p);if(!a.success)throw new Error(e("Unable to generate alt text. Check error logs for details.","alttext-ai"));window.location.reload()}catch(t){s.innerText=t.message||e("An error occurred.","alttext-ai"),s.classList.add("atai-update-notice--error")}finally{this.classList.remove("disabled"),r.innerText=o}})),document.addEventListener("DOMContentLoaded",(()=>{wp?.blocks&&jQuery.ajax({url:wp_atai.ajax_url,type:"GET",data:{action:"atai_check_enrich_post_content_transient",security:wp_atai.security_enrich_post_content_transient},success:function(e){e?.success&&wp.data.dispatch("core/notices").createNotice("success",e.data.message,{isDismissible:!0})}})})),jQuery('[name="handle_api_key"]').on("click",(function(){"Clear API Key"===this.value&&jQuery('[name="atai_api_key"]').val("")})),jQuery(".notice--atai.is-dismissible").on("click",".notice-dismiss",(function(){jQuery.ajax(wp_atai.ajax_url,{type:"POST",data:{action:"atai_expire_insufficient_credits_notice",security:wp_atai.security_insufficient_credits_notice}})})),document.addEventListener("DOMContentLoaded",(async()=>{const e=window.location.href.includes("post.php")&&jQuery("body").hasClass("post-type-attachment"),t=window.location.href.includes("post-new.php")||window.location.href.includes("post.php")&&!jQuery("body").hasClass("post-type-attachment"),a=window.location.href.includes("upload.php");let n=null,i="atai-generate-button";if(e){if(n=r("post"),!n)return!1;if(n=parseInt(n,10),!n)return;let e=document.getElementsByClassName("attachment-alt-text")[0];if(e){let t=o(i,n,"single");setTimeout((()=>{!function(e,t){if(e.hasChildNodes()){for(const a of e.childNodes)if("BUTTON"==a.nodeName)return void e.replaceChild(t,a);e.appendChild(t)}else e.appendChild(t)}(e,t)}),200)}}else{if(!a&&!t)return!1;if(n=r("item"),jQuery(document).on("click","ul.attachments li.attachment",(function(){let e=jQuery(this);e.attr("data-id")&&(n=parseInt(e.attr("data-id"),10),n&&s("alt-text-description",i,n))})),document.addEventListener("click",(function(e){d(e,"button-click",i)})),document.addEventListener("keydown",(function(e){"ArrowRight"!==e.key&&"ArrowLeft"!==e.key||d(e,"keyboard",i)})),!n)return!1}})),document.addEventListener("DOMContentLoaded",(()=>{jQuery('.tablenav .bulkactions select option[value="alttext_options"]').attr("disabled","disabled")}));function l(){const t=wp.media.view.Attachment.Details;wp.media.view.Attachment.Details=t.extend({ATAICheckboxToggle:function(e){const t=e.currentTarget,a=t.parentNode.nextElementSibling,n=a.querySelector(".atai-generate-button__keywords-textfield");t.checked?(a.style.display="block",n.setSelectionRange(0,0),n.focus()):a.style.display="none"},ATAIAnchorClick:async function(t){t.preventDefault();const n=this.model.id,r=t.currentTarget,s=r.closest(".attachment-details"),o=r.closest(".atai-generate-button"),c=o.querySelector(".atai-generate-button__keywords-checkbox"),d=o.querySelector(".atai-generate-button__keywords-textfield"),l=o.querySelector(".atai-update-notice");r.classList.add("disabled");const u=r.querySelector("span");u&&(u.innerText=e("Processing...","alttext-ai")),wp_atai.has_api_key||(window.location.href=wp_atai.settings_page_url+"&api_key_missing=1");const p=s.querySelector('[data-setting="title"] input'),w=s.querySelector('[data-setting="caption"] textarea'),g=s.querySelector('[data-setting="description"] textarea'),h=s.querySelector('[data-setting="alt"] textarea'),y=c.checked?i(d.value):[];l&&(l.innerText="",l.classList.remove("atai-update-notice--success","atai-update-notice--error"));const m=await a(n,y);if("success"===m.status)h.value=m.alt_text,"yes"===wp_atai.should_update_title&&(p.value=m.alt_text),"yes"===wp_atai.should_update_caption&&(w.value=m.alt_text),"yes"===wp_atai.should_update_description&&(g.value=m.alt_text),l.innerText=e("Updated","alttext-ai"),l.classList.add("atai-update-notice--success"),setTimeout((()=>{l.classList.remove("atai-update-notice--success")}),3e3);else{let t=e("Unable to generate alt text. Check error logs for details.","alttext-ai");m?.message&&(t=m.message),l.innerText=t,l.classList.add("atai-update-notice--error")}r.classList.remove("disabled"),u.innerText=e("Update Alt Text","alttext-ai")},events:{...t.prototype.events,"change .atai-generate-button__keywords-checkbox":"ATAICheckboxToggle","click .atai-generate-button__anchor":"ATAIAnchorClick"},template:function(e){const a=t.prototype.template.apply(this,arguments),n=document.createElement("div");return n.innerHTML=a,c(n,e.model.id,"modal"),n.innerHTML}})}(()=>{if(wp?.media?.view?.Attachment?.Details?.prototype?.render){const e=wp.media.view.Attachment.Details.prototype.render;wp.media.view.Attachment.Details.prototype.render=function(){const t=e.apply(this,arguments),a=this.$el?this.$el[0]:null;if(a){this._ataiObserver&&(this._ataiObserver.disconnect(),delete this._ataiObserver);let e=null;const t=()=>{e&&clearTimeout(e),e=setTimeout((()=>{a.querySelector(".atai-generate-button")||c(a,this.model.get("id"),"modal"),this._ataiObserver&&(this._ataiObserver.disconnect(),delete this._ataiObserver)}),50)};this._ataiObserver=new MutationObserver(t),this._ataiObserver.observe(a,{childList:!0,subtree:!0,attributes:!1,characterData:!1}),setTimeout((()=>{a.querySelector(".atai-generate-button")||c(a,this.model.get("id"),"modal")}),10)}return t}}})(),document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("form#alttextai-csv-import");if(e){const t=e.querySelector('input[type="file"]');t&&t.addEventListener("change",(t=>{e.dataset.fileLoaded=t.target.files?.length>0?"true":"false"}))}})),document.addEventListener("DOMContentLoaded",(()=>{wp?.media?.view?.Attachment?.Details&&setTimeout(l,500)}))}(); -
alttext-ai/trunk/atai.php
r3307656 r3317623 16 16 * Plugin URI: https://alttext.ai/product 17 17 * Description: Automatically generate image alt text with AltText.ai. 18 * Version: 1.10. 018 * Version: 1.10.1 19 19 * Author: AltText.ai 20 20 * Author URI: https://alttext.ai … … 33 33 * Current plugin version. 34 34 */ 35 define( 'ATAI_VERSION', '1.10. 0' );35 define( 'ATAI_VERSION', '1.10.1' ); 36 36 37 37 /** -
alttext-ai/trunk/changelog.txt
r3307656 r3317623 1 1 *** AltText.ai Changelog *** 2 3 2025-06-24 - version 1.10.1 4 * Fix potential bulk generation lockups on small images 2 5 3 6 2025-06-06 - version 1.10.0 -
alttext-ai/trunk/includes/class-atai-attachment.php
r3280046 r3317623 168 168 */ 169 169 public function is_attachment_eligible( $attachment_id, $context = 'generate' ) { 170 // Determine if we should log errors (skip logging during bulk operations) 171 $should_log = ($context !== 'bulk'); 170 172 171 173 /** Check user-defined filter for eligibility. Bail early if this attachment is not eligible. **/ … … 227 229 $valid_extensions = array_map('trim', explode(',', $file_type_extensions)); 228 230 if (! in_array(strtolower($extension), $valid_extensions)) { 229 if ( $ context === 'generate') {231 if ( $should_log ) { 230 232 ATAI_Utility::log_error( 231 233 sprintf( … … 243 245 244 246 if (!in_array(strtolower($extension), ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'avif', 'svg'])) { 245 if ( $ context === 'generate') {247 if ( $should_log ) { 246 248 ATAI_Utility::log_error( 247 249 sprintf( … … 258 260 259 261 if ($size === null || $size === false) { 260 if ($ context === 'generate'&& get_option('atai_skip_filenotfound') === 'yes') {262 if ($should_log && get_option('atai_skip_filenotfound') === 'yes') { 261 263 ATAI_Utility::log_error( 262 264 sprintf( … … 272 274 273 275 if ($size > 16) { 274 if ( $ context === 'generate') {276 if ( $should_log ) { 275 277 ATAI_Utility::log_error( 276 278 sprintf( … … 292 294 } 293 295 294 if ( $ context === 'generate') {296 if ( $should_log ) { 295 297 ATAI_Utility::log_error( 296 298 sprintf( … … 909 911 $wc_only_featured = sanitize_text_field( $_REQUEST['wcOnlyFeatured'] ?? '0' ); 910 912 $batch_id = sanitize_text_field( $_REQUEST['batchId'] ?? '0' ); 911 $images_successful = $loop_count = 0;913 $images_successful = $images_skipped = $loop_count = 0; 912 914 $redirect_url = admin_url( 'admin.php?page=atai-bulk-generate' ); 913 915 $recursive = true; … … 994 996 ATAI_Utility::log_error( sprintf("BulkGenerate: Attachment ID %d", $attachment_id) ); 995 997 } 998 999 // Skip if attachment is not eligible 1000 if ( ! $this->is_attachment_eligible( $attachment_id, 'bulk' ) ) { 1001 $images_skipped++; 1002 $last_post_id = $attachment_id; // IMPORTANT: Update last_post_id to prevent infinite loop 1003 1004 if ( $mode === 'bulk-select' ) { 1005 // Remove the attachment ID from the transient 1006 $images_to_update = array_diff( $images_to_update, array( $attachment_id ) ); 1007 set_transient( 'alttext_bulk_select_generate_' . $batch_id, $images_to_update, 2048 ); 1008 } 1009 1010 if ( ++$loop_count >= $query_limit ) { 1011 break; 1012 } 1013 continue; 1014 } 1015 996 1016 $response = $this->generate_alt( $attachment_id, null, array( 'keywords' => $keywords, 'negative_keywords' => $negative_keywords ) ); 997 1017 … … 1033 1053 } 1034 1054 1055 // Prepare response message based on whether we have skipped images 1056 $message = $images_skipped > 0 1057 ? sprintf(__('Images processed: %d updated, %d skipped.', 'alttext-ai'), $images_successful, $images_skipped) 1058 : __('Images successfully updated.', 'alttext-ai'); 1059 1035 1060 wp_send_json( array( 1036 1061 'status' => 'success', 1037 'message' => __( 'Images successfully updated.', 'alttext-ai' ),1062 'message' => $message, 1038 1063 'process_count' => $loop_count, 1039 1064 'success_count' => $images_successful, 1065 'skipped_count' => $images_skipped, 1040 1066 'last_post_id' => $last_post_id, 1041 1067 'recursive' => $recursive,
Note: See TracChangeset
for help on using the changeset viewer.