WordPress.org

Make WordPress Core

Ticket #12959: 12959.diff

File 12959.diff, 2.3 KB (added by nacin, 8 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