Make WordPress Core


Ignore:
Timestamp:
03/22/2010 07:56:16 PM (15 years ago)
Author:
nacin
Message:

Various bug fixes and improvements to menu management. props ptahdunbar, see #11817.

File:
1 edited

Legend:

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

    r13748 r13802  
    1313require_once( 'admin.php' );
    1414
     15// Load all the nav menu interface functions
     16require_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );
     17
    1518// Permissions Check
    1619if ( ! current_user_can('switch_themes') )
     
    3841add_thickbox();
    3942
    40 // Load all the nav menu interface functions
    41 require_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );
    42 
    4343// Container for any messages displayed to the user
    4444$messages_div = '';
     
    5858
    5959        if ( is_nav_menu($nav_menu_selected_id) ) {
    60             wp_delete_nav_menu( $nav_menu_selected_id );
    61             $messages_div = '<div id="message" class="updated fade below-h2"><p>' . __('Menu successfully deleted.') . '</p></div>';
    62             $nav_menu_selected_id = 0;
     60            $delete_nav_menu = wp_delete_nav_menu( $nav_menu_selected_id );
     61           
     62            if ( is_wp_error($delete_nav_menu) ) {
     63                $messages_div = '<div id="message" class="error"><p>' . $delete_nav_menu->get_error_message() . '</p></div>';
     64            } else {
     65                $messages_div = '<div id="message" class="updated"><p>' . __('The menu has been successfully deleted.') . '</p></div>';
     66                $nav_menu_selected_id = 0; // Reset the selected menu
     67            }
     68            unset( $delete_nav_menu );
    6369        }
    6470        break;
     
    7682
    7783                    if ( is_wp_error( $add_nav_menu ) ) {
    78                         $messages_div = '<div id="message" class="error fade below-h2"><p>' . $add_nav_menu->get_error_message() . '</p></div>';
     84                        $messages_div = '<div id="message" class="error"><p>' . $add_nav_menu->get_error_message() . '</p></div>';
    7985                    } else {
    8086                        $nav_menu_selected_id = $add_nav_menu->term_id;
    8187                        $nav_menu_selected_title = $add_nav_menu->name;
    82                         $messages_div = '<div id="message" class="updated fade below-h2"><p>' . sprintf( __('The <strong>%s</strong> menu has been successfully created.'), esc_html( $add_nav_menu->name ) ) . '</p></div>';
     88                        $messages_div = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been successfully created.'), $add_nav_menu->name ) . '</p></div>';
    8389                    }
    8490                } else {
    85                     $messages_div = '<div id="message" class="error fade below-h2"><p>' . __('Please enter a valid menu name.') . '</p></div>';
     91                    $messages_div = '<div id="message" class="error"><p>' . __('Please enter a valid menu name.') . '</p></div>';
    8692                }
    87                 unset($add_nav_menu);
     93                unset( $add_nav_menu );
    8894            }
    8995        } else {
     96           
     97            // @todo wrap this into wp_update_nav_menu_object();
    9098            if ( isset($_POST['menu-name']) ) {
    9199                $old_nav_menu = get_term( $nav_menu_selected_id, 'nav_menu', ARRAY_A );
     
    93101                $new_nav_menu = wp_update_term( $nav_menu_selected_id, 'nav_menu', $args );
    94102            }
    95 
     103           
    96104            // Update menu items
    97             $update_nav_items = isset( $_POST['li-count'] ) ? (int) $_POST['li-count'] : 0;
     105           
     106            // @todo: wrap update logic into wp_update_nav_menu();
     107            $update_count = isset( $_POST['li-count'] ) ? (int) $_POST['li-count'] : 0;
    98108            $update_nav_menu = is_nav_menu( $nav_menu_selected_id );
    99109
    100110            if ( !is_wp_error($update_nav_menu) ) {
    101111                $menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID') );
    102                 $parent_menu_ids = array();
    103 
     112               
    104113                // Loop through all POST variables
    105                 for ( $k = 0; $k < $update_nav_items; $k++ ) {
     114                for ( $k = 0; $k < $update_count; $k++ ) {
     115                   
     116                    // Menu item title can't be blank
     117                    if ( '' == $_POST['menu-item-title'][$k] )
     118                        continue;
     119                   
    106120                    $menu_item_db_id       = isset( $_POST['menu-item-db-id'][$k] )       ? $_POST['menu-item-db-id'][$k]       : 0;
    107121                    $menu_item_object_id   = isset( $_POST['menu-item-object-id'][$k] )   ? $_POST['menu-item-object-id'][$k]   : 0;
     122                    $menu_item_object      = isset( $_POST['menu-item-object'][$k] )      ? $_POST['menu-item-object'][$k]      : '';
    108123                    $menu_item_parent_id   = isset( $_POST['menu-item-parent-id'][$k] )   ? $_POST['menu-item-parent-id'][$k]   : 0;
    109124                    $menu_item_position    = isset( $_POST['menu-item-position'][$k] )    ? $_POST['menu-item-position'][$k]    : 0;
     
    114129                    $menu_item_description = isset( $_POST['menu-item-description'][$k] ) ? $_POST['menu-item-description'][$k] : '';
    115130                    $menu_item_attr_title  = isset( $_POST['menu-item-attr-title'][$k] )  ? $_POST['menu-item-attr-title'][$k]  : '';
    116                     $menu_item_target      = isset( $_POST['menu-item-target'][$k] )      ? $_POST['menu-item-target'][$k]      : 0;
     131                    $menu_item_target      = isset( $_POST['menu-item-target'][$k] )      ? $_POST['menu-item-target'][$k]      : '_self';
    117132                    $menu_item_classes     = isset( $_POST['menu-item-classes'][$k] )     ? $_POST['menu-item-classes'][$k]     : '';
    118133                    $menu_item_xfn         = isset( $_POST['menu-item-xfn'][$k] )         ? $_POST['menu-item-xfn'][$k]         : '';
    119134
    120                     // Menu item title can't be blank
    121                     if ( '' == $menu_item_title )
    122                         continue;
    123 
    124                     // Populate the menu item
    125                     $post = array( 'post_status' => 'publish', 'post_type' => 'nav_menu_item', 'post_author' => $user_ID,
    126                         'ping_status' => 0, 'post_parent' => $menu_item_parent_id, 'menu_order' => $menu_item_position,
    127                         'post_excerpt' => $menu_item_attr_title, 'tax_input' => array( 'nav_menu' => $update_nav_menu->name ),
    128                         'post_content' => $menu_item_description, 'post_title' => $menu_item_title );
    129 
     135                    // Populate the menu item object
     136                    $post = array(
     137                        'post_status' => 'publish', 'post_type' => 'nav_menu_item', 'ping_status' => 0,
     138                        'post_author' => $user_ID, 'tax_input' => array( 'nav_menu' => $update_nav_menu->name ),
     139                        'post_title' => $menu_item_title, 'post_excerpt' => $menu_item_attr_title,
     140                        'post_parent' => $menu_item_parent_id, 'menu_order' => $menu_item_position,
     141                        'post_content' => $menu_item_description,
     142                    );
     143                   
    130144                    // New menu item
    131145                    if ( $menu_item_db_id == 0 ) {
    132146                        $menu_item_db_id = wp_insert_post( $post );
    133                     } elseif ( isset( $menu_items[$menu_item_db_id] ) ) {
     147                   
     148                    // Update existing menu item
     149                    } elseif ( isset($menu_items[$menu_item_db_id]) || ( 'custom' == $menu_item_type && 0 != $menu_item_db_id ) ) {
    134150                        $post['ID'] = $menu_item_db_id;
    135151                        wp_update_post( $post );
    136152                        unset( $menu_items[$menu_item_db_id] );
    137153                    }
    138                     $parent_menu_ids[$k] = $menu_item_db_id;
    139 
    140                     // @todo sanitize type append and ID.
    141                     update_post_meta( $menu_item_db_id, 'menu_item_type', $menu_item_type );
    142                     update_post_meta( $menu_item_db_id, 'menu_item_append', $menu_item_append );
    143                     update_post_meta( $menu_item_db_id, 'menu_item_object_id', $menu_item_object_id );
    144                     update_post_meta( $menu_item_db_id, 'menu_item_target', sanitize_key($menu_item_target) );
     154
     155                    update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key($menu_item_type) );
     156                    update_post_meta( $menu_item_db_id, '_menu_item_object_id', (int) $menu_item_object_id );
     157                    update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($menu_item_object) );
     158                    update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($menu_item_target) );
    145159                    // @todo handle sanitizing multiple classes separated by whitespace.
    146                     update_post_meta( $menu_item_db_id, 'menu_item_classes', sanitize_html_class($menu_item_classes) );
    147                     update_post_meta( $menu_item_db_id, 'menu_item_xfn', sanitize_html_class($menu_item_xfn) );
     160                    update_post_meta( $menu_item_db_id, '_menu_item_classes', sanitize_html_class($menu_item_classes) );
     161                    update_post_meta( $menu_item_db_id, '_menu_item_xfn', sanitize_html_class($menu_item_xfn) );
    148162
    149163                    // @todo: only save custom link urls.
    150                     update_post_meta( $menu_item_db_id, 'menu_item_url', esc_url_raw( $menu_item_url ) );
     164                    update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($menu_item_url) );
    151165                }
    152166
     
    157171                    }
    158172                }
    159                 $messages_div = '<div id="message" class="updated fade below-h2"><p>' . __('The menu has been updated.') . '</p></div>';
     173               
     174                do_action( 'wp_update_nav_menu', $nav_menu_selected_id );
     175               
     176                $messages_div = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been updated.'), $update_nav_menu->name ) . '</p></div>';
     177                unset( $update_nav_menu, $update_count, $menu_items );
    160178            }
    161179        }
     
    191209}
    192210
     211// Create Menu Metabox
     212add_meta_box( 'create-menu', __('Create Menu'), 'wp_nav_menu_create_metabox', 'nav-menus', 'side', 'core' );
     213
    193214// The user has no menus.
    194215if ( !is_nav_menu( $nav_menu_selected_id ) ) {
    195     if ( current_theme_supports('nav-menus') ) {
    196         $messages_div = '<div id="message" class="updated"><p>' . __('You do not have any menus. Create a new menu.') . '</p></div>';
    197     } else {
    198         $messages_div = '<div id="message" class="error"><p>' . __('The current theme does not support menus.') . '</p></div>';
    199     }
     216    $messages_div = '<div id="message" class="updated"><p>' . __('You do not have any menus. Create a new menu.') . '</p></div>';
     217   
     218// The theme supports menus
     219} elseif ( current_theme_supports('nav-menus') ) {
     220   
     221    // Register nav menu metaboxes
     222    add_meta_box( 'manage-menu', __( 'Menu Settings' ), 'wp_nav_menu_manage_menu_metabox', 'nav-menus', 'side', 'high', array( $nav_menu_selected_id, $nav_menu_selected_title ) );
     223    wp_nav_menu_metaboxes_setup();
     224
     225// The theme does not support menus
    200226} else {
    201     add_meta_box( 'manage-menu', __( 'Menu Settings' ), 'wp_nav_menu_manage_menu_metabox', 'menus', 'side', 'high', array( $nav_menu_selected_id, $nav_menu_selected_title ) );
     227    remove_meta_box( 'create-menu', 'nav-menus', 'side' );
     228    $messages_div = '<div id="message" class="error"><p>' . __('The current theme does not support menus.') . '</p></div>';
    202229}
    203230
     
    211238    <div class="hide-if-js error"><p><?php _e('You do not have JavaScript enabled in your browser. Please enable it to access the Menus functionality.'); ?></p></div>
    212239
    213     <?php if ( !empty($nav_menus) && count($nav_menus) > 1 ) : ?>
     240    <?php if ( !empty($nav_menus) && count($nav_menus) > 1 && current_theme_supports('nav-menus') ) : ?>
    214241    <ul class="subsubsub">
    215242        <?php
     
    227254
    228255    <div id="menu-management" class="metabox-holder has-right-sidebar">
    229         <form id="update-nav-menu" onsubmit="wp_update_post_data();" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
     256        <form id="update-nav-menu" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
    230257            <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
    231258            <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>
    232259            <?php wp_nonce_field( 'update-nav_menu' ); ?>
    233260            <input type="hidden" name="action" value="update" />
    234             <input type="hidden" name="li-count" id="li-count" value="0" />
     261            <input type="hidden" name="li-count" id="li-count" value="-1" />
    235262            <input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
    236 
     263            <input type="hidden" id="hidden-metaboxes" value="<?php echo wp_initial_nav_menu_meta_boxes(); ?>" />
    237264            <div id="post-body">
    238265                <div id="post-body-content">
    239                     <?php if ( is_nav_menu($nav_menu_selected_id) ) : ?>
     266                    <?php if ( is_nav_menu($nav_menu_selected_id) && current_theme_supports('nav-menus') ) : ?>
    240267                        <div id="menu-container" class="postbox">
    241268                            <h3 class="hndle"><?php echo esc_html( $nav_menu_selected_title ); ?></h3>
    242269                            <div class="inside">
    243 
    244270                                <?php echo wp_get_nav_menu( array( 'context' => 'backend', 'menu' => $nav_menu_selected_id ) ); ?>
    245 
    246271                            </div><!-- /.inside -->
    247272                        <!-- /#nav-menu-canvas .postbox-->
    248273                        </div>
    249                         <script type="text/javascript">
    250                             wp_update_post_data();
    251                         </script>
    252274                    <?php endif; ?>
    253275                </div><!-- /#post-body-content-->
     
    255277            <div id="menu-settings-column" class="inner-sidebar">
    256278
    257                 <?php do_meta_boxes( 'menus', 'side', null ); ?>
     279                <?php do_meta_boxes( 'nav-menus', 'side', null ); ?>
    258280
    259281            </div><!-- /#menu-settings-column -->
Note: See TracChangeset for help on using the changeset viewer.