我希望只有我的子页面可以在导航栏中点击

时间:2013-05-19 作者:oyvey

我正在建立一个简单的网站,有许多页面,每个页面都是分组的。

假设我的网站有大约20个页面,分为5类。因此,我希望我的导航栏显示5个类别,每个类别在滚动时显示在其下创建的页面。

现在,由于我将我的页面创建为页面而不是帖子,我知道“类别”不可用。所以我将它们创建为子页面。我将每个“类别”创建为一个页面。

我的问题是:我创建这些“页面”只是为了将导航栏中的“子页面”分组。但这些“页面”都不是真实的页面,所以我不希望它们中的任何一个是可点击的。我想要的是,如果有人单击导航栏中的“页面”本身,他们应该被带到该类别(或页面)的第一个子页面。

如果有任何解决办法,我将不胜感激。

(旁注:这似乎是一种极为常见的情况,然而,经过一段时间的研究,我发现没有任何东西可以解决这个问题。我是一名拥有十多年经验的web程序员,但对wp来说是一个相对新手,我发现这种情况一再重复。)

4 个回复
SO网友:Matt Keys

我会使用内置的Wordpress菜单管理器(外观->菜单)来创建我的菜单结构。

对于每个“虚拟”父页面,您只需使用指向该页面第一个子页面的第二个链接,然后将其重命名为任意阅读即可。

因此,如果您的结构是:

-父级A

孩子A

孩子B

子C

如果您希望这样做,那么单击父A将把人们带到子A页面,只需插入指向子A的链接作为顶级页面,然后将其重命名为“父A”。

