将自定义分类术语动态添加到WordPress菜单并将#slug附加到url

时间:2019-02-07 作者:Janne Wolterbeek

我有一个由两部分组成的问题。这是我在这里的第一篇帖子,如果我做错了,请道歉。

我有一个名为“作者类别”的自定义分类法(使用WP工具集创建)。

我需要做的是:

menu item | menu item | authors | menu item
                        category
                        category
                        category
                        etc.
我有一个名为“authors”的菜单项,该菜单项指向一个名为“authors”的页面,其中列出了特定类别下的所有作者(如thriller、children’s book等),这些是我自定义分类法中的类别。

问题1:如何动态添加类别(例如,创建新类别时,将在下拉列表中列出)?

问题2:如何将此菜单下拉列表中的每个类别链接到同一个“作者”页面,但在URL后添加一个#slug,以便它可以滚动到该页面上的正确类别?我已经确保“authors”页面上的每个类别标题都将slug设置为元素的ID。

如果我问得太多,我很抱歉,但我已经做了几天的研究,还没有弄清楚,部分原因是我认为Wordpress Codex中的文档不够完整。

谢谢你的帮助!

1 个回复
SO网友:Milo

如果菜单是通过生成的wp_nav_menu, 您可以使用自定义Walker向特定项目添加动态子菜单。

首先是课堂,这将成为你的主题functions.php 文件或您自己的自定义插件:

class Walker_Author_Categories extends Walker_Nav_Menu {
    // we only need to override the function that closes each menu item,
    // this is where we can insert a submenu
    function end_el( &$output, $item, $depth=0, $args=array() ) {
        // if the current menu item being output is authors
        if( \'authors\' == $item->title ){
            // get all of the author categories
            $author_cats = get_terms( array(
                \'taxonomy\' => \'author_categories\',
                \'hide_empty\' => false,
            ) );
            if ( ! empty( $author_cats ) && ! is_wp_error( $author_cats ) ) {
                // url of the authors page
                // to be used to append #anchor links
                $parent_url = get_permalink( $item->object_id );
                // start a new list
                $output .= \'<ul>\';
                // iterate over each category
                // and add an li
                foreach( $author_cats as $author_cat ){
                    $slug = $author_cat->slug;
                    $name = $author_cat->name;
                    $format = \'<li><a href="%s#%s">%s</a></li>\';
                    $output .= sprintf( $format, $parent_url, $slug, $name );
                }
                // close the list
                $output .= \'</ul>\';
            }
        }
        // close the parent li
        $output .= "</li>\\n";  
    }
}
然后,在输出菜单的位置,添加自定义walker:

wp_nav_menu( array(
    \'theme_location\' => \'primary\',
    \'walker\' => new Walker_Author_Categories
) );

相关推荐

WordPress编辑角色删除外观菜单中除‘menus’之外的所有内容

我正在尝试删除对角色编辑器WP admin中外观菜单中所有内容的访问权限。或者至少,只需删除对主题和插件的访问即可。我发现了如何删除整个外观菜单,而不是像那样删除其中的一部分。这可能吗?最好是功能方面的东西。php,以便在需要时打开/关闭此选项。