我正在尝试引入一些动态(非 WP)内容来填充 Wordpress 中的菜单。为此,我扩展了 Walker 类,如下所示:
http://www.kriesi.at/archives/improve-your-wordpress-navigation-menu-output
所以我的菜单看起来像
- 家
- 博客
- 消息
- 特征
- 比赛——
- 比较1
- 比较2
Comp1 和 Comp2 是从单独站点上的数据库中提取的。它们只是指向外部站点的链接,因此唯一相关的值是“Comp Title”和“Comp URL”
我班的主要方法是:
function start_el(&$output, $item, $depth, $args)
{
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
$class_names = ' class="'. esc_attr( $class_names ) . '"';
$output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';
$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 ) .'"' : '';
$prepend = '<strong>';
$append = '</strong>';
$description = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : '';
if($depth != 0)
{
$description = $append = $prepend = "";
}
if($item->title == 'Competitions')
{
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
$item_output .= $description.$args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
$this->loopComps($output , $args);
}
else
{
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
$item_output .= $description.$args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
}
然后loopComps方法是:(getGalleryComps()拉入动态内容)
function loopComps($output , $args)
{
$openComps = $this->getGalleryComps();
foreach($openComps as $comp)
{
$item = new StdClass;
$item->ID = 9999;
$item->post_author = 5;
$item->post_date = '2012-11-16 10:48:44';
$item->post_date_gmt = '2012-11-16 10:48:44';
$item->title = $comp['competition_name'];
$item->post_type = 'nav_menu_item';
$item->post_name = $comp['competition_name'];
$item->post_title = $comp['competition_name'];
$item->post_excerpt = $comp['competition_name'];
$item->guid = $comp['competition_name'];
$item->url = 'http://www.mycomps';
$item->post_status = 'publish';
$item->post_parent = 0;
$item->filter = 'raw';
$item->menu_item_parent = '6845';
$item->object_id = '99999';
$item->object = 'custom';
$item->type = 'custom';
$item->classes = array(null , 'menu-item' , 'menu-item-type-custom' , 'menu-item-object-custom');
$item->menu_order = 6;
return $this->start_el($output, $item, 1, $args);
}
}
这一切似乎都很好,希望 $item 永远不会附加到实际菜单上。如果我在导航菜单循环期间打印出 $items,我可以看到我创建的“伪帖子”的动态内容在那里,它永远不会附加到菜单上。
有没有更简单的注入菜单项的方法?
更新 1:
我已将 loopComps 方法调整为:
function loopComps($output)
{
$openComps = $this->getGalleryComps();
$output .= '<ul>';
foreach( $openComps as $openComp )
{
$output .= '<li><a href='.$openComp->url.'>'.$openComp['competition_name]'].'</a></li>';
}
$output .= '</ul>';
return $output;
}
由于这确实更有意义,但不能解决问题,因此数据在那里,但从未显示在菜单中。