Wordpressのメニューにデータを入力するために、動的な(WP以外の)コンテンツを取得しようとしています。このために、ここに示すようにウォーカークラスを拡張しました。
http://www.kriesi.at/archives/improve-your-wordpress-navigation-menu-output
だから私のメニューは次のようになります
- 家
- ブログ
- ニュース
- 特徴
- 大会-
- Comp1
- Comp2
Comp1とComp2が別のサイトのDBからプルされる場合。これらは外部サイトへのリンクにすぎないため、関連する値は「CompTitle」と「CompURL」のみです。
私のクラス内の主なメソッドは次のとおりです。
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が実際のメニューに添付されないことを期待してください。navメニューループ中に$itemsを印刷すると、「psuedo Post」を作成した動的コンテンツがそこにあることがわかりますが、メニューに添付されることはありません。
メニュー項目を挿入する簡単な方法はありますか?
更新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;
}
これははるかに理にかなっていますが、問題を解決しないため、データはそこにありますが、メニューに表示されることはありません。