WordPress.org

Make WordPress Core

Ticket #16075: 16075_fase1.patch

File 16075_fase1.patch, 11.3 KB (added by raulillana, 11 years ago)

only post type archives implemented in fase1

  • wp-admin/admin-ajax.php

     
    751751                        ! empty( $menu_item_data['menu-item-object-id'] )
    752752                ) {
    753753                        switch( $menu_item_data['menu-item-type'] ) {
     754                                case 'post_type_archive' :
     755                                        $_object = get_post_type_object( $menu_item_data['menu-item-object'] );
     756                                break;
     757                               
    754758                                case 'post_type' :
    755759                                        $_object = get_post( $menu_item_data['menu-item-object-id'] );
    756760                                break;
  • wp-admin/includes/nav-menu.php

     
    5757                } elseif ( 'post_type' == $item->type ) {
    5858                        $original_object = get_post( $item->object_id );
    5959                        $original_title = $original_object->post_title;
     60                } elseif ( 'post_type_archive' == $item->type ) {
     61                        $original_title = $item->label;
    6062                }
    6163
    6264                $classes = array(
     
    368370        add_meta_box( 'add-custom-links', __('Custom Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' );
    369371        wp_nav_menu_post_type_meta_boxes();
    370372        wp_nav_menu_taxonomy_meta_boxes();
     373        wp_nav_menu_post_type_archives_meta_box();
    371374
    372375        // Register advanced menu items (columns)
    373376        add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns');
     
    452455}
    453456
    454457/**
     458 * Displays a metabox for any post type archive menu item.
     459 *
     460 * @since 3.0.0
     461 */
     462function wp_nav_menu_post_type_archives_meta_box() {
     463        $post_type_archives = get_post_types( array( 'show_in_nav_menus' => true, 'has_archive' => true ), 'object' );
     464
     465        if ( ! $post_type_archives )
     466                return;
     467
     468        add_meta_box( 'add-post-type-archives', 'Post Type Archives', 'wp_nav_menu_item_post_type_archives_meta_box', 'nav-menus', 'side', 'default', $post_type_archives );
     469}
     470
     471/**
    455472 * Displays a metabox for the nav menu theme locations.
    456473 *
    457474 * @since 3.0.0
     
    938955}
    939956
    940957/**
     958 * Displays a metabox for the post type archives menu item.
     959 *
     960 * @since 3.0.0
     961 *
     962 * @param string $object Not used.
     963 * @param string $post_type_archives_list The post type archives object.
     964 */
     965function wp_nav_menu_item_post_type_archives_meta_box( $object, $post_type_archives_list ) {
     966        global $_nav_menu_placeholder, $nav_menu_selected_id;
     967
     968        $post_type_name = 'posttype-archives';
     969
     970        // paginate browsing for large numbers of post objects
     971        $per_page = 50;
     972        $pagenum = isset( $_REQUEST[$post_type_name . '-tab'] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1;
     973        $offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0;
     974
     975        $walker = new Walker_Nav_Menu_Checklist;
     976
     977        $current_tab = 'all';
     978        if ( isset( $_REQUEST[$post_type_name . '-tab'] ) && in_array( $_REQUEST[$post_type_name . '-tab'], array('all', 'search') ) ) {
     979                $current_tab = $_REQUEST[$post_type_name . '-tab'];
     980        }
     981
     982        if ( ! empty( $_REQUEST['quick-search-' . $post_type_name] ) ) {
     983                $current_tab = 'search';
     984        }
     985
     986        $removed_args = array(
     987                'action',
     988                'customlink-tab',
     989                'edit-menu-item',
     990                'menu-item',
     991                'page-tab',
     992                '_wpnonce',
     993        );
     994
     995        foreach ( $post_type_archives_list['args'] as $post_type_archive ) {
     996                $post_type_archives[$post_type_archive->label] = $post_type_archive;
     997        }
     998       
     999        ?>
     1000        <div id="<?php echo $post_type_name; ?>" class="posttypediv">
     1001                <ul id="<?php echo $post_type_name; ?>-tabs" class="posttype-tabs add-menu-item-tabs">
     1002                        <?php /*<li <?php echo ( 'most-recent' == $current_tab ? ' class="tabs"' : '' ); ?>><a class="nav-tab-link" href="<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args))); ?>#tabs-panel-<?php echo $post_type_name; ?>-most-recent"><?php _e('Most Recent'); ?></a></li> */ ?>
     1003                        <li <?php echo ( 'all' == $current_tab ? ' class="tabs"' : '' ); ?>><a class="nav-tab-link" href="<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args))); ?>#<?php echo $post_type_name; ?>-all"><?php _e('View All'); ?></a></li>
     1004                        <li <?php echo ( 'search' == $current_tab ? ' class="tabs"' : '' ); ?>><a class="nav-tab-link" href="<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args))); ?>#tabs-panel-<?php echo $post_type_name; ?>-search"><?php _e('Search'); ?></a></li>
     1005                </ul>
     1006                <div class="tabs-panel <?php
     1007                        echo ( 'search' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );
     1008                ?>" id="tabs-panel-<?php echo $post_type_name; ?>-search">
     1009                        <?php
     1010                        if ( isset( $_REQUEST['quick-search-' . $post_type_name] ) ) {
     1011                                $searched = esc_attr( $_REQUEST['quick-search-' . $post_type_name] );
     1012                                $search_results = get_posts( array( 's' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC', ) );
     1013                        } else {
     1014                                $searched = '';
     1015                                $search_results = array();
     1016                        }
     1017                        ?>
     1018                        <p class="quick-search-wrap">
     1019                                <input type="text" class="quick-search input-with-default-title" title="<?php esc_attr_e('Search'); ?>" value="<?php echo $searched; ?>" name="quick-search-<?php echo $post_type_name; ?>" />
     1020                                <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />
     1021                                <?php submit_button( __( 'Search' ), 'quick-search-submit button-secondary hide-if-js', 'submit', false ); ?>
     1022                        </p>
     1023
     1024                        <ul id="<?php echo $post_type_name; ?>-search-checklist" class="list:<?php echo $post_type_name?> categorychecklist form-no-clear">
     1025                        <?php if ( ! empty( $search_results ) && ! is_wp_error( $search_results ) ) : ?>
     1026                                <?php
     1027                                $args['walker'] = $walker;
     1028                                echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args );
     1029                                ?>
     1030                        <?php elseif ( is_wp_error( $search_results ) ) : ?>
     1031                                <li><?php echo $search_results->get_error_message(); ?></li>
     1032                        <?php elseif ( ! empty( $searched ) ) : ?>
     1033                                <li><?php _e('No results found.'); ?></li>
     1034                        <?php endif; ?>
     1035                        </ul>
     1036                </div><!-- /.tabs-panel -->
     1037
     1038
     1039                <div id="<?php echo $post_type_name; ?>-all" class="tabs-panel tabs-panel-view-all <?php
     1040                        echo ( 'all' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );
     1041                ?>">
     1042                        <?php if ( ! empty( $page_links ) ) : ?>
     1043                                <div class="add-menu-item-pagelinks">
     1044                                        <?php echo $page_links; ?>
     1045                                </div>
     1046                        <?php endif; ?>
     1047                        <ul id="<?php echo $post_type_name; ?>checklist" class="list:<?php echo $post_type_name?> categorychecklist form-no-clear">
     1048                                <?php
     1049                                $args['walker'] = $walker;
     1050
     1051                                $checkbox_items = walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $post_type_archives), 0, (object) $args );
     1052
     1053                                if ( 'all' == $current_tab && ! empty( $_REQUEST['selectall'] ) ) {
     1054                                        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
     1055                                }
     1056
     1057                                echo $checkbox_items;
     1058                                ?>
     1059                        </ul>
     1060                        <?php if ( ! empty( $page_links ) ) : ?>
     1061                                <div class="add-menu-item-pagelinks">
     1062                                        <?php echo $page_links; ?>
     1063                                </div>
     1064                        <?php endif; ?>
     1065                </div><!-- /.tabs-panel -->
     1066
     1067
     1068                <p class="button-controls">
     1069                        <span class="list-controls">
     1070                                <a href="<?php
     1071                                        echo esc_url(add_query_arg(
     1072                                                array(
     1073                                                        $post_type_name . '-tab' => 'all',
     1074                                                        'selectall' => 1,
     1075                                                ),
     1076                                                remove_query_arg($removed_args)
     1077                                        ));
     1078                                ?>#<?php echo $post_type_name; ?>" class="select-all"><?php _e('Select All'); ?></a>
     1079                        </span>
     1080
     1081                        <span class="add-to-menu">
     1082                                <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />
     1083                                <input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-post-type-menu-item" id="submit-<?php echo $post_type_name; ?>" />
     1084                        </span>
     1085                </p>
     1086
     1087        </div><!-- /.posttypediv -->
     1088        <?php
     1089}
     1090
     1091
     1092/**
    9411093 * Save posted nav menu item data.
    9421094 *
    9431095 * @since 3.0.0
  • wp-includes/nav-menu-template.php

     
    358358                        $active_parent_object_ids[] = (int) $menu_item->post_parent;
    359359                        $active_object = $menu_item->object;
    360360
     361                // if the menu item corresponds to the currently-queried post type archive object
     362                } elseif ( 'post_type_archive' == $menu_item->type && $wp_query->is_post_type_archive ) {
     363                        $current_url = untrailingslashit( ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
     364                        $item_url = untrailingslashit( strpos( $menu_item->url, '#' ) ? substr( $menu_item->url, 0, strpos( $menu_item->url, '#' ) ) : $menu_item->url );
     365                        $_indexless_current = untrailingslashit( preg_replace( '/index.php$/', '', $current_url ) );
     366
     367                        if ( in_array( $item_url, array( $current_url, $_indexless_current ) ) ) {
     368                                $classes[] = 'current-menu-item';
     369                                $menu_items[$key]->current = true;
     370                               
     371                                $_anc_id = (int) $menu_item->db_id;
     372                               
     373                                while(
     374                                        ( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&
     375                                        ! in_array( $_anc_id, $active_ancestor_item_ids )
     376                                ) {
     377                                        $active_ancestor_item_ids[] = $_anc_id;
     378                                }
     379
     380                                $active_parent_item_ids[] = (int) $menu_item->menu_item_parent;
     381                                $active_parent_object_ids[] = (int) $menu_item->post_parent;
     382                                $active_object = $menu_item->object;
     383                        }
     384
    361385                // if the menu item corresponds to the currently-requested URL
    362386                } elseif ( 'custom' == $menu_item->object ) {
    363387                        $current_url = untrailingslashit( ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
  • wp-includes/nav-menu.php

     
    576576                                $original_title = get_term_field( 'name', $menu_item->object_id, $menu_item->object, 'raw' );
    577577                                $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
    578578
     579                        } elseif ( 'post_type_archive' == $menu_item->type ) {
     580                                $object = get_post_type_object( $menu_item->object );
     581                                $menu_item->type_label = __('Post Type Archive');
     582                                $menu_item->title = $object->label;
     583                                $menu_item->url = get_post_type_archive_link( $object->name );
     584
    579585                        } else {
    580586                                $menu_item->type_label = __('Custom');
    581587                                $menu_item->title = $menu_item->post_title;
     
    627633                $menu_item->description = get_term_field( 'description', $menu_item->term_id, $menu_item->taxonomy );
    628634                $menu_item->classes = array();
    629635                $menu_item->xfn = '';
     636        } elseif ( isset( $menu_item->has_archive ) ) { // post type or taxonomy archive items
     637                $menu_item->ID = 0;
     638                $menu_item->db_id = 0;
     639                $menu_item->menu_item_parent = 0;
     640                $menu_item->object_id = -1; // must be different from 0
     641                $menu_item->post_parent = 0;
     642                $menu_item->type = 'post_type_archive';
    630643
     644                $menu_item->object = $menu_item->label;
     645                $menu_item->type_label = 'Post Type Archive';
     646
     647                $menu_item->title = $menu_item->label;
     648                $menu_item->url = get_post_type_archive_link( $menu_item->label );
     649                $menu_item->target = '';
     650                $menu_item->attr_title = '';
     651                $menu_item->description = '';
     652                $menu_item->classes = array();
     653                $menu_item->xfn = '';
    631654        }
    632655
    633656        return apply_filters( 'wp_setup_nav_menu_item', $menu_item );