如何将自定义文章类型(CPT)的默认全局编辑链接替换为插件页面链接
解决Gutenberg全屏模式下WP Logo跳转至自定义文章类型默认列表的问题
我明白你的痛点——用WPPB脚手架开发插件,自定义了CPT但不想给它单独菜单,结果Gutenberg全屏模式左上角的WP Logo偏偏跳转到CPT的默认列表页(edit.php?post_type=CPT),而不是你的插件首页。之前试了get_edit_post_link没效果很正常,因为那个过滤器是针对单篇文章的编辑链接,和你现在要改的logo跳转完全是两个场景。
下面给你两个靠谱的解决思路,按需选择:
方法1:直接修改Admin Bar中WP Logo的跳转链接
Gutenberg全屏模式下的左上角Logo属于后台Admin Bar的一部分,我们可以通过admin_bar_menu过滤器精准修改它的跳转目标,仅当编辑你的CPT时生效:
add_action('admin_bar_menu', 'custom_cpt_admin_bar_logo_redirect', 999); function custom_cpt_admin_bar_logo_redirect($wp_admin_bar) { // 获取当前后台屏幕信息 $current_screen = get_current_screen(); // 检查是否处于你的CPT编辑页面 if ($current_screen->base === 'post' && $current_screen->post_type === '你的CPT别名') { // 获取Admin Bar中的"site-name"节点(就是WP Logo对应的节点) $logo_node = $wp_admin_bar->get_node('site-name'); if ($logo_node) { // 将跳转链接替换为你的插件页面 $logo_node->href = admin_url('admin.php?page=myplugin'); // 更新节点信息 $wp_admin_bar->add_node($logo_node); } } }
这个方法的优势是精准,只影响编辑你的CPT时的Logo跳转,不会干扰其他页面的正常逻辑。
方法2:拦截CPT默认列表页的请求并重定向
如果还想防止用户直接访问edit.php?post_type=你的CPT别名(比如通过书签或手动输入),可以用parse_request过滤器拦截这类请求,重定向到你的插件页面:
add_action('parse_request', 'redirect_cpt_default_list_to_plugin'); function redirect_cpt_default_list_to_plugin($wp) { // 检查是否是CPT默认列表的请求 if (isset($wp->query_vars['post_type']) && $wp->query_vars['post_type'] === '你的CPT别名' && $wp->request === 'edit.php') { // 排除有其他参数的情况(比如搜索、筛选、批量操作等,根据你的需求调整) $allowed_params = ['post_type']; $extra_params = array_diff(array_keys($_GET), $allowed_params); if (empty($extra_params)) { // 重定向到插件页面 wp_redirect(admin_url('admin.php?page=myplugin')); exit; } } }
注意:如果你的CPT列表页需要支持筛选、搜索等功能,要调整$allowed_params数组,把这些参数加进去,避免正常操作被拦截。
为什么get_edit_post_link没用?
get_edit_post_link过滤器是用来生成单篇文章的编辑链接(比如post.php?post=123&action=edit),而你遇到的是Logo跳转的列表页链接,属于完全不同的链接生成逻辑,所以这个过滤器自然起不到作用。
内容的提问来源于stack exchange,提问作者Mks




