【问题标题】:Trouble highlighting correct menu parent with wp_nav_menu classes while viewing “single posts”在查看“单个帖子”时无法使用 wp_nav_menu 类突出显示正确的菜单父级
【发布时间】:2011-08-08 16:05:44
【问题描述】:

我刚刚更新了我网站上的一个菜单以使用 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>

【问题讨论】:

  • 您有活动、媒体和博客类别吗?
  • 是的,每个页面通过自定义查询显示 1 个类别,与上面显示的完全一样……在设置 > 阅读 > 我将首页设置为事件,并将帖子页面设置为博客。一切都按预期工作,除了 wp_nav_menu 在访问来自媒体或事件的单个帖子时在错误的 li 标签上错误地生成当前类。我将上传来自 firebug 的屏幕截图以说明我的意思并将其放在我的原始帖子中。

标签: wordpress menu navigation singlepage current-page


【解决方案1】:

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

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。将“my-menu-slug”替换为您的菜单 slug。

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

已更新。

【讨论】:

  • 这看起来很有希望,我会尝试并报告。 PS - 我相信你将帖子页面设置为:博客的权利......但是我也尝试过它的默认行为,不幸的是我仍然没有得到一个活跃的家庭课程,只有 .home-menu-item 或类似的东西。
  • Hadvig - 非常感谢您的帮助。不幸的是,它仍然呈现相同的结果。您会推荐什么是解决此问题的最佳途径?
  • 为了以后参考,每篇文章只包含1个分类。
  • 为除博客以外的所有内容创建自定义帖子类型会更好/更合适吗?...只是觉得这似乎过分了。
  • 我用这个解决方案解决了和你一样的问题。挖到那个地方。尝试从过滤器中获取 var_dump($items, $menu) 并查看输出。我想你的过滤器功能出错了:menu slug check、category check 或其他地方。如果没有过滤器代码以及类别和菜单的名称/ID,抱歉不能说更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 2016-10-30
相关资源
最近更新 更多