You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将自定义文章类型(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

火山引擎 最新活动