WordPress后台删除文章时,文章里用到的那些上传到媒体库的图片等附件是不会同步删除的,既占用了网站空间,又不利于内容管理。
如果我们不需要以往的图片文件了。就可通过以下方法删除文章的同时将这篇文章中包含的图片附件缩略图一并删除,这样可以节省空间。
将代码添加到当前主题的functions.php文件中即可。推荐你使用WordPress代码片段插件 WPCode搭配使用,更加的方便管理。
/* 删除文章时删除图片附件 */
function delete_post_and_attachments($post_ID) {
global $wpdb;
//删除特色图片
$thumbnails = $wpdb->get_results( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id' AND post_id = $post_ID" );
if (!empty($thumbnails)) {
foreach ( $thumbnails as $thumbnail ) {
wp_delete_attachment( $thumbnail->meta_value, true );
}
}
//删除图片附件
$attachments = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE post_parent = $post_ID AND post_type = 'attachment'" );
if (!empty($attachments)) {
foreach ( $attachments as $attachment ) {
wp_delete_attachment( $attachment->ID, true );
}
}
}
add_action('before_delete_post', 'delete_post_and_attachments');
/* 删除文章时删除图片附件 over */
其原理是在删除文章时先执行函数内容:首先获取特色图片的ID,并使用wp_delete_attachment函数将其删除。然后,它获取与文章关联的所有附件ID,并将它们也删除。
add_action函数将delete_post_and_attachments函数挂接到before_delete_post动作上,确保在删除文章之前先删除附件。
删除特色图片以及图片附件,如果在使用action delete_post
而不是before_delete_post
将导致删除文章后因媒体附件与文章关联已取消而无法正确删除。
如果你的代码是在一个多用户的环境中运行,例如一个博客或者新闻网站,下面的代码可以检测登录用户是否有删除文章的权限等操作,你可以考虑使用下面的代码,它可以防止没有权限的用户删除文章。
如果你的代码只是在一个单用户的环境中运行,例如一个个人博客,那么这个检查可能就不那么重要了。因为在这种情况下,只有一个用户(即博客的所有者)可以登录和管理网站,而管理员应该有权删除任何文章。
/* 删除文章时删除图片附件 */
function delete_post_and_attachments($post_ID) {
if (current_user_can('delete_posts')) { // 进行权限检查
global $wpdb;
// 删除特色图片
$thumbnails = $wpdb->get_results($wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id' AND post_id = %d", $post_ID)); // 使用参数化处理SQL语句
if (!empty($thumbnails)) {
foreach ($thumbnails as $thumbnail) {
wp_delete_attachment($thumbnail->meta_value, true);
}
}
// 删除图片附件
$attachments = $wpdb->get_results($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'attachment'", $post_ID)); // 使用参数化处理SQL语句
if (!empty($attachments)) {
foreach ($attachments as $attachment) {
wp_delete_attachment($attachment->ID, true);
}
}
// 记录日志
error_log('Deleted attachments for post ID: ' . $post_ID);
} else {
// 处理权限不足的情况
wp_die('You do not have permission to delete posts.');
}
}
add_action('before_delete_post', 'delete_post_and_attachments');
/* 删除文章时删除图片附件 over */
不过你要注意的是这个函数只会删除掉文章里面引用的图片,如果你的图片在WordPress数据库中没有被文章引用。是无法删除的。这样描述可能不太好理解的,看图吧:
就是你的图片需要在媒体库中上传至这一列能够显示处在那篇文章的,你在删除文章的时候才会跟着删除
我发现如果是单独上到媒体库,然后手动添加到文章的这类图片,在上传至这一列是没有数据的…也无法一起删除。如果是在文章编辑页面直接上传的,则会存在引用信息,可以一起删除。