Php 添加自定义<;李>;到Wordpress导航菜单

Php 添加自定义<;李>;到Wordpress导航菜单,php,wordpress,Php,Wordpress,我无法完全理解自定义Walker在worpress中的工作原理: theme的home.php中的代码(实际上所有代码都包含在其他文件中,以避免弄乱HTML)如下所示: /** * Contains wordpress function with array with parameters * @return string HTML output */ function show_main_navigation() { return wp_nav_menu( arr

我无法完全理解自定义Walker在worpress中的工作原理:

theme的home.php中的代码(实际上所有代码都包含在其他文件中,以避免弄乱HTML)如下所示:

/**
 * Contains wordpress function with array with parameters
 * @return string HTML output
 */
function show_main_navigation() {
    return wp_nav_menu(
        array(
            'theme_location' => 'header-menu',
            'echo' => false,
            'depth' => '-1',
            'walker' => new Last_Item_Walker()
        )
    );
}
class Last_Item_Walker extends Walker_Nav_Menu { 

    function end_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\t", $depth);
        $output .= '<li class="spec"><a href="#" title="title">title</a></li>'; // my custom <li>
        $output .= "$indent</ul>\n";
    }
}
沃克看起来像这样:

/**
 * Contains wordpress function with array with parameters
 * @return string HTML output
 */
function show_main_navigation() {
    return wp_nav_menu(
        array(
            'theme_location' => 'header-menu',
            'echo' => false,
            'depth' => '-1',
            'walker' => new Last_Item_Walker()
        )
    );
}
class Last_Item_Walker extends Walker_Nav_Menu { 

    function end_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\t", $depth);
        $output .= '<li class="spec"><a href="#" title="title">title</a></li>'; // my custom <li>
        $output .= "$indent</ul>\n";
    }
}
class Last\u Item\u Walker扩展了Walker\u导航菜单{
函数end_lvl(&$output,$depth=0,$args=array()){
$indent=str\u repeat(“\t”,$depth);
$output.='
  • ;//我的自定义
  • $output.=“$indent\n”; } }
  • 覆盖方法就是不起作用

    如果我尝试覆盖其他方法,例如:

    class Last_Item_Walker extends Walker_Nav_Menu { 
    
        function end_el( &$output, $item, $depth = 0, $args = array() ) {
                $output .= "<br>"; // for demonstration
            $output .= "</li>\n";
        }
    }
    
    class Last\u Item\u Walker扩展了Walker\u导航菜单{
    函数end_el(&$output,$item,$depth=0,$args=array()){
    $output.=“
    ”;//用于演示 $output.=“\n”; } }
    这一个有效,添加了br标签,但这不是我想要的,我想在/ul之前定制最后一个li


    有人能帮我吗?

    如果您不太担心IE8及以下版本,可以使用:last child选择器

    li.spec:last-child{
        color: red;
    }
    

    如果您担心IE8及以下版本,您可以使用a使其正常工作。

    如果您不太担心IE8及以下版本,您可以使用:last child选择器

    li.spec:last-child{
        color: red;
    }
    

    如果你对IE8和更少的问题感到烦恼,你可以使用一个过滤器使其工作。

    好的,使用过滤器更容易

    /**
     * Hardcodes shop item in navigation
     * @param string $items HTML with navigation items
     * @param object $args navigation menu arguments
     * @return string all navigation items HTML
     */
    function new_nav_menu_items($items, $args) {
        if($args->theme_location == 'header-menu'){
           $shop_item = '<li class="spec"><a href="#" title="title">title</a></li>';
           $items = $items . $shop_item;
        }
    
        return $items;
    }
    add_filter('wp_nav_menu_items', 'new_nav_menu_items', 10, 2);
    
    /**
    *导航中的商店商品硬编码
    *@param string$items带导航项的HTML
    *@param object$args导航菜单参数
    *@return string所有导航项HTML
    */
    功能新建导航菜单项($items,$args){
    如果($args->theme\u location=='标题菜单'){
    $shop_item='
  • ; $items=$items.$shop\u项目; } 退回$items; } 添加过滤器(“wp\U导航菜单项”,“新建导航菜单项”,10,2);
    好的,使用过滤器更容易

    /**
     * Hardcodes shop item in navigation
     * @param string $items HTML with navigation items
     * @param object $args navigation menu arguments
     * @return string all navigation items HTML
     */
    function new_nav_menu_items($items, $args) {
        if($args->theme_location == 'header-menu'){
           $shop_item = '<li class="spec"><a href="#" title="title">title</a></li>';
           $items = $items . $shop_item;
        }
    
        return $items;
    }
    add_filter('wp_nav_menu_items', 'new_nav_menu_items', 10, 2);
    
    /**
    *导航中的商店商品硬编码
    *@param string$items带导航项的HTML
    *@param object$args导航菜单参数
    *@return string所有导航项HTML
    */
    功能新建导航菜单项($items,$args){
    如果($args->theme\u location=='标题菜单'){
    $shop_item='
  • ; $items=$items.$shop\u项目; } 退回$items; } 添加过滤器(“wp\U导航菜单项”,“新建导航菜单项”,10,2);
    经过更多的测试后,我发现end_lvl只对子菜单有效,而不是菜单。但问题仍然存在,我是如何为顶级lvl菜单做到这一点的。经过更多的测试,我发现end_lvl只在子菜单上工作,而不是菜单上。但问题仍然存在,我如何为顶级lvl菜单做到这一点。我知道我可以用CSS做到这一点,在WorpAddress admin中甚至有向菜单项添加自定义类的选项,但不幸的是,我需要用wordpress代码而不是CSS来做这件事。我明白了。所以当你说定制时,你需要对最后一个元素做什么?你需要添加一个
    吗?我知道我可以用CSS来做,在WorpAddress admin中甚至有向菜单项添加自定义类的选项,但不幸的是我需要用wordpress代码而不是CSS来做。我明白了。所以当你说定制时,你需要对最后一个元素做什么?您需要添加一个
    吗?很高兴您对它进行了排序@Roo。很高兴您对它进行了排序@Roo。