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); } } ?>
但执行删除后出现以下问题:
- 页面未自动重定向,停留在当前页
- 当前页仅显示一个附件已删除(实际已删除多个)
- 需手动刷新页面才会显示全部删除后的状态
问题根源
- 重定向未生效:
header('Location: ...')后未终止后续代码执行,若页面存在隐性输出(比如空格、换行)会导致重定向失效 - 缓存未清理: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
相关产品推荐
相关产品推荐

