Skip to content

Commit 8a38712

Browse files
akashmdiuclaude
andcommitted
Fix duplicate PDF thumbnail generation in Elementor PDF Gallery
Pass attachment_id from JS to the server-side AJAX handler so cached thumbnails are found via _ep_pdf_thumbnail_id post meta. Also check the server cache before client-side PDF.js rendering to avoid re-generating thumbnails for the same PDF on every widget open. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 2197a1c commit 8a38712

File tree

2 files changed

+88
-34
lines changed

2 files changed

+88
-34
lines changed

assets/js/pdf-gallery-elementor-editor.js

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@
175175
}
176176

177177
// ── Upload a base64 image to WordPress via AJAX ─────────────────────
178-
function uploadThumbnailImage(dataUrl, pdfUrl, fileName, callback) {
178+
function uploadThumbnailImage(dataUrl, pdfUrl, fileName, callback, attachmentId) {
179179
if (!window.epPdfGallery || !epPdfGallery.ajaxUrl) {
180180
console.error('[EP PDF Gallery] No AJAX URL configured');
181181
callback('', 0);
@@ -189,6 +189,9 @@
189189
formData.append('image_data', dataUrl);
190190
formData.append('pdf_url', pdfUrl);
191191
formData.append('file_name', fileName);
192+
if (attachmentId) {
193+
formData.append('attachment_id', attachmentId);
194+
}
192195

193196
$.ajax({
194197
url: epPdfGallery.ajaxUrl,
@@ -270,26 +273,50 @@
270273
_generatingThumbs[pdfUrl] = true;
271274
updateThumbLoading(pdfUrl, true);
272275

273-
// Render first page via PDF.js client-side
274-
renderPdfFirstPage(pdfUrl, function (dataUrl) {
275-
if (!dataUrl) {
276-
delete _generatingThumbs[pdfUrl];
277-
updateThumbLoading(pdfUrl, false);
278-
processNext(queueIndex + 1);
279-
return;
280-
}
276+
// First check if server already has a cached thumbnail
277+
if (item.id && window.epPdfGallery && epPdfGallery.ajaxUrl) {
278+
$.post(epPdfGallery.ajaxUrl, {
279+
action: 'ep_generate_pdf_thumbnail',
280+
nonce: epPdfGallery.nonce,
281+
attachment_id: item.id
282+
}, function (response) {
283+
if (response.success && response.data && response.data.url) {
284+
delete _generatingThumbs[pdfUrl];
285+
applyThumbToItem(pdfUrl, response.data.url, response.data.id);
286+
processNext(queueIndex + 1);
287+
return;
288+
}
289+
// No cached thumbnail, render client-side
290+
doClientRender();
291+
}).fail(function () {
292+
doClientRender();
293+
});
294+
} else {
295+
doClientRender();
296+
}
281297

282-
// Upload the rendered PNG to WordPress
283-
uploadThumbnailImage(dataUrl, pdfUrl, item.fileName || '', function (uploadedUrl, uploadedId) {
284-
delete _generatingThumbs[pdfUrl];
285-
if (uploadedUrl) {
286-
applyThumbToItem(pdfUrl, uploadedUrl, uploadedId);
287-
} else {
298+
function doClientRender() {
299+
// Render first page via PDF.js client-side
300+
renderPdfFirstPage(pdfUrl, function (dataUrl) {
301+
if (!dataUrl) {
302+
delete _generatingThumbs[pdfUrl];
288303
updateThumbLoading(pdfUrl, false);
304+
processNext(queueIndex + 1);
305+
return;
289306
}
290-
processNext(queueIndex + 1);
307+
308+
// Upload the rendered PNG to WordPress
309+
uploadThumbnailImage(dataUrl, pdfUrl, item.fileName || '', function (uploadedUrl, uploadedId) {
310+
delete _generatingThumbs[pdfUrl];
311+
if (uploadedUrl) {
312+
applyThumbToItem(pdfUrl, uploadedUrl, uploadedId);
313+
} else {
314+
updateThumbLoading(pdfUrl, false);
315+
}
316+
processNext(queueIndex + 1);
317+
}, item.id);
291318
});
292-
});
319+
}
293320
}
294321

295322
processNext(0);

static/js/pdf-gallery-elementor-editor.js

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@
175175
}
176176

177177
// ── Upload a base64 image to WordPress via AJAX ─────────────────────
178-
function uploadThumbnailImage(dataUrl, pdfUrl, fileName, callback) {
178+
function uploadThumbnailImage(dataUrl, pdfUrl, fileName, callback, attachmentId) {
179179
if (!window.epPdfGallery || !epPdfGallery.ajaxUrl) {
180180
console.error('[EP PDF Gallery] No AJAX URL configured');
181181
callback('', 0);
@@ -189,6 +189,9 @@
189189
formData.append('image_data', dataUrl);
190190
formData.append('pdf_url', pdfUrl);
191191
formData.append('file_name', fileName);
192+
if (attachmentId) {
193+
formData.append('attachment_id', attachmentId);
194+
}
192195

193196
$.ajax({
194197
url: epPdfGallery.ajaxUrl,
@@ -270,26 +273,50 @@
270273
_generatingThumbs[pdfUrl] = true;
271274
updateThumbLoading(pdfUrl, true);
272275

273-
// Render first page via PDF.js client-side
274-
renderPdfFirstPage(pdfUrl, function (dataUrl) {
275-
if (!dataUrl) {
276-
delete _generatingThumbs[pdfUrl];
277-
updateThumbLoading(pdfUrl, false);
278-
processNext(queueIndex + 1);
279-
return;
280-
}
276+
// First check if server already has a cached thumbnail
277+
if (item.id && window.epPdfGallery && epPdfGallery.ajaxUrl) {
278+
$.post(epPdfGallery.ajaxUrl, {
279+
action: 'ep_generate_pdf_thumbnail',
280+
nonce: epPdfGallery.nonce,
281+
attachment_id: item.id
282+
}, function (response) {
283+
if (response.success && response.data && response.data.url) {
284+
delete _generatingThumbs[pdfUrl];
285+
applyThumbToItem(pdfUrl, response.data.url, response.data.id);
286+
processNext(queueIndex + 1);
287+
return;
288+
}
289+
// No cached thumbnail, render client-side
290+
doClientRender();
291+
}).fail(function () {
292+
doClientRender();
293+
});
294+
} else {
295+
doClientRender();
296+
}
281297

282-
// Upload the rendered PNG to WordPress
283-
uploadThumbnailImage(dataUrl, pdfUrl, item.fileName || '', function (uploadedUrl, uploadedId) {
284-
delete _generatingThumbs[pdfUrl];
285-
if (uploadedUrl) {
286-
applyThumbToItem(pdfUrl, uploadedUrl, uploadedId);
287-
} else {
298+
function doClientRender() {
299+
// Render first page via PDF.js client-side
300+
renderPdfFirstPage(pdfUrl, function (dataUrl) {
301+
if (!dataUrl) {
302+
delete _generatingThumbs[pdfUrl];
288303
updateThumbLoading(pdfUrl, false);
304+
processNext(queueIndex + 1);
305+
return;
289306
}
290-
processNext(queueIndex + 1);
307+
308+
// Upload the rendered PNG to WordPress
309+
uploadThumbnailImage(dataUrl, pdfUrl, item.fileName || '', function (uploadedUrl, uploadedId) {
310+
delete _generatingThumbs[pdfUrl];
311+
if (uploadedUrl) {
312+
applyThumbToItem(pdfUrl, uploadedUrl, uploadedId);
313+
} else {
314+
updateThumbLoading(pdfUrl, false);
315+
}
316+
processNext(queueIndex + 1);
317+
}, item.id);
291318
});
292-
});
319+
}
293320
}
294321

295322
processNext(0);

0 commit comments

Comments
 (0)