一旦创建了您喜欢的结构,就可以使用WP\\u Nav\\u菜单(http://codex.wordpress.org/Function_Reference/wp_nav_menu) 在标题中显示菜单。

如果在内部页面上需要只显示当前部分的子页面,可以使用我编写的名为WP Nav Plus的插件设置起始深度并只显示子页面(https://mattkeys.me/products/wp-nav-plus/).

我希望这有帮助。

SO网友:s_ha_dum

我对@MattKey的答案投了赞成票,因为后端可配置菜单系统是处理此类问题的好方法,并且还可以使菜单在后端保持可编辑状态。

然而这个答案并不能直接回答您将如何仅基于页面结构来实现这一点的问题。我想到的答案是为wp_list_pages.

class No_Top_Link_Walker extends Walker_Page {
  static $parent = false;

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

  function start_el( &$output, $page, $depth, $args, $current_page = 0 ) {
    if ( $depth ) {
      $indent = str_repeat("\\t", $depth);
    } else {
      $indent = \'\';
    }

    extract($args, EXTR_SKIP);
    $css_class = array(\'page_item\', \'page-item-\'.$page->ID);
    if ( !empty($current_page) ) {
      $_current_page = get_post( $current_page );
    if ( in_array( $page->ID, $_current_page->ancestors ) )
      $css_class[] = \'current_page_ancestor\';
    if ( $page->ID == $current_page )
      $css_class[] = \'current_page_item\';
    elseif ( $_current_page && $page->ID == $_current_page->post_parent )
      $css_class[] = \'current_page_parent\';
    } elseif ( $page->ID == get_option(\'page_for_posts\') ) {
      $css_class[] = \'current_page_parent\';
    }

    $css_class = implode( \' \', apply_filters( \'page_css_class\', $css_class, $page, $depth, $args, $current_page ) );

    $href = (0 === $depth && $args[\'has_children\']) ? \'%s\' : get_permalink($page->ID);

    $tli = \'\';
    if (false !== static::$parent) {
      $tli = sprintf(static::$parent,get_permalink($page->ID));
      static::$parent = false;
    }

    $output = sprintf($output,$tli);

    $li = $indent . \'<li class="\' . $css_class . \'"><a href="\' . $href . \'">\' . $link_before . apply_filters( \'the_title\', $page->post_title, $page->ID ) . $link_after . \'</a>\';

    if ( !empty($show_date) ) {
      if ( \'modified\' == $show_date )
    $time = $page->post_modified;
      else
    $time = $page->post_date;

      $li .= " " . mysql2date($date_format, $time);
    }

    if (0 === $depth && $args[\'has_children\']) {
      static::$parent = $li;
    } else {
      $output .= $li;
    }
  }

  function end_el( &$output, $page, $depth = 0, $args = array() ) {
    if (false === static::$parent) {
      $output .= "</li>\\n";
    }
  }

}
$args = array(
  \'walker\' => new No_Top_Link_Walker,
  \'title_li\' => \'Pages\'
);
echo \'<ul>\';
wp_list_pages($args);     
echo \'</ul>\';
助行器伸出Walker_Page 并替换了几种方法。上面的代码本质上是walker的methods 除了我在哪里做的更改,不包括一些琐碎的格式和语法更改。

walker在到达那里之前不知道子URL是什么,所以我保存了没有子菜单的顶级菜单的标记,并在开始为子菜单添加标记之前插入了它们。

我在开发过程中对它进行了一点测试,它似乎在验证程序中工作。w3。org给它一个“绿色”。然而,没有承诺。我只是编出来的。

SO网友:Core

以下是页面和子页面中带有子菜单的菜单代码。

<ul>
<?php 
$parents = array();
$args = array(
                \'post_type\' => \'page\',
                \'parent\' => -1,
                \'number\' => \'\',
             );
$pages = get_pages($args);
foreach( $pages as $page){
    $childs = get_pages(\'child_of=\'.$page->ID);
    if( count( $childs ) > 0 ){
        echo \'<li><a href="#">\' . $page->post_title . \'</a>\';

        if( count( $childs ) > 0 ){
            echo \'<ul>\';
            foreach( $childs as $child ){
                echo \'<li><a href="\' . get_permalink($child->ID) . \'">\' . $child->post_title . \'</a></li>\';
            }
            echo \'</ul>\';
        }
    }
}
?>
</ul>
现在,检查一下this 纯CSS菜单和子菜单的代码,并根据您的需要进行自定义。

SO网友:oyvey

In response to Matt, here is what I\'ve done:

  1. I delete all of the pages that I had created just for the sake of grouping the sub-pages.
  2. All of the pages that were sub-pages are now regular pages, not sub-pages.
  3. I created a new menu.
  4. For each menu group, I created a custom link, and assigned as its url the url of what will be its first child.
  5. Within the menu, I created a hierarchy of these custom links and their respective children.

Matt, is this what you meant? It seems to suit my needs.

Actually, I believe it is a bit simpler than your solution, in that I don\'t need to edit WP_Nav_Menu or WP_Nav_Plus.

The main disadvantage that I can see is that every time the first child of a group changes, I will need to manually change the url of its parent custom link. (Perhaps this is an advantage in your solution? For me, the advantage that I don\'t need to edit any php outweighs this disadvantage.)

Not too bad, but it seems to me that there ought to be a way to not have to create a custom menu to accomplish this. Perhaps what I\'m saying is that there should be a feature called "Page Category" that would automatically accomplish this. I\'m sure I\'m the first person to make such a suggestion!

(I understand that I\'m supposed to enter this as a comment to Matt\'s comment, but it wouldn\'t let me due to the length of my post.)

结束

相关推荐

必需:找不到wp_link_ages。请参阅:WP_LINK_PAGES by Theme Checker

我已经通过WordPress主题检查器运行了我的主题,看看它是否可以提交给WordPress。组织。我遇到了以下错误:必需:找不到wp\\u link\\u页面。请参阅:wp\\U link\\u页面但事实并非如此。我正在使用自定义函数wp_my_own_link_pages() 它是wp_link_pages(). 它为主题生成具有兼容HTML结构的分页。我错过了一些必要的东西吗?我怎样才能做到这一点?