worldpress 上传图片时直接替换同名文件

17次阅读

下方内容来源ai,已经测试可以直接使用第一种方式!!!

Kimi: 要实现新上传的图片等文件直接覆盖原来的媒体 ID 和文件,可以通过 WordPress 的钩子系统来实现,而不是直接修改 media_handle_upload 函数。以下是具体实现方法:

使用 wp_handle_upload_prefilter 过滤器

wp_handle_upload_prefilter 是一个过滤器钩子,它在文件上传之前被触发,可以用来修改文件名等信息[^1^]。但这个钩子主要用于修改文件名,而不是直接覆盖原有的媒体 ID 和文件。

使用 sanitize_file_name 过滤器

可以通过 sanitize_file_name 过滤器删除同名的旧文件,从而实现覆盖的效果[^1^]。将以下代码添加到你的主题的 functions.php 文件中:

add_filter('sanitize_file_name', 'filename_filter_wpse_28439', 10, 1);

function filename_filter_wpse_28439($name) {
    $args = array(
        'numberposts'   => -1,
        'post_type'     => 'attachment',
        'meta_query' => array(
            array(
                'key'     => '_wp_attached_file',
                'value'   => $name,
                'compare' => 'LIKE'
            )
        )
    );
    $attachments_to_remove = get_posts($args);

    foreach ($attachments_to_remove as $attach) {
        wp_delete_attachment($attach->ID, true);
    }

    return $name;
}

这段代码会在上传文件时检查是否存在同名文件,如果存在,则删除旧的附件,从而实现覆盖的效果[^1^]。

使用 wp_generate_attachment_metadata 动作钩子

wp_generate_attachment_metadata 是一个动作钩子,它在生成附件元数据时被触发[^4^]。可以利用这个钩子来覆盖原有的媒体 ID 和文件。将以下代码添加到你的主题的 functions.php 文件中:

add_action('wp_generate_attachment_metadata', 'custom_replace_attachment', 10, 2);

function custom_replace_attachment($metadata, $attachment_id) {
    // 获取新上传的文件路径
    $new_file_path = get_attached_file($attachment_id);

    // 获取旧文件的附件 ID 和路径
    $old_attachment_id = get_post_meta($attachment_id, '_old_attachment_id', true);
    if ($old_attachment_id) {
        $old_file_path = get_attached_file($old_attachment_id);

        // 删除旧文件
        if (file_exists($old_file_path)) {
            unlink($old_file_path);
        }

        // 更新旧附件的文件路径为新文件路径
        update_attached_file($old_attachment_id, $new_file_path);

        // 删除新附件
        wp_delete_attachment($attachment_id, true);
    }

    return $metadata;
}

注意事项

  • 在使用上述方法时,请确保备份你的网站数据,以防出现问题[^1^]。
  • 修改 WordPress 核心文件会导致在升级 WordPress 时丢失自定义更改,因此建议使用过滤器或钩子来实现自定义功能[^1^]。

正文完
 0