Hey,
Nice plugin, but I found some faulty logic regarding Menu HTML IDs versus Menu Object IDs. In wps_custom_nav_menu_items() (line 188), the first check is for:
if ( $args['menu_id'] ){
$menu_id = $args['menu_id'];
}
However, the menu_id argument is the string for the ID attribute of the menu's top-level UL element. If not set in wp_nav_menu, I believe it defaults to the menu object's (database) ID. However, this is not a reliable way to determine the menu object's ID, which is what is required, since it can easily be set in the wp_nav_menu() call (as in my case). If that occurs, the ID is not properly determined and the remaining plugin logic fails.
The second bit of logic is a much better solution:
if ( $args['theme_location'] ) {
$menu_locations = get_nav_menu_locations();
$menu_id = $menu_locations[$args['theme_location']];
}
because if the theme_location parameter is set (as it almost always should be), this is a reliable way to determine the menu object ID.
I'm not convinced that the $args['menu_id'] check should be there at all, unless it is accompanied by an is_numeric check (which still has the potential to be unreliable), but I propose this rearranged logic:
// Get menu id
//Check the theme location first
if ( $args['theme_location'] ) {
$menu_locations = get_nav_menu_locations();
$menu_id = $menu_locations[$args['theme_location']];
}
//Try the menu ID, if it's a number
else if ( isset( $args['menu_id'] ) && is_numeric( $args['menu_id'] ) ){
$menu_id = $args['menu_id'];
}
else {
$nav_item_db_id = $sorted_menu_items[1]->ID;
$nav_menu = wp_get_object_terms( $nav_item_db_id, 'nav_menu' );
$menu_id = $nav_menu[0]->term_id;
}
Hope that helps! :)
Chris
http://wordpress.org/extend/plugins/wp-custom-menu-filter-plugin/