2

我正在使用 wordpress walker 类在 menu 之后附加模板部分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在菜单结构上方渲染?

4

1 回答 1

0

因为模板部分直接输出回显到浏览器,菜单在$output中,稍后会输出。(那可能真的很糟糕的英语)

打开输出缓冲以获取模板部分的输出:

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()


顺便一提。一个<ul>元素应该只包含<li>元素。也许这不是您额外输出的最佳位置。

于 2017-02-22T06:45:37.650 回答