为带自定义Walker子项的导航菜单项创建条件PHP时出现问题

时间:2019-06-25 作者:mira-fraiyo

我试图创建一个带有可点击下拉功能的导航菜单,但同时尽量减少脚本编写,因此我找到了一种通过不可见的输入框和CSS来实现这一点的方法。我唯一的问题是,我没有使用PHP的经验,让菜单加载正确的HTML非常令人沮丧(我花了很长时间才让自定义walker首先出现)。这就是我想要达到的效果-相同的默认WordPress菜单,但包含子菜单的菜单项略有不同:

<ul>
    <li>A menu item</li>
    <li>A menu item</li>
    <li>
    <input id="check-(item-id)" type="checkbox" />
    <label for="check-(item-id)">A menu item with children</label>
        <ul>
            <li>Child one</li>
            <li>Child two</li>
    </li>
    <li>A menu item</li>
</ul>
在我的功能中。php文件,我有以下内容:

<?php
/*---- Custom Menu Settings ----*/
function custom_menus() {
    $locations = array(
        "top-menu" => __( "Top Menu" ),
        "side-menu" => __( "Side Menu" ),
       );

    register_nav_menus( $locations );
    }

add_action( "init", "custom_menus" );

class Clickable_Dropdown_Walker extends Walker_Nav_Menu {
    // The code isn\'t even worth showing because I\'ve tried at least a dozen combinations and nothing\'s worked
    }
?>
最后,在我的侧边栏中。php我有:

<?php
if ( has_nav_menu( "side-menu" ) ) {
    wp_nav_menu( array( 
        "theme_location" => "side-menu", 
        "container_class" => "side-menu",
        "walker" => new Clickable_Dropdown_Walker() ) );
    }
?>
任何帮助都将不胜感激,谢谢!

2 个回复
SO网友:Joy Reynolds

我在我的主题中这样做了,所以您可以在这里查看整个代码:https://wordpress.org/themes/twenty8teen

我使用了标准的walker,并为“walker\\u nav\\u menu\\u start\\u el”添加了一个过滤器。当然,我也希望它能用于回退页面菜单,所以我克隆了标准walker并将调用添加到apply_filters 使用稍微不同的过滤器。

/**
 * For custom menu, adding an input and label for submenus.
 */
function twenty8teen_nav_menu_start_el( $item_output, $item, $depth, $args ) {
    $classes = empty( $item->classes ) ? array() : (array) $item->classes;
    if ( $classes && in_array( \'menu-item-has-children\', $classes ) ||
        in_array( \'page_item_has_children\', $classes) ) {
        $item_output .= \'<input type="checkbox" id="sub\' . $item->ID
            . \'"><label for="sub\' . $item->ID . \'"></label>\';
    }
    return $item_output;
}

/**
 * For page menu, adding an input and label for submenus.
 */
function twenty8teen_page_menu_start_el( $item_output, $page, $depth, $args ) {
    if ( isset( $args[\'pages_with_children\'][ $page->ID ] ) ) {
        $item_output .= \'<input type="checkbox" id="sub\' . $page->ID
            . \'"><label for="sub\' . $page->ID . \'"></label>\';
    }
    return $item_output;
}
add_filter( \'walker_page_menu_start_el\', \'twenty8teen_page_menu_start_el\', 9, 4);

SO网友:mira-fraiyo

我设法利用你所做的和其他资源想出了我自己的解决方案!代码简短而甜美:

class Clickable_Dropdown_Walker extends Walker_Nav_Menu {
    function start_el( &$output, $item, $item_output, $depth = 0, $args = array() ) {
        if( in_array( \'menu-item-has-children\', $item->classes ) ){
            $output .= \'<li class="menu-item-has-children"><input id="check-\' . $item->ID . \'" type="checkbox" />\'
                    . \'<label for="check-\' . $item->ID . \'">\' . $item->title . \'</label>\';
            }

        else {
            $output .= \'<li><a href="\' . $item->url . \'">\' . $item->title . \'</a>\';
            }
        }
    }
我必须确保在我的自定义菜单中启用了walker,并且WP Admin中的菜单被指定为“侧菜单”

谢谢你的帮助!!

相关推荐

使用admin-post.php的表单在提交后提供404

我正在为wordpress页面创建一个自定义表单,并使用admin post。php作为我的操作。然而,每当我尝试提交表单时,我都会得到404。以下是输出表单的代码:function output_email_verification() { $error = \'\'; if(isset($_COOKIE[\'rguroo_form_error\'])) { $error = $_COOKIE[\'rguroo_form_error\'