Make WordPress Core

Changeset 45891


Ignore:
Timestamp:
08/25/2019 09:31:43 PM (4 years ago)
Author:
SergeyBiryukov
Message:

Menus: In wp_setup_nav_menu_item() and Walker_Nav_Menu_Edit::start_el(), check if the post or term associated with the menu item still exists to avoid a PHP notice.

If the associated post or term no longer exists, mark the menu item as invalid.

Props mehulkaklotar, kamrankhorsandi, cristiano.zanca, SergeyBiryukov.
Fixes #31703.

Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/class-walker-nav-menu-edit.php

    r45697 r45891  
    7272
    7373        $original_title = false;
     74
    7475        if ( 'taxonomy' == $item->type ) {
    75             $original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
    76             if ( is_wp_error( $original_title ) ) {
    77                 $original_title = false;
     76            $original_object = get_term( (int) $item->object_id, $item->object );
     77            if ( $original_object && ! is_wp_error( $original_title ) ) {
     78                $original_title = $original_object->name;
    7879            }
    7980        } elseif ( 'post_type' == $item->type ) {
    8081            $original_object = get_post( $item->object_id );
    81             $original_title  = get_the_title( $original_object->ID );
     82            if ( $original_object ) {
     83                $original_title = get_the_title( $original_object->ID );
     84            }
    8285        } elseif ( 'post_type_archive' == $item->type ) {
    8386            $original_object = get_post_type_object( $item->object );
  • trunk/src/wp-includes/nav-menu.php

    r45723 r45891  
    820820                }
    821821
    822                 $menu_item->url = get_permalink( $menu_item->object_id );
    823 
    824822                $original_object = get_post( $menu_item->object_id );
    825                 /** This filter is documented in wp-includes/post-template.php */
    826                 $original_title = apply_filters( 'the_title', $original_object->post_title, $original_object->ID );
     823
     824                if ( $original_object ) {
     825                    $menu_item->url = get_permalink( $original_object->ID );
     826                    /** This filter is documented in wp-includes/post-template.php */
     827                    $original_title = apply_filters( 'the_title', $original_object->post_title, $original_object->ID );
     828                } else {
     829                    $menu_item->url      = '';
     830                    $original_title      = '';
     831                    $menu_item->_invalid = true;
     832                }
    827833
    828834                if ( '' === $original_title ) {
    829835                    /* translators: %d: ID of a post */
    830                     $original_title = sprintf( __( '#%d (no title)' ), $original_object->ID );
     836                    $original_title = sprintf( __( '#%d (no title)' ), $menu_item->object_id );
    831837                }
    832838
    833                 $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
     839                $menu_item->title = ( '' === $menu_item->post_title ) ? $original_title : $menu_item->post_title;
    834840
    835841            } elseif ( 'post_type_archive' == $menu_item->type ) {
    836842                $object = get_post_type_object( $menu_item->object );
    837843                if ( $object ) {
    838                     $menu_item->title      = '' == $menu_item->post_title ? $object->labels->archives : $menu_item->post_title;
     844                    $menu_item->title      = ( '' === $menu_item->post_title ) ? $object->labels->archives : $menu_item->post_title;
    839845                    $post_type_description = $object->description;
    840846                } else {
     847                    $post_type_description = '';
    841848                    $menu_item->_invalid   = true;
    842                     $post_type_description = '';
    843849                }
    844850
    845851                $menu_item->type_label = __( 'Post Type Archive' );
    846852                $post_content          = wp_trim_words( $menu_item->post_content, 200 );
    847                 $post_type_description = '' == $post_content ? $post_type_description : $post_content;
     853                $post_type_description = ( '' === $post_content ) ? $post_type_description : $post_content;
    848854                $menu_item->url        = get_post_type_archive_link( $menu_item->object );
     855
    849856            } elseif ( 'taxonomy' == $menu_item->type ) {
    850857                $object = get_taxonomy( $menu_item->object );
     
    856863                }
    857864
    858                 $term_url       = get_term_link( (int) $menu_item->object_id, $menu_item->object );
    859                 $menu_item->url = ! is_wp_error( $term_url ) ? $term_url : '';
    860 
    861                 $original_title = get_term_field( 'name', $menu_item->object_id, $menu_item->object, 'raw' );
    862                 if ( is_wp_error( $original_title ) ) {
    863                     $original_title = false;
     865                $original_object = get_term( (int) $menu_item->object_id, $menu_item->object );
     866
     867                if ( $original_object && ! is_wp_error( $original_object ) ) {
     868                    $menu_item->url = get_term_link( (int) $menu_item->object_id, $menu_item->object );
     869                    $original_title = $original_object->name;
     870                } else {
     871                    $menu_item->url      = '';
     872                    $original_title      = '';
     873                    $menu_item->_invalid = true;
    864874                }
    865                 $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
     875
     876                if ( '' === $original_title ) {
     877                    /* translators: %d: ID of a term */
     878                    $original_title = sprintf( __( '#%d (no title)' ), $menu_item->object_id );
     879                }
     880
     881                $menu_item->title = ( '' === $menu_item->post_title ) ? $original_title : $menu_item->post_title;
    866882
    867883            } else {
Note: See TracChangeset for help on using the changeset viewer.