wordpress提取正文中的第一张图片自动设置为特色图

223次阅读
没有评论

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

wordpress 提取正文中的第一张图片自动设置为特色图

WordPress 中自动提取正文第一张图片并设置为特色图(特色图像),可以通过代码片段或插件实现。以下是两种主流方法:

方法 1:纯代码方式实现(推荐)

将以下代码添加到主题的 functions.php 文件中(或通过代码片段插件如 Code Snippets 添加):

简化版

</p>
<p>// 自动将文章第一张图片设为特色图片 <br />
function auto_set_featured_image() {<br />
global $post;<br />
<br />
// 仅在文章类型为 post 且未设置特色图片时执行 <br />
if (&#8216;post&#8217; == get_post_type( $post) &amp;&amp; !has_post_thumbnail($post-&gt;ID) ) {<br />
// 从文章内容中提取图片 <br />
$first_image = &#8221;;<br />
ob_start();<br />
ob_end_clean();<br />
<br />
// 使用正则表达式查找文章中的第一张图片 <br />
preg_match_all(&#8216;/&lt;img.+src=[\'&#8221;]([^\'&#8221;]+)[\'&#8221;].*&gt;/i&#8217;, $post-&gt;post_content, $matches );<br />
<br />
if (!empty( $matches[1] ) ) {<br />
$first_image = $matches[1][0];<br />
<br />
// 尝试获取图片的附件 ID<br />
$attachment_id = attachment_url_to_postid($first_image);<br />
<br />
// 如果找到了附件 ID,设置为特色图片 <br />
if ($attachment_id) {<br />
set_post_thumbnail($post-&gt;ID, $attachment_id);<br />
} else {<br />
// 如果图片不是媒体库中的附件,尝试导入 <br />
require_once(ABSPATH . &#8216;wp-admin/includes/media.php&#8217;);<br />
require_once(ABSPATH . &#8216;wp-admin/includes/file.php&#8217;);<br />
require_once(ABSPATH . &#8216;wp-admin/includes/image.php&#8217;);<br />
<br />
// 下载图片并添加到媒体库 <br />
$attachment_id = media_sideload_image($first_image, $post-&gt;ID, $post-&gt;post_title, &#8216;id&#8217;);<br />
<br />
// 如果导入成功,设置为特色图片 <br />
if (!is_wp_error( $attachment_id) ) {<br />
set_post_thumbnail($post-&gt;ID, $attachment_id);<br />
}<br />
}<br />
}<br />
}<br />
}<br />
// 在文章保存时执行 <br />
add_action(&#8216;save_post&#8217;, &#8216;auto_set_featured_image&#8217;);</p>
<p>// 确保在文章发布时也执行 <br />
add_action(&#8216;publish_post&#8217;, &#8216;auto_set_featured_image&#8217;);</p>
<p>&nbsp;</p>
<p>

优化版:

</p>
<p>// 自动将文章第一张图片设为特色图片(优化版)<br />
function auto_set_featured_image($post_id) {<br />
// 防止保存修订版本时执行 <br />
if (wp_is_post_revision( $post_id) ) {<br />
return;<br />
}<br />
<br />
// 获取文章对象 <br />
$post = get_post($post_id);<br />
<br />
// 仅在文章类型为 post 时执行 <br />
if (&#8216;post&#8217; != get_post_type( $post) ) {<br />
return;<br />
}<br />
<br />
// 如果已经设置了特色图片,则跳过处理 <br />
if (has_post_thumbnail( $post_id) ) {<br />
// 可以在这里添加日志,记录已跳过处理的文章 <br />
// error_log(&#8220; 已跳过处理已设置特色图片的文章: {$post_id}&#8221; );<br />
return;<br />
}<br />
<br />
// 从文章内容中提取图片 <br />
$first_image = &#8221;;<br />
<br />
// 使用正则表达式查找文章中的第一张图片 <br />
preg_match_all(&#8216;/&lt;img.+src=[\'&#8221;]([^\'&#8221;]+)[\'&#8221;].*&gt;/i&#8217;, $post-&gt;post_content, $matches );<br />
<br />
if (!empty( $matches[1] ) ) {<br />
$first_image = $matches[1][0];<br />
<br />
// 尝试获取图片的附件 ID<br />
$attachment_id = attachment_url_to_postid($first_image);<br />
<br />
// 如果找到了附件 ID,设置为特色图片 <br />
if ($attachment_id) {<br />
// 关闭钩子防止无限循环 <br />
remove_action(&#8216;save_post&#8217;, &#8216;auto_set_featured_image&#8217;);<br />
set_post_thumbnail($post_id, $attachment_id);<br />
add_action(&#8216;save_post&#8217;, &#8216;auto_set_featured_image&#8217;);<br />
} else {<br />
// 如果图片不是媒体库中的附件,尝试导入 <br />
require_once(ABSPATH . &#8216;wp-admin/includes/media.php&#8217;);<br />
require_once(ABSPATH . &#8216;wp-admin/includes/file.php&#8217;);<br />
require_once(ABSPATH . &#8216;wp-admin/includes/image.php&#8217;);<br />
<br />
// 下载图片并添加到媒体库 <br />
$attachment_id = media_sideload_image($first_image, $post_id, $post-&gt;post_title, &#8216;id&#8217;);<br />
<br />
// 如果导入成功,设置为特色图片 <br />
if (!is_wp_error( $attachment_id) ) {<br />
// 关闭钩子防止无限循环 <br />
remove_action(&#8216;save_post&#8217;, &#8216;auto_set_featured_image&#8217;);<br />
set_post_thumbnail($post_id, $attachment_id);<br />
add_action(&#8216;save_post&#8217;, &#8216;auto_set_featured_image&#8217;);<br />
} else {<br />
// 记录错误日志 <br />
error_log(&#8220; 导入图片失败 (文章 ID: {$post_id}): &#8221; . $attachment_id-&gt;get_error_message());<br />
}<br />
}<br />
}<br />
}</p>
<p>// 在文章保存时执行,优先级设为较高的值 (20) 确保在其他保存操作之后执行 <br />
add_action(&#8216;save_post&#8217;, &#8216;auto_set_featured_image&#8217;, 20, 1);</p>
<p>

代码说明:

条件检查:仅当文章没有特色图时才生效。

正则匹配:通过正则提取正文中的第一个 <img> 标签的 src。

媒体库处理:

如果图片已存在于媒体库,直接关联。

如果图片是外链,先下载到媒体库,再设为特色图。

触发时机:在文章保存时 (save_post 钩子) 执行。

方法 2:插件实现(简单快捷)

如果不想写代码,可以使用以下插件:

Quick Featured Images

免费插件,支持批量设置第一张图片为特色图。

Auto Featured Image

自动扫描正文中的第一张图片并设为特色图。

这两个插件到 wordpress 官方的插件库下载就可以

注意事项

图片版权:确保正文中的图片有合法使用权。

性能优化:如果文章量大,建议用代码方案(避免插件臃肿)。

兼容性:代码需测试是否与主题或其他插件冲突(如缓存插件)。

测试步骤

发布一篇 无特色图 且正文中包含图片的文章。

保存后检查是否自动生成了特色图。

如果失败,检查图片是否为外链 (需允许下载) 或正则匹配是否被主题过滤。

如有其他需求(如提取特定尺寸图片),可进一步调整正则或添加条件。

正文完
 0
蓝猫の鱼
版权声明:本站原创文章,由 蓝猫の鱼 于2025-08-06发表,共计3070字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码