【问题标题】:How to manually set a custom admin submenu selected?如何手动设置选择的自定义管理子菜单?
【发布时间】:2016-08-02 06:43:19
【问题描述】:

我正在开发我的第一个 Wordpress 插件。 假设它有以下管理页面:

  • 常规设置
  • 添加新供应商
  • 供应商
  • 编辑供应商

我不想从中显示菜单中的编辑供应商,并希望使用供应商页面中的链接使其可访问。我的菜单和 供应商 页面是:

生成菜单的代码:

function nes_general_settings_view () { 
    require_once("views/admin/general_settings.php");
}

function nes_vendor_view () { 
    require_once("views/admin/vendor.php");
}

function nes_vendor_new_view () {
    require_once("views/admin/vendor_new.php");
}

function nes_vendor_edit_view () {

    require_once("views/admin/vendor_edit.php");
}

add_action("admin_menu", function () {
    add_menu_page(
        "Service",  
        "Service",  
        "manage_options",            
        "nes_general_settings",      
        "nes_general_settings_view", 
        null,                        
        4                            
    );

    add_submenu_page( "nes_general_settings", "General Settings", "General Settings", 0, "nes_general_settings", "nes_general_settings_view");      
    add_submenu_page( "nes_general_settings", "Vendors", "Vendors", 0, "nes_vendor", "nes_vendor_view");
    add_submenu_page( "nes_general_settings", "New Vendor", "New Vendor", 0, "nes_vendor_new", "nes_vendor_new_view");
    add_submenu_page( "nes_fake_id", "Edit Vendor", "Edit Vendor", 0, "nes_vendor_edit", "nes_vendor_edit_view");       
});

以及生成编辑供应商页面链接的代码:

<a href="<?=admin_url("admin.php?page=nes_vendor_edit")?>">Edit</a>

但是当我在 Edit Vendor 页面时,我的菜单没有被选中。

如何设置 服务>供应商子菜单被选中,当我在编辑供应商时?

【问题讨论】:

标签: wordpress


【解决方案1】:

如果您的子菜单是自定义帖子类型,您可以通过将“show_in_menu”的自定义帖子类型参数设置为您定义的 slug 轻松地将它们定义为自定义菜单的子菜单项创建您的自定义帖子类型。这样做将保留默认菜单打开/关闭并突出显示管理菜单中的当前子菜单项。

例如:

/* ————————————————————————— */
/* Content Types Menu Item
/* ————————————————————————— */

add_menu_page(
    'Content Types',
    'Content Types',
    'manage_options',
    'custom-content', // menu slug
    'ds_create_new_submenu',
    'dashicons-editor-table',
    null
);

然后在您的自定义帖子类型参数中定义 show_in_menu 以匹配菜单 slug。

$args = array(
    'labels'                => $labels,
    'menu_icon'             => 'dashicons-format-status',
    'capability_type'       => 'manage_options',
    'show_in_menu'          => 'custom-content'
);

为简单起见缩短了代码示例

【讨论】:

    【解决方案2】:

    这必须用 jQuery 将add the proper classes 发送到管理菜单。

    使用以下内容打印脚本:

    # Grab the slug to print only in this screen
    $hook = add_submenu_page( 
        null, # better than fake id
        "Edit Vendor", 
        "Edit Vendor", 
        'manage_options', # IMPORTANT, don't use levels (0-9), they're deprecated
        "nes_vendor_edit", 
        function() {
            echo '<h1>nes_vendor_edit_view</h1>';
        }
    );
    
    add_action( "admin_footer-$hook", function()
    {
        # http://stackoverflow.com/questions/5673269/what-is-the-advantage-of-using-heredoc-in-php
        echo <<<HTML
            <script type="text/javascript">
            jQuery(document).ready( function($) {
                $('#toplevel_page_nes_general_settings')
                    .addClass('current wp-has-current-submenu wp-menu-open');
            });     
            </script>
    HTML;
    });
    

    【讨论】:

    • 很好的答案。我只想提一下,让“供应商”也被选中,我将current 类添加到其li 标记中。
    • 将全局 $plugin_page 设置为过滤器“父文件”中的子菜单项
    • 您还可以将“当前”类添加到“li”标签内的“a”标签中: $('#toplevel_page_nes_general_settings a') ...否则,当我们将鼠标悬停时,它会更改图标,至少在我尝试的时候,我需要这样做。
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 2011-11-14
    • 2011-09-05
    相关资源
    最近更新 更多