Publish: 2019-10-27 | Modify: 2019-10-27
LayUI is a front-end framework developed by "Xianxin". It is easy to use and similar to the well-known Bootstrap framework. Currently, most of the open source projects by Xiaoz are developed using the LayUI framework. However, there are relatively few developers using LayUI to develop WordPress themes, so there are some pitfalls. For example, WordPress uses the wp_nav_menu()
function to output the menu structure, which is inconsistent with the menu structure of LayUI, resulting in very messy styles. Here is a solution:
Add the following code to the functions.php
file in your theme directory:
#-----------------------------------------------------------------#
# Modify the li tag of wp_nav_menu
#-----------------------------------------------------------------#
class new_walker extends Walker_Nav_Menu{
// Modify the style of the first level ul tag
function start_lvl( &$output, $depth = 0, $args = array() ){
if( $depth == 0 ){
$output .= '<ul class="layui-nav-child">';
}else{
$output .= '<ul class="layui-nav-child">';
}
}
function end_lvl( &$output, $depth = 0, $args = array() ){
if( $depth == 0 ){
$output .= "</ul>";
}else{
$output .= '</ul>';
}
}
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
$t = '';
$n = '';
} else {
$t = "\t";
$n = "\n";
}
$indent = ( $depth ) ? str_repeat( $t, $depth ) : '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$classes[] = 'menu-item-' . $item->ID;
$args = apply_filters( 'nav_menu_item_args', $args, $item, $depth );
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
if( $depth == 0 ){
$class_names .= ' layui-nav-item'; // Add Layui style
}
if ( in_array( 'current-menu-item', $classes ) ){
$class_names .= ' layui-this'; // Add current style
}
$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
$id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $item->ID, $item, $args, $depth );
$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
$output .= $indent . '<li' . $id . $class_names . '>';
$atts = array();
$atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : '';
$atts['target'] = ! empty( $item->target ) ? $item->target : '';
if ( '_blank' === $item->target && empty( $item->xfn ) ) {
$atts['rel'] = 'noopener noreferrer';
} else {
$atts['rel'] = $item->xfn;
}
$atts['href'] = ! empty( $item->url ) ? $item->url : '';
$atts['aria-current'] = $item->current ? 'page' : '';
$atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );
$attributes = '';
foreach ( $atts as $attr => $value ) {
if ( ! empty( $value ) ) {
$value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
$attributes .= ' ' . $attr . '="' . $value . '"';
}
}
$title = apply_filters( 'the_title', $item->title, $item->ID );
$title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth );
$item_output = $args->before;
$item_output .= '<a' . $attributes . '>';
$item_output .= $args->link_before . $title . $args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
}
Use the following code to call the menu and generate the LayUI style:
<?php
wp_nav_menu( array(
'theme_location' => '', // Navigation alias
'menu_class' => 'layui-nav', // Apply layui-nav style
'walker' => new new_walker(), // Use the refactored code
));
?>
The theme_location
parameter is empty, which means it calls the first main menu by default. However, if the menu you registered is not the main menu, the navigation bar may not be displayed, so you need to modify it to the alias of your registered menu. For example:
<?php
wp_nav_menu( array(
'theme_location' => 'header-menu', // Navigation alias
'menu_class' => 'layui-nav', // Apply layui-nav style
'walker' => new new_walker(), // Use the refactored code
));
?>
Where header-menu
is the alias of your registered menu.
Some content in this article is referenced from: WordPress Output LayUI Menu Structure
I come from China and I am a freelancer. I specialize in Linux operations, PHP, Golang, and front-end development. I have developed open-source projects such as Zdir, ImgURL, CCAA, and OneNav.