我正在寻找一种快速而肮脏的方法来在WP站点上输出面包屑导航,而不需要安装插件,也不需要利用内置的WP菜单。
这是我想到的。我很想知道我是否缺少一个更好的解决方案,和/或这样做是否有任何明显的错误。到目前为止,在我的测试中,它运行得很好。
class BreadcrumbWalker extends Walker_Nav_Menu {
private $i_current_page_id;
private $i_depth;
private $a_output;
function __construct() {
// sets our current page so we know when to exit
$this->i_current_page_id = get_queried_object()->ID;
}
function start_lvl(&$output, $depth=0, $args=array()) {
// increment the depth every time a new ul is entered
$this->i_depth++;
}
function end_lvl(&$output, $depth=0, $args=array()) {
// decrement the depth when we exit a ul
$this->i_depth--;
}
function start_el(&$output, $item, $depth=0, $args=array()) {
// if this value is zero, we\'re starting a new branch
if($item->menu_item_parent == 0) {
// reset the output array and depth counters
$this->a_output = array();
$this->i_depth = 0;
}
// if we haven\'t set the representative menu item for this depth, do so
if(!isset($this->a_output[$this->i_depth])) {
$this->a_output[$this->i_depth] = \'<a href="\' . get_permalink($item->object_id) . \'">\' . $item->title . \'</a>\';
}
}
function end_el(&$output, $item, $depth=0, $args=array()) {
if($this->i_current_page_id == $item->object_id) {
// check to see if this is our last item, if so display the breadcrumb
if($this->i_depth > 0) {
// but only show it if we actually have a breadcrumb trail
$this->display_breadcrumb();
}
} else {
// if not, unset the item for this depth since this isn\'t what we\'re going to display
unset($this->a_output[$this->i_depth]);
}
}
function display_breadcrumb() {
// implode our array into a string
echo implode(\' » \', $this->a_output);
}
}
基本上,我所做的是使用Walker\\u Nav\\u菜单方法来设置一个输出数组,该数组使用深度作为其键,并且一旦调用end\\u el方法,如果不是页面的ID作为面包屑的结尾,它将在该深度处取消设置该项,并在该数组上不断迭代。如果ID正确,则调用display\\u breadcrumb方法输出菜单。
提前感谢您的任何意见。我觉得可能有更好的方法来做到这一点,但目前我很困惑这可能是什么。
干杯
SO网友:Jules
我简直不敢相信没有一个免费的插件可以做到这一点。所以我写了自己的函数。给你。只需将此复制到您的函数。php:
function my_breadcrumb($theme_location = \'main\', $separator = \' > \') {
$theme_locations = get_nav_menu_locations();
if( ! isset( $theme_locations[ $theme_location ] ) ) {
return \'\';
}
$items = wp_get_nav_menu_items( $theme_locations[ $theme_location ] );
_wp_menu_item_classes_by_context( $items ); // Set up the class variables, including current-classes
$crumbs = array();
foreach($items as $item) {
if ($item->current_item_ancestor || $item->current) {
$crumbs[] = "<a href=\\"{$item->url}\\" title=\\"{$item->title}\\">{$item->title}</a>";
}
}
echo implode($separator, $crumbs);
}
然后,您可以在主题的任何位置输出面包屑,如下所示:
<?php my_breadcrumb(\'menu-slug\'); ?>
通过省略$theme\\u location参数并获取每个可用菜单的列表,只在$crumbs数组不为空时输出结果,可以轻松扩展此代码。我可能会写一篇关于这个的博客文章,或者很快把它变成一个免费的插件。随时更新您的信息。
您还可以通过检查$item->;为当前项目添加类或不同的标记;现在的
SO网友:laychinhan
这是我为zurb foundation 5面包屑元素开发的walker类,如果您想在无序列表标记中显示面包屑,这将非常有用。
class BreadCrumbWalker extends Walker_Nav_Menu
{
function start_lvl( &$output, $depth = 0, $args = array() )
{
}
function end_lvl( &$output, $depth = 0, $args = array() )
{
}
function start_el( &$output, $item, $depth, $args )
{
//Check if menu item is an ancestor of the current page
$classes = empty( $item->classes ) ? array() : (array)$item->classes;
$title = apply_filters( \'the_title\', $item->title, $item->ID );
if( in_array(\'current-menu-item\', $classes) OR in_array( \'current-menu-parent\', $classes ) ){
//Link tag attributes
$attributes = !empty( $item->attr_title ) ? \' title="\' . esc_attr( $item->attr_title ) . \'"\' : \'\';
$attributes .= !empty( $item->target ) ? \' target="\' . esc_attr( $item->target ) . \'"\' : \'\';
$attributes .= !empty( $item->xfn ) ? \' rel="\' . esc_attr( $item->xfn ) . \'"\' : \'\';
$attributes .= !empty( $item->url ) ? \' href="\' . esc_attr( $item->url ) . \'"\' : \'\';
//Add to the HTML output
if( in_array(\'current-menu-item\', $classes) ){
$output .= \'<li>\'.$title.\'</li>\';
}else{
$output .= \'<li><a\' . $attributes . \'>\' . $title . \'</a></li>\';
}
}//if current
}//start_el
}