Remove duplicate featured images from blog content
- Add removeLeadingImage() to strip the first image from content when it matches the featured image, preventing duplication on blog post pages - Handles figure wraps, linked images, and standalone img tags - Featured image now appears only once (in the header), not repeated in content Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
64da557836
commit
da39ee7751
|
|
@ -195,6 +195,36 @@ function removeShortcodes(text) {
|
|||
return clean;
|
||||
}
|
||||
|
||||
// Remove the first/leading image from content to avoid duplication with featured image
|
||||
function removeLeadingImage(content, featuredImageUrl) {
|
||||
if (!featuredImageUrl || !content) return content;
|
||||
|
||||
let result = content.trim();
|
||||
|
||||
// Pattern 1: Remove leading <figure class="wp-caption">...</figure> containing the featured image
|
||||
const figureMatch = result.match(/^(\s*<figure[^>]*>[\s\S]*?<\/figure>\s*)/i);
|
||||
if (figureMatch && figureMatch[1].includes(featuredImageUrl.split('?')[0])) {
|
||||
result = result.substring(figureMatch[1].length).trim();
|
||||
return result;
|
||||
}
|
||||
|
||||
// Pattern 2: Remove leading <a><img></a> containing the featured image
|
||||
const linkedImgMatch = result.match(/^(\s*<a[^>]*>[\s\S]*?<img[^>]*>[\s\S]*?<\/a>\s*)/i);
|
||||
if (linkedImgMatch && linkedImgMatch[1].includes(featuredImageUrl.split('?')[0])) {
|
||||
result = result.substring(linkedImgMatch[1].length).trim();
|
||||
return result;
|
||||
}
|
||||
|
||||
// Pattern 3: Remove leading standalone <img> containing the featured image
|
||||
const imgMatch = result.match(/^(\s*<img[^>]*\/?>[\s*]*)/i);
|
||||
if (imgMatch && imgMatch[1].includes(featuredImageUrl.split('?')[0])) {
|
||||
result = result.substring(imgMatch[1].length).trim();
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Extract first paragraph as excerpt
|
||||
function extractExcerpt(content, maxLength = 200) {
|
||||
// First decode HTML entities in the raw content
|
||||
|
|
@ -230,7 +260,9 @@ items.forEach((item, index) => {
|
|||
const slug = createSlug(postName, title);
|
||||
const images = extractImages(content);
|
||||
const featuredImage = images[0] || null;
|
||||
const cleanedContent = cleanContent(content);
|
||||
let cleanedContent = cleanContent(content);
|
||||
// Remove the leading image from content if it matches the featured image (to avoid duplication)
|
||||
cleanedContent = removeLeadingImage(cleanedContent, featuredImage);
|
||||
const excerpt = extractExcerpt(cleanedContent);
|
||||
|
||||
const data = {
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue