WordPress 3.0 beta 1 documentation kindly provided to you by Hay Kranen
| [ Index ] |
PHP Cross Reference of WordPress 3.0 beta 1 |
|
| [ Index ] [ Variables ] [ Functions ] [ Classes ] [ Constants ] [ Statistics ] | ||
[Summary view] [Print] [Text view]
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’ 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 “Navigation Menu” widget to add any menus you create here to the theme’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&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&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' ); ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Mon Apr 5 14:26:09 2010 | Cross-referenced by PHPXref 0.7 |