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

WordPress附件删除后页面未自动重定向刷新问题求助

问题与修复方案

问题场景

页面通过$posturl = $_GET['posturl'];获取目标跳转URL,表单可正常展示文章的图片/视频附件及对应删除复选框,代码如下:

<form action="" method="post">
    <?php
        $attachments = get_posts(array( 
            'post_type' => 'attachment',
            'numberposts' => -1,
            'post_status' =>'any',
            'post_parent' => $_GET['post_id']
        ));
        if ($attachments) {
            foreach ( $attachments as $attachment ) {
                $myNewImg = wp_get_attachment_url( $attachment->ID );
                $pathtofile = $myNewImg;
                $info = pathinfo($pathtofile);
                if ( ($info["extension"] == "jpg") || ($info["extension"] == "png")  || ($info["extension"] == "JPG")  || ($info["extension"] == "jpeg")  || ($info["extension"] == "gif") ) { ?>
                    <img src="<?php echo $myNewImg; ?>" class="bnr_img img-fluid mx-auto d-block" alt="">
                    <input type="checkbox" class="img_delete" name="img_delete[]" value="<?php echo $attachment->ID; ?>">
                <?php } else { ?>
                    <video src="<?php echo $myNewImg; ?>" controls></video>
                    <input type="checkbox" class="img_delete" name="img_delete[]" value="<?php echo $attachment->ID; ?>">
                <?php }
            }
        }
    ?>
    <input class="btn btn-dark" type="submit" name="delete_media" value="Delete media">
</form>

删除请求处理代码如下:

<?php
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        if (isset($_POST['delete_media'])) {
            foreach($_POST['img_delete'] as $value) {
                wp_delete_attachment( $value, true);
            } 
            header('Location: '.$posturl);
        }
    }
?>

但执行删除后出现以下问题:

  • 页面未自动重定向,停留在当前页
  • 当前页仅显示一个附件已删除(实际已删除多个)
  • 需手动刷新页面才会显示全部删除后的状态

问题根源

  1. 重定向未生效:header('Location: ...')后未终止后续代码执行,若页面存在隐性输出(比如空格、换行)会导致重定向失效
  2. 缓存未清理:WordPress会缓存文章及附件数据,删除附件后未清理缓存,导致当前页面加载时仍读取旧数据

修复步骤

1. 确保重定向生效并终止输出

修改删除处理代码,在header()后添加exit;,同时用esc_url()对$posturl做安全转义,避免XSS风险:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['delete_media'])) {
        // 遍历删除选中的附件
        foreach($_POST['img_delete'] as $value) {
            wp_delete_attachment( intval($value), true);
        } 
        // 清理父文章的缓存,确保跳转后加载最新数据
        clean_post_cache( intval($_GET['post_id']) );
        // 安全重定向并终止所有输出
        header('Location: ' . esc_url($posturl));
        exit;
    }
}
?>

2. 优化附件查询的安全性

对$_GET['post_id']做类型转换,避免SQL注入风险:

$attachments = get_posts(array( 
    'post_type' => 'attachment',
    'numberposts' => -1,
    'post_status' =>'any',
    'post_parent' => intval($_GET['post_id'])
));

效果验证

修改后执行删除操作,页面会自动重定向到$posturl对应的页面,且目标页面会直接显示所有附件已删除的最新状态,无需手动刷新。

内容的提问来源于stack exchange,提问作者rob.m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:25:19