WordPress保存/发布文章后重定向至原分页文章列表
解决WordPress编辑文章后重定向回原分页的问题
问题分析
你之前的代码失效主要有两个原因:
- 依赖
$_SERVER['HTTP_REFERER']不可靠:提交保存/发布表单时,请求的来源是编辑页面(post.php),而非最初的文章列表分页页面,所以无法获取到正确的分页URL。 - 钩子时机或判断逻辑错误:第二段代码中
wp_after_insert_post执行时,WordPress已经默认发起重定向,且get_redirect_url里的$_GET['post_type']判断逻辑不成立,导致重定向到错误页面。
可行解决方案
通过会话(Session)存储分页参数的方式实现,步骤如下:
- 启用WordPress会话支持,用于存储分页页码
- 在进入编辑页面时,从来源URL中提取分页参数并存入会话
- 在保存/发布文章后,从会话中取出分页参数,构造正确的重定向URL
以下是完整代码:
// 启用会话支持 add_action('init', function() { if (!session_id()) { session_start(); } }); // 进入编辑页面时,存储来源分页的页码 add_action('load-post.php', function() { $referer = wp_get_referer(); // 检查来源是否是文章列表页面(edit.php)且包含分页参数 if (strpos($referer, 'edit.php') !== false && strpos($referer, 'paged=') !== false) { parse_str(parse_url($referer, PHP_URL_QUERY), $query_vars); if (isset($query_vars['paged'])) { $_SESSION['post_list_paged'] = $query_vars['paged']; // 同时存储文章类型,适配自定义文章类型 $_SESSION['post_list_type'] = isset($query_vars['post_type']) ? $query_vars['post_type'] : 'post'; } } }); // 修改保存后的重定向地址 add_filter('redirect_post_location', function($location) { // 检查会话中是否存储了分页参数,且当前操作的是目标文章类型 if (isset($_SESSION['post_list_paged'], $_SESSION['post_list_type'])) { $post_type = get_post_type(); if ($post_type === $_SESSION['post_list_type']) { // 构造文章列表分页URL $redirect_url = admin_url("edit.php?post_type={$post_type}&paged={$_SESSION['post_list_paged']}"); // 清除会话中的参数,避免后续影响 unset($_SESSION['post_list_paged'], $_SESSION['post_list_type']); return $redirect_url; } } // 默认返回原重定向地址 return $location; });
代码说明
- 会话启用:确保WordPress能使用会话存储临时数据,避免依赖不可靠的
HTTP_REFERER。 - 存储分页参数:在编辑页面加载时,解析来源URL,提取
paged和post_type参数并存入会话,确保只在从文章列表进入编辑时才存储。 - 重定向处理:通过
redirect_post_location过滤器,覆盖默认重定向地址,使用会话中存储的参数构造正确的分页列表URL,完成后清除会话参数避免干扰其他操作。
内容的提问来源于stack exchange,提问作者Ahmad Karimi
相关产品推荐
相关产品推荐

