1

我刚刚更新了我网站上的一个菜单以使用 wp_nav_menu。使用 WP 进行设置非常简单,但是我遇到了一个小障碍,因为 wordpress 输出其父/祖先类以用于突出显示内容所属的当前页面,尤其是单个帖子页面.. .

突出显示当前页面,只要它只是在带有孩子的普通页面上,就可以完美地工作,.current_page_item a但是一旦您访问来自事件媒体的帖子,菜单中的博客链接就会突出显示,这显然是不正确的.current_page_parent a

*在查看 Wordpress 的输出时,明显错误的一件事是,当前页面类甚至没有在帖子所属的正确li 标签上生成,这似乎是问题的根源。

为了将来参考,事件、媒体和博客页面都使用了我编写的特殊查询,以仅获取该页面的相应类别,即。

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts("category_name=media&paged=$paged");

if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div class="post">
</div>
<?php
endwhile;
else:
endif;

希望那是足够的信息,如果不让我知道。最佳,某人


编辑 - 2011 年 8 月 3 日


下面是我说 wp_nav_menu 在错误的 li 标签上生成当前类时所指的屏幕截图。蓝色突出显示的是帖子实际所属的菜单项。以灰色突出显示的是 wordpress 决定将当前类添加到的不正确的 li 标签。

例子 http://img688.imageshack.us/img688/4180/picture2zo.png



编辑 - 2011 年 8 月 4 日


也许这将有助于展示我到目前为止如何在 Hadvig 的帮助下更好地设置菜单?

在我的functions.php模板中,我有 -

<?php
// Add Custom Menu Support
if ( function_exists( 'register_nav_menu' ) ) {
    register_nav_menu( 'epr_menu', 'EPR Main Menu' );
}

function my_menu_items_hook($items, $menu, $args) {

  if ( 'epr_menu' == $menu->slug ) { // check if it is process your top menu
    if ( is_single() ) { // check if single post loaded

      if ( in_category('events') || in_category('media') ) {
        foreach ( $items as $key => $value ) {
          if ( 'blog' == $value->ID ) {
            $items[$key]->classes[] = array(); //unset classes for blog item
          }

          // add class if post from event category
          if ( in_category('events') && 'events' == $value->ID ) {
            $items[$key]->classes[] = 'current-menu-item';
          }

          // add class if post from media category
          if ( in_category('media') && 'media' == $value->ID ) {
            $items[$key]->classes[] = 'current-menu-item';
          }
        }
      }
    }
  }

  return $items;
}

add_action('wp_get_nav_menu_items', 'my_menu_items_hook', 10, 3);
?>

在我的header.php模板中,我这样调用菜单 -

<div id="nav_wrapper">
    <ul id="nav">
        <?php wp_nav_menu( array( 'container' => '', 'items_wrap' => '%3$s' ) ); ?>
    </ul>
</div>

4

1 回答 1

0

我想问题是因为您将帖子页面设置为博客,而 wordpress 将其设置为所有帖子的父页面(在您的菜单中)。您可以尝试使用wp_get_nav_menu_itemshook 更改此行为。例子:

function my_menu_items_hook($items, $menu, $args) {

  if ( 'my-menu-slug' == $menu->slug ) { // check if it is process your top menu
    if ( is_single() ) { // check if single post loaded

      if ( in_category(EVENT_CATEGORY_ID) || in_category(MEDIA_CATEGORY_ID) ) {
        foreach ( $items as $key => $value ) {
          if ( BLOG_PAGE_ID == $value->object_id ) {
            $items[$key]->classes[] = array(); //unset classes for blog item
          }

          // add class if post from event category
          if ( in_category(EVENT_CATEGORY_ID) && EVENT_PAGE_ID == $value->object_id ) {
            $items[$key]->classes[] = 'current-menu-item';
          }

          // add class if post from media category
          if ( in_category(MEDIA_CATEGORY_ID) && MEDIA_PAGE_ID == $value->object_id ) {
            $items[$key]->classes[] = 'current-menu-item';
          }
        }
      }
    }
  }

  return $items;
}

add_action('wp_get_nav_menu_items', 'my_menu_items_hook', 10, 3);

您应该将 EVENT_CATEGORY_ID 和 MEDIA_CATEGORY_ID 替换为您的类别 ID(或名称)。还将 EVENT_PAGE_ID 和 MEDIA_PAGE_ID 替换为您的页面 ID。用您的菜单 slug 替换 'my-menu-slug'。

当然,这仅在您将帖子附加到事件、媒体或博客中的一个类别时才有效。

更新。

于 2011-08-04T08:33:41.757 回答