WordPress.org

Make WordPress Core

Ticket #16075: 16075.5.diff

File 16075.5.diff, 5.9 KB (added by ericlewis, 9 years 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 );