如何防止自定义漫游为不是当前页面相关的页面创建子导航?

时间:2012-11-20 作者:Evan Mattson

我有一个扩展walker类的自定义walker。我的代码使用Walker\\u Page类作为它的基础,因为它几乎可以完成我想要的所有其他操作,但我需要对其进行一些修改,使其行为略有不同。

从本质上讲,我希望阻止walker为与当前页面无关的菜单项创建新的导航级别——也就是说,我只希望当当前页面是当前页面或其祖先时,walker能够更深入地进行导航。

关键在于$current_page (current\\u object\\u id)参数,该参数传递给start_el 方法如果这也传递给start_lvl 方法,我认为这很容易编码,但是start_el 似乎是唯一能得到它的方法。

如有任何帮助/指示,将不胜感激。

我会将代码粘贴到这里,但基本上与Walker_Page

2 个回复
最合适的回答,由SO网友:Evan Mattson 整理而成

我不小心在问题中遗漏了一个重要的细节,这使问题的解决变得更加复杂。我还想显示当前页面的子导航,如果它有子项的话。

我通过将元素的祖先与当前页面的祖先(以及当前页面本身)进行比较来做到这一点,如果没有任何匹配,则跳过迭代。

这是我的解决方案(谢谢Stephen!)

class WPSE73358_Walker extends Walker_Page {

    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {

        if ( 0 < $depth ) {

            $qoID = get_queried_object_id();

            // seperated for readability
            $current_ancestors = get_post_ancestors( $qoID );
            $element_ancestors = get_post_ancestors( $element->ID );

            $check = $current_ancestors;
            unset( $check[ count($check)-1 ] ); // remove the last ancestor - all pages will share this in common
            $check[] = $qoID; // include current page id

            $against = $element_ancestors;
            unset( $against[ count($against)-1 ] );
            // element id is unnecessary because we\'re checking against it\'s ancestry

            // check to see if the current page & current element have anything in common
            $results = array_intersect( $check, $against );

            // if current page & element have something in common, array will not be empty, and we can continue.
            // if not, move on to the next iteration.
            if ( empty( $results ) )
                return;
        }

        parent::display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output );
    }
}

SO网友:Stephen Harris

你可以找到这个article I wrote over at WPtuts 有用的

下面的例子是我根据那篇文章改编的。它列出了所有顶级链接,但只探索了“当前”菜单项的祖先。希望评论中的逻辑是明确的:

class WPSE73358_Ancestors_Only_Walker extends Walker_Nav_Menu {

    // Only follow down one branch
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {

        // Check if element as a \'current element\' class
        $current_element_markers = array( \'current-menu-item\', \'current-menu-parent\', \'current-menu-ancestor\' );
        $current_class = array_intersect( $current_element_markers, $element->classes );

        // If element has a \'current\' class, it is an ancestor of the current element
        $ancestor_of_current = !empty($current_class);

        // If this is not the top level nor the current, or ancestor of the current menu item - stop here.
       if ( 0 != $depth &&  !$ancestor_of_current)
           return;

        parent::display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output );
    }
}
虽然它扩展了Walker_Nav_Menu 它的编写使得它可以扩展几乎所有的Walker类(包括基类)。您可能会发现类需要更改,或者-例如,对于post,使用它可能更合适get_post_ancestors() 相反

结束

相关推荐

如何将参数传递给我的自定义Walker?

我已经设置了一个自定义walker,当我硬编码我的变量时,它可以根据需要工作。我想要的是能够调用我的walker,并将walker中使用的变量传递给它。例如: \'walker\' => new Plus_walker($refine => \'review\'), 我调整输出的步行器http://URL/review 以便在此菜单项的“审阅”类别中查找帖子。但我希望能够使用同一个助行器进行“预览”、“采访”等。到目前为止,我输入变量的尝试打破了“解析错误:语法错