5

I am having trouble understanding this error and I've not come across it before, please could someone help?

Strict Standards: Declaration of wp_bootstrap_navwalker::start_lvl() should be compatible with Walker_Nav_Menu::start_lvl(&$output, $depth = 0, $args = Array) in .../wp-content/themes/flat-portfolio/wp_bootstrap_navwalker.php on line 143

The wp_bootstrap_navwalker.php code is as follows:

<?php

/**
 * Class Name: wp_bootstrap_navwalker
 * GitHub URI: https://github.com/twittem/wp-bootstrap-navwalker
 * Description: A custom WordPress nav walker class to implement the Twitter Bootstrap 2.3.2 navigation style in a custom theme using the WordPress built in menu manager.
 * Version: 1.4.3
 * Author: Edward McIntyre - @twittem
 * License: GPL-2.0+
 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
 */

class wp_bootstrap_navwalker extends Walker_Nav_Menu {

    /**
     * @see Walker::start_lvl()
     * @since 3.0.0
     *
     * @param string $output Passed by reference. Used to append additional content.
     * @param int $depth Depth of page. Used for padding.
     */
    function start_lvl( &$output, $depth ) {
        $indent = str_repeat( "\t", $depth );
        $output    .= "\n$indent<ul class=\"dropdown-menu\">\n";        
    }

    /**
     * @see Walker::start_el()
     * @since 3.0.0
     *
     * @param string $output Passed by reference. Used to append additional content.
     * @param object $item Menu item data object.
     * @param int $depth Depth of menu item. Used for padding.
     * @param int $current_page Menu item ID.
     * @param object $args
     */

    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        global $wp_query;
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        /**
         * Dividers & Headers
         * ==================
         * Determine whether the item is a Divider, Header, or regular menu item.
         * To prevent errors we use the strcasecmp() function to so a comparison
         * that is not case sensitive. The strcasecmp() function returns a 0 if 
         * the strings are equal.
         */
        if (strcasecmp($item->title, 'divider') == 0) {
            // Item is a Divider
            $output .= $indent . '<li class="divider">';
        } else if (strcasecmp($item->title, 'divider-vertical') == 0) {
            // Item is a Vertical Divider
            $output .= $indent . '<li class="divider-vertical">';
        } else if (strcasecmp($item->title, 'nav-header') == 0) {
            // Item is a Header
            $output .= $indent . '<li class="nav-header">' . esc_attr( $item->attr_title );
        } else {

            $class_names = $value = '';
            $classes = empty( $item->classes ) ? array() : (array) $item->classes;
            $classes[] = ($item->current) ? 'active' : '';
            $classes[] = 'menu-item-' . $item->ID;
            $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );

            if ($args->has_children && $depth > 0) {
                $class_names .= ' dropdown-submenu';
            } else if($args->has_children && $depth === 0) {
                $class_names .= ' dropdown';
            }

            $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';

            $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
            $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';

            $output .= $indent . '<li' . $id . $value . $class_names .'>';

            $attributes = ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
            $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
            $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';
            $attributes .= ($args->has_children)        ? ' data-toggle="dropdown" data-target="#" class="dropdown-toggle"' : '';

            $item_output = $args->before;

            /**
             * Glyphicons
             * ===========
             * Since the the menu item is NOT a Divider or Header we check the see
             * if there is a value in the attr_title property. If the attr_title
             * property is NOT null we apply it as the class name for the glyphicon.
             */
            if(! empty( $item->attr_title )){
                $item_output .= '<a'. $attributes .'><i class="' . esc_attr( $item->attr_title ) . '"></i>&nbsp;';
            } else {
                $item_output .= '<a'. $attributes .'>';
            }

            $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
            $item_output .= ($args->has_children && $depth == 0) ? ' <span class="caret"></span></a>' : '</a>';
            $item_output .= $args->after;

            $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
        }
    }

    /**
     * Traverse elements to create list from elements.
     *
     * Display one element if the element doesn't have any children otherwise,
     * display the element and its children. Will only traverse up to the max
     * depth and no ignore elements under that depth. 
     *
     * This method shouldn't be called directly, use the walk() method instead.
     *
     * @see Walker::start_el()
     * @since 2.5.0
     *
     * @param object $element Data object
     * @param array $children_elements List of elements to continue traversing.
     * @param int $max_depth Max depth to traverse.
     * @param int $depth Depth of current element.
     * @param array $args
     * @param string $output Passed by reference. Used to append additional content.
     * @return null Null on failure with no changes to parameters.
     */

    function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
        if ( !$element ) {
            return;
        }

        $id_field = $this->db_fields['id'];

        //display this element
        if ( is_object( $args[0] ) ) {
           $args[0]->has_children = ! empty( $children_elements[$element->$id_field] );
        }

        parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output);
    }
}

?>

I'm calling the walker by putting the following code in my header.php

<?php 
    wp_nav_menu( array(
        'menu'       => 'top_menu',
        'depth'      => 2,
        'container'  => false,
        'menu_class' => 'nav',
        'fallback_cb' => 'wp_page_menu',
        //Process nav menu using our custom nav walker
        'walker' => new wp_bootstrap_navwalker())
    );
?>

and registering the function in functions.php:

// Register Custom Navigation Walker
require_once('wp_bootstrap_navwalker.php');

3 Answers 3

15

It means that the declaration of the start_lvl method in wp_bootstrap_navwalker should match the declaration of the method in Walker_Nav_Menu. It doesn't.

function start_lvl( &$output, $depth ) {

VS.

function start_lvl( &$output, $depth = 0, $args = array() ) {

Make the arguments match exactly and you should be fine.

And you should probably not use the wp_ prefix as yours is not Core code.

0
0

Your class definition line which is:

class description_walker extends Walker_Nav_Menu { function start_el(&$output, $item, $depth, $args)

Should be modified to include the new $id field (and assign defaults to your other method parameters:

class description_walker extends Walker_Nav_Menu { function start_el(&$output, $item, $depth, $args, $id = 0)

You also need to update the apply filter line to include the new $id field:

apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args, $id);
-2

I don't know if you've gotten a solution to that but, I had an error with that too and what I did was entirely different from this. The solution I had was quite straightforward (although not sure if it is conventional).

Step #1

Navigate row 172 of the "wp_bootstrap_navwalker.php" file (which should look like this)

function fallback( $args ) {
    if ( current_user_can( 'manage_options' ) ) {

Step #2

Change that line with the code below and you should have a working nav menu

public static function fallback( $args ) {
    if ( current_user_can( 'manage_options' ) ) {

That is about it... I do hope it works for you!

1
  • 3
    This is very wrong. The parent class’ method is not static, so you’ve just added another error. Update your PHP version and read the error messages.
    – fuxia
    Commented Oct 2, 2013 at 12:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.