基于顶级父页面的WordPress侧边栏导航

时间:2014-06-06 13:32:15

标签: php wordpress menu navigation

我尝试创建一个复杂的侧边栏导航系统,该系统保持不变,具体取决于您正在查看的顶级页面。例如,假设我有这个导航:

  • 主页
  • 关于
    • 我们公司
      • 位置
      • 小时
    • 我们的人
      • Jim
      • 戴夫
      • 萨拉
      • 凯利
  • 组合
    • 标志
    • 网站
  • 联系

现在,如果用户位于“关于”部分中的任何位置,我希望侧边栏显示:

  • 关于
    • 我们公司
      • 位置
      • 小时
    • 我们的人
      • Jim
      • 戴夫
      • 萨拉
      • 凯利

如果他们出现在主要的“关于”页面,“我们的公司”页面或“位置”页面中,那就是这样。无论深度如何,我都需要整个导航。

如果用户位于没有子项的页面中,例如Contact,侧边栏需要显示:

  • 主页
  • 关于
  • 组合
  • 联系

更重要的是,订购需要基于WordPress菜单(一个主菜单,每个侧边栏都可以是它自己的;这对用户来说太复杂了)。我不知道这是否使事情变得复杂。

过去,我设法显示儿童和兄弟页面,但它不会显示父页面,也不会按用户定义的顺序显示。< / p>

<ul>
    <?
    global $wp_query;
    if( empty($wp_query->post->post_parent) ) {
        $parent = $wp_query->post->ID;
    }
    else {
        $parent = $wp_query->post->post_parent;
    }
    wp_list_pages ("&title_li=&child_of=$parent");
    ?>
</ul>

如果可以修改它以我想要的方式工作,那就太棒了。我将尝试自己解决这个问题,并会在我取得进展时发布更新。

更新1:我在确定绝对父母的方面取得了一些进展。我想我已走上正轨。

<?
if ($post->post_parent) {
    $ancestors = get_post_ancestors($post->ID);
    $root = count($ancestors)-1;
    $parent = $ancestors[$root];
} else {
    $parent = $post->ID;
}
echo "Current Page: " . $post->ID . "<br />";
echo "Top Level Parent: " . $parent;
?>

更新2:我现在可以确定要查询菜单的正确页面ID,所以我想我已经接近了。

<?
$children = get_pages("child_of=".$post->ID);
if ($post->post_parent) {
    $ancestors = get_post_ancestors($post->ID);
    $root = count($ancestors)-1;
    $parent = $ancestors[$root];
} elseif (count($children) != 0) {
    $parent = $post->ID;
} else {
    $parent = 0;
}
echo "Current Page: " . $post->ID . "<br />";
echo "Top Level Parent: " . $parent;
?>

更新3:我快到了!唯一的问题是,它使用编辑器中的页面顺序,而不是菜单中的页面顺序。是否可以编辑它以使用菜单?

<aside>
    <?
    $children = get_pages("child_of=".$post->ID);
    if ($post->post_parent) {
        $ancestors = get_post_ancestors($post->ID);
        $root = count($ancestors)-1;
        $parent = $ancestors[$root];
        $sidebarDepth = 0;
        $postParentID = get_post($parent);
        $title = $postParentID->post_title;
    } elseif (count($children) != 0) {
        $parent = $post->ID;
        $sidebarDepth = 0;
        $postParentID = get_post($parent);
        $title = $postParentID->post_title;
    } else {
        $parent = 0;
        $sidebarDepth = 1;
        $frontPageID = get_option("page_on_front");
        $exclude = $frontPageID;
        $postParentID = get_post($frontPageID);
        $title = $postParentID->post_title;
    }
    ?>
    <header>
        <h6><a href="#"><? echo $title ?> &raquo;</a></h6>
    </header>
    <section>
        <nav>
            <?
            echo "<ul>";
            wp_list_pages("child_of=" . $parent . "&depth=" . $sidebarDepth . "&exclude=" . $exclude . "&title_li=&");
            echo "</ul>";
            ?>
        </nav>
    </section>
</aside>

1 个答案:

答案 0 :(得分:1)

想出来!我修改了this answer中的代码,为start_in添加了wp_nav_menu选项,并从那里修改了我的代码。现在这完全符合我的要求。

functions.php

// add start_in argument to navigation
add_filter("wp_nav_menu_objects",'my_wp_nav_menu_objects_start_in',10,2);
function my_wp_nav_menu_objects_start_in( $sorted_menu_items, $args ) {
    if (isset($args->start_in) && $args->start_in != 0) {
        $menu_item_parents = array();
        foreach ($sorted_menu_items as $key => $item) {
            if ($item->object_id == (int)$args->start_in) $menu_item_parents[] = $item->ID;
            if (in_array($item->menu_item_parent, $menu_item_parents)) {
                $menu_item_parents[] = $item->ID;
            } else {
                unset($sorted_menu_items[$key]);
            }
        }
        return $sorted_menu_items;
    } else {
        return $sorted_menu_items;
    }
}

page.php(或您想要的任何模板)中:

    <aside>
    <?
    if ($post->post_parent) {
        $ancestors = get_post_ancestors($post->ID);
        $root = count($ancestors)-1;
        $parent = $ancestors[$root];
    } elseif (count(get_pages("child_of=".$post->ID)) != 0) {
        $parent = $post->ID;
    } else {
        $parent = get_option("page_on_front");
        $sidebarDepth = 1;
        $exclude = $parent;
    }
    if ($post->post_parent || count(get_pages("child_of=".$post->ID)) != 0) {
        $sidebarDepth = 0;
        $start_in = $parent;
        $depth = 0;
    } else {
        $depth = 1;
        $start_in = 0;
    }
    $parentID = get_post($parent);
    $parentTitle = $parentID->post_title;
    $parentURL = get_permalink($parentID);
    ?>
    <header>
        <h6><a href="<? echo $parentURL ?>"><? echo $parentTitle ?> &raquo;</a></h6>
    </header>
    <section>
        <nav>
            <?
            wp_nav_menu(
                array(
                    "container" => false,
                    "depth" => $depth,
                    "items_wrap" => '<ul>%3$s</ul>',
                    "start_in" => $start_in,
                    "theme_location" => "first"
                )
            );
            ?>
        </nav>
    </section>
</aside>