WordPress.org

Make WordPress Core

Ticket #16075: 16075.5.diff

File 16075.5.diff, 5.9 KB (added by ericlewis, 13 months ago)

Fixes issues brought up in comment 50. Works properly with default permalinks as well as custom. In the menus admin screen, the CPT archive is now marked as "Archive," a new menu item type. Current menu item is set when on either an archives page for the post type or a single CPT page.

  • wp-includes/nav-menu-template.php

     
    372372                        $active_parent_object_ids[] = (int) $menu_item->post_parent; 
    373373                        $active_object = $menu_item->object; 
    374374 
     375                // if the menu item corresponds to a post type archive  
     376                } elseif ( 'archive' == $menu_item->type ) { 
     377                        if ( is_post_type_archive( $menu_item->object ) || is_singular( $menu_item->object ) ) { 
     378                                array_push( $classes, 'current-menu-item', 'current_page_item'); 
     379                        } 
     380 
    375381                // if the menu item corresponds to the currently-requested URL 
    376382                } elseif ( 'custom' == $menu_item->object ) { 
    377383                        $_root_relative_current = untrailingslashit( $_SERVER['REQUEST_URI'] ); 
  • wp-includes/post.php

     
    12461246                        add_rewrite_tag("%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name="); 
    12471247 
    12481248                if ( $args->has_archive ) { 
    1249                         $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive; 
     1249                        $args->archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive; 
    12501250                        if ( $args->rewrite['with_front'] ) 
    1251                                 $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; 
     1251                                $args->archive_slug = substr( $wp_rewrite->front, 1 ) . $args->archive_slug; 
    12521252                        else 
    1253                                 $archive_slug = $wp_rewrite->root . $archive_slug; 
     1253                                $args->archive_slug = $wp_rewrite->root . $args->archive_slug; 
    12541254 
    1255                         add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' ); 
     1255                        $wp_rewrite->add_rule( "{$args->archive_slug}/?$", "index.php?post_type=$post_type", 'top' ); 
    12561256                        if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) { 
    12571257                                $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; 
    1258                                 add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); 
    1259                                 add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); 
     1258                                $wp_rewrite->add_rule( "{$args->archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); 
     1259                                $wp_rewrite->add_rule( "{$args->archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); 
    12601260                        } 
    12611261                        if ( $args->rewrite['pages'] ) 
    1262                                 add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' ); 
     1262                                $wp_rewrite->add_rule( "{$args->archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' ); 
    12631263                } 
    12641264 
    12651265                add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $args->rewrite ); 
     
    14361436                'not_found' => array( __('No posts found.'), __('No pages found.') ), 
    14371437                'not_found_in_trash' => array( __('No posts found in Trash.'), __('No pages found in Trash.') ), 
    14381438                'parent_item_colon' => array( null, __('Parent Page:') ), 
    1439                 'all_items' => array( __( 'All Posts' ), __( 'All Pages' ) ) 
     1439                'all_items' => array( __( 'All Posts' ), __( 'All Pages' ) ), 
     1440                'items_archive' => array( __( 'Post Archive' ), __( 'Page Archive' ) ), 
    14401441        ); 
    14411442        $nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name']; 
    14421443 
  • wp-includes/nav-menu.php

     
    609609                                        $original_title = false; 
    610610                                $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title; 
    611611 
     612                        } elseif ( 'archive' == $menu_item->type ) { 
     613                                $menu_item->type_label = __('Archive'); 
     614                                $menu_item->title = $menu_item->post_title; 
     615                                $menu_item->url = get_post_type_archive_link( $menu_item->object ); 
    612616                        } else { 
    613617                                $menu_item->type_label = __('Custom'); 
    614618                                $menu_item->title = $menu_item->post_title; 
  • wp-admin/includes/ajax-actions.php

     
    861861                                case 'taxonomy' : 
    862862                                        $_object = get_term( $menu_item_data['menu-item-object-id'], $menu_item_data['menu-item-object'] ); 
    863863                                break; 
     864 
     865                                case 'archive' : 
     866                                        $_object = get_post_type_object( $menu_item_data['menu-item-object'] ); 
     867                                break; 
    864868                        } 
    865869 
    866870                        $_menu_items = array_map( 'wp_setup_nav_menu_item', array( $_object ) ); 
  • wp-admin/includes/nav-menu.php

     
    5959                } elseif ( 'post_type' == $item->type ) { 
    6060                        $original_object = get_post( $item->object_id ); 
    6161                        $original_title = $original_object->post_title; 
    62                 } 
     62                } elseif ( 'archive' == $item->type ) { 
     63                        $original_title = false; 
     64                } 
    6365 
    6466                $classes = array( 
    6567                        'menu-item menu-item-depth-' . $depth, 
     
    767769                                                        'url' => home_url('/'), 
    768770                                                ) ); 
    769771                                        } 
     772                                } elseif ( $post_type['args']->has_archive ) { 
     773                                        $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1; 
     774                                        array_unshift( $posts, (object) array( 
     775                                                'ID' => 0, 
     776                                                'object' => $post_type_name, 
     777                                                'object_id' => $_nav_menu_placeholder, 
     778                                                'post_content' => '', 
     779                                                'post_excerpt' => '', 
     780                                                'post_parent' => '', 
     781                                                'post_title' => $post_type['args']->labels->items_archive, 
     782                                                'post_type' => 'nav_menu_item', 
     783                                                'type' => 'archive', 
     784                                                'url' => site_url( $post_type['args']->archive_slug ), 
     785                                        ) ); 
    770786                                } 
    771787 
    772788                                $posts = apply_filters( 'nav_menu_items_'.$post_type_name, $posts, $args, $post_type );