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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:57:18