如何在WordPress插件中用PHP自动移动文件并仅展示最新24张图片?
两种不用改原插件的解决方案,轻松实现只显示最新24张图片
嘿,别慌!虽然你完全不懂PHP,但我会把方案拆得明明白白,代码都是直接能用的那种,照着做就行~
方案一:按日期自动归档前一天的图片(适合每日新增的场景)
这个思路和你想的一致:每天凌晨把前一天及更早的图片移到归档文件夹,这样原文件夹里永远只有当天的图片(只要你每天新增的数量不超过24张就行)。
具体步骤&代码:
确定文件夹路径:
咱用WordPress自带函数获取路径,避免硬写路径出问题。比如原图片文件夹是wp-content/uploads/carousel-images/,归档文件夹是wp-content/uploads/carousel-archives/。复制代码到主题的
functions.php或做成小插件:
// 定义图片文件夹和归档文件夹路径 function get_carousel_paths() { $upload_dir = wp_upload_dir(); $carousel_dir = $upload_dir['basedir'] . '/carousel-images/'; $archive_dir = $upload_dir['basedir'] . '/carousel-archives/'; // 如果归档文件夹不存在,自动创建 if (!file_exists($archive_dir)) { mkdir($archive_dir, 0755, true); } return array('carousel' => $carousel_dir, 'archive' => $archive_dir); } // 移动前一天的图片到归档文件夹 function move_old_carousel_images() { $paths = get_carousel_paths(); $carousel_dir = $paths['carousel']; $archive_dir = $paths['archive']; // 只处理指定图片格式(可按需添加其他格式) $allowed_extensions = array('jpg', 'jpeg', 'png', 'gif'); // 获取前一天零点的时间戳 $yesterday = strtotime('yesterday midnight'); // 遍历原文件夹内的文件 if ($handle = opendir($carousel_dir)) { while (false !== ($file = readdir($handle))) { // 跳过系统默认的.和..文件夹 if ($file == '.' || $file == '..') continue; // 过滤非图片文件 $file_ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (!in_array($file_ext, $allowed_extensions)) continue; // 获取文件修改时间(如果文件名带时间戳,可改用文件名解析,后面会说) $file_time = filemtime($carousel_dir . $file); // 移动前一天及更早的文件 if ($file_time <= $yesterday) { $source = $carousel_dir . $file; $destination = $archive_dir . $file; // 若目标文件已存在,自动重命名避免冲突 if (file_exists($destination)) { $destination = $archive_dir . time() . '_' . $file; } rename($source, $destination); } } closedir($handle); } } // 设置WordPress定时任务,每天凌晨1点执行归档 function setup_carousel_cron() { if (!wp_next_scheduled('move_old_carousel_images_hook')) { wp_schedule_event(strtotime('1:00 am'), 'daily', 'move_old_carousel_images_hook'); } } add_action('wp', 'setup_carousel_cron'); add_action('move_old_carousel_images_hook', 'move_old_carousel_images');
- 如果想用文件名的时间戳判断(更准确):
假设你的文件名是20240520123456.jpg这种带时间戳的格式,把上面代码里的$file_time = filemtime(...)替换成:
// 从文件名提取时间戳(假设前14位是年月日时分秒) $file_timestamp_str = substr($file, 0, 14); $file_time = strtotime($file_timestamp_str);
- 测试效果:
你可以手动触发一次验证:在WordPress后台随便找个页面临时加一行move_old_carousel_images();,刷新页面后删掉即可;也可以用WP Crontrol这类插件手动执行定时任务。
方案二:保留最新24张,移走其余图片(不限制日期,只看数量)
如果你的图片新增不规律(比如某天传30张,某天传10张),这个方案更合适:不管日期,只留最新的24张,剩下的全部移去归档。
具体步骤&代码:
同样把代码加到主题functions.php或小插件里(如果已经加了方案一的get_carousel_paths函数,可跳过重复部分):
// 定义路径(若已添加方案一代码,可省略此函数) function get_carousel_paths() { $upload_dir = wp_upload_dir(); $carousel_dir = $upload_dir['basedir'] . '/carousel-images/'; $archive_dir = $upload_dir['basedir'] . '/carousel-archives/'; if (!file_exists($archive_dir)) { mkdir($archive_dir, 0755, true); } return array('carousel' => $carousel_dir, 'archive' => $archive_dir); } // 保留最新24张图片,其余移到归档 function keep_latest_carousel_images() { $paths = get_carousel_paths(); $carousel_dir = $paths['carousel']; $archive_dir = $paths['archive']; $allowed_extensions = array('jpg', 'jpeg', 'png', 'gif'); $keep_count = 24; // 要保留的图片数量 $files = array(); // 遍历文件夹,收集所有图片文件 if ($handle = opendir($carousel_dir)) { while (false !== ($file = readdir($handle))) { if ($file == '.' || $file == '..') continue; $file_ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (!in_array($file_ext, $allowed_extensions)) continue; // 获取文件修改时间(也可改用文件名时间戳,参考方案一) $file_time = filemtime($carousel_dir . $file); $files[] = array('name' => $file, 'time' => $file_time); } closedir($handle); } // 按时间倒序排序,最新的排在前面 usort($files, function($a, $b) { return $b['time'] - $a['time']; }); // 移动超出数量的旧文件 if (count($files) > $keep_count) { $files_to_move = array_slice($files, $keep_count); foreach ($files_to_move as $file_data) { $source = $carousel_dir . $file_data['name']; $destination = $archive_dir . $file_data['name']; if (file_exists($destination)) { $destination = $archive_dir . time() . '_' . $file_data['name']; } rename($source, $destination); } } } // 设置定时任务,每小时执行一次(可按需改成daily) function setup_latest_carousel_cron() { if (!wp_next_scheduled('keep_latest_carousel_images_hook')) { wp_schedule_event(time(), 'hourly', 'keep_latest_carousel_images_hook'); } } add_action('wp', 'setup_latest_carousel_cron'); add_action('keep_latest_carousel_images_hook', 'keep_latest_carousel_images');
几个重要小提醒:
- 权限问题:确保服务器给
wp-content/uploads/文件夹分配了读写权限,否则PHP无法移动文件。 - 定时任务触发:WordPress的Cron依赖网站访问触发,如果网站访问量极低,可能会延迟执行。这种情况可以改用服务器自带的Cron(比如Linux的crontab)直接触发脚本。
- 备份优先:第一次使用前,务必备份原文件夹的所有图片,避免意外丢失。
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

