2017-02-22 20 views
1

後面我在使用wordpress walker class在菜單li後追加模板零件,但是它將模板零件注入整個菜單結構的上方。以下是我已經有了模板零件沒有追加到菜單元素

class bt_menu_walker extends Walker_Nav_Menu 
{ 
    public function end_el(&$output, $item, $depth = 0, $args = array()) { 
     $dir = get_template_directory() . '/partials'; 
     // Get file names from 'partials' directory 
     $scan = scandir($dir); 
     // Get css class names from menu elements 
     $classes = empty($item->classes) ? array() : (array) $item->classes; 
     foreach($scan as $file) { 
      // Only grab files 
      if (!is_dir("$file")) { 
       // Just raw filenames 
       $strip_extension = pathinfo($file, PATHINFO_FILENAME); 
       // Match css class with filenames 
       if ($classes[0] == $strip_extension) { 
        // Append template part after closing </li> 
        $output .= "</li>" . get_template_part('partials/' . $strip_extension); 
       } 
      } 
     } 
    } 
} 

正如我測試過它,當我追加其它的HTML $output它直接顯示閉幕</li>元素之後預期。爲什麼get_template_part呈現在菜單結構之上?

回答

0

由於模板部件直接向瀏覽器輸出回聲,並且菜單位於$輸出中,並且稍後會輸出。 (that`s可能真的不好英語)

打開輸出緩衝,以獲得模板部分的輸出:

if ($classes[0] == $strip_extension) { 
    // Append template part after closing </li> 
    $output .= "</li>"; 
    ob_start(); 
    get_template_part('partials/' . $strip_extension); 
    $output .= ob_get_clean(); 
} 

解釋見ob_start()ob_get_clean()


順便說一句。 A <ul>元素應僅包含<li>元素。也許這不是您額外輸出的最佳位置。