Before the questions roll in... I am using Advanced Custom Fields to add a selection field in the menu items to select a font awesome icon which is added before the title. The coding works great except for one small issue. If you want to create a menu item say a home link with only an icon and leave the title blank wordpress got in their mind that it would be a good idea to delete the menu item if the title is blank.
I am looking for a way to modify the save menu function to prevent the deletion of the item containing a blank title. This would have to be a function that could reside within the functions.php file as it will be built into our premium theme.
Before the questions roll in... I am using Advanced Custom Fields to add a selection field in the menu items to select a font awesome icon which is added before the title. The coding works great except for one small issue. If you want to create a menu item say a home link with only an icon and leave the title blank wordpress got in their mind that it would be a good idea to delete the menu item if the title is blank.
I am looking for a way to modify the save menu function to prevent the deletion of the item containing a blank title. This would have to be a function that could reside within the functions.php file as it will be built into our premium theme.
Share Improve this question asked Feb 21, 2018 at 22:27 JamesJames 2053 silver badges12 bronze badges1 Answer
Reset to default 0It took me forever to find a solution to this. I thought I would release my code here for anyone that needs an answer to this question. I had to use two functions in order to solve the problem.
The first function replaces the blank label with
to prevent the deletion of the menu item.
add_action('wp_update_nav_menu', 'blank_menu_items');
function blank_menu_items($nav_menu_selected_id) {
$navmenudata = json_decode(stripslashes($_POST['nav-menu-data']),true);
$k=0;
foreach((array) $navmenudata as $data){
if(
isset($data['name']) &&
isset($data['value']) &&
strpos($data['name'], 'menu-item-title') !==false
){
if(trim($data['value']) == ''){
$data['value'] = ' ';
$navmenudata[$k] = $data;
}
}
$k++;
}
if(isset($_POST['menu-item-title'])){
$k=0;
foreach($_POST['menu-item-title'] as $key => $value){
if(trim($value) == ''){
$value = ' ';
$_POST['menu-item-title'][$key] = $value;
}
$k++;
}
}
}
This second function simply removes the
when the menu is rendered.
add_filter('wp_nav_menu_objects', 'blank_menu_display', 10, 2);
function blank_menu_display( $items, $args ){
foreach( $items as &$item ) {
$item->title = str_replace(' ','',$item->title);
}
return $items;
}
These were the basic functions and I did not include the ACF code to make it easier to understand.