[ Index ]

PHP Cross Reference of WordPress 3.0 beta 1

[ Index ]     [ Variables ]     [ Functions ]     [ Classes ]     [ Constants ]     [ Statistics ]

title

Body

[close]

/wp-admin/ -> nav-menus.php (source)

   1  <?php
   2  /**
   3   * WordPress Administration for Navigation Menus
   4   * Interface functions
   5   *
   6   * @version 2.0.0
   7   *
   8   * @package WordPress
   9   * @subpackage Administration
  10   */
  11  
  12  /** Load WordPress Administration Bootstrap */
  13  require_once ( 'admin.php' );
  14  
  15  // Load all the nav menu interface functions
  16  require_once ( ABSPATH . 'wp-admin/includes/nav-menu.php' );
  17  
  18  // Permissions Check
  19  if ( ! current_user_can('switch_themes') )
  20      wp_die( __( 'Cheatin&#8217; uh?' ));
  21  
  22  // Nav Menu CSS
  23  wp_admin_css( 'nav-menu' );
  24  
  25  // jQuery
  26  wp_enqueue_script( 'jquery' );
  27  wp_enqueue_script( 'jquery-ui-draggable' );
  28  wp_enqueue_script( 'jquery-ui-droppable' );
  29  wp_enqueue_script( 'jquery-ui-sortable' );
  30  wp_enqueue_script( 'jquery-autocomplete' );
  31  
  32  // Nav Menu functions
  33  wp_enqueue_script( 'nav-menu' );
  34  
  35  // Metaboxes
  36  wp_enqueue_script( 'common' );
  37  wp_enqueue_script( 'wp-lists' );
  38  wp_enqueue_script( 'postbox' );
  39  
  40  // Thickbox
  41  add_thickbox();
  42  
  43  // Container for any messages displayed to the user
  44  $messages_div = '';
  45  
  46  // Container that stores the name of the active menu
  47  $nav_menu_selected_title = '';
  48  
  49  // The menu id of the current menu being edited
  50  $nav_menu_selected_id = isset( $_REQUEST['menu'] ) ? (int) $_REQUEST['menu'] : 0;
  51  
  52  // Allowed actions: add, update, delete
  53  $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'edit';
  54  
  55  switch ( $action ) {
  56      case 'delete':
  57          check_admin_referer( 'delete-nav_menu-' . $nav_menu_selected_id );
  58  
  59          if ( is_nav_menu($nav_menu_selected_id) ) {
  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 );
  69          }
  70          break;
  71  
  72      case 'update':
  73          check_admin_referer( 'update-nav_menu' );
  74  
  75          // Add Menu
  76          if ( isset($_POST['create-menu-button']) ) {
  77              if ( current_theme_supports('nav-menus') || current_theme_supports('widgets') ) {
  78                  $add_nav_menu = esc_html( $_POST['create-menu-name'] );
  79  
  80                  if ( $add_nav_menu ) {
  81                      $add_nav_menu = wp_create_nav_menu( $add_nav_menu );
  82  
  83                      if ( is_wp_error( $add_nav_menu ) ) {
  84                          $messages_div = '<div id="message" class="error"><p>' . $add_nav_menu->get_error_message() . '</p></div>';
  85                      } else {
  86                          $nav_menu_selected_id = $add_nav_menu->term_id;
  87                          $nav_menu_selected_title = $add_nav_menu->name;
  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>';
  89                      }
  90                  } else {
  91                      $messages_div = '<div id="message" class="error"><p>' . __('Please enter a valid menu name.') . '</p></div>';
  92                  }
  93                  unset( $add_nav_menu );
  94              }
  95          } else {
  96  
  97              // @todo wrap this into wp_update_nav_menu_object();
  98              if ( isset($_POST['menu-name']) ) {
  99                  $old_nav_menu = get_term( $nav_menu_selected_id, 'nav_menu', ARRAY_A );
 100                  $args = array( 'name' => $_POST['menu-name'], 'slug' => null, 'description' => $old_nav_menu['description'], 'parent' => $old_nav_menu['parent'], );
 101                  $new_nav_menu = wp_update_term( $nav_menu_selected_id, 'nav_menu', $args );
 102              }
 103  
 104              // Update menu items
 105  
 106              // @todo: wrap update logic into wp_update_nav_menu();
 107              $update_count = isset( $_POST['li-count'] ) ? (int) $_POST['li-count'] : 0;
 108              $update_nav_menu = is_nav_menu( $nav_menu_selected_id );
 109  
 110              if ( !is_wp_error($update_nav_menu) ) {
 111                  $menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID') );
 112  
 113                  // Loop through all POST variables
 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  
 120                      $menu_item_db_id       = isset( $_POST['menu-item-db-id'][$k] )       ? $_POST['menu-item-db-id'][$k]       : 0;
 121                      $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]      : '';
 123                      $menu_item_parent_id   = isset( $_POST['menu-item-parent-id'][$k] )   ? $_POST['menu-item-parent-id'][$k]   : 0;
 124                      $menu_item_position    = isset( $_POST['menu-item-position'][$k] )    ? $_POST['menu-item-position'][$k]    : 0;
 125                      $menu_item_type        = isset( $_POST['menu-item-type'][$k] )        ? $_POST['menu-item-type'][$k]        : 'custom';
 126                      $menu_item_append      = isset( $_POST['menu-item-append'][$k] )      ? $_POST['menu-item-append'][$k]      : 'custom';
 127                      $menu_item_title       = isset( $_POST['menu-item-title'][$k] )       ? $_POST['menu-item-title'][$k]       : '';
 128                      $menu_item_url         = isset( $_POST['menu-item-url'][$k] )         ? $_POST['menu-item-url'][$k]         : '';
 129                      $menu_item_description = isset( $_POST['menu-item-description'][$k] ) ? $_POST['menu-item-description'][$k] : '';
 130                      $menu_item_attr_title  = isset( $_POST['menu-item-attr-title'][$k] )  ? $_POST['menu-item-attr-title'][$k]  : '';
 131                      $menu_item_target      = isset( $_POST['menu-item-target'][$k] )      ? $_POST['menu-item-target'][$k]      : '_self';
 132                      $menu_item_classes     = isset( $_POST['menu-item-classes'][$k] )     ? $_POST['menu-item-classes'][$k]     : '';
 133                      $menu_item_xfn         = isset( $_POST['menu-item-xfn'][$k] )         ? $_POST['menu-item-xfn'][$k]         : '';
 134  
 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  
 144                      // New menu item
 145                      if ( $menu_item_db_id == 0 ) {
 146                          $menu_item_db_id = wp_insert_post( $post );
 147  
 148                      // Update existing menu item
 149                      } elseif ( isset($menu_items[$menu_item_db_id]) || ( 'custom' == $menu_item_type && 0 != $menu_item_db_id ) ) {
 150                          $post['ID'] = $menu_item_db_id;
 151                          wp_update_post( $post );
 152                          unset( $menu_items[$menu_item_db_id] );
 153                      }
 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) );
 159                      // @todo handle sanitizing multiple classes separated by whitespace.
 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) );
 162  
 163                      // @todo: only save custom link urls.
 164                      update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($menu_item_url) );
 165                  }
 166  
 167                  // Remove menu items from the menu that weren't in $_POST
 168                  if ( !empty( $menu_items ) ) {
 169                      foreach ( array_keys( $menu_items ) as $menu_item_id ) {
 170                          wp_delete_post( $menu_item_id );
 171                      }
 172                  }
 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 );
 178              }
 179          }
 180          break;
 181  }
 182  
 183  // Get all nav menus
 184  $nav_menus = wp_get_nav_menus();
 185  
 186  // Get recently edited nav menu
 187  $recently_edited = get_user_option( 'nav_menu_recently_edited' );
 188  
 189  // If there was no recently edited menu, and $nav_menu_selected_id is a nav menu, update recently edited menu.
 190  if ( !$recently_edited && is_nav_menu($nav_menu_selected_id) ) {
 191      $recently_edited = $nav_menu_selected_id;
 192  
 193  // Else if $nav_menu_selected_id is not a menu, but $recently_edited is, grab that one.
 194  } elseif ( 0 == $nav_menu_selected_id && is_nav_menu($recently_edited) ) {
 195      $nav_menu_selected_id = $recently_edited;
 196  
 197  // Else try to grab the first menu from the menus list
 198  } elseif ( 0 == $nav_menu_selected_id && ! empty($nav_menus) ) {
 199      $nav_menu_selected_id = $nav_menus[0]->term_id;
 200  }
 201  
 202  // Update the user's setting
 203  if ( $nav_menu_selected_id != $recently_edited && is_nav_menu($nav_menu_selected_id) )
 204      update_user_meta( $current_user->ID, 'nav_menu_recently_edited', $nav_menu_selected_id );
 205  
 206  // If there's a menu, get it's name.
 207  if ( !$nav_menu_selected_title && $nav_menu_selected_title = is_nav_menu( $nav_menu_selected_id ) ) {
 208      $nav_menu_selected_title = $nav_menu_selected_title->name;
 209  }
 210  
 211  // Create Menu Metabox
 212  add_meta_box( 'create-menu', __('Create Menu'), 'wp_nav_menu_create_metabox', 'nav-menus', 'side', 'core' );
 213  
 214  // The user has no menus.
 215  if ( !is_nav_menu( $nav_menu_selected_id ) ) {
 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      // Register nav menu metaboxes
 221      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 ) );
 222      wp_nav_menu_metaboxes_setup();
 223  
 224  // The theme does not support menus but supports widgets
 225  } elseif ( current_theme_supports('widgets') ) {
 226      // Register nav menu metaboxes
 227      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 ) );
 228      wp_nav_menu_metaboxes_setup();
 229      $messages_div = '<div id="message" class="error"><p>' . __('The current theme does not natively support menus, but you can use the &#8220;Navigation Menu&#8221; widget to add any menus you create here to the theme&#8217;s sidebar.') . '</p></div>';
 230  
 231  // The theme supports neither menus nor widgets.
 232  } else {
 233      remove_meta_box( 'create-menu', 'nav-menus', 'side' );
 234      $messages_div = '<div id="message" class="error"><p>' . __('The current theme does not support menus.') . '</p></div>';
 235  }
 236  
 237  // Get the admin header
 238  require_once ( 'admin-header.php' );
 239  ?>
 240  <div class="wrap">
 241      <?php screen_icon(); ?>
 242      <h2><?php esc_html_e('Menus'); ?></h2>
 243      <?php /* OMGWTFBBQ */ ?><div class="error"><p><strong><?php _e('Beta Testers:') ?></strong> <?php _e('This feature is still under construction. You can try it out, but expect it to change in layout and functionality in the second beta release.'); ?></p></div>
 244      <?php echo $messages_div; ?>
 245      <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>
 246  
 247      <?php if ( !empty($nav_menus) && count($nav_menus) > 1 && ( current_theme_supports('nav-menus') || current_theme_supports('widgets') ) ) : ?>
 248      <ul class="subsubsub">
 249          <?php
 250              foreach ( $nav_menus as $_nav_menu ) {
 251                  $sep = end( $nav_menus ) == $_nav_menu ? '' : ' | ';
 252  
 253                  if ( $nav_menu_selected_id == $_nav_menu->term_id )
 254                      echo '<li><a href="'. admin_url( 'nav-menus.php?action=edit&amp;menu=' . esc_attr($_nav_menu->term_id) ) .'" class="current">'. esc_html( $_nav_menu->name ) .'</a>'. $sep .'</li>';
 255                  else
 256                      echo '<li><a href="'. admin_url( 'nav-menus.php?action=edit&amp;menu=' . esc_attr($_nav_menu->term_id) ) .'">'. esc_html( $_nav_menu->name ) .'</a>'. $sep .'</li>';
 257              }
 258          ?>
 259      </ul>
 260      <?php endif; ?>
 261  
 262      <div id="menu-management" class="metabox-holder has-right-sidebar">
 263          <form id="update-nav-menu" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
 264              <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
 265              <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>
 266              <?php wp_nonce_field( 'update-nav_menu' ); ?>
 267              <input type="hidden" name="action" value="update" />
 268              <input type="hidden" name="li-count" id="li-count" value="-1" />
 269              <input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
 270              <input type="hidden" id="hidden-metaboxes" value="<?php echo wp_initial_nav_menu_meta_boxes(); ?>" />
 271              <div id="post-body">
 272                  <div id="post-body-content">
 273                      <?php if ( is_nav_menu($nav_menu_selected_id) && ( current_theme_supports('nav-menus') || current_theme_supports('widgets') ) ) : ?>
 274                          <div id="menu-container" class="postbox">
 275                              <h3 class="hndle"><?php echo esc_html( $nav_menu_selected_title ); ?></h3>
 276                              <div class="inside">
 277                                  <?php echo wp_get_nav_menu( array( 'context' => 'backend', 'menu' => $nav_menu_selected_id ) ); ?>
 278                              </div><!-- /.inside -->
 279                          <!-- /#nav-menu-canvas .postbox-->
 280                          </div>
 281                      <?php endif; ?>
 282                  </div><!-- /#post-body-content-->
 283              </div><!--- /#post-body -->
 284              <div id="menu-settings-column" class="inner-sidebar">
 285  
 286                  <?php do_meta_boxes( 'nav-menus', 'side', null ); ?>
 287  
 288              </div><!-- /#menu-settings-column -->
 289          </form><!--/#update-nav-menu-->
 290          <br class="clear" />
 291      </div><!-- /.metabox-holder has-right-sidebar-->
 292  </div><!-- /.wrap-->
 293  
 294  <div id="menu-item-settings">
 295      <p class="description">
 296          <label for="edit-menu-item-title">
 297              <?php _e( 'Menu Title' ); ?><br />
 298              <input type="text" id="edit-menu-item-title" class="widefat" name="edit-menu-item-title" value="" tabindex="1" />
 299          </label>
 300      </p>
 301      <p class="description">
 302          <label for="edit-menu-item-url">
 303              <?php _e( 'URL' ); ?><br />
 304              <input type="text" id="edit-menu-item-url" class="widefat code" name="edit-menu-item-url" value="" tabindex="2" />
 305          </label>
 306      </p>
 307      <p class="description">
 308          <label for="edit-menu-item-attr-title">
 309              <?php _e( 'Title Attribute' ); ?><br />
 310              <input type="text" id="edit-menu-item-attr-title" class="widefat" name="edit-menu-item-attr-title" value="" tabindex="3" />
 311          </label>
 312      </p>
 313      <p class="description">
 314          <label for="edit-menu-item-target">
 315              <?php _e( 'Link Target' ); ?><br />
 316              <select id="edit-menu-item-target" class="widefat" name="edit-menu-item-target" tabindex="4">
 317                  <option value="_self"><?php _e('Same window or tab'); ?></option>
 318                  <option value="_blank"><?php _e('New window or tab'); ?></option>
 319              </select>
 320          </label>
 321      </p>
 322      <p class="description">
 323          <label for="edit-menu-item-classes">
 324              <?php _e( 'CSS Classes (optional)' ); ?><br />
 325              <input type="text" id="edit-menu-item-classes" class="widefat code" name="edit-menu-item-classes" value="" tabindex="5" />
 326          </label>
 327      </p>
 328      <p class="description">
 329          <label for="edit-menu-item-xfn">
 330              <?php _e( 'Link Relationship (XFN) (optional)' ); ?><br />
 331              <input type="text" id="edit-menu-item-xfn" class="widefat code" name="edit-menu-item-xfn" value="" tabindex="6" />
 332          </label>
 333      </p>
 334      <p class="description">
 335          <label for="edit-menu-item-description">
 336              <?php _e( 'Description (optional)' ); ?><br />
 337              <textarea id="edit-menu-item-description" class="widefat" rows="3" name="edit-menu-item-description" tabindex="7" /></textarea>
 338              <span class="description"><?php _e('The description will be displayed in the menu if the current theme supports it.'); ?></span>
 339          </label>
 340      </p>
 341      <p>
 342          <a id="update-menu-item" class="save button-primary" tabindex="8"><?php _e('Save Changes'); ?></a>
 343          <a id="cancel-save" class="submitdelete deletion" tabindex="9"><?php _e('Cancel'); ?></a>
 344      </p>
 345      <input type="hidden" id="edit-menu-item-id" name="edit-item-id" value="" />
 346  </div><!-- /#menu-item-settings-->
 347  
 348  <?php include ( 'admin-footer.php' ); ?>


Generated: Mon Apr 5 14:26:09 2010 Cross-referenced by PHPXref 0.7