如何在WordPress前端使用PHP删除媒体库文件
如何通过前端PHP代码删除WordPress媒体库文件?
我正在开发一个文件管理系统,管理员无法访问WordPress后台,只能通过带HTML表单的密码保护页面使用PHP代码管理文件。目前已实现让用户输入文件名,删除自定义files数据库表中的记录以及wp-content/uploads文件夹内的文件,但无法同步删除WordPress后台媒体库中的对应文件。现有代码如下:
<html> <body> Name of file to delete: <form method="post"> <input type=text name="t1"> <br> <br> <input type=submit name="submission" value="Delete File"> <?php if(isset($_POST['submission'])){ $db = new wpdb('username','password','database','localhost'); $entry = $_POST['t1']; //accessing value from the text field $found = "SELECT * FROM files WHERE name = \"$entry\";"; $result = $table->query($found); if($result != 0){ $delete_file = "DELETE FROM files WHERE name=(\"$entry\");"; $file_path = get_wordpress_uploads_directory_path().$entry; $eq_files->query($delete_file); wp_delete_file( $file_path ); echo "The file deleted is: ".$entry; //displaying result } else{ echo "Error. This file does currently not exist in the database."; } } ?> </form> </body> </html>
解决方案
WordPress的媒体库文件是以attachment类型的文章存储在wp_posts表中,同时在wp_postmeta表中保存文件路径等元数据。要删除媒体库中的记录,需要先找到该文件对应的附件ID,再通过WordPress内置函数完成删除:
- 第一步:通过
wp_postmeta表的_wp_attached_file字段(存储文件相对路径)匹配文件名,查询对应的附件ID; - 第二步:使用
wp_delete_post()函数永久删除附件,该函数会自动清理媒体库的相关数据库记录。
修改后的完整代码
<html> <body> 要删除的文件名: <form method="post"> <input type="text" name="t1"> <br> <br> <input type="submit" name="submission" value="删除文件"> <?php if(isset($_POST['submission'])){ // 加载WordPress核心环境,确保能调用内置函数 require_once($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php'); global $wpdb; $entry = sanitize_text_field($_POST['t1']); // 安全处理用户输入 // 检查自定义files表中是否存在目标文件 $found = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM files WHERE name = %s;", $entry)); if($found > 0){ // 删除自定义表中的记录 $wpdb->query($wpdb->prepare("DELETE FROM files WHERE name = %s;", $entry)); // 获取uploads目录的绝对路径 $uploads = wp_get_upload_dir(); $file_path = $uploads['path'] . '/' . $entry; // 删除服务器上的文件 if(file_exists($file_path)){ wp_delete_file($file_path); } // 查询媒体库中对应文件的附件ID $attachment_id = $wpdb->get_var($wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_wp_attached_file' AND meta_value LIKE %s;", '%' . $wpdb->esc_like($entry) . '%' )); // 永久删除媒体库中的附件记录 if($attachment_id){ wp_delete_post($attachment_id, true); } echo "已删除文件:".$entry; } else{ echo "错误:该文件不存在于数据库中。"; } } ?> </form> </body> </html>
关键注意点
- 安全防护:用
sanitize_text_field()过滤用户输入,$wpdb->prepare()防止SQL注入; - 环境依赖:必须加载
wp-load.php才能调用WordPress的内置函数,路径需根据站点实际结构调整; - 路径匹配:媒体库文件的路径可能包含年月子目录(如
2024/05/xxx.jpg),所以用LIKE模糊匹配确保能找到对应记录。
内容的提问来源于stack exchange,提问作者astinne
相关产品推荐
相关产品推荐

