共计 3070 个字符,预计需要花费 8 分钟才能阅读完成。

在 WordPress 中自动提取正文第一张图片并设置为特色图(特色图像),可以通过代码片段或插件实现。以下是两种主流方法:
方法 1:纯代码方式实现(推荐)
将以下代码添加到主题的 functions.php 文件中(或通过代码片段插件如 Code Snippets 添加):
简化版
// 自动将文章第一张图片设为特色图片
function auto_set_featured_image() {
global $post;
// 仅在文章类型为 post 且未设置特色图片时执行
if (‘post’ == get_post_type( $post) && !has_post_thumbnail($post->ID) ) {
// 从文章内容中提取图片
$first_image = ”;
ob_start();
ob_end_clean();
// 使用正则表达式查找文章中的第一张图片
preg_match_all(‘/<img.+src=[\'”]([^\'”]+)[\'”].*>/i’, $post->post_content, $matches );
if (!empty( $matches[1] ) ) {
$first_image = $matches[1][0];
// 尝试获取图片的附件 ID
$attachment_id = attachment_url_to_postid($first_image);
// 如果找到了附件 ID,设置为特色图片
if ($attachment_id) {
set_post_thumbnail($post->ID, $attachment_id);
} else {
// 如果图片不是媒体库中的附件,尝试导入
require_once(ABSPATH . ‘wp-admin/includes/media.php’);
require_once(ABSPATH . ‘wp-admin/includes/file.php’);
require_once(ABSPATH . ‘wp-admin/includes/image.php’);
// 下载图片并添加到媒体库
$attachment_id = media_sideload_image($first_image, $post->ID, $post->post_title, ‘id’);
// 如果导入成功,设置为特色图片
if (!is_wp_error( $attachment_id) ) {
set_post_thumbnail($post->ID, $attachment_id);
}
}
}
}
}
// 在文章保存时执行
add_action(‘save_post’, ‘auto_set_featured_image’);// 确保在文章发布时也执行
add_action(‘publish_post’, ‘auto_set_featured_image’);
优化版:
// 自动将文章第一张图片设为特色图片(优化版)
function auto_set_featured_image($post_id) {
// 防止保存修订版本时执行
if (wp_is_post_revision( $post_id) ) {
return;
}
// 获取文章对象
$post = get_post($post_id);
// 仅在文章类型为 post 时执行
if (‘post’ != get_post_type( $post) ) {
return;
}
// 如果已经设置了特色图片,则跳过处理
if (has_post_thumbnail( $post_id) ) {
// 可以在这里添加日志,记录已跳过处理的文章
// error_log(“ 已跳过处理已设置特色图片的文章: {$post_id}” );
return;
}
// 从文章内容中提取图片
$first_image = ”;
// 使用正则表达式查找文章中的第一张图片
preg_match_all(‘/<img.+src=[\'”]([^\'”]+)[\'”].*>/i’, $post->post_content, $matches );
if (!empty( $matches[1] ) ) {
$first_image = $matches[1][0];
// 尝试获取图片的附件 ID
$attachment_id = attachment_url_to_postid($first_image);
// 如果找到了附件 ID,设置为特色图片
if ($attachment_id) {
// 关闭钩子防止无限循环
remove_action(‘save_post’, ‘auto_set_featured_image’);
set_post_thumbnail($post_id, $attachment_id);
add_action(‘save_post’, ‘auto_set_featured_image’);
} else {
// 如果图片不是媒体库中的附件,尝试导入
require_once(ABSPATH . ‘wp-admin/includes/media.php’);
require_once(ABSPATH . ‘wp-admin/includes/file.php’);
require_once(ABSPATH . ‘wp-admin/includes/image.php’);
// 下载图片并添加到媒体库
$attachment_id = media_sideload_image($first_image, $post_id, $post->post_title, ‘id’);
// 如果导入成功,设置为特色图片
if (!is_wp_error( $attachment_id) ) {
// 关闭钩子防止无限循环
remove_action(‘save_post’, ‘auto_set_featured_image’);
set_post_thumbnail($post_id, $attachment_id);
add_action(‘save_post’, ‘auto_set_featured_image’);
} else {
// 记录错误日志
error_log(“ 导入图片失败 (文章 ID: {$post_id}): ” . $attachment_id->get_error_message());
}
}
}
}// 在文章保存时执行,优先级设为较高的值 (20) 确保在其他保存操作之后执行
add_action(‘save_post’, ‘auto_set_featured_image’, 20, 1);
代码说明:
条件检查:仅当文章没有特色图时才生效。
正则匹配:通过正则提取正文中的第一个 <img> 标签的 src。
媒体库处理:
如果图片已存在于媒体库,直接关联。
如果图片是外链,先下载到媒体库,再设为特色图。
触发时机:在文章保存时 (save_post 钩子) 执行。
方法 2:插件实现(简单快捷)
如果不想写代码,可以使用以下插件:
Quick Featured Images
免费插件,支持批量设置第一张图片为特色图。
Auto Featured Image
自动扫描正文中的第一张图片并设为特色图。
这两个插件到 wordpress 官方的插件库下载就可以
注意事项
图片版权:确保正文中的图片有合法使用权。
性能优化:如果文章量大,建议用代码方案(避免插件臃肿)。
兼容性:代码需测试是否与主题或其他插件冲突(如缓存插件)。
测试步骤
发布一篇 无特色图 且正文中包含图片的文章。
保存后检查是否自动生成了特色图。
如果失败,检查图片是否为外链 (需允许下载) 或正则匹配是否被主题过滤。
如有其他需求(如提取特定尺寸图片),可进一步调整正则或添加条件。