Custom Walker:如何在函数start_lvl中获取ID


15

我正在制作我的第一个自定义助行器,以构建手风琴菜单。首先,我使用以下示例:http : //bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

有两个功能。首先是start_lvl,然后是start_el。

在start_el中,ID获取由$ item-> ID实现。有人知道我也可以在start_lvl中做到这一点吗?我需要给(周围的下层导航)一个ID,以便可以触发它在手风琴菜单中折叠。

我试图生成的是这样的:

<a href="#collapse2">Titel 2</a>
<ul id="collapse2">Lower Level Menu 2</ul>
<a href="#collapse3">Titel 3</a>
<ul id="collapse3">Lower Level Menu  3</ul>

我的start_lvl函数代码:

// add id's and classes to ul sub-menus
function start_lvl( &$output, $depth, $item ) {
    // depth dependent classes
    $indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // code indent
    $display_depth = ( $depth + 1); // because it counts the first submenu as 0
    $pgid = ; // How to get ID in here??
    $classes = array(
        'sub-menu',
        ( $display_depth == 1  ? 'accordion-body collapse' : '' ),
        ( $display_depth % 2  ? 'menu-odd' : 'menu-even' ),
        ( $display_depth >=2 ? 'sub-sub-menu' : '' ),
        'menu-depth-' . $display_depth
        );
    $ids = array(
        'collapse' . $pgid
        );
    $class_names = implode( ' ', $classes );
    $id_name = implode( ' ', $ids );

    // build html
    $output .= "\n" . $indent . '<ul id="' . $id_name . '" class="' . $class_names . '">' . "\n";
}

Answers:


38

我只需要在我的一个主题中执行此操作...由于在Walker的那个阶段您没有访问$ item变量的权限,因此您现在想将当前项目存储在更全局的范围内确实可以访问它。下面的代码会更有意义...注意:除了相关代码,我已经剥离了所有内容。

class ThemeTruck_Nav_Walker extends Walker_Nav_Menu {
   private $curItem;

  // retrieve the curItem
  function start_lvl(&$output, $depth = 0, $args = array()) {
    var_dump($this->curItem );
  }

  // store the curItem
  function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
    $this->curItem = $item;
  }

 }

3
这是此线程中提出的最优雅的解决方案。谢谢莱恩!
凯文C.

1
确实,一种非常干净的方法行之有效。非常感谢。
艾萨克·格雷格森

1
我不确定,但是我必须将整个默认代码添加到start_el才能使其正常工作吗?
GDY

4
好的,您可以只使用parent :: start_el($ output,$ item,$ depth,$ args,$ id); 在start_el中...
GDY

出色,一直以来都想弄清楚这一点,并且马上就奏效了。谢谢。
cfx

3

我有一个类似的问题,并通过在类内部使用静态变量来解决:

static protected $menu_lvl; 

然后在“ display_element”中增加变量:

self::$menu_lvl++;

然后在我的代码中,在start_lvl函数中引用了类似以下内容的代码:

$output .= "<ul id='level". self::$menu_lvl ."'>";

它不使用页面ID,但确实对可被JavaScript引用的UL语句使用唯一ID。

顺便说一句-这对于嵌套手风琴或使用移动应用程序Bootstrap的Roots主题中可单击的嵌套下拉列表确实有用。


2

您可以在start_el函数中使用以下过滤器,并在start_lvl函数中查找参数。

apply_filters( 'walker_nav_menu_start_lvl', $item_output, $item, $depth, $args->myarg=$item->title );

请让我知道它是否有效。


感谢您的发布!我希望能在接下来的几天中找到一些时间来解决问题,但我现在真的很忙于学习。结果我会尽快回复您!
罗伯特·布顿

0

您可以简单地将$ page添加到自定义walker的参数中:

class My_Custom_Walker extends Walker_page {
    function start_el(&$output, $page, $depth, $args, $current_page) {
        if ( $depth )
            $indent = str_repeat("\t", $depth);
        else
            $indent = '';

        extract($args, EXTR_SKIP);

        $output .= $indent . 
            '<li>
            <a style="color:red" href="' . get_page_link($page->ID) . '" title="' . 
            esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . 
            $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

尝试上面的方法,然后在调用wp_list_pages()之前,添加自定义沃克类:

$MyWalker = new My_Custom_Walker();

然后,在wp_list_pages的参数中:

wp_list_pages('walker'=> $ MyWalker)

检查并确认助步器的输出是否为红色。


那是在函数start_el中,但是在start_lvl中显然有所不同,因为我不能在其中放置相同的变量。或至少不相同的顺序。
罗伯特·布顿

您打算如何使用start_lvl?
AlxVallejo 2012年

我正在尝试给<ul>一个id =“ collapse102”与102生成的页面ID。这样,我可以触发它以将其折叠到我的手风琴菜单中。
罗伯特·布顿

添加id =“ collapse”可以,但是我也无法添加pageID。
罗伯特·布顿

您是说只希望折叠特定的ID吗?我有一个用于wp_list_pages的手风琴树,根本不需要更改start_lvl。
AlxVallejo 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.