WordPress.org

Make WordPress Core

Ticket #12959: 12959.diff

File 12959.diff, 2.3 KB (added by nacin, 5 years ago)
  • nav-menu.php

     
    208208                                $object = get_taxonomy( $menu_item->object ); 
    209209                                $menu_item->append = $object->singular_label; 
    210210                                $menu_item->url = get_term_link( (int) $menu_item->object_id, $menu_item->object ); 
     211                                if ( is_wp_error( $menu_item->url ) ) 
     212                                        $menu_item->url = ''; 
    211213 
    212214                        } else { 
    213215                                $menu_item->append = __('Custom'); 
     
    273275 
    274276                        $menu_item->title = $menu_item->name; 
    275277                        $menu_item->url = get_term_link( $menu_item, $menu_item_object ); 
     278                        if ( is_wp_error( $menu_item->url ) ) 
     279                                $menu_item->url = ''; 
    276280                        $menu_item->target = ''; 
    277281                        $menu_item->attr_title = ''; 
    278282                        $menu_item->description = ''; 
     
    283287         
    284288        return apply_filters( 'wp_setup_nav_menu_item', $menu_item, $menu_item_type, $menu_item_object ); 
    285289} 
     290 
     291/** 
     292 * Internal function that deletes nav menu items 
     293 * if the object has been deleted elsewhere. 
     294 * 
     295 * It removes any instances of that object from all nav menus. 
     296 * 
     297 * @since 3.0.0 
     298 **/ 
     299function _wp_delete_nav_menu_item( $term_or_post_id, $tt_id = null, $taxonomy = null ) { 
     300        if ( empty( $taxonomy ) && $post = get_post( $term_or_post_id ) && $post->post_type == 'nav_menu_item' ) 
     301                return; 
     302        $nav_menus = wp_get_nav_menus(); 
     303        if ( empty( $nav_menus ) ) 
     304                return; 
     305        foreach ( $nav_menus as $nav_menu ) { 
     306                $menu_items = wp_get_nav_menu_items( $nav_menu->term_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID') ); 
     307                if ( empty( $menu_items ) ) 
     308                        continue; 
     309                foreach ( $menu_items as $menu_item ) { 
     310                        $object_type = get_post_meta( $menu_item->ID, '_menu_item_type', true ); 
     311                        if ( ! in_array( $object_type, array( 'post_type', 'taxonomy' ) ) ) 
     312                                continue; 
     313                        $object_id = get_post_meta( $menu_item->ID, '_menu_item_object_id', true ); 
     314                        if ( $object_id != $term_or_post_id ) 
     315                                continue; 
     316                        if ( 'taxonomy' == $object_type && ! empty( $taxonomy ) || 'post_type' == $object_type && empty( $taxonomy ) ) { 
     317                                wp_delete_post( $menu_item->ID, true ); 
     318                                return; 
     319                        } 
     320                } 
     321        } 
     322} 
     323add_action( 'deleted_term', '_wp_delete_nav_menu_item', 10, 3 ); 
     324add_action( 'deleted_post', '_wp_delete_nav_menu_item' ); 
     325add_action( 'trashed_post', '_wp_delete_nav_menu_item' ); 
    286326?> 
     327 No newline at end of file