使用wp_NAV_MENU_OBJECTS动态添加菜单项

时间:2014-03-04 作者:JM01

在我的主导航中,我希望每个顶级页面都有一个子页面列表。因此,我创建了将菜单项动态添加到主导航的代码。这只适用于子页面的第一级。您可以看到,我注释掉了进入第二级的代码,因为它在主级上输出了这些链接。我不知道为什么它在第二层上不起作用。难道我们不能将菜单项分配给动态生成的父菜单项?

它看起来像:

add_filter( \'wp_nav_menu_objects\', \'epc_wp_nav_menu_items\', 10, 2 );
function epc_wp_nav_menu_items($items, $args) {
    if ($args->theme_location == \'primary\') {
        $menu_order = 10000;
        $menu_order2 = 20000;
        global $wpdb;
        global $post;
        $post_id = 0;       
        if($post){
            $post_id = $post->ID;
        }

        foreach($items as $item){
            $pageChildren = $wpdb->get_results("SELECT post_title, ID FROM wp_posts WHERE post_parent = ".$item->object_id." AND post_status = \'publish\' AND post_type=\'page\' ORDER BY menu_order", \'OBJECT\' );
            foreach($pageChildren as $child){
                $menu_order++;
                $new_item = epc_add_menu_item($post_id, $menu_order, $item, $child);
                $items[] = (object)$new_item;
                /*
                $pageChildrenSecondLevel = $wpdb->get_results("SELECT post_title, ID FROM wp_posts WHERE post_parent = ".$child->ID." AND post_status = \'publish\' AND post_type=\'page\' ORDER BY menu_order", \'OBJECT\' );
                foreach($pageChildrenSecondLevel as $child2){
                    $menu_order2++;
                    $new_item2 = epc_add_menu_item($post_id, $menu_order2, $new_item, $child2);
                    $items[] = (object)$new_item2;
                }
                */
            }
        }
    }
    return $items;
}

function epc_add_menu_item($post_id, $menu_order, $item, $child){
                $new_item = new stdClass;
                $new_item->ID = $menu_order;
                $new_item->menu_item_parent = $item->ID;
                $new_item->url = get_permalink( $child->ID );
                $new_item->title = $child->post_title;
                $new_item->menu_order = $menu_order;
                $new_item->object_id = $child->ID;
                $new_item->post_parent = $item->object_id;
                $classes = \'menu-item\';
                $classes .= \' menu-item-parent-\' . $item->ID;
                $classes .= \' menu-item-type-post_type\';
                $classes .= \' menu-item-object-page\';
                if($post_id == $child->ID){
                    $classes .= \' current-menu-item\';
                    $classes .= \' page-item\';
                    $classes .= \' page-item-\' . $child->ID ;
                    $classes .= \' current_page_item\';
                }   
                $new_item->classes = $classes;
                return $new_item;
}

3 个回复
SO网友:kaaposc

还应指定db_id 父菜单项的字段:

function epc_add_menu_item( $post_id, $menu_order, $item, $child ) {
    ...
    $new_item->db_id = $menu_order;
    ...
}
另一方面,具有子菜单项的菜单项也应该具有menu-item-has-children

SO网友:TMA

使用此自定义类可显示子菜单:

class Wp_Sublevel_Walker extends Walker_Nav_Menu {

    function start_lvl(&$output, $depth = 0, $args = array()) {
        $indent = str_repeat("\\t", $depth);
        $output .= "\\n$indent<ul class=\'submenu\'>\\n";
    }

    function end_lvl(&$output, $depth = 0, $args = array()) {
        $indent = str_repeat("\\t", $depth);
        $output .= "$indent</ul>\\n";
    }

}

SO网友:pietervanderstar

如果自定义菜单项基于帖子、类别或其他WP对象,则可以使用WP\\u setup\\u nav\\u menu\\u item(WP\\u object)获取菜单项对象。

$item=wp_setup_nav_menu_item(get_post());
该对象将正确获取大部分信息集,但并非所有信息都存在。我们仍然需要设置项目的一些属性。我们需要设置父菜单项,如果要使其处于顶层,请将其值设置为0。

$item->menu_item_parent = $parentitem->ID;
为了使项目具有子项,您需要分配一个db\\U id,但这需要是WP对象的id,它不能与任何其他值一起工作(最好我没有让它工作)。所以我们需要设置:

$item->db_id = get_the_ID();
如果您当前的条目将包含您添加的子条目menu-has-children 到classes变量。注:我还添加了主题所需的其他(css)类。

$item->classes = array("menu-item", "menu-item-type-post_type", "menu-item-object-page", "menu-item-has-children");
您可以通过如上所述创建项目,然后修改$item->title$item->url 但是保留身份证。只需确保ID在菜单级别是唯一的(我没有检查它是否需要在菜单中是唯一的)。

(对于像我这样在尝试创建自定义菜单时发现此线程的其他人:菜单顺序需要确保父菜单后面紧跟着子菜单。)

结束

相关推荐

How to add taxonomy in menus?

书籍(自定义帖子类型)小说(税)科学(税)历史(税)--书籍体裁(税务)小说(术语)科学(学期)历史(学期)以下哪一项是做这件事的“好方法”?对于前一个(这是我目前在管理菜单中的功能,我为每个功能都提供了“register\\u taxonomy”功能),我无法选择要在菜单中显示的“Tax”。而对于后者,我可以将它们添加到菜单中,只需要一个“register\\u taxonomy”函数。