下方内容来源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^]。
正文完