WordPress媒体文件到期自动删除功能开发求助
回答
首先,既然你已经确认mtp_deletiondate元字段已经正确设置,那问题大概率出在WP_Query的参数配置上——查询媒体文件和自定义元字段时很容易踩几个常见的坑,我整理了对应解决方案:
1. 确保查询目标是媒体文件类型
默认WP_Query会检索post类型内容,如果你没指定post_type为attachment,肯定查不到媒体文件;另外媒体文件的默认状态是inherit而非publish,这点也容易忽略:
$args = array( 'post_type' => 'attachment', // 关键:指定查询媒体附件 'post_status' => 'inherit', // 媒体文件默认状态,必须加上 'posts_per_page' => -1, // 检索所有符合条件的文件 'meta_query' => array( array( 'key' => 'mtp_deletiondate', 'value' => current_time('mysql'), // 用WordPress标准时间格式 'compare' => '<=', // 筛选已过期的文件 'type' => 'DATE' // 指定元字段类型为日期,确保比较逻辑准确 ) ) ); $expired_media = new WP_Query($args); // 测试输出验证结果 if ($expired_media->have_posts()) { while ($expired_media->have_posts()) { $expired_media->the_post(); echo get_the_ID() . ' - 过期日期:' . get_post_meta(get_the_ID(), 'mtp_deletiondate', true) . '<br>'; } wp_reset_postdata(); } else { echo '未找到已过期的媒体文件'; }
2. 确认日期格式完全匹配
WP_Query的日期比较依赖MySQL标准格式(YYYY-MM-DD或YYYY-MM-DD HH:MM:SS),如果你在after_create_entry钩子中存入的是其他格式(比如DD/MM/YYYY),比较逻辑会直接失效。建议钩子中设置日期时统一用标准格式:
// 在Formidable Pro的after_create_entry钩子中设置删除日期 $deletion_date = date('Y-m-d H:i:s', strtotime('+7 days')); // 示例:7天后过期 update_post_meta($attachment_id, 'mtp_deletiondate', $deletion_date);
3. 检查元字段的存储形式
有时候Formidable Pro可能会把元字段存为序列化数组,这种情况下WP_Query的meta_query无法正确匹配。你可以直接查看数据库wp_postmeta表(前缀可能不同),确认mtp_deletiondate的meta_value是纯日期字符串而非序列化内容。如果是数组形式,修改钩子代码为直接存储字符串:
// 错误:存储了数组 // update_post_meta($attachment_id, 'mtp_deletiondate', array('date' => $deletion_date)); // 正确:存储纯字符串 update_post_meta($attachment_id, 'mtp_deletiondate', $deletion_date);
4. 自动删除逻辑的优化建议
如果你的最终目的是访问网站时自动清理过期文件,没必要在自定义页面测试后手动处理,可以把删除逻辑加到init钩子中,再加上缓存机制避免频繁查询数据库:
add_action('init', 'auto_delete_expired_media'); function auto_delete_expired_media() { // 每小时仅执行一次,降低性能消耗 if (get_transient('mtp_media_deletion_lock') === false) { $args = array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'mtp_deletiondate', 'value' => current_time('mysql'), 'compare' => '<=', 'type' => 'DATE' ) ) ); $expired_media = new WP_Query($args); if ($expired_media->have_posts()) { while ($expired_media->have_posts()) { $expired_media->the_post(); // 彻底删除媒体文件(含数据库记录和服务器文件) wp_delete_attachment(get_the_ID(), true); } wp_reset_postdata(); } // 设置1小时的执行锁 set_transient('mtp_media_deletion_lock', 'executed', 3600); } }
如果你的问题不在上述情况里,可以补充具体的错误现象(比如WP_Query返回空结果、检索到错误文件等),我再帮你进一步排查!
内容的提问来源于stack exchange,提问作者Ultra Graphics
相关产品推荐
相关产品推荐

