run:R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
17.74 KB
2026-03-11 16:18:51
R W Run
5.03 KB
2026-03-11 16:18:51
R W Run
2.77 KB
2026-03-11 16:18:51
R W Run
479 By
2026-03-11 16:18:51
R W Run
9.12 KB
2026-03-11 16:18:51
R W Run
1.97 KB
2026-03-11 16:18:51
R W Run
12.35 KB
2026-03-11 16:18:51
R W Run
5.47 KB
2026-03-11 16:18:51
R W Run
10.09 KB
2026-03-11 16:18:51
R W Run
11.35 KB
2026-03-11 16:18:51
R W Run
5.86 KB
2026-03-11 16:18:51
R W Run
4.38 KB
2026-03-11 16:18:51
R W Run
489 By
2026-03-11 16:18:51
R W Run
499 By
2026-03-11 16:18:51
R W Run
11.01 KB
2026-03-11 16:18:51
R W Run
14.38 KB
2026-03-11 16:18:51
R W Run
28.83 KB
2026-03-11 16:18:51
R W Run
14.6 KB
2026-03-11 16:18:51
R W Run
8.34 KB
2026-03-11 16:18:51
R W Run
6.21 KB
2026-03-11 16:18:51
R W Run
10.44 KB
2026-03-11 16:18:51
R W Run
22 KB
2026-03-11 16:18:51
R W Run
19.48 KB
2026-03-11 16:18:51
R W Run
7.33 KB
2026-03-11 16:18:51
R W Run
7.75 KB
2026-03-11 16:18:51
R W Run
11.02 KB
2026-03-11 16:18:51
R W Run
4.8 KB
2026-03-11 16:18:51
R W Run
7.58 KB
2026-03-11 16:18:51
R W Run
7.68 KB
2026-03-11 16:18:51
R W Run
6.8 KB
2026-03-11 16:18:51
R W Run
17.77 KB
2026-03-11 16:18:51
R W Run
934 By
2026-03-11 16:18:51
R W Run
4.26 KB
2026-03-11 16:18:51
R W Run
2.72 KB
2026-03-11 16:18:51
R W Run
2.89 KB
2026-03-11 16:18:51
R W Run
2.02 KB
2026-03-11 16:18:51
R W Run
2.92 KB
2026-03-11 16:18:51
R W Run
3.2 KB
2026-03-11 16:18:51
R W Run
3.58 KB
2026-03-11 16:18:51
R W Run
819 By
2026-03-11 16:18:51
R W Run
9.82 KB
2026-03-11 16:18:51
R W Run
17.46 KB
2026-03-11 16:18:51
R W Run
307 By
2026-03-11 16:18:51
R W Run
196 By
2026-03-11 16:18:51
R W Run
4.5 KB
2026-03-11 16:18:51
R W Run
216 By
2026-03-11 16:18:51
R W Run
229 By
2026-03-11 16:18:51
R W Run
215 By
2026-03-11 16:18:51
R W Run
217 By
2026-03-11 16:18:51
R W Run
219 By
2026-03-11 16:18:51
R W Run
215 By
2026-03-11 16:18:51
R W Run
4.74 KB
2026-03-11 16:18:51
R W Run
48.19 KB
2026-03-11 16:18:51
R W Run
5.39 KB
2026-03-11 16:18:51
R W Run
15.92 KB
2026-03-11 16:18:51
R W Run
21.65 KB
2026-03-11 16:18:51
R W Run
621 By
2026-03-11 16:18:51
R W Run
6.38 KB
2026-03-11 16:18:51
R W Run
21.22 KB
2026-03-11 16:18:51
R W Run
9.95 KB
2026-03-11 16:18:51
R W Run
9.94 KB
2026-03-11 16:18:51
R W Run
9.1 KB
2026-03-11 16:18:51
R W Run
13.6 KB
2026-03-11 16:18:51
R W Run
13.75 KB
2026-03-11 16:18:51
R W Run
6.96 KB
2026-03-11 16:18:51
R W Run
30 KB
2026-03-11 16:18:51
R W Run
2.7 KB
2026-03-11 16:18:51
R W Run
10.03 KB
2026-03-11 16:18:51
R W Run
2.34 KB
2026-03-11 16:18:51
R W Run
3.67 KB
2026-03-11 16:18:51
R W Run
2.79 KB
2026-03-11 16:18:51
R W Run
283 By
2026-03-11 16:18:51
R W Run
5.7 KB
2026-03-11 16:18:51
R W Run
17.48 KB
2026-03-11 16:18:51
R W Run
11.98 KB
2026-03-11 16:18:51
R W Run
3.99 KB
2026-03-11 16:18:51
R W Run
10.2 KB
2026-03-11 16:18:51
R W Run
2.2 KB
2026-03-11 16:18:51
R W Run
16.87 KB
2026-03-11 16:18:51
R W Run
23.38 KB
2026-03-11 16:18:51
R W Run
47.92 KB
2026-03-11 16:18:51
R W Run
3.43 KB
2026-03-11 16:18:51
R W Run
45.45 KB
2026-03-11 16:18:51
R W Run
12.79 KB
2026-03-11 16:18:51
R W Run
341 By
2026-03-11 16:18:51
R W Run
6.27 KB
2026-03-11 16:18:51
R W Run
14.9 KB
2026-03-11 16:18:51
R W Run
40.36 KB
2026-03-11 16:18:51
R W Run
24.05 KB
2026-03-11 16:18:51
R W Run
23.29 KB
2026-03-11 16:18:51
R W Run
5.12 KB
2026-03-11 16:18:51
R W Run
19.29 KB
2026-03-11 16:18:51
R W Run
1.09 KB
2026-03-11 16:18:51
R W Run
error_log
📄nav-menus.php
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 */
13require_once __DIR__ . '/admin.php';
14
15// Load all the nav menu interface functions.
16require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
17
18if ( ! current_theme_supports( 'menus' ) && ! current_theme_supports( 'widgets' ) ) {
19 wp_die( __( 'Your theme does not support navigation menus or widgets.' ) );
20}
21
22// Permissions check.
23if ( ! current_user_can( 'edit_theme_options' ) ) {
24 wp_die(
25 '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
26 '<p>' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '</p>',
27 403
28 );
29}
30
31// Used in the HTML title tag.
32$title = __( 'Menus' );
33
34wp_enqueue_script( 'nav-menu' );
35
36if ( wp_is_mobile() ) {
37 wp_enqueue_script( 'jquery-touch-punch' );
38}
39
40// Container for any messages displayed to the user.
41$messages = array();
42
43// Container that stores the name of the active menu.
44$nav_menu_selected_title = '';
45
46// The menu id of the current menu being edited.
47$nav_menu_selected_id = isset( $_REQUEST['menu'] ) ? (int) $_REQUEST['menu'] : 0;
48
49// Get existing menu locations assignments.
50$locations = get_registered_nav_menus();
51$menu_locations = get_nav_menu_locations();
52$num_locations = count( array_keys( $locations ) );
53
54// Allowed actions: add, update, delete.
55$action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'edit';
56
57/*
58 * If a JSON blob of navigation menu data is found, expand it and inject it
59 * into `$_POST` to avoid PHP `max_input_vars` limitations. See #14134.
60 */
61_wp_expand_nav_menu_post_data();
62
63switch ( $action ) {
64 case 'add-menu-item':
65 check_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' );
66
67 if ( isset( $_REQUEST['nav-menu-locations'] ) ) {
68 set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_REQUEST['menu-locations'] ) );
69 } elseif ( isset( $_REQUEST['menu-item'] ) ) {
70 wp_save_nav_menu_items( $nav_menu_selected_id, $_REQUEST['menu-item'] );
71 }
72
73 break;
74
75 case 'move-down-menu-item':
76 // Moving down a menu item is the same as moving up the next in order.
77 check_admin_referer( 'move-menu_item' );
78
79 $menu_item_id = isset( $_REQUEST['menu-item'] ) ? (int) $_REQUEST['menu-item'] : 0;
80
81 if ( is_nav_menu_item( $menu_item_id ) ) {
82 $menus = isset( $_REQUEST['menu'] ) ? array( (int) $_REQUEST['menu'] ) : wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );
83
84 if ( ! is_wp_error( $menus ) && ! empty( $menus[0] ) ) {
85 $menu_id = (int) $menus[0];
86 $ordered_menu_items = wp_get_nav_menu_items( $menu_id );
87 $menu_item_data = (array) wp_setup_nav_menu_item( get_post( $menu_item_id ) );
88
89 // Set up the data we need in one pass through the array of menu items.
90 $dbids_to_orders = array();
91 $orders_to_dbids = array();
92
93 foreach ( (array) $ordered_menu_items as $ordered_menu_item_object ) {
94 if ( isset( $ordered_menu_item_object->ID ) ) {
95 if ( isset( $ordered_menu_item_object->menu_order ) ) {
96 $dbids_to_orders[ $ordered_menu_item_object->ID ] = $ordered_menu_item_object->menu_order;
97 $orders_to_dbids[ $ordered_menu_item_object->menu_order ] = $ordered_menu_item_object->ID;
98 }
99 }
100 }
101
102 // Get next in order.
103 if ( isset( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] + 1 ] ) ) {
104 $next_item_id = $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] + 1 ];
105 $next_item_data = (array) wp_setup_nav_menu_item( get_post( $next_item_id ) );
106
107 // If not siblings of same parent, bubble menu item up but keep order.
108 if ( ! empty( $menu_item_data['menu_item_parent'] )
109 && ( empty( $next_item_data['menu_item_parent'] )
110 || (int) $next_item_data['menu_item_parent'] !== (int) $menu_item_data['menu_item_parent'] )
111 ) {
112 if ( in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true ) ) {
113 $parent_db_id = (int) $menu_item_data['menu_item_parent'];
114 } else {
115 $parent_db_id = 0;
116 }
117
118 $parent_object = wp_setup_nav_menu_item( get_post( $parent_db_id ) );
119
120 if ( ! is_wp_error( $parent_object ) ) {
121 $parent_data = (array) $parent_object;
122 $menu_item_data['menu_item_parent'] = $parent_data['menu_item_parent'];
123
124 // Reset invalid `menu_item_parent`.
125 $menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );
126
127 update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
128 }
129
130 // Make menu item a child of its next sibling.
131 } else {
132 $next_item_data['menu_order'] = $next_item_data['menu_order'] - 1;
133 $menu_item_data['menu_order'] = $menu_item_data['menu_order'] + 1;
134
135 $menu_item_data['menu_item_parent'] = $next_item_data['ID'];
136
137 // Reset invalid `menu_item_parent`.
138 $menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );
139
140 update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
141
142 wp_update_post( $menu_item_data );
143 wp_update_post( $next_item_data );
144 }
145
146 // The item is last but still has a parent, so bubble up.
147 } elseif ( ! empty( $menu_item_data['menu_item_parent'] )
148 && in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true )
149 ) {
150 $menu_item_data['menu_item_parent'] = (int) get_post_meta( $menu_item_data['menu_item_parent'], '_menu_item_menu_item_parent', true );
151
152 // Reset invalid `menu_item_parent`.
153 $menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );
154
155 update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
156 }
157 }
158 }
159
160 break;
161
162 case 'move-up-menu-item':
163 check_admin_referer( 'move-menu_item' );
164
165 $menu_item_id = isset( $_REQUEST['menu-item'] ) ? (int) $_REQUEST['menu-item'] : 0;
166
167 if ( is_nav_menu_item( $menu_item_id ) ) {
168 if ( isset( $_REQUEST['menu'] ) ) {
169 $menus = array( (int) $_REQUEST['menu'] );
170 } else {
171 $menus = wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );
172 }
173
174 if ( ! is_wp_error( $menus ) && ! empty( $menus[0] ) ) {
175 $menu_id = (int) $menus[0];
176 $ordered_menu_items = wp_get_nav_menu_items( $menu_id );
177 $menu_item_data = (array) wp_setup_nav_menu_item( get_post( $menu_item_id ) );
178
179 // Set up the data we need in one pass through the array of menu items.
180 $dbids_to_orders = array();
181 $orders_to_dbids = array();
182
183 foreach ( (array) $ordered_menu_items as $ordered_menu_item_object ) {
184 if ( isset( $ordered_menu_item_object->ID ) ) {
185 if ( isset( $ordered_menu_item_object->menu_order ) ) {
186 $dbids_to_orders[ $ordered_menu_item_object->ID ] = $ordered_menu_item_object->menu_order;
187 $orders_to_dbids[ $ordered_menu_item_object->menu_order ] = $ordered_menu_item_object->ID;
188 }
189 }
190 }
191
192 // If this menu item is not first.
193 if ( ! empty( $dbids_to_orders[ $menu_item_id ] )
194 && ! empty( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] )
195 ) {
196
197 // If this menu item is a child of the previous.
198 if ( ! empty( $menu_item_data['menu_item_parent'] )
199 && in_array( (int) $menu_item_data['menu_item_parent'], array_keys( $dbids_to_orders ), true )
200 && isset( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] )
201 && ( (int) $menu_item_data['menu_item_parent'] === $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] )
202 ) {
203 if ( in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true ) ) {
204 $parent_db_id = (int) $menu_item_data['menu_item_parent'];
205 } else {
206 $parent_db_id = 0;
207 }
208
209 $parent_object = wp_setup_nav_menu_item( get_post( $parent_db_id ) );
210
211 if ( ! is_wp_error( $parent_object ) ) {
212 $parent_data = (array) $parent_object;
213
214 /*
215 * If there is something before the parent and parent a child of it,
216 * make menu item a child also of it.
217 */
218 if ( ! empty( $dbids_to_orders[ $parent_db_id ] )
219 && ! empty( $orders_to_dbids[ $dbids_to_orders[ $parent_db_id ] - 1 ] )
220 && ! empty( $parent_data['menu_item_parent'] )
221 ) {
222 $menu_item_data['menu_item_parent'] = $parent_data['menu_item_parent'];
223
224 /*
225 * Else if there is something before parent and parent not a child of it,
226 * make menu item a child of that something's parent
227 */
228 } elseif ( ! empty( $dbids_to_orders[ $parent_db_id ] )
229 && ! empty( $orders_to_dbids[ $dbids_to_orders[ $parent_db_id ] - 1 ] )
230 ) {
231 $_possible_parent_id = (int) get_post_meta( $orders_to_dbids[ $dbids_to_orders[ $parent_db_id ] - 1 ], '_menu_item_menu_item_parent', true );
232
233 if ( in_array( $_possible_parent_id, array_keys( $dbids_to_orders ), true ) ) {
234 $menu_item_data['menu_item_parent'] = $_possible_parent_id;
235 } else {
236 $menu_item_data['menu_item_parent'] = 0;
237 }
238
239 // Else there isn't something before the parent.
240 } else {
241 $menu_item_data['menu_item_parent'] = 0;
242 }
243
244 // Set former parent's [menu_order] to that of menu-item's.
245 $parent_data['menu_order'] = $parent_data['menu_order'] + 1;
246
247 // Set menu-item's [menu_order] to that of former parent.
248 $menu_item_data['menu_order'] = $menu_item_data['menu_order'] - 1;
249
250 // Save changes.
251 update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
252 wp_update_post( $menu_item_data );
253 wp_update_post( $parent_data );
254 }
255
256 // Else this menu item is not a child of the previous.
257 } elseif ( empty( $menu_item_data['menu_order'] )
258 || empty( $menu_item_data['menu_item_parent'] )
259 || ! in_array( (int) $menu_item_data['menu_item_parent'], array_keys( $dbids_to_orders ), true )
260 || empty( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] )
261 || $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] !== (int) $menu_item_data['menu_item_parent']
262 ) {
263 // Just make it a child of the previous; keep the order.
264 $menu_item_data['menu_item_parent'] = (int) $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ];
265
266 // Reset invalid `menu_item_parent`.
267 $menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );
268
269 update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
270 wp_update_post( $menu_item_data );
271 }
272 }
273 }
274 }
275
276 break;
277
278 case 'delete-menu-item':
279 $menu_item_id = (int) $_REQUEST['menu-item'];
280
281 check_admin_referer( 'delete-menu_item_' . $menu_item_id );
282
283 if ( is_nav_menu_item( $menu_item_id ) && wp_delete_post( $menu_item_id, true ) ) {
284 $messages[] = wp_get_admin_notice(
285 __( 'The menu item has been successfully deleted.' ),
286 array(
287 'id' => 'message',
288 'additional_classes' => array( 'updated' ),
289 'dismissible' => true,
290 )
291 );
292 }
293
294 break;
295
296 case 'delete':
297 check_admin_referer( 'delete-nav_menu-' . $nav_menu_selected_id );
298
299 if ( is_nav_menu( $nav_menu_selected_id ) ) {
300 $deletion = wp_delete_nav_menu( $nav_menu_selected_id );
301 } else {
302 // Reset the selected menu.
303 $nav_menu_selected_id = 0;
304 unset( $_REQUEST['menu'] );
305 }
306
307 if ( ! isset( $deletion ) ) {
308 break;
309 }
310
311 if ( is_wp_error( $deletion ) ) {
312 $messages[] = wp_get_admin_notice(
313 $deletion->get_error_message(),
314 array(
315 'id' => 'message',
316 'additional_classes' => array( 'error' ),
317 'dismissible' => true,
318 )
319 );
320 } else {
321 $messages[] = wp_get_admin_notice(
322 __( 'The menu has been successfully deleted.' ),
323 array(
324 'id' => 'message',
325 'additional_classes' => array( 'updated' ),
326 'dismissible' => true,
327 )
328 );
329 }
330
331 break;
332
333 case 'delete_menus':
334 check_admin_referer( 'nav_menus_bulk_actions' );
335
336 foreach ( $_REQUEST['delete_menus'] as $menu_id_to_delete ) {
337 if ( ! is_nav_menu( $menu_id_to_delete ) ) {
338 continue;
339 }
340
341 $deletion = wp_delete_nav_menu( $menu_id_to_delete );
342
343 if ( is_wp_error( $deletion ) ) {
344 $messages[] = wp_get_admin_notice(
345 $deletion->get_error_message(),
346 array(
347 'id' => 'message',
348 'additional_classes' => array( 'error' ),
349 'dismissible' => true,
350 )
351 );
352 $deletion_error = true;
353 }
354 }
355
356 if ( empty( $deletion_error ) ) {
357 $messages[] = wp_get_admin_notice(
358 __( 'Selected menus have been successfully deleted.' ),
359 array(
360 'id' => 'message',
361 'additional_classes' => array( 'updated' ),
362 'dismissible' => true,
363 )
364 );
365 }
366
367 break;
368
369 case 'update':
370 check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' );
371
372 // Merge new and existing menu locations if any new ones are set.
373 $new_menu_locations = array();
374 if ( isset( $_POST['menu-locations'] ) ) {
375 $new_menu_locations = array_map( 'absint', $_POST['menu-locations'] );
376 $menu_locations = array_merge( $menu_locations, $new_menu_locations );
377 }
378
379 // Add Menu.
380 if ( 0 === $nav_menu_selected_id ) {
381 $new_menu_title = trim( esc_html( $_POST['menu-name'] ) );
382
383 if ( $new_menu_title ) {
384 $_nav_menu_selected_id = wp_update_nav_menu_object( 0, array( 'menu-name' => $new_menu_title ) );
385
386 if ( is_wp_error( $_nav_menu_selected_id ) ) {
387 $messages[] = wp_get_admin_notice(
388 $_nav_menu_selected_id->get_error_message(),
389 array(
390 'id' => 'message',
391 'additional_classes' => array( 'error' ),
392 'dismissible' => true,
393 )
394 );
395 } else {
396 $_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id );
397 $nav_menu_selected_id = $_nav_menu_selected_id;
398 $nav_menu_selected_title = $_menu_object->name;
399
400 if ( isset( $_REQUEST['menu-item'] ) ) {
401 wp_save_nav_menu_items( $nav_menu_selected_id, absint( $_REQUEST['menu-item'] ) );
402 }
403
404 if ( isset( $_REQUEST['zero-menu-state'] ) || ! empty( $_POST['auto-add-pages'] ) ) {
405 // If there are menu items, add them.
406 wp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title );
407 }
408
409 if ( isset( $_REQUEST['zero-menu-state'] ) ) {
410 // Auto-save nav_menu_locations.
411 $locations = get_nav_menu_locations();
412
413 foreach ( $locations as $location => $menu_id ) {
414 $locations[ $location ] = $nav_menu_selected_id;
415 break; // There should only be 1.
416 }
417
418 set_theme_mod( 'nav_menu_locations', $locations );
419 } elseif ( count( $new_menu_locations ) > 0 ) {
420 // If locations have been selected for the new menu, save those.
421 $locations = get_nav_menu_locations();
422
423 foreach ( array_keys( $new_menu_locations ) as $location ) {
424 $locations[ $location ] = $nav_menu_selected_id;
425 }
426
427 set_theme_mod( 'nav_menu_locations', $locations );
428 }
429
430 if ( isset( $_REQUEST['use-location'] ) ) {
431 $locations = get_registered_nav_menus();
432 $menu_locations = get_nav_menu_locations();
433
434 if ( isset( $locations[ $_REQUEST['use-location'] ] ) ) {
435 $menu_locations[ $_REQUEST['use-location'] ] = $nav_menu_selected_id;
436 }
437
438 set_theme_mod( 'nav_menu_locations', $menu_locations );
439 }
440
441 wp_redirect( admin_url( 'nav-menus.php?menu=' . $_nav_menu_selected_id ) );
442 exit;
443 }
444 } else {
445 $messages[] = wp_get_admin_notice(
446 __( 'Please enter a valid menu name.' ),
447 array(
448 'id' => 'message',
449 'additional_classes' => array( 'error' ),
450 'dismissible' => true,
451 )
452 );
453 }
454
455 // Update existing menu.
456 } else {
457 // Remove menu locations that have been unchecked.
458 foreach ( $locations as $location => $description ) {
459 if ( ( empty( $_POST['menu-locations'] ) || empty( $_POST['menu-locations'][ $location ] ) )
460 && isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] === $nav_menu_selected_id
461 ) {
462 unset( $menu_locations[ $location ] );
463 }
464 }
465
466 // Set menu locations.
467 set_theme_mod( 'nav_menu_locations', $menu_locations );
468
469 $_menu_object = wp_get_nav_menu_object( $nav_menu_selected_id );
470
471 $menu_title = trim( esc_html( $_POST['menu-name'] ) );
472
473 if ( ! $menu_title ) {
474 $messages[] = wp_get_admin_notice(
475 __( 'Please enter a valid menu name.' ),
476 array(
477 'id' => 'message',
478 'additional_classes' => array( 'error' ),
479 'dismissible' => true,
480 )
481 );
482 $menu_title = $_menu_object->name;
483 }
484
485 if ( ! is_wp_error( $_menu_object ) ) {
486 $_nav_menu_selected_id = wp_update_nav_menu_object( $nav_menu_selected_id, array( 'menu-name' => $menu_title ) );
487
488 if ( is_wp_error( $_nav_menu_selected_id ) ) {
489 $_menu_object = $_nav_menu_selected_id;
490 $messages[] = wp_get_admin_notice(
491 $_nav_menu_selected_id->get_error_message(),
492 array(
493 'id' => 'message',
494 'additional_classes' => array( 'error' ),
495 'dismissible' => true,
496 )
497 );
498 } else {
499 $_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id );
500 $nav_menu_selected_title = $_menu_object->name;
501 }
502 }
503
504 // Update menu items.
505 if ( ! is_wp_error( $_menu_object ) ) {
506 $messages = array_merge( $messages, wp_nav_menu_update_menu_items( $_nav_menu_selected_id, $nav_menu_selected_title ) );
507
508 // If the menu ID changed, redirect to the new URL.
509 if ( $nav_menu_selected_id !== $_nav_menu_selected_id ) {
510 wp_redirect( admin_url( 'nav-menus.php?menu=' . (int) $_nav_menu_selected_id ) );
511 exit;
512 }
513 }
514 }
515
516 break;
517
518 case 'locations':
519 if ( ! $num_locations ) {
520 wp_redirect( admin_url( 'nav-menus.php' ) );
521 exit;
522 }
523
524 add_filter( 'screen_options_show_screen', '__return_false' );
525
526 if ( isset( $_POST['menu-locations'] ) ) {
527 check_admin_referer( 'save-menu-locations' );
528
529 $new_menu_locations = array_map( 'absint', $_POST['menu-locations'] );
530 $menu_locations = array_merge( $menu_locations, $new_menu_locations );
531 // Set menu locations.
532 set_theme_mod( 'nav_menu_locations', $menu_locations );
533
534 $messages[] = wp_get_admin_notice(
535 __( 'Menu locations updated.' ),
536 array(
537 'id' => 'message',
538 'additional_classes' => array( 'updated' ),
539 'dismissible' => true,
540 )
541 );
542 }
543
544 break;
545}
546
547// Get all nav menus.
548$nav_menus = wp_get_nav_menus();
549$menu_count = count( $nav_menus );
550
551// Are we on the add new screen?
552$add_new_screen = ( isset( $_GET['menu'] ) && 0 === (int) $_GET['menu'] ) ? true : false;
553
554$locations_screen = ( isset( $_GET['action'] ) && 'locations' === $_GET['action'] ) ? true : false;
555
556$page_count = wp_count_posts( 'page' );
557
558/*
559 * If we have one theme location, and zero menus, we take them right
560 * into editing their first menu.
561 */
562if ( 1 === count( get_registered_nav_menus() ) && ! $add_new_screen
563 && empty( $nav_menus ) && ! empty( $page_count->publish )
564) {
565 $one_theme_location_no_menus = true;
566} else {
567 $one_theme_location_no_menus = false;
568}
569
570$nav_menus_l10n = array(
571 'oneThemeLocationNoMenus' => $one_theme_location_no_menus,
572 'moveUp' => __( 'Move up one' ),
573 'moveDown' => __( 'Move down one' ),
574 'moveToTop' => __( 'Move to the top' ),
575 /* translators: %s: Previous item name. */
576 'moveUnder' => __( 'Move under %s' ),
577 /* translators: %s: Previous item name. */
578 'moveOutFrom' => __( 'Move out from under %s' ),
579 /* translators: %s: Previous item name. */
580 'under' => __( 'Under %s' ),
581 /* translators: %s: Previous item name. */
582 'outFrom' => __( 'Out from under %s' ),
583 /* translators: 1: Item name, 2: Item type, 3: Item index, 4: Total items. */
584 'menuFocus' => __( 'Edit %1$s (%2$s, %3$d of %4$d)' ),
585 /* translators: 1: Item name, 2: Item type, 3: Item index, 4: Total items, 5: Item parent. */
586 'subMenuFocus' => __( 'Edit %1$s (%2$s, sub-item %3$d of %4$d under %5$s)' ),
587 /* translators: 1: Item name, 2: Item type, 3: Item index, 4: Total items, 5: Item parent, 6: Item depth. */
588 'subMenuMoreDepthFocus' => __( 'Edit %1$s (%2$s, sub-item %3$d of %4$d under %5$s, level %6$d)' ),
589 /* translators: %s: Item name. */
590 'menuItemDeletion' => __( 'item %s' ),
591 /* translators: %s: Item name. */
592 'itemsDeleted' => __( 'Deleted menu item: %s.' ),
593 'itemAdded' => __( 'Menu item added' ),
594 'itemRemoved' => __( 'Menu item removed' ),
595 'movedUp' => __( 'Menu item moved up' ),
596 'movedDown' => __( 'Menu item moved down' ),
597 'movedTop' => __( 'Menu item moved to the top' ),
598 'movedLeft' => __( 'Menu item moved out of submenu' ),
599 'movedRight' => __( 'Menu item is now a sub-item' ),
600 'parentUpdated' => __( 'Menu parent updated' ),
601 'orderUpdated' => __( 'Menu order updated' ),
602);
603wp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n );
604
605/*
606 * Redirect to add screen if there are no menus and this users has either zero,
607 * or more than 1 theme locations.
608 */
609if ( 0 === $menu_count && ! $add_new_screen && ! $one_theme_location_no_menus ) {
610 wp_redirect( admin_url( 'nav-menus.php?action=edit&menu=0' ) );
611}
612
613// Get recently edited nav menu.
614$recently_edited = absint( get_user_option( 'nav_menu_recently_edited' ) );
615if ( empty( $recently_edited ) && is_nav_menu( $nav_menu_selected_id ) ) {
616 $recently_edited = $nav_menu_selected_id;
617}
618
619// Use $recently_edited if none are selected.
620if ( empty( $nav_menu_selected_id ) && ! isset( $_GET['menu'] ) && is_nav_menu( $recently_edited ) ) {
621 $nav_menu_selected_id = $recently_edited;
622}
623
624// On deletion of menu, if another menu exists, show it.
625if ( ! $add_new_screen && $menu_count > 0 && isset( $_GET['action'] ) && 'delete' === $_GET['action'] ) {
626 $nav_menu_selected_id = $nav_menus[0]->term_id;
627}
628
629// Set $nav_menu_selected_id to 0 if no menus.
630if ( $one_theme_location_no_menus ) {
631 $nav_menu_selected_id = 0;
632} elseif ( empty( $nav_menu_selected_id ) && ! empty( $nav_menus ) && ! $add_new_screen ) {
633 // If we have no selection yet, and we have menus, set to the first one in the list.
634 $nav_menu_selected_id = $nav_menus[0]->term_id;
635}
636
637// Update the user's setting.
638if ( $nav_menu_selected_id !== $recently_edited && is_nav_menu( $nav_menu_selected_id ) ) {
639 update_user_meta( $current_user->ID, 'nav_menu_recently_edited', $nav_menu_selected_id );
640}
641
642// If there's a menu, get its name.
643if ( ! $nav_menu_selected_title && is_nav_menu( $nav_menu_selected_id ) ) {
644 $_menu_object = wp_get_nav_menu_object( $nav_menu_selected_id );
645 $nav_menu_selected_title = ! is_wp_error( $_menu_object ) ? $_menu_object->name : '';
646}
647
648// Generate truncated menu names.
649foreach ( (array) $nav_menus as $key => $_nav_menu ) {
650 $nav_menus[ $key ]->truncated_name = wp_html_excerpt( $_nav_menu->name, 40, '&hellip;' );
651}
652
653// Retrieve menu locations.
654if ( current_theme_supports( 'menus' ) ) {
655 $locations = get_registered_nav_menus();
656 $menu_locations = get_nav_menu_locations();
657}
658
659/*
660 * Ensure the user will be able to scroll horizontally
661 * by adding a class for the max menu depth.
662 *
663 * @global int $_wp_nav_menu_max_depth
664 */
665global $_wp_nav_menu_max_depth;
666$_wp_nav_menu_max_depth = 0;
667
668// Calling wp_get_nav_menu_to_edit generates $_wp_nav_menu_max_depth.
669if ( is_nav_menu( $nav_menu_selected_id ) ) {
670 $menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array( 'post_status' => 'any' ) );
671 $edit_markup = wp_get_nav_menu_to_edit( $nav_menu_selected_id );
672}
673
674/**
675 * @since 3.0.0
676 *
677 * @global int $_wp_nav_menu_max_depth
678 *
679 * @param string $classes
680 * @return string
681 */
682function wp_nav_menu_max_depth( $classes ) {
683 global $_wp_nav_menu_max_depth;
684 return "$classes menu-max-depth-$_wp_nav_menu_max_depth";
685}
686
687add_filter( 'admin_body_class', 'wp_nav_menu_max_depth' );
688
689wp_nav_menu_setup();
690wp_initial_nav_menu_meta_boxes();
691
692if ( ! current_theme_supports( 'menus' ) && ! $num_locations ) {
693 $message_no_theme_support = sprintf(
694 /* translators: %s: URL to Widgets screen. */
695 __( 'Your theme does not natively support menus, but you can use them in sidebars by adding a &#8220;Navigation Menu&#8221; widget on the <a href="%s">Widgets</a> screen.' ),
696 admin_url( 'widgets.php' )
697 );
698 $messages[] = wp_get_admin_notice(
699 $message_no_theme_support,
700 array(
701 'id' => 'message',
702 'additional_classes' => array( 'updated' ),
703 'dismissible' => true,
704 )
705 );
706}
707
708if ( ! $locations_screen ) : // Main tab.
709 $overview = '<p>' . __( 'This screen is used for managing your navigation menus.' ) . '</p>';
710 $overview .= '<p>' . sprintf(
711 /* translators: 1: URL to Widgets screen, 2 and 3: The names of the default themes. */
712 __( 'Menus can be displayed in locations defined by your theme, even used in sidebars by adding a &#8220;Navigation Menu&#8221; widget on the <a href="%1$s">Widgets</a> screen. If your theme does not support the navigation menus feature (the default themes, %2$s and %3$s, do), you can learn about adding this support by following the documentation link to the side.' ),
713 admin_url( 'widgets.php' ),
714 'Twenty Twenty',
715 'Twenty Twenty-One'
716 ) . '</p>';
717 $overview .= '<p>' . __( 'From this screen you can:' ) . '</p>';
718 $overview .= '<ul><li>' . __( 'Create, edit, and delete menus' ) . '</li>';
719 $overview .= '<li>' . __( 'Add, organize, and modify individual menu items' ) . '</li></ul>';
720
721 get_current_screen()->add_help_tab(
722 array(
723 'id' => 'overview',
724 'title' => __( 'Overview' ),
725 'content' => $overview,
726 )
727 );
728
729 $menu_management = '<p>' . __( 'The menu management box at the top of the screen is used to control which menu is opened in the editor below.' ) . '</p>';
730 $menu_management .= '<ul><li>' . __( 'To edit an existing menu, <strong>choose a menu from the dropdown and click Select</strong>' ) . '</li>';
731 $menu_management .= '<li>' . __( 'If you have not yet created any menus, <strong>click the &#8217;create a new menu&#8217; link</strong> to get started' ) . '</li></ul>';
732 $menu_management .= '<p>' . __( 'You can assign theme locations to individual menus by <strong>selecting the desired settings</strong> at the bottom of the menu editor. To assign menus to all theme locations at once, <strong>visit the Manage Locations tab</strong> at the top of the screen.' ) . '</p>';
733
734 get_current_screen()->add_help_tab(
735 array(
736 'id' => 'menu-management',
737 'title' => __( 'Menu Management' ),
738 'content' => $menu_management,
739 )
740 );
741
742 $editing_menus = '<p>' . __( 'Each navigation menu may contain a mix of links to pages, categories, custom URLs or other content types. Menu links are added by selecting items from the expanding boxes in the left-hand column below.' ) . '</p>';
743 $editing_menus .= '<p>' . __( '<strong>Clicking the arrow to the right of any menu item</strong> in the editor will reveal a standard group of settings. Additional settings such as link target, CSS classes, link relationships, and link descriptions can be enabled and disabled via the Screen Options tab.' ) . '</p>';
744 $editing_menus .= '<ul><li>' . __( 'Add one or several items at once by <strong>selecting the checkbox next to each item and clicking Add to Menu</strong>' ) . '</li>';
745 $editing_menus .= '<li>' . __( 'To add a custom link, <strong>expand the Custom Links section, enter a URL and link text, and click Add to Menu</strong>' ) . '</li>';
746 $editing_menus .= '<li>' . __( 'To reorganize menu items, <strong>drag and drop items with your mouse or use your keyboard</strong>. Drag or move a menu item a little to the right to make it a submenu' ) . '</li>';
747 $editing_menus .= '<li>' . __( 'Delete a menu item by <strong>expanding it and clicking the Remove link</strong>' ) . '</li></ul>';
748
749 get_current_screen()->add_help_tab(
750 array(
751 'id' => 'editing-menus',
752 'title' => __( 'Editing Menus' ),
753 'content' => $editing_menus,
754 )
755 );
756else : // Locations tab.
757 $locations_overview = '<p>' . __( 'This screen is used for globally assigning menus to locations defined by your theme.' ) . '</p>';
758 $locations_overview .= '<ul><li>' . __( 'To assign menus to one or more theme locations, <strong>select a menu from each location&#8217;s dropdown</strong>. When you are finished, <strong>click Save Changes</strong>' ) . '</li>';
759 $locations_overview .= '<li>' . __( 'To edit a menu currently assigned to a theme location, <strong>click the adjacent &#8217;Edit&#8217; link</strong>' ) . '</li>';
760 $locations_overview .= '<li>' . __( 'To add a new menu instead of assigning an existing one, <strong>click the &#8217;Use new menu&#8217; link</strong>. Your new menu will be automatically assigned to that theme location' ) . '</li></ul>';
761
762 get_current_screen()->add_help_tab(
763 array(
764 'id' => 'locations-overview',
765 'title' => __( 'Overview' ),
766 'content' => $locations_overview,
767 )
768 );
769endif;
770
771get_current_screen()->set_help_sidebar(
772 '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
773 '<p>' . __( '<a href="https://wordpress.org/documentation/article/appearance-menus-screen/">Documentation on Menus</a>' ) . '</p>' .
774 '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
775);
776
777// Get the admin header.
778require_once ABSPATH . 'wp-admin/admin-header.php';
779?>
780<div class="wrap">
781 <h1 class="wp-heading-inline"><?php esc_html_e( 'Menus' ); ?></h1>
782 <?php
783 if ( current_user_can( 'customize' ) ) :
784 $focus = $locations_screen ? array( 'section' => 'menu_locations' ) : array( 'panel' => 'nav_menus' );
785 printf(
786 ' <a class="page-title-action hide-if-no-customize" href="%1$s">%2$s</a>',
787 esc_url(
788 add_query_arg(
789 array(
790 array( 'autofocus' => $focus ),
791 'return' => urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ),
792 ),
793 admin_url( 'customize.php' )
794 )
795 ),
796 __( 'Manage with Live Preview' )
797 );
798 endif;
799
800 $nav_tab_active_class = '';
801 $nav_aria_current = '';
802
803 if ( ! isset( $_GET['action'] ) || isset( $_GET['action'] ) && 'locations' !== $_GET['action'] ) {
804 $nav_tab_active_class = ' nav-tab-active';
805 $nav_aria_current = ' aria-current="page"';
806 }
807 ?>
808
809 <hr class="wp-header-end">
810
811 <nav class="nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
812 <a href="<?php echo esc_url( admin_url( 'nav-menus.php' ) ); ?>" class="nav-tab<?php echo $nav_tab_active_class; ?>"<?php echo $nav_aria_current; ?>><?php esc_html_e( 'Edit Menus' ); ?></a>
813 <?php
814 if ( $num_locations && $menu_count ) {
815 $active_tab_class = '';
816 $aria_current = '';
817
818 if ( $locations_screen ) {
819 $active_tab_class = ' nav-tab-active';
820 $aria_current = ' aria-current="page"';
821 }
822 ?>
823 <a href="<?php echo esc_url( add_query_arg( array( 'action' => 'locations' ), admin_url( 'nav-menus.php' ) ) ); ?>" class="nav-tab<?php echo $active_tab_class; ?>"<?php echo $aria_current; ?>><?php esc_html_e( 'Manage Locations' ); ?></a>
824 <?php
825 }
826 ?>
827 </nav>
828 <?php
829 foreach ( $messages as $message ) :
830 echo $message . "\n";
831 endforeach;
832 ?>
833 <?php
834 if ( $locations_screen ) :
835 if ( 1 === $num_locations ) {
836 echo '<p>' . __( 'Your theme supports one menu. Select which menu you would like to use.' ) . '</p>';
837 } else {
838 echo '<p>' . sprintf(
839 /* translators: %s: Number of menus. */
840 _n(
841 'Your theme supports %s menu. Select which menu appears in each location.',
842 'Your theme supports %s menus. Select which menu appears in each location.',
843 $num_locations
844 ),
845 number_format_i18n( $num_locations )
846 ) . '</p>';
847 }
848 ?>
849 <div id="menu-locations-wrap">
850 <form method="post" action="<?php echo esc_url( add_query_arg( array( 'action' => 'locations' ), admin_url( 'nav-menus.php' ) ) ); ?>">
851 <table class="widefat fixed" id="menu-locations-table">
852 <thead>
853 <tr>
854 <th scope="col" class="manage-column column-locations"><?php _e( 'Theme Location' ); ?></th>
855 <th scope="col" class="manage-column column-menus"><?php _e( 'Assigned Menu' ); ?></th>
856 </tr>
857 </thead>
858 <tbody class="menu-locations">
859 <?php foreach ( $locations as $_location => $_name ) { ?>
860 <tr class="menu-locations-row">
861 <td class="menu-location-title"><label for="locations-<?php echo $_location; ?>"><?php echo $_name; ?></label></td>
862 <td class="menu-location-menus">
863 <select name="menu-locations[<?php echo $_location; ?>]" id="locations-<?php echo $_location; ?>">
864 <option value="0"><?php printf( '&mdash; %s &mdash;', esc_html__( 'Select a Menu' ) ); ?></option>
865 <?php
866 foreach ( $nav_menus as $menu ) :
867 $data_orig = '';
868 $selected = isset( $menu_locations[ $_location ] ) && $menu_locations[ $_location ] === $menu->term_id;
869
870 if ( $selected ) {
871 $data_orig = 'data-orig="true"';
872 }
873 ?>
874 <option <?php echo $data_orig; ?> <?php selected( $selected ); ?> value="<?php echo $menu->term_id; ?>">
875 <?php echo wp_html_excerpt( $menu->name, 40, '&hellip;' ); ?>
876 </option>
877 <?php endforeach; ?>
878 </select>
879 <div class="locations-row-links">
880 <?php if ( isset( $menu_locations[ $_location ] ) && 0 !== $menu_locations[ $_location ] ) : ?>
881 <span class="locations-edit-menu-link">
882 <?php
883 printf(
884 '<a href="%1$s">
885 <span aria-hidden="true">%2$s</span>
886 <span class="screen-reader-text">%3$s</span>
887 </a>',
888 esc_url(
889 add_query_arg(
890 array(
891 'action' => 'edit',
892 'menu' => $menu_locations[ $_location ],
893 ),
894 admin_url( 'nav-menus.php' )
895 )
896 ),
897 _x( 'Edit', 'menu' ),
898 /* translators: Hidden accessibility text. */
899 __( 'Edit selected menu' )
900 );
901 ?>
902 </span>
903 <?php endif; ?>
904 <span class="locations-add-menu-link">
905 <?php
906 printf(
907 '<a href="%1$s">%2$s</a>',
908 esc_url(
909 add_query_arg(
910 array(
911 'action' => 'edit',
912 'menu' => 0,
913 'use-location' => $_location,
914 ),
915 admin_url( 'nav-menus.php' )
916 )
917 ),
918 _x( 'Use new menu', 'menu' )
919 );
920 ?>
921 </span>
922 </div><!-- .locations-row-links -->
923 </td><!-- .menu-location-menus -->
924 </tr><!-- .menu-locations-row -->
925 <?php } // End foreach. ?>
926 </tbody>
927 </table>
928 <p class="button-controls wp-clearfix"><?php submit_button( __( 'Save Changes' ), 'primary left', 'nav-menu-locations', false ); ?></p>
929 <?php wp_nonce_field( 'save-menu-locations' ); ?>
930 <input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
931 </form>
932 </div><!-- #menu-locations-wrap -->
933 <?php
934 /**
935 * Fires after the menu locations table is displayed.
936 *
937 * @since 3.6.0
938 */
939 do_action( 'after_menu_locations_table' );
940 ?>
941 <?php else : ?>
942 <div class="manage-menus">
943 <?php if ( $menu_count < 1 ) : ?>
944 <span class="first-menu-message">
945 <?php _e( 'Create your first menu below.' ); ?>
946 <span class="screen-reader-text">
947 <?php
948 /* translators: Hidden accessibility text. */
949 _e( 'Fill in the Menu Name and click the Create Menu button to create your first menu.' );
950 ?>
951 </span>
952 </span><!-- /first-menu-message -->
953 <?php elseif ( $menu_count < 2 ) : ?>
954 <span class="add-edit-menu-action">
955 <?php
956 printf(
957 /* translators: %s: URL to create a new menu. */
958 __( 'Edit your menu below, or <a href="%s">create a new menu</a>. Do not forget to save your changes!' ),
959 esc_url(
960 add_query_arg(
961 array(
962 'action' => 'edit',
963 'menu' => 0,
964 ),
965 admin_url( 'nav-menus.php' )
966 )
967 )
968 );
969 ?>
970 <span class="screen-reader-text">
971 <?php
972 /* translators: Hidden accessibility text. */
973 _e( 'Click the Save Menu button to save your changes.' );
974 ?>
975 </span>
976 </span><!-- /add-edit-menu-action -->
977 <?php else : ?>
978 <form method="get" action="<?php echo esc_url( admin_url( 'nav-menus.php' ) ); ?>">
979 <input type="hidden" name="action" value="edit" />
980 <label for="select-menu-to-edit" class="selected-menu"><?php _e( 'Select a menu to edit:' ); ?></label>
981 <select name="menu" id="select-menu-to-edit">
982 <?php if ( $add_new_screen ) : ?>
983 <option value="0" selected="selected"><?php _e( '&mdash; Select &mdash;' ); ?></option>
984 <?php endif; ?>
985 <?php foreach ( (array) $nav_menus as $_nav_menu ) : ?>
986 <option value="<?php echo esc_attr( $_nav_menu->term_id ); ?>" <?php selected( $_nav_menu->term_id, $nav_menu_selected_id ); ?>>
987 <?php
988 echo esc_html( $_nav_menu->truncated_name );
989
990 if ( ! empty( $menu_locations ) && in_array( $_nav_menu->term_id, $menu_locations, true ) ) {
991 $locations_assigned_to_this_menu = array();
992
993 foreach ( array_keys( $menu_locations, $_nav_menu->term_id, true ) as $menu_location_key ) {
994 if ( isset( $locations[ $menu_location_key ] ) ) {
995 $locations_assigned_to_this_menu[] = $locations[ $menu_location_key ];
996 }
997 }
998
999 /**
1000 * Filters the number of locations listed per menu in the drop-down select.
1001 *
1002 * @since 3.6.0
1003 *
1004 * @param int $locations Number of menu locations to list. Default 3.
1005 */
1006 $locations_listed_per_menu = absint( apply_filters( 'wp_nav_locations_listed_per_menu', 3 ) );
1007
1008 $assigned_locations = array_slice( $locations_assigned_to_this_menu, 0, $locations_listed_per_menu );
1009
1010 // Adds ellipses following the number of locations defined in $assigned_locations.
1011 if ( ! empty( $assigned_locations ) ) {
1012 printf(
1013 ' (%1$s%2$s)',
1014 implode( ', ', $assigned_locations ),
1015 count( $locations_assigned_to_this_menu ) > count( $assigned_locations ) ? ' &hellip;' : ''
1016 );
1017 }
1018 }
1019 ?>
1020 </option>
1021 <?php endforeach; ?>
1022 </select>
1023 <span class="submit-btn"><input type="submit" class="button" value="<?php esc_attr_e( 'Select' ); ?>"></span>
1024 <span class="add-new-menu-action">
1025 <?php
1026 printf(
1027 /* translators: %s: URL to create a new menu. */
1028 __( 'or <a href="%s">create a new menu</a>. Do not forget to save your changes!' ),
1029 esc_url(
1030 add_query_arg(
1031 array(
1032 'action' => 'edit',
1033 'menu' => 0,
1034 ),
1035 admin_url( 'nav-menus.php' )
1036 )
1037 )
1038 );
1039 ?>
1040 <span class="screen-reader-text">
1041 <?php
1042 /* translators: Hidden accessibility text. */
1043 _e( 'Click the Save Menu button to save your changes.' );
1044 ?>
1045 </span>
1046 </span><!-- /add-new-menu-action -->
1047 </form>
1048 <?php
1049 endif;
1050
1051 $metabox_holder_disabled_class = '';
1052
1053 if ( isset( $_GET['menu'] ) && 0 === (int) $_GET['menu'] ) {
1054 $metabox_holder_disabled_class = ' metabox-holder-disabled';
1055 }
1056 ?>
1057 </div><!-- /manage-menus -->
1058 <div id="nav-menus-frame" class="wp-clearfix">
1059 <div id="menu-settings-column" class="metabox-holder<?php echo $metabox_holder_disabled_class; ?>">
1060
1061 <div class="clear"></div>
1062
1063 <form id="nav-menu-meta" class="nav-menu-meta" method="post" enctype="multipart/form-data">
1064 <input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
1065 <input type="hidden" name="action" value="add-menu-item" />
1066 <?php wp_nonce_field( 'add-menu_item', 'menu-settings-column-nonce' ); ?>
1067 <h2><?php _e( 'Add menu items' ); ?></h2>
1068 <?php do_accordion_sections( 'nav-menus', 'side', null ); ?>
1069 </form>
1070
1071 </div><!-- /#menu-settings-column -->
1072 <div id="menu-management-liquid">
1073 <div id="menu-management">
1074 <form id="update-nav-menu" method="post" enctype="multipart/form-data">
1075 <h2><?php _e( 'Menu structure' ); ?></h2>
1076 <div class="menu-edit">
1077 <input type="hidden" name="nav-menu-data">
1078 <?php
1079 wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
1080 wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
1081 wp_nonce_field( 'update-nav_menu', 'update-nav-menu-nonce' );
1082
1083 $menu_name_aria_desc = $add_new_screen ? ' aria-describedby="menu-name-desc"' : '';
1084
1085 if ( $one_theme_location_no_menus ) {
1086 $menu_name_val = 'value="' . esc_attr__( 'Menu 1' ) . '"';
1087 ?>
1088 <input type="hidden" name="zero-menu-state" value="true" />
1089 <?php
1090 } else {
1091 $menu_name_val = 'value="' . esc_attr( $nav_menu_selected_title ) . '"';
1092 }
1093 ?>
1094 <input type="hidden" name="action" value="update" />
1095 <input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
1096 <div id="nav-menu-header">
1097 <div class="major-publishing-actions wp-clearfix">
1098 <label class="menu-name-label" for="menu-name"><?php _e( 'Menu Name' ); ?></label>
1099 <input name="menu-name" id="menu-name" type="text" class="menu-name regular-text menu-item-textbox form-required" required="required" <?php echo $menu_name_val . $menu_name_aria_desc; ?> />
1100 <div class="publishing-action">
1101 <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'primary large menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?>
1102 </div><!-- END .publishing-action -->
1103 </div><!-- END .major-publishing-actions -->
1104 </div><!-- END .nav-menu-header -->
1105 <div id="post-body">
1106 <div id="post-body-content" class="wp-clearfix">
1107 <?php if ( ! $add_new_screen ) : ?>
1108 <?php
1109 $hide_style = '';
1110
1111 if ( isset( $menu_items ) && 0 === count( $menu_items ) ) {
1112 $hide_style = 'style="display: none;"';
1113 }
1114
1115 if ( $one_theme_location_no_menus ) {
1116 $starter_copy = __( 'Edit your default menu by adding or removing items. Drag the items into the order you prefer. Click Create Menu to save your changes.' );
1117 } else {
1118 $starter_copy = __( 'Drag the items into the order you prefer. Click the arrow on the right of the item to reveal additional configuration options.' );
1119 }
1120 ?>
1121 <div class="drag-instructions post-body-plain" <?php echo $hide_style; ?>>
1122 <p><?php echo $starter_copy; ?></p>
1123 </div>
1124
1125 <div id="nav-menu-bulk-actions-top" class="bulk-actions" <?php echo $hide_style; ?>>
1126 <label class="bulk-select-button" for="bulk-select-switcher-top">
1127 <input type="checkbox" id="bulk-select-switcher-top" name="bulk-select-switcher-top" class="bulk-select-switcher">
1128 <span class="bulk-select-button-label"><?php _e( 'Bulk Select' ); ?></span>
1129 </label>
1130 </div>
1131
1132 <?php
1133 if ( isset( $edit_markup ) && ! is_wp_error( $edit_markup ) ) {
1134 echo $edit_markup;
1135 } else {
1136 ?>
1137 <ul class="menu" id="menu-to-edit"></ul>
1138 <?php } ?>
1139
1140 <?php endif; ?>
1141
1142 <?php if ( $add_new_screen ) : ?>
1143 <p class="post-body-plain" id="menu-name-desc"><?php _e( 'Give your menu a name, then click Create Menu.' ); ?></p>
1144 <?php if ( isset( $_GET['use-location'] ) ) : ?>
1145 <input type="hidden" name="use-location" value="<?php echo esc_attr( $_GET['use-location'] ); ?>" />
1146 <?php endif; ?>
1147
1148 <?php
1149 endif;
1150
1151 $no_menus_style = '';
1152
1153 if ( $one_theme_location_no_menus ) {
1154 $no_menus_style = 'style="display: none;"';
1155 }
1156 ?>
1157
1158 <?php if ( ! $add_new_screen ) : ?>
1159 <div id="nav-menu-bulk-actions-bottom" class="bulk-actions" <?php echo $hide_style; ?>>
1160 <label class="bulk-select-button" for="bulk-select-switcher-bottom">
1161 <input type="checkbox" id="bulk-select-switcher-bottom" name="bulk-select-switcher-top" class="bulk-select-switcher">
1162 <span class="bulk-select-button-label"><?php _e( 'Bulk Select' ); ?></span>
1163 </label>
1164 <input type="button" class="deletion menu-items-delete disabled" value="<?php esc_attr_e( 'Remove Selected Items' ); ?>">
1165 <div id="pending-menu-items-to-delete">
1166 <p><?php _e( 'List of menu items selected for deletion:' ); ?></p>
1167 <ul></ul>
1168 </div>
1169 </div>
1170 <?php endif; ?>
1171
1172 <div class="menu-settings" <?php echo $no_menus_style; ?>>
1173 <h3><?php _e( 'Menu Settings' ); ?></h3>
1174 <?php
1175 if ( ! isset( $auto_add ) ) {
1176 $auto_add = get_option( 'nav_menu_options' );
1177
1178 if ( ! isset( $auto_add['auto_add'] ) ) {
1179 $auto_add = false;
1180 } elseif ( false !== array_search( $nav_menu_selected_id, $auto_add['auto_add'], true ) ) {
1181 $auto_add = true;
1182 } else {
1183 $auto_add = false;
1184 }
1185 }
1186 ?>
1187
1188 <fieldset class="menu-settings-group auto-add-pages">
1189 <legend class="menu-settings-group-name howto"><?php _e( 'Auto add pages' ); ?></legend>
1190 <div class="menu-settings-input checkbox-input">
1191 <input type="checkbox"<?php checked( $auto_add ); ?> name="auto-add-pages" id="auto-add-pages" value="1" /> <label for="auto-add-pages"><?php printf( __( 'Automatically add new top-level pages to this menu' ), esc_url( admin_url( 'edit.php?post_type=page' ) ) ); ?></label>
1192 </div>
1193 </fieldset>
1194
1195 <?php if ( current_theme_supports( 'menus' ) ) : ?>
1196
1197 <fieldset class="menu-settings-group menu-theme-locations">
1198 <legend class="menu-settings-group-name howto"><?php _e( 'Display location' ); ?></legend>
1199 <?php
1200 foreach ( $locations as $location => $description ) :
1201 $checked = false;
1202
1203 if ( isset( $menu_locations[ $location ] )
1204 && 0 !== $nav_menu_selected_id
1205 && $menu_locations[ $location ] === $nav_menu_selected_id
1206 ) {
1207 $checked = true;
1208 }
1209 ?>
1210 <div class="menu-settings-input checkbox-input">
1211 <input type="checkbox"<?php checked( $checked ); ?> name="menu-locations[<?php echo esc_attr( $location ); ?>]" id="locations-<?php echo esc_attr( $location ); ?>" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
1212 <label for="locations-<?php echo esc_attr( $location ); ?>"><?php echo $description; ?></label>
1213 <?php if ( ! empty( $menu_locations[ $location ] ) && $menu_locations[ $location ] !== $nav_menu_selected_id ) : ?>
1214 <span class="theme-location-set">
1215 <?php
1216 printf(
1217 /* translators: %s: Menu name. */
1218 _x( '(Currently set to: %s)', 'menu location' ),
1219 wp_get_nav_menu_object( $menu_locations[ $location ] )->name
1220 );
1221 ?>
1222 </span>
1223 <?php endif; ?>
1224 </div>
1225 <?php endforeach; ?>
1226 </fieldset>
1227
1228 <?php endif; ?>
1229
1230 </div>
1231 </div><!-- /#post-body-content -->
1232 </div><!-- /#post-body -->
1233 <div id="nav-menu-footer">
1234 <div class="major-publishing-actions">
1235 <div class="publishing-action">
1236 <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'primary large menu-save', 'save_menu', false, array( 'id' => 'save_menu_footer' ) ); ?>
1237 </div><!-- END .publishing-action -->
1238 <?php if ( $menu_count > 0 ) : ?>
1239
1240 <?php if ( $add_new_screen ) : ?>
1241 <span class="cancel-action">
1242 <?php
1243 printf(
1244 '<a class="submitcancel cancellation menu-cancel" href="%1$s">%2$s</a>',
1245 esc_url( admin_url( 'nav-menus.php' ) ),
1246 __( 'Cancel' )
1247 );
1248 ?>
1249 </span><!-- END .cancel-action -->
1250 <?php else : ?>
1251 <span class="delete-action">
1252 <?php
1253 printf(
1254 '<a class="submitdelete deletion menu-delete" href="%1$s">%2$s</a>',
1255 esc_url(
1256 wp_nonce_url(
1257 add_query_arg(
1258 array(
1259 'action' => 'delete',
1260 'menu' => $nav_menu_selected_id,
1261 ),
1262 admin_url( 'nav-menus.php' )
1263 ),
1264 'delete-nav_menu-' . $nav_menu_selected_id
1265 )
1266 ),
1267 __( 'Delete Menu' )
1268 );
1269 ?>
1270 </span><!-- END .delete-action -->
1271 <?php endif; ?>
1272
1273 <?php endif; ?>
1274 </div><!-- END .major-publishing-actions -->
1275 </div><!-- /#nav-menu-footer -->
1276 </div><!-- /.menu-edit -->
1277 </form><!-- /#update-nav-menu -->
1278 </div><!-- /#menu-management -->
1279 </div><!-- /#menu-management-liquid -->
1280 </div><!-- /#nav-menus-frame -->
1281 <?php endif; ?>
1282</div><!-- /.wrap-->
1283<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
1284
Ui Ux Design – Teachers Night Out https://cardgames4educators.com Wed, 16 Oct 2024 22:24:18 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 https://cardgames4educators.com/wp-content/uploads/2024/06/cropped-Card-4-Educators-logo-32x32.png Ui Ux Design – Teachers Night Out https://cardgames4educators.com 32 32 Masters In English How English Speaker https://cardgames4educators.com/masters-in-english-how-english-speaker/ https://cardgames4educators.com/masters-in-english-how-english-speaker/#comments Mon, 27 May 2024 08:54:45 +0000 https://themexriver.com/wp/kadu/?p=1

Erat himenaeos neque id sagittis massa. Hac suscipit pulvinar dignissim platea magnis eu. Don tellus a pharetra inceptos efficitur dui pulvinar. Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent pulvinar odio volutpat parturient. Quisque risus finibus suspendisse mus purus magnis facilisi condimentum consectetur dui. Curae elit suspendisse cursus vehicula.

Turpis taciti class non vel pretium quis pulvinar tempor lobortis nunc. Libero phasellus parturient sapien volutpat malesuada ornare. Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae. Porta est tempor ex eget feugiat vulputate ipsum. Justo nec iaculis habitant diam arcu fermentum.

We offer comprehen sive emplo ment services such as assistance wit employer compliance.Our company is your strategic HR partner as instead of HR. john smithson

Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae.

Exploring Learning Landscapes in Academic

Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent.

]]>
https://cardgames4educators.com/masters-in-english-how-english-speaker/feed/ 1