WordPress 媒体库管理着所有需要使用到的媒体文件,其中使用最多的就属图片,但经历日积月累的长期使用和删除更新等操作后,就可能造成大量未使用的图片,加上 WordPress 本身会自动裁切多种图片尺寸,再有许多的主题插件也可能会生成不同的尺寸,这就造成了不必要的服务器空间暂用。所以子凡今天给大家分享一个能够避免误删的 WordPress 未使用图片清理功能,以及将使用的图片进行自动入库操作。

最近因为在线调试 WordPress 数据库 ID 的回收功能,造成了最近几天的 WordPress 媒体库图片插入的元数据丢失,导致部分图片的重复上传而无法被删除,所以就有些混乱。作为一个资深的开发和编辑,我肯定是不可能手动的去删除和重新上传匹配,那么最直接的就是将所有的图片遍历查询和重新入库匹配,顺便再将所有未使用的图片进行清理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <?php // WordPress 图片清理 require('./wp-load.php'); global $wpdb; // 指定年月 $year = "2024/09"; // 修改为你想要的年份/月份 // 获取上传目录 $upload_dir = wp_upload_dir(); $year_dir = $upload_dir['basedir'] . '/' . $year; // 检查目录是否存在 if (is_dir($year_dir)) { $urls = []; $images = glob($year_dir . '/*.{jpg,jpeg,png,gif}', GLOB_BRACE);// 获取目的所有图片 foreach ($images as $image_path) { $file_url = str_replace($upload_dir['basedir'] , $upload_dir['baseurl'], $image_path); $exists = $wpdb->get_var( $wpdb->prepare("SELECT EXISTS(SELECT 1 FROM {$wpdb->posts} WHERE guid = %s AND post_type = 'attachment')", $file_url) ); if ($exists == 0) {// 未入库的图片 $urls[] = $file_url; } } //print_r($urls); if(!empty($urls)){ $dels = []; foreach ($urls as $url) { $path = str_replace($upload_dir['baseurl'] , $upload_dir['basedir'], $url); $ID = $wpdb->get_var( $wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_content LIKE %s AND post_type = 'post'", '%'.$wpdb->esc_like($url).'%') ); if ($ID) {// 被使用的图片重新入库 // 获取文件名和文件类型 $filename = basename($path); $filetype = wp_check_filetype($filename, null); // 插入到 posts 表 $attachment = array( 'guid' => $url, 'post_mime_type' => $filetype['type'], 'post_title' => str_replace('-', ' ', preg_replace( '/(-d+)?.[^.]+$/', '', basename( $filename ) )), 'post_content' => '', 'post_status' => 'inherit', 'post_type' => 'attachment', ); $media_id = wp_insert_attachment($attachment, $path, $ID); update_attached_file( $media_id, str_replace($upload_dir['baseurl'].'/','',$url) ); // 生成附件的元数据 require_once(ABSPATH . 'wp-admin/includes/image.php'); $file_path = get_attached_file($media_id); wp_generate_attachment_metadata( $media_id, $file_path ); echo "成功导入图片:$media_id / $urln"; }else{//删除未使用的图片 $dels[] = $url; @unlink($path); } } echo "nn"; print_r($dels); } } else { echo "目录不存在:{$year_dir}"; } |
这是一段 PHP 代码,在 WordPress 根目录创建一个任意命名的.php 文件,将以上 php 代码全部复制粘贴过去,修改代码中的“年月”位置,使其为自己当前图片的保存目录结构,通过域名前端访问这个文件即可。之所以采用年月的结构是子凡我所有网站都是采用这样结构来保存图片,便于管理维护,这样在处理的时候也避免图片过多而超时。
代码中子凡我以及竟可能的写明注释,虽然可以直接使用,但主要也是给 WordPress 开发的一些朋友提供一些思路和解决办法,当然也是给这些功能留个备份在泪雪博客上,也便于我自己后期的使用查看。
更多关于WordPress优化及疑问可以添加QQ群:255308000
除非注明,否则均为泪雪博客原创文章,禁止任何形式转载













川公网安备 51062302000103号