WordPress.org

Make WordPress Core

Changeset 46309


Ignore:
Timestamp:
09/25/2019 09:51:00 PM (4 weeks ago)
Author:
whyisjake
Message:

Menus: Duplicate Page Entry in View All Pages when generating a Menu

Simplifies the interface in menu creation.

Fixes [37782]
Props garrett-eclipse, mdgl, birgire, xkon, audrasjb, pento, girlieworks

Location:
trunk/src/wp-admin
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/css/nav-menus.css

    r46242 r46309  
    412412    display: inline-block;
    413413    margin-top: -4px;
     414}
     415
     416.menu-item-title .post-state {
     417    font-weight: 600;
    414418}
    415419
  • trunk/src/wp-admin/includes/class-walker-nav-menu-checklist.php

    r45932 r46309  
    9595            /** This filter is documented in wp-includes/post-template.php */
    9696            $title = apply_filters( 'the_title', $item->post_title, $item->ID );
    97             if ( ! empty( $item->front_or_home ) && _x( 'Home', 'nav menu home label' ) !== $title ) {
    98                 /* translators: %s: Front page title. */
    99                 $title = sprintf( _x( 'Home: %s', 'nav menu front page title' ), $title );
    100             }
    10197        }
    10298
    10399        $output .= isset( $title ) ? esc_html( $title ) : esc_html( $item->title );
     100
     101        if ( empty( $item->label ) && isset( $item->post_type ) && 'page' === $item->post_type ) {
     102            // Append post states.
     103            $output .= _post_states( $item, false );
     104        }
     105
    104106        $output .= '</label>';
    105107
  • trunk/src/wp-admin/includes/nav-menu.php

    r46240 r46309  
    355355    }
    356356
     357    /*
     358     * If we're dealing with pages, let's prioritize the Front Page,
     359     * Posts Page and Privacy Policy Page at the top of the list.
     360     */
     361    $important_pages = array();
     362    if ( 'page' == $post_type_name ) {
     363        $suppress_page_ids = array();
     364
     365        // Insert Front Page or custom Home link.
     366        $front_page = 'page' == get_option( 'show_on_front' ) ? (int) get_option( 'page_on_front' ) : 0;
     367
     368        $front_page_obj = null;
     369        if ( ! empty( $front_page ) ) {
     370            $front_page_obj                = get_post( $front_page );
     371            $front_page_obj->front_or_home = true;
     372
     373            $important_pages[]   = $front_page_obj;
     374            $suppress_page_ids[] = $front_page_obj->ID;
     375        } else {
     376            $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval( $_nav_menu_placeholder ) - 1 : -1;
     377            $front_page_obj        = (object) array(
     378                'front_or_home' => true,
     379                'ID'            => 0,
     380                'object_id'     => $_nav_menu_placeholder,
     381                'post_content'  => '',
     382                'post_excerpt'  => '',
     383                'post_parent'   => '',
     384                'post_title'    => _x( 'Home', 'nav menu home label' ),
     385                'post_type'     => 'nav_menu_item',
     386                'type'          => 'custom',
     387                'url'           => home_url( '/' ),
     388            );
     389
     390            $important_pages[] = $front_page_obj;
     391        }
     392
     393        // Insert Posts Page.
     394        $posts_page = 'page' == get_option( 'show_on_front' ) ? (int) get_option( 'page_for_posts' ) : 0;
     395
     396        if ( ! empty( $posts_page ) ) {
     397            $posts_page_obj             = get_post( $posts_page );
     398            $posts_page_obj->posts_page = true;
     399
     400            $important_pages[]   = $posts_page_obj;
     401            $suppress_page_ids[] = $posts_page_obj->ID;
     402        }
     403
     404        // Insert Privacy Policy Page.
     405        $privacy_policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' );
     406
     407        if ( ! empty( $privacy_policy_page_id ) ) {
     408            $privacy_policy_page = get_post( $privacy_policy_page_id );
     409            if ( $privacy_policy_page instanceof WP_Post && 'publish' === $privacy_policy_page->post_status ) {
     410                $privacy_policy_page->privacy_policy_page = true;
     411
     412                $important_pages[]   = $privacy_policy_page;
     413                $suppress_page_ids[] = $privacy_policy_page->ID;
     414            }
     415        }
     416
     417        // Add suppression array to arguments for WP_Query.
     418        if ( ! empty( $suppress_page_ids ) ) {
     419            $args['post__not_in'] = $suppress_page_ids;
     420        }
     421    }
     422
    357423    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    358424    $get_posts = new WP_Query;
    359425    $posts     = $get_posts->query( $args );
     426
     427    // Only suppress and insert when more than just suppression pages available.
    360428    if ( ! $get_posts->post_count ) {
    361         echo '<p>' . __( 'No items.' ) . '</p>';
    362         return;
     429        if ( ! empty( $suppress_page_ids ) ) {
     430            unset( $args['post__not_in'] );
     431            $get_posts = new WP_Query;
     432            $posts     = $get_posts->query( $args );
     433        } else {
     434            echo '<p>' . __( 'No items.' ) . '</p>';
     435            return;
     436        }
     437    } elseif ( ! empty( $important_pages ) ) {
     438        $posts = array_merge( $important_pages, $posts );
    363439    }
    364440
     
    523599                $args['walker'] = $walker;
    524600
    525                 /*
    526                  * If we're dealing with pages, let's put a checkbox for the front
    527                  * page at the top of the list.
    528                  */
    529                 if ( 'page' == $post_type_name ) {
    530                     $front_page = 'page' == get_option( 'show_on_front' ) ? (int) get_option( 'page_on_front' ) : 0;
    531                     if ( ! empty( $front_page ) ) {
    532                         $front_page_obj                = get_post( $front_page );
    533                         $front_page_obj->front_or_home = true;
    534                         array_unshift( $posts, $front_page_obj );
    535                     } else {
    536                         $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval( $_nav_menu_placeholder ) - 1 : -1;
    537                         array_unshift(
    538                             $posts,
    539                             (object) array(
    540                                 'front_or_home' => true,
    541                                 'ID'            => 0,
    542                                 'object_id'     => $_nav_menu_placeholder,
    543                                 'post_content'  => '',
    544                                 'post_excerpt'  => '',
    545                                 'post_parent'   => '',
    546                                 'post_title'    => _x( 'Home', 'nav menu home label' ),
    547                                 'post_type'     => 'nav_menu_item',
    548                                 'type'          => 'custom',
    549                                 'url'           => home_url( '/' ),
    550                             )
    551                         );
    552                     }
    553                 }
    554 
    555601                $post_type = get_post_type_object( $post_type_name );
    556602
  • trunk/src/wp-admin/includes/template.php

    r46137 r46309  
    20632063
    20642064/**
    2065  * @param WP_Post $post
    2066  */
    2067 function _post_states( $post ) {
     2065 * Function to echo or return the Post States as HTML.
     2066 *
     2067 * @since 2.7.0
     2068 * @since 5.3.0 Adopted use of get_post_states
     2069 *
     2070 * @param WP_Post $post The post to retrieve states for.
     2071 * @param boolean $echo Optional. Whether to echo or return the Post States as an HTML string. Default true for echo.
     2072 *
     2073 * @return string|void Post States string when echo is false.
     2074 */
     2075function _post_states( $post, $echo = true ) {
     2076    $post_states        = get_post_states( $post );
     2077    $post_states_string = '';
     2078
     2079    if ( ! empty( $post_states ) ) {
     2080        $state_count = count( $post_states );
     2081        $i           = 0;
     2082
     2083        $post_states_string .= ' &mdash; ';
     2084        foreach ( $post_states as $state ) {
     2085            ++$i;
     2086            ( $i == $state_count ) ? $sep = '' : $sep = ', ';
     2087            $post_states_string          .= "<span class='post-state'>$state$sep</span>";
     2088        }
     2089    }
     2090
     2091    if ( $echo ) {
     2092        echo $post_states_string;
     2093    }
     2094
     2095    return $post_states_string;
     2096}
     2097
     2098/**
     2099 * Function to retrieve an array of Post States from a Post.
     2100 *
     2101 * @since 5.3.0
     2102 *
     2103 * @param WP_Post $post The post to retrieve states for.
     2104 *
     2105 * @return array $post_states The array of translated post states.
     2106 *
     2107 */
     2108function get_post_states( $post ) {
    20682109    $post_states = array();
    20692110    if ( isset( $_REQUEST['post_status'] ) ) {
     
    20742115
    20752116    if ( ! empty( $post->post_password ) ) {
    2076         $post_states['protected'] = __( 'Password protected' );
    2077     }
     2117        $post_states['protected'] = _x( 'Password protected', 'post status' );
     2118    }
     2119
    20782120    if ( 'private' == $post->post_status && 'private' != $post_status ) {
    2079         $post_states['private'] = __( 'Private' );
    2080     }
     2121        $post_states['private'] = _x( 'Private', 'post status' );
     2122    }
     2123
    20812124    if ( 'draft' === $post->post_status ) {
    20822125        if ( get_post_meta( $post->ID, '_customize_changeset_uuid', true ) ) {
    20832126            $post_states[] = __( 'Customization Draft' );
    20842127        } elseif ( 'draft' !== $post_status ) {
    2085             $post_states['draft'] = __( 'Draft' );
     2128            $post_states['draft'] = _x( 'Draft', 'post status' );
    20862129        }
    20872130    } elseif ( 'trash' === $post->post_status && get_post_meta( $post->ID, '_customize_changeset_uuid', true ) ) {
    2088         $post_states[] = __( 'Customization Draft' );
    2089     }
     2131        $post_states[] = _x( 'Customization Draft', 'post status' );
     2132    }
     2133
    20902134    if ( 'pending' == $post->post_status && 'pending' != $post_status ) {
    20912135        $post_states['pending'] = _x( 'Pending', 'post status' );
    20922136    }
     2137
    20932138    if ( is_sticky( $post->ID ) ) {
    2094         $post_states['sticky'] = __( 'Sticky' );
     2139        $post_states['sticky'] = _x( 'Sticky', 'post status' );
    20952140    }
    20962141
    20972142    if ( 'future' === $post->post_status ) {
    2098         $post_states['scheduled'] = __( 'Scheduled' );
     2143        $post_states['scheduled'] = _x( 'Scheduled', 'post status' );
    20992144    }
    21002145
    21012146    if ( 'page' === get_option( 'show_on_front' ) ) {
    21022147        if ( intval( get_option( 'page_on_front' ) ) === $post->ID ) {
    2103             $post_states['page_on_front'] = __( 'Front Page' );
     2148            $post_states['page_on_front'] = _x( 'Front Page', 'page label' );
    21042149        }
    21052150
    21062151        if ( intval( get_option( 'page_for_posts' ) ) === $post->ID ) {
    2107             $post_states['page_for_posts'] = __( 'Posts Page' );
     2152            $post_states['page_for_posts'] = _x( 'Posts Page', 'page label' );
    21082153        }
    21092154    }
    21102155
    21112156    if ( intval( get_option( 'wp_page_for_privacy_policy' ) ) === $post->ID ) {
    2112         $post_states['page_for_privacy_policy'] = __( 'Privacy Policy Page' );
     2157        $post_states['page_for_privacy_policy'] = _x( 'Privacy Policy Page', 'page label' );
    21132158    }
    21142159
     
    21222167     * @param WP_Post  $post        The current post object.
    21232168     */
    2124     $post_states = apply_filters( 'display_post_states', $post_states, $post );
    2125 
    2126     if ( ! empty( $post_states ) ) {
    2127         $state_count = count( $post_states );
    2128         $i           = 0;
    2129         echo ' &mdash; ';
    2130         foreach ( $post_states as $state ) {
    2131             ++$i;
    2132             ( $i == $state_count ) ? $sep = '' : $sep = ', ';
    2133             echo "<span class='post-state'>$state$sep</span>";
    2134         }
    2135     }
    2136 
     2169    return apply_filters( 'display_post_states', $post_states, $post );
    21372170}
    21382171
Note: See TracChangeset for help on using the changeset viewer.