Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I need to add line breaks to the nav menu item titles. I didn't realize this was a problem as when I am logged in as a Super Admin, I can add <br/> just fine, but apparently regular-level admins cannot.

I've read over this post Custom Menus Description Stripping HTML Tags

but I'm fairly convinced the tags are being stripped on on save/update, so I am not immediately seeing how a Custom Walker is the solution, but my brain is pretty well shot today, so it might be obvious.

There also doesn't seem to be any sanitation happening in wp_save_nav_menu_items() or wp_update_nav_menu_item().

share|improve this question
    
This must be specific to multisites since an admin on a single-site install can use the <br/> tag... In any case menu items are post types, so I think the sanitisation is in sanitize_post_field() (specifically title_save_pre - see source). Unfortunately there's no way to circumvent that for just menu titles - so your posted solution is probably the best. –  Stephen Harris Jul 10 '13 at 8:49
    
Yeah I thought I remembered that you could... so never realized it was a problem until a client complained. Thanks for the source link. –  helgatheviking Jul 10 '13 at 13:41
add comment

2 Answers 2

Following the hint from @Rarst regarding safe characters here's what I ended up doing:

function wpa_105883_menu_title_markup( $title, $id ){
    if ( is_nav_menu_item ( $id ) ){
        $title = preg_replace( '/#BR#/', '<br/>', $title );
    }
    return $title;
}
add_filter( 'the_title', 'wpa_105883_menu_title_markup', 10, 2 );

Edit: Also per Rarst's comment I've replaced the preg_replace with str_ireplace

function wpa_105883_menu_title_markup( $title, $id ){
    if ( is_nav_menu_item ( $id ) ){
        $title = str_ireplace( "#BR#", "<br/>", $title );
    }
    return $title;
}
add_filter( 'the_title', 'wpa_105883_menu_title_markup', 10, 2 );
share|improve this answer
1  
Given that it's not really regular expression, I'd just use generic str_ireplace() for replace. Also didn't know is_nav_menu_item(), cool. :) –  Rarst Jul 10 '13 at 0:08
1  
I just discovered is_nav_menu_item() while reading through some code for this question. It was new to me too. Thanks for your help! –  helgatheviking Jul 10 '13 at 0:38
add comment

Sans turning sanitization logic inside out or coding custom interface for it... I would just designate some safe character for it (for example pipe |) and replace it with break tag on output.

It passes through the_title filter in walker, would only need to timely add and remove the filter so it does not affect titles elsewhere.

share|improve this answer
    
Yup! That's exactly what I just discovered. I ended up using #BR# as a safe character. Will post. –  helgatheviking Jul 10 '13 at 0:03
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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