WordPress:点击删除页面快捷按钮后重定向用户
问题分析与修复方案
你的代码核心问题是用错了wp_redirect过滤器的参数——这个钩子的第二个参数是HTTP重定向状态码,不是$post_id,所以你函数里的$post_id是未定义的无效值,导致条件判断完全不生效,自然不会触发重定向。
另外,判断get_post_status($post_id) === 'trash'的时机也不对:当用户点击删除链接触发跳转时,页面还没被移入回收站,此时状态还是publish或其他原始状态,这个条件永远不成立。
修正后的代码
我们改用WordPress专门处理文章/页面操作跳转的redirect_post_location过滤器,它的参数包含正确的$post_id,且触发时机刚好是操作完成后准备跳转的节点:
function custom_admin_bar_delete_link( $wp_admin_bar ) { global $post; if( is_admin() || ! is_object( $post ) ) return; if ( ! current_user_can( 'delete_pages' ) ) return; if ( $post->post_type != 'page' ) return; $args = array( 'id' => 'delete_link', 'title' => 'Delete this page', 'href' => get_delete_post_link( $post->ID ), 'meta' => array( 'class' => 'delete-link' ) ); $wp_admin_bar->add_node( $args ); } add_action( 'admin_bar_menu', 'custom_admin_bar_delete_link', 999 ); // 替换原有的重定向函数 function custom_page_delete_redirect( $location, $post_id ) { $post = get_post( $post_id ); // 检查当前操作是删除页面(移到回收站) if ( 'page' === $post->post_type && isset( $_GET['action'] ) && 'trash' === $_GET['action'] ) { // 重定向到页面列表页(即「My Pages」页面) return admin_url( 'edit.php?post_type=page' ); } // 处理永久删除页面的场景 if ( 'page' === $post->post_type && isset( $_GET['action'] ) && 'delete' === $_GET['action'] && isset( $_GET['force'] ) && $_GET['force'] === '1' ) { return admin_url( 'edit.php?post_type=page' ); } return $location; } add_filter( 'redirect_post_location', 'custom_page_delete_redirect', 10, 2 );
关键说明
redirect_post_location钩子:专门用于修改文章、页面在编辑、删除、更新等操作后的跳转地址,参数$location是默认跳转地址,$post_id是当前操作的文章/页面ID,完全匹配需求场景。- 操作类型判断:通过
$_GET['action']区分「移到回收站」和「永久删除」两种操作,确保所有删除场景都能重定向到目标页面。 - 兼容性:保留了原有的admin bar按钮逻辑,只修改重定向部分,不影响原有功能。
内容的提问来源于stack exchange,提问作者Şenol Üstün
相关产品推荐
相关产品推荐

