You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:51:56