0

I've found a custom Menu Walker on the Internet that was perfect for my multilevel menu. It fitted almost like a glove. I've made some tiny improvements but now I need to limit the number of characters inside the output:

<li><a href="http:\\..."><span>Blah Blah Blah Blah Blah Blah Blah Blah Blah</span></a></li>

I'm having some problems to understand the way it really works so that i can limit it by PHP or by CSS. None of the approaches seems to work (certainly all by my fault...).

Can you please help me? Here's the code of the extend Walker:

class CSS_Menu_Walker extends Walker {

var $db_fields = array('parent' => 'menu_item_parent', 'id' => 'db_id');

function start_lvl(&$output, $depth = 0, $args = array()) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n$indent<ul>\n";
}

function end_lvl(&$output, $depth = 0, $args = array()) {
    $indent = str_repeat("\t", $depth);
    $output .= "$indent</ul>\n";
}

function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {

    global $wp_query;
    $indent = ($depth) ? str_repeat("\t", $depth) : '';
    $class_names = $value = '';
    $classes = empty($item->classes) ? array() : (array) $item->classes;

    /* Add active class */
    if (in_array('current-menu-item', $classes)) {
        $classes[] = 'active';
        unset($classes['current-menu-item']);
    }

    /* Check for children */
    $children = get_posts(array('post_type' => 'nav_menu_item', 'nopaging' => true, 'numberposts' => 1, 'meta_key' => '_menu_item_menu_item_parent', 'meta_value' => $item->ID));
    if (!empty($children)) {
        $classes[] = 'has-sub';
    }

    $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args));
    $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 . $indent .  '<li'. $value . '>';

    $attributes  = ! empty($item->attr_title) ? ' title="'  . esc_attr($item->attr_title) .'"' : '';
    $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       ) .'"' : '';

    $item_output = $args->before;
    $item_output .= '<a'. $attributes .'><span>';
    $item_output .= $args->link_before . apply_filters('the_title', $item->title, $item->ID) . $args->link_after;
    $item_output .= '</span></a>';
    $item_output .= $args->after;

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

Thank you!!!

  • Could you reduce your code to the part that you have issue with, not all of it? Also this sounds more like question on PHP string manipulation and might be unrelated to WP, such are better asked at Stack Overflow. – Rarst Sep 3 '15 at 18:55
1

change this line:

$item_output .= $args->link_before . apply_filters('the_title', $item->title, $item->ID) . $args->link_after;

to:

$item_output .= $args->link_before . apply_filters('the_title', substr($item->title, 0, 10), $item->ID) . $args->link_after;

That limits the character to 10. Please note this substr($item->title, 0, 10).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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