~canonical-sysadmins/wordpress/4.5.2

« back to all changes in this revision

Viewing changes to wp-admin/includes/nav-menu.php

  • Committer: Jacek Nykis
  • Date: 2015-01-05 16:17:05 UTC
  • Revision ID: jacek.nykis@canonical.com-20150105161705-w544l1h5mcg7u4w9
Initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
 
 
3
/**
 
4
 * Create HTML list of nav menu input items.
 
5
 *
 
6
 * @package WordPress
 
7
 * @since 3.0.0
 
8
 * @uses Walker_Nav_Menu
 
9
 */
 
10
class Walker_Nav_Menu_Edit extends Walker_Nav_Menu {
 
11
        /**
 
12
         * Starts the list before the elements are added.
 
13
         *
 
14
         * @see Walker_Nav_Menu::start_lvl()
 
15
         *
 
16
         * @since 3.0.0
 
17
         *
 
18
         * @param string $output Passed by reference.
 
19
         * @param int    $depth  Depth of menu item. Used for padding.
 
20
         * @param array  $args   Not used.
 
21
         */
 
22
        public function start_lvl( &$output, $depth = 0, $args = array() ) {}
 
23
 
 
24
        /**
 
25
         * Ends the list of after the elements are added.
 
26
         *
 
27
         * @see Walker_Nav_Menu::end_lvl()
 
28
         *
 
29
         * @since 3.0.0
 
30
         *
 
31
         * @param string $output Passed by reference.
 
32
         * @param int    $depth  Depth of menu item. Used for padding.
 
33
         * @param array  $args   Not used.
 
34
         */
 
35
        public function end_lvl( &$output, $depth = 0, $args = array() ) {}
 
36
 
 
37
        /**
 
38
         * Start the element output.
 
39
         *
 
40
         * @see Walker_Nav_Menu::start_el()
 
41
         * @since 3.0.0
 
42
         *
 
43
         * @param string $output Passed by reference. Used to append additional content.
 
44
         * @param object $item   Menu item data object.
 
45
         * @param int    $depth  Depth of menu item. Used for padding.
 
46
         * @param array  $args   Not used.
 
47
         * @param int    $id     Not used.
 
48
         */
 
49
        public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
 
50
                global $_wp_nav_menu_max_depth;
 
51
                $_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;
 
52
 
 
53
                ob_start();
 
54
                $item_id = esc_attr( $item->ID );
 
55
                $removed_args = array(
 
56
                        'action',
 
57
                        'customlink-tab',
 
58
                        'edit-menu-item',
 
59
                        'menu-item',
 
60
                        'page-tab',
 
61
                        '_wpnonce',
 
62
                );
 
63
 
 
64
                $original_title = '';
 
65
                if ( 'taxonomy' == $item->type ) {
 
66
                        $original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
 
67
                        if ( is_wp_error( $original_title ) )
 
68
                                $original_title = false;
 
69
                } elseif ( 'post_type' == $item->type ) {
 
70
                        $original_object = get_post( $item->object_id );
 
71
                        $original_title = get_the_title( $original_object->ID );
 
72
                }
 
73
 
 
74
                $classes = array(
 
75
                        'menu-item menu-item-depth-' . $depth,
 
76
                        'menu-item-' . esc_attr( $item->object ),
 
77
                        'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'),
 
78
                );
 
79
 
 
80
                $title = $item->title;
 
81
 
 
82
                if ( ! empty( $item->_invalid ) ) {
 
83
                        $classes[] = 'menu-item-invalid';
 
84
                        /* translators: %s: title of menu item which is invalid */
 
85
                        $title = sprintf( __( '%s (Invalid)' ), $item->title );
 
86
                } elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) {
 
87
                        $classes[] = 'pending';
 
88
                        /* translators: %s: title of menu item in draft status */
 
89
                        $title = sprintf( __('%s (Pending)'), $item->title );
 
90
                }
 
91
 
 
92
                $title = ( ! isset( $item->label ) || '' == $item->label ) ? $title : $item->label;
 
93
 
 
94
                $submenu_text = '';
 
95
                if ( 0 == $depth )
 
96
                        $submenu_text = 'style="display: none;"';
 
97
 
 
98
                ?>
 
99
                <li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode(' ', $classes ); ?>">
 
100
                        <dl class="menu-item-bar">
 
101
                                <dt class="menu-item-handle">
 
102
                                        <span class="item-title"><span class="menu-item-title"><?php echo esc_html( $title ); ?></span> <span class="is-submenu" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span></span>
 
103
                                        <span class="item-controls">
 
104
                                                <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span>
 
105
                                                <span class="item-order hide-if-js">
 
106
                                                        <a href="<?php
 
107
                                                                echo wp_nonce_url(
 
108
                                                                        add_query_arg(
 
109
                                                                                array(
 
110
                                                                                        'action' => 'move-up-menu-item',
 
111
                                                                                        'menu-item' => $item_id,
 
112
                                                                                ),
 
113
                                                                                remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
 
114
                                                                        ),
 
115
                                                                        'move-menu_item'
 
116
                                                                );
 
117
                                                        ?>" class="item-move-up"><abbr title="<?php esc_attr_e('Move up'); ?>">&#8593;</abbr></a>
 
118
                                                        |
 
119
                                                        <a href="<?php
 
120
                                                                echo wp_nonce_url(
 
121
                                                                        add_query_arg(
 
122
                                                                                array(
 
123
                                                                                        'action' => 'move-down-menu-item',
 
124
                                                                                        'menu-item' => $item_id,
 
125
                                                                                ),
 
126
                                                                                remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
 
127
                                                                        ),
 
128
                                                                        'move-menu_item'
 
129
                                                                );
 
130
                                                        ?>" class="item-move-down"><abbr title="<?php esc_attr_e('Move down'); ?>">&#8595;</abbr></a>
 
131
                                                </span>
 
132
                                                <a class="item-edit" id="edit-<?php echo $item_id; ?>" title="<?php esc_attr_e('Edit Menu Item'); ?>" href="<?php
 
133
                                                        echo ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? admin_url( 'nav-menus.php' ) : add_query_arg( 'edit-menu-item', $item_id, remove_query_arg( $removed_args, admin_url( 'nav-menus.php#menu-item-settings-' . $item_id ) ) );
 
134
                                                ?>"><?php _e( 'Edit Menu Item' ); ?></a>
 
135
                                        </span>
 
136
                                </dt>
 
137
                        </dl>
 
138
 
 
139
                        <div class="menu-item-settings" id="menu-item-settings-<?php echo $item_id; ?>">
 
140
                                <?php if( 'custom' == $item->type ) : ?>
 
141
                                        <p class="field-url description description-wide">
 
142
                                                <label for="edit-menu-item-url-<?php echo $item_id; ?>">
 
143
                                                        <?php _e( 'URL' ); ?><br />
 
144
                                                        <input type="text" id="edit-menu-item-url-<?php echo $item_id; ?>" class="widefat code edit-menu-item-url" name="menu-item-url[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->url ); ?>" />
 
145
                                                </label>
 
146
                                        </p>
 
147
                                <?php endif; ?>
 
148
                                <p class="description description-thin">
 
149
                                        <label for="edit-menu-item-title-<?php echo $item_id; ?>">
 
150
                                                <?php _e( 'Navigation Label' ); ?><br />
 
151
                                                <input type="text" id="edit-menu-item-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->title ); ?>" />
 
152
                                        </label>
 
153
                                </p>
 
154
                                <p class="description description-thin">
 
155
                                        <label for="edit-menu-item-attr-title-<?php echo $item_id; ?>">
 
156
                                                <?php _e( 'Title Attribute' ); ?><br />
 
157
                                                <input type="text" id="edit-menu-item-attr-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->post_excerpt ); ?>" />
 
158
                                        </label>
 
159
                                </p>
 
160
                                <p class="field-link-target description">
 
161
                                        <label for="edit-menu-item-target-<?php echo $item_id; ?>">
 
162
                                                <input type="checkbox" id="edit-menu-item-target-<?php echo $item_id; ?>" value="_blank" name="menu-item-target[<?php echo $item_id; ?>]"<?php checked( $item->target, '_blank' ); ?> />
 
163
                                                <?php _e( 'Open link in a new window/tab' ); ?>
 
164
                                        </label>
 
165
                                </p>
 
166
                                <p class="field-css-classes description description-thin">
 
167
                                        <label for="edit-menu-item-classes-<?php echo $item_id; ?>">
 
168
                                                <?php _e( 'CSS Classes (optional)' ); ?><br />
 
169
                                                <input type="text" id="edit-menu-item-classes-<?php echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo $item_id; ?>]" value="<?php echo esc_attr( implode(' ', $item->classes ) ); ?>" />
 
170
                                        </label>
 
171
                                </p>
 
172
                                <p class="field-xfn description description-thin">
 
173
                                        <label for="edit-menu-item-xfn-<?php echo $item_id; ?>">
 
174
                                                <?php _e( 'Link Relationship (XFN)' ); ?><br />
 
175
                                                <input type="text" id="edit-menu-item-xfn-<?php echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->xfn ); ?>" />
 
176
                                        </label>
 
177
                                </p>
 
178
                                <p class="field-description description description-wide">
 
179
                                        <label for="edit-menu-item-description-<?php echo $item_id; ?>">
 
180
                                                <?php _e( 'Description' ); ?><br />
 
181
                                                <textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_html( $item->description ); // textarea_escaped ?></textarea>
 
182
                                                <span class="description"><?php _e('The description will be displayed in the menu if the current theme supports it.'); ?></span>
 
183
                                        </label>
 
184
                                </p>
 
185
 
 
186
                                <p class="field-move hide-if-no-js description description-wide">
 
187
                                        <label>
 
188
                                                <span><?php _e( 'Move' ); ?></span>
 
189
                                                <a href="#" class="menus-move-up"><?php _e( 'Up one' ); ?></a>
 
190
                                                <a href="#" class="menus-move-down"><?php _e( 'Down one' ); ?></a>
 
191
                                                <a href="#" class="menus-move-left"></a>
 
192
                                                <a href="#" class="menus-move-right"></a>
 
193
                                                <a href="#" class="menus-move-top"><?php _e( 'To the top' ); ?></a>
 
194
                                        </label>
 
195
                                </p>
 
196
 
 
197
                                <div class="menu-item-actions description-wide submitbox">
 
198
                                        <?php if( 'custom' != $item->type && $original_title !== false ) : ?>
 
199
                                                <p class="link-to-original">
 
200
                                                        <?php printf( __('Original: %s'), '<a href="' . esc_attr( $item->url ) . '">' . esc_html( $original_title ) . '</a>' ); ?>
 
201
                                                </p>
 
202
                                        <?php endif; ?>
 
203
                                        <a class="item-delete submitdelete deletion" id="delete-<?php echo $item_id; ?>" href="<?php
 
204
                                        echo wp_nonce_url(
 
205
                                                add_query_arg(
 
206
                                                        array(
 
207
                                                                'action' => 'delete-menu-item',
 
208
                                                                'menu-item' => $item_id,
 
209
                                                        ),
 
210
                                                        admin_url( 'nav-menus.php' )
 
211
                                                ),
 
212
                                                'delete-menu_item_' . $item_id
 
213
                                        ); ?>"><?php _e( 'Remove' ); ?></a> <span class="meta-sep hide-if-no-js"> | </span> <a class="item-cancel submitcancel hide-if-no-js" id="cancel-<?php echo $item_id; ?>" href="<?php echo esc_url( add_query_arg( array( 'edit-menu-item' => $item_id, 'cancel' => time() ), admin_url( 'nav-menus.php' ) ) );
 
214
                                                ?>#menu-item-settings-<?php echo $item_id; ?>"><?php _e('Cancel'); ?></a>
 
215
                                </div>
 
216
 
 
217
                                <input class="menu-item-data-db-id" type="hidden" name="menu-item-db-id[<?php echo $item_id; ?>]" value="<?php echo $item_id; ?>" />
 
218
                                <input class="menu-item-data-object-id" type="hidden" name="menu-item-object-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object_id ); ?>" />
 
219
                                <input class="menu-item-data-object" type="hidden" name="menu-item-object[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object ); ?>" />
 
220
                                <input class="menu-item-data-parent-id" type="hidden" name="menu-item-parent-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_item_parent ); ?>" />
 
221
                                <input class="menu-item-data-position" type="hidden" name="menu-item-position[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_order ); ?>" />
 
222
                                <input class="menu-item-data-type" type="hidden" name="menu-item-type[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->type ); ?>" />
 
223
                        </div><!-- .menu-item-settings-->
 
224
                        <ul class="menu-item-transport"></ul>
 
225
                <?php
 
226
                $output .= ob_get_clean();
 
227
        }
 
228
 
 
229
} // Walker_Nav_Menu_Edit
 
230
 
 
231
/**
 
232
 * Create HTML list of nav menu input items.
 
233
 *
 
234
 * @since 3.0.0
 
235
 * @uses Walker_Nav_Menu
 
236
 */
 
237
class Walker_Nav_Menu_Checklist extends Walker_Nav_Menu {
 
238
        public function __construct( $fields = false ) {
 
239
                if ( $fields ) {
 
240
                        $this->db_fields = $fields;
 
241
                }
 
242
        }
 
243
 
 
244
        /**
 
245
         * Starts the list before the elements are added.
 
246
         *
 
247
         * @see Walker_Nav_Menu::start_lvl()
 
248
         *
 
249
         * @since 3.0.0
 
250
         *
 
251
         * @param string $output Passed by reference. Used to append additional content.
 
252
         * @param int    $depth  Depth of page. Used for padding.
 
253
         * @param array  $args   Not used.
 
254
         */
 
255
        public function start_lvl( &$output, $depth = 0, $args = array() ) {
 
256
                $indent = str_repeat( "\t", $depth );
 
257
                $output .= "\n$indent<ul class='children'>\n";
 
258
        }
 
259
 
 
260
        /**
 
261
         * Ends the list of after the elements are added.
 
262
         *
 
263
         * @see Walker_Nav_Menu::end_lvl()
 
264
         *
 
265
         * @since 3.0.0
 
266
         *
 
267
         * @param string $output Passed by reference. Used to append additional content.
 
268
         * @param int    $depth  Depth of page. Used for padding.
 
269
         * @param array  $args   Not used.
 
270
         */
 
271
        public function end_lvl( &$output, $depth = 0, $args = array() ) {
 
272
                $indent = str_repeat( "\t", $depth );
 
273
                $output .= "\n$indent</ul>";
 
274
        }
 
275
 
 
276
        /**
 
277
         * Start the element output.
 
278
         *
 
279
         * @see Walker_Nav_Menu::start_el()
 
280
         *
 
281
         * @since 3.0.0
 
282
         *
 
283
         * @param string $output Passed by reference. Used to append additional content.
 
284
         * @param object $item   Menu item data object.
 
285
         * @param int    $depth  Depth of menu item. Used for padding.
 
286
         * @param array  $args   Not used.
 
287
         * @param int    $id     Not used.
 
288
         */
 
289
        public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
 
290
                global $_nav_menu_placeholder;
 
291
 
 
292
                $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;
 
293
                $possible_object_id = isset( $item->post_type ) && 'nav_menu_item' == $item->post_type ? $item->object_id : $_nav_menu_placeholder;
 
294
                $possible_db_id = ( ! empty( $item->ID ) ) && ( 0 < $possible_object_id ) ? (int) $item->ID : 0;
 
295
 
 
296
                $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
 
297
 
 
298
                $output .= $indent . '<li>';
 
299
                $output .= '<label class="menu-item-title">';
 
300
                $output .= '<input type="checkbox" class="menu-item-checkbox';
 
301
 
 
302
                if ( ! empty( $item->front_or_home ) )
 
303
                        $output .= ' add-to-top';
 
304
 
 
305
                $output .= '" name="menu-item[' . $possible_object_id . '][menu-item-object-id]" value="'. esc_attr( $item->object_id ) .'" /> ';
 
306
 
 
307
                if ( ! empty( $item->label ) ) {
 
308
                        $title = $item->label;
 
309
                } elseif ( isset( $item->post_type ) ) {
 
310
                        /** This filter is documented in wp-includes/post-template.php */
 
311
                        $title = apply_filters( 'the_title', $item->post_title, $item->ID );
 
312
                        if ( ! empty( $item->front_or_home ) && _x( 'Home', 'nav menu home label' ) !== $title )
 
313
                                $title = sprintf( _x( 'Home: %s', 'nav menu front page title' ), $title );
 
314
                }
 
315
 
 
316
                $output .= isset( $title ) ? esc_html( $title ) : esc_html( $item->title );
 
317
                $output .= '</label>';
 
318
 
 
319
                // Menu item hidden fields
 
320
                $output .= '<input type="hidden" class="menu-item-db-id" name="menu-item[' . $possible_object_id . '][menu-item-db-id]" value="' . $possible_db_id . '" />';
 
321
                $output .= '<input type="hidden" class="menu-item-object" name="menu-item[' . $possible_object_id . '][menu-item-object]" value="'. esc_attr( $item->object ) .'" />';
 
322
                $output .= '<input type="hidden" class="menu-item-parent-id" name="menu-item[' . $possible_object_id . '][menu-item-parent-id]" value="'. esc_attr( $item->menu_item_parent ) .'" />';
 
323
                $output .= '<input type="hidden" class="menu-item-type" name="menu-item[' . $possible_object_id . '][menu-item-type]" value="'. esc_attr( $item->type ) .'" />';
 
324
                $output .= '<input type="hidden" class="menu-item-title" name="menu-item[' . $possible_object_id . '][menu-item-title]" value="'. esc_attr( $item->title ) .'" />';
 
325
                $output .= '<input type="hidden" class="menu-item-url" name="menu-item[' . $possible_object_id . '][menu-item-url]" value="'. esc_attr( $item->url ) .'" />';
 
326
                $output .= '<input type="hidden" class="menu-item-target" name="menu-item[' . $possible_object_id . '][menu-item-target]" value="'. esc_attr( $item->target ) .'" />';
 
327
                $output .= '<input type="hidden" class="menu-item-attr_title" name="menu-item[' . $possible_object_id . '][menu-item-attr_title]" value="'. esc_attr( $item->attr_title ) .'" />';
 
328
                $output .= '<input type="hidden" class="menu-item-classes" name="menu-item[' . $possible_object_id . '][menu-item-classes]" value="'. esc_attr( implode( ' ', $item->classes ) ) .'" />';
 
329
                $output .= '<input type="hidden" class="menu-item-xfn" name="menu-item[' . $possible_object_id . '][menu-item-xfn]" value="'. esc_attr( $item->xfn ) .'" />';
 
330
        }
 
331
 
 
332
} // Walker_Nav_Menu_Checklist
 
333
 
 
334
/**
 
335
 * Prints the appropriate response to a menu quick search.
 
336
 *
 
337
 * @since 3.0.0
 
338
 *
 
339
 * @param array $request The unsanitized request values.
 
340
 */
 
341
function _wp_ajax_menu_quick_search( $request = array() ) {
 
342
        $args = array();
 
343
        $type = isset( $request['type'] ) ? $request['type'] : '';
 
344
        $object_type = isset( $request['object_type'] ) ? $request['object_type'] : '';
 
345
        $query = isset( $request['q'] ) ? $request['q'] : '';
 
346
        $response_format = isset( $request['response-format'] ) && in_array( $request['response-format'], array( 'json', 'markup' ) ) ? $request['response-format'] : 'json';
 
347
 
 
348
        if ( 'markup' == $response_format ) {
 
349
                $args['walker'] = new Walker_Nav_Menu_Checklist;
 
350
        }
 
351
 
 
352
        if ( 'get-post-item' == $type ) {
 
353
                if ( post_type_exists( $object_type ) ) {
 
354
                        if ( isset( $request['ID'] ) ) {
 
355
                                $object_id = (int) $request['ID'];
 
356
                                if ( 'markup' == $response_format ) {
 
357
                                        echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_post( $object_id ) ) ), 0, (object) $args );
 
358
                                } elseif ( 'json' == $response_format ) {
 
359
                                        echo json_encode(
 
360
                                                array(
 
361
                                                        'ID' => $object_id,
 
362
                                                        'post_title' => get_the_title( $object_id ),
 
363
                                                        'post_type' => get_post_type( $object_id ),
 
364
                                                )
 
365
                                        );
 
366
                                        echo "\n";
 
367
                                }
 
368
                        }
 
369
                } elseif ( taxonomy_exists( $object_type ) ) {
 
370
                        if ( isset( $request['ID'] ) ) {
 
371
                                $object_id = (int) $request['ID'];
 
372
                                if ( 'markup' == $response_format ) {
 
373
                                        echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_term( $object_id, $object_type ) ) ), 0, (object) $args );
 
374
                                } elseif ( 'json' == $response_format ) {
 
375
                                        $post_obj = get_term( $object_id, $object_type );
 
376
                                        echo json_encode(
 
377
                                                array(
 
378
                                                        'ID' => $object_id,
 
379
                                                        'post_title' => $post_obj->name,
 
380
                                                        'post_type' => $object_type,
 
381
                                                )
 
382
                                        );
 
383
                                        echo "\n";
 
384
                                }
 
385
                        }
 
386
 
 
387
                }
 
388
 
 
389
        } elseif ( preg_match('/quick-search-(posttype|taxonomy)-([a-zA-Z_-]*\b)/', $type, $matches) ) {
 
390
                if ( 'posttype' == $matches[1] && get_post_type_object( $matches[2] ) ) {
 
391
                        query_posts(array(
 
392
                                'posts_per_page' => 10,
 
393
                                'post_type' => $matches[2],
 
394
                                's' => $query,
 
395
                        ));
 
396
                        if ( ! have_posts() )
 
397
                                return;
 
398
                        while ( have_posts() ) {
 
399
                                the_post();
 
400
                                if ( 'markup' == $response_format ) {
 
401
                                        $var_by_ref = get_the_ID();
 
402
                                        echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_post( $var_by_ref ) ) ), 0, (object) $args );
 
403
                                } elseif ( 'json' == $response_format ) {
 
404
                                        echo json_encode(
 
405
                                                array(
 
406
                                                        'ID' => get_the_ID(),
 
407
                                                        'post_title' => get_the_title(),
 
408
                                                        'post_type' => get_post_type(),
 
409
                                                )
 
410
                                        );
 
411
                                        echo "\n";
 
412
                                }
 
413
                        }
 
414
                } elseif ( 'taxonomy' == $matches[1] ) {
 
415
                        $terms = get_terms( $matches[2], array(
 
416
                                'name__like' => $query,
 
417
                                'number' => 10,
 
418
                        ));
 
419
                        if ( empty( $terms ) || is_wp_error( $terms ) )
 
420
                                return;
 
421
                        foreach( (array) $terms as $term ) {
 
422
                                if ( 'markup' == $response_format ) {
 
423
                                        echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( $term ) ), 0, (object) $args );
 
424
                                } elseif ( 'json' == $response_format ) {
 
425
                                        echo json_encode(
 
426
                                                array(
 
427
                                                        'ID' => $term->term_id,
 
428
                                                        'post_title' => $term->name,
 
429
                                                        'post_type' => $matches[2],
 
430
                                                )
 
431
                                        );
 
432
                                        echo "\n";
 
433
                                }
 
434
                        }
 
435
                }
 
436
        }
 
437
}
 
438
 
 
439
/**
 
440
 * Register nav menu metaboxes and advanced menu items
 
441
 *
 
442
 * @since 3.0.0
 
443
 **/
 
444
function wp_nav_menu_setup() {
 
445
        // Register meta boxes
 
446
        wp_nav_menu_post_type_meta_boxes();
 
447
        add_meta_box( 'add-custom-links', __( 'Links' ), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' );
 
448
        wp_nav_menu_taxonomy_meta_boxes();
 
449
 
 
450
        // Register advanced menu items (columns)
 
451
        add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns' );
 
452
 
 
453
        // If first time editing, disable advanced items by default.
 
454
        if( false === get_user_option( 'managenav-menuscolumnshidden' ) ) {
 
455
                $user = wp_get_current_user();
 
456
                update_user_option($user->ID, 'managenav-menuscolumnshidden',
 
457
                        array( 0 => 'link-target', 1 => 'css-classes', 2 => 'xfn', 3 => 'description', ),
 
458
                        true);
 
459
        }
 
460
}
 
461
 
 
462
/**
 
463
 * Limit the amount of meta boxes to just links, pages and cats for first time users.
 
464
 *
 
465
 * @since 3.0.0
 
466
 **/
 
467
function wp_initial_nav_menu_meta_boxes() {
 
468
        global $wp_meta_boxes;
 
469
 
 
470
        if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array($wp_meta_boxes) )
 
471
                return;
 
472
 
 
473
        $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-page', 'add-custom-links', 'add-category' );
 
474
        $hidden_meta_boxes = array();
 
475
 
 
476
        foreach ( array_keys($wp_meta_boxes['nav-menus']) as $context ) {
 
477
                foreach ( array_keys($wp_meta_boxes['nav-menus'][$context]) as $priority ) {
 
478
                        foreach ( $wp_meta_boxes['nav-menus'][$context][$priority] as $box ) {
 
479
                                if ( in_array( $box['id'], $initial_meta_boxes ) ) {
 
480
                                        unset( $box['id'] );
 
481
                                } else {
 
482
                                        $hidden_meta_boxes[] = $box['id'];
 
483
                                }
 
484
                        }
 
485
                }
 
486
        }
 
487
 
 
488
        $user = wp_get_current_user();
 
489
        update_user_option( $user->ID, 'metaboxhidden_nav-menus', $hidden_meta_boxes, true );
 
490
}
 
491
 
 
492
/**
 
493
 * Creates metaboxes for any post type menu item.
 
494
 *
 
495
 * @since 3.0.0
 
496
 */
 
497
function wp_nav_menu_post_type_meta_boxes() {
 
498
        $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'object' );
 
499
 
 
500
        if ( ! $post_types )
 
501
                return;
 
502
 
 
503
        foreach ( $post_types as $post_type ) {
 
504
                /**
 
505
                 * Filter whether a menu items meta box will be added for the current
 
506
                 * object type.
 
507
                 *
 
508
                 * If a falsey value is returned instead of an object, the menu items
 
509
                 * meta box for the current meta box object will not be added.
 
510
                 *
 
511
                 * @since 3.0.0
 
512
                 *
 
513
                 * @param object $meta_box_object The current object to add a menu items
 
514
                 *                                meta box for.
 
515
                 */
 
516
                $post_type = apply_filters( 'nav_menu_meta_box_object', $post_type );
 
517
                if ( $post_type ) {
 
518
                        $id = $post_type->name;
 
519
                        // Give pages a higher priority.
 
520
                        $priority = ( 'page' == $post_type->name ? 'core' : 'default' );
 
521
                        add_meta_box( "add-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', $priority, $post_type );
 
522
                }
 
523
        }
 
524
}
 
525
 
 
526
/**
 
527
 * Creates metaboxes for any taxonomy menu item.
 
528
 *
 
529
 * @since 3.0.0
 
530
 */
 
531
function wp_nav_menu_taxonomy_meta_boxes() {
 
532
        $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'object' );
 
533
 
 
534
        if ( !$taxonomies )
 
535
                return;
 
536
 
 
537
        foreach ( $taxonomies as $tax ) {
 
538
                /** This filter is documented in wp-admin/includes/nav-menu.php */
 
539
                $tax = apply_filters( 'nav_menu_meta_box_object', $tax );
 
540
                if ( $tax ) {
 
541
                        $id = $tax->name;
 
542
                        add_meta_box( "add-{$id}", $tax->labels->name, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax );
 
543
                }
 
544
        }
 
545
}
 
546
 
 
547
/**
 
548
 * Check whether to disable the Menu Locations meta box submit button
 
549
 *
 
550
 * @since 3.6.0
 
551
 *
 
552
 * @uses global $one_theme_location_no_menus to determine if no menus exist
 
553
 * @uses disabled() to output the disabled attribute in $other_attributes param in submit_button()
 
554
 *
 
555
 * @param int|string $nav_menu_selected_id (id, name or slug) of the currently-selected menu
 
556
 * @return string Disabled attribute if at least one menu exists, false if not
 
557
*/
 
558
function wp_nav_menu_disabled_check( $nav_menu_selected_id ) {
 
559
        global $one_theme_location_no_menus;
 
560
 
 
561
        if ( $one_theme_location_no_menus )
 
562
                return false;
 
563
 
 
564
        return disabled( $nav_menu_selected_id, 0 );
 
565
}
 
566
 
 
567
/**
 
568
 * Displays a metabox for the custom links menu item.
 
569
 *
 
570
 * @since 3.0.0
 
571
 */
 
572
function wp_nav_menu_item_link_meta_box() {
 
573
        global $_nav_menu_placeholder, $nav_menu_selected_id;
 
574
 
 
575
        $_nav_menu_placeholder = 0 > $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1;
 
576
 
 
577
        ?>
 
578
        <div class="customlinkdiv" id="customlinkdiv">
 
579
                <input type="hidden" value="custom" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-type]" />
 
580
                <p id="menu-item-url-wrap">
 
581
                        <label class="howto" for="custom-menu-item-url">
 
582
                                <span><?php _e('URL'); ?></span>
 
583
                                <input id="custom-menu-item-url" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-url]" type="text" class="code menu-item-textbox" value="http://" />
 
584
                        </label>
 
585
                </p>
 
586
 
 
587
                <p id="menu-item-name-wrap">
 
588
                        <label class="howto" for="custom-menu-item-name">
 
589
                                <span><?php _e( 'Link Text' ); ?></span>
 
590
                                <input id="custom-menu-item-name" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-title]" type="text" class="regular-text menu-item-textbox input-with-default-title" title="<?php esc_attr_e('Menu Item'); ?>" />
 
591
                        </label>
 
592
                </p>
 
593
 
 
594
                <p class="button-controls">
 
595
                        <span class="add-to-menu">
 
596
                                <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-custom-menu-item" id="submit-customlinkdiv" />
 
597
                                <span class="spinner"></span>
 
598
                        </span>
 
599
                </p>
 
600
 
 
601
        </div><!-- /.customlinkdiv -->
 
602
        <?php
 
603
}
 
604
 
 
605
/**
 
606
 * Displays a metabox for a post type menu item.
 
607
 *
 
608
 * @since 3.0.0
 
609
 *
 
610
 * @param string $object Not used.
 
611
 * @param string $post_type The post type object.
 
612
 */
 
613
function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
 
614
        global $_nav_menu_placeholder, $nav_menu_selected_id;
 
615
 
 
616
        $post_type_name = $post_type['args']->name;
 
617
 
 
618
        // Paginate browsing for large numbers of post objects.
 
619
        $per_page = 50;
 
620
        $pagenum = isset( $_REQUEST[$post_type_name . '-tab'] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1;
 
621
        $offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0;
 
622
 
 
623
        $args = array(
 
624
                'offset' => $offset,
 
625
                'order' => 'ASC',
 
626
                'orderby' => 'title',
 
627
                'posts_per_page' => $per_page,
 
628
                'post_type' => $post_type_name,
 
629
                'suppress_filters' => true,
 
630
                'update_post_term_cache' => false,
 
631
                'update_post_meta_cache' => false
 
632
        );
 
633
 
 
634
        if ( isset( $post_type['args']->_default_query ) )
 
635
                $args = array_merge($args, (array) $post_type['args']->_default_query );
 
636
 
 
637
        // @todo transient caching of these results with proper invalidation on updating of a post of this type
 
638
        $get_posts = new WP_Query;
 
639
        $posts = $get_posts->query( $args );
 
640
        if ( ! $get_posts->post_count ) {
 
641
                echo '<p>' . __( 'No items.' ) . '</p>';
 
642
                return;
 
643
        }
 
644
 
 
645
        $num_pages = $get_posts->max_num_pages;
 
646
 
 
647
        $page_links = paginate_links( array(
 
648
                'base' => add_query_arg(
 
649
                        array(
 
650
                                $post_type_name . '-tab' => 'all',
 
651
                                'paged' => '%#%',
 
652
                                'item-type' => 'post_type',
 
653
                                'item-object' => $post_type_name,
 
654
                        )
 
655
                ),
 
656
                'format' => '',
 
657
                'prev_text' => __('&laquo;'),
 
658
                'next_text' => __('&raquo;'),
 
659
                'total' => $num_pages,
 
660
                'current' => $pagenum
 
661
        ));
 
662
 
 
663
        $db_fields = false;
 
664
        if ( is_post_type_hierarchical( $post_type_name ) ) {
 
665
                $db_fields = array( 'parent' => 'post_parent', 'id' => 'ID' );
 
666
        }
 
667
 
 
668
        $walker = new Walker_Nav_Menu_Checklist( $db_fields );
 
669
 
 
670
        $current_tab = 'most-recent';
 
671
        if ( isset( $_REQUEST[$post_type_name . '-tab'] ) && in_array( $_REQUEST[$post_type_name . '-tab'], array('all', 'search') ) ) {
 
672
                $current_tab = $_REQUEST[$post_type_name . '-tab'];
 
673
        }
 
674
 
 
675
        if ( ! empty( $_REQUEST['quick-search-posttype-' . $post_type_name] ) ) {
 
676
                $current_tab = 'search';
 
677
        }
 
678
 
 
679
        $removed_args = array(
 
680
                'action',
 
681
                'customlink-tab',
 
682
                'edit-menu-item',
 
683
                'menu-item',
 
684
                'page-tab',
 
685
                '_wpnonce',
 
686
        );
 
687
 
 
688
        ?>
 
689
        <div id="posttype-<?php echo $post_type_name; ?>" class="posttypediv">
 
690
                <ul id="posttype-<?php echo $post_type_name; ?>-tabs" class="posttype-tabs add-menu-item-tabs">
 
691
                        <li <?php echo ( 'most-recent' == $current_tab ? ' class="tabs"' : '' ); ?>>
 
692
                                <a class="nav-tab-link" data-type="tabs-panel-posttype-<?php echo esc_attr( $post_type_name ); ?>-most-recent" href="<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args))); ?>#tabs-panel-posttype-<?php echo $post_type_name; ?>-most-recent">
 
693
                                        <?php _e( 'Most Recent' ); ?>
 
694
                                </a>
 
695
                        </li>
 
696
                        <li <?php echo ( 'all' == $current_tab ? ' class="tabs"' : '' ); ?>>
 
697
                                <a class="nav-tab-link" data-type="<?php echo esc_attr( $post_type_name ); ?>-all" href="<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args))); ?>#<?php echo $post_type_name; ?>-all">
 
698
                                        <?php _e( 'View All' ); ?>
 
699
                                </a>
 
700
                        </li>
 
701
                        <li <?php echo ( 'search' == $current_tab ? ' class="tabs"' : '' ); ?>>
 
702
                                <a class="nav-tab-link" data-type="tabs-panel-posttype-<?php echo esc_attr( $post_type_name ); ?>-search" href="<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args))); ?>#tabs-panel-posttype-<?php echo $post_type_name; ?>-search">
 
703
                                        <?php _e( 'Search'); ?>
 
704
                                </a>
 
705
                        </li>
 
706
                </ul><!-- .posttype-tabs -->
 
707
 
 
708
                <div id="tabs-panel-posttype-<?php echo $post_type_name; ?>-most-recent" class="tabs-panel <?php
 
709
                        echo ( 'most-recent' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );
 
710
                ?>">
 
711
                        <ul id="<?php echo $post_type_name; ?>checklist-most-recent" class="categorychecklist form-no-clear">
 
712
                                <?php
 
713
                                $recent_args = array_merge( $args, array( 'orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15 ) );
 
714
                                $most_recent = $get_posts->query( $recent_args );
 
715
                                $args['walker'] = $walker;
 
716
                                echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args );
 
717
                                ?>
 
718
                        </ul>
 
719
                </div><!-- /.tabs-panel -->
 
720
 
 
721
                <div class="tabs-panel <?php
 
722
                        echo ( 'search' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );
 
723
                ?>" id="tabs-panel-posttype-<?php echo $post_type_name; ?>-search">
 
724
                        <?php
 
725
                        if ( isset( $_REQUEST['quick-search-posttype-' . $post_type_name] ) ) {
 
726
                                $searched = esc_attr( $_REQUEST['quick-search-posttype-' . $post_type_name] );
 
727
                                $search_results = get_posts( array( 's' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC', ) );
 
728
                        } else {
 
729
                                $searched = '';
 
730
                                $search_results = array();
 
731
                        }
 
732
                        ?>
 
733
                        <p class="quick-search-wrap">
 
734
                                <input type="search" class="quick-search input-with-default-title" title="<?php esc_attr_e('Search'); ?>" value="<?php echo $searched; ?>" name="quick-search-posttype-<?php echo $post_type_name; ?>" />
 
735
                                <span class="spinner"></span>
 
736
                                <?php submit_button( __( 'Search' ), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array( 'id' => 'submit-quick-search-posttype-' . $post_type_name ) ); ?>
 
737
                        </p>
 
738
 
 
739
                        <ul id="<?php echo $post_type_name; ?>-search-checklist" data-wp-lists="list:<?php echo $post_type_name?>" class="categorychecklist form-no-clear">
 
740
                        <?php if ( ! empty( $search_results ) && ! is_wp_error( $search_results ) ) : ?>
 
741
                                <?php
 
742
                                $args['walker'] = $walker;
 
743
                                echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args );
 
744
                                ?>
 
745
                        <?php elseif ( is_wp_error( $search_results ) ) : ?>
 
746
                                <li><?php echo $search_results->get_error_message(); ?></li>
 
747
                        <?php elseif ( ! empty( $searched ) ) : ?>
 
748
                                <li><?php _e('No results found.'); ?></li>
 
749
                        <?php endif; ?>
 
750
                        </ul>
 
751
                </div><!-- /.tabs-panel -->
 
752
 
 
753
                <div id="<?php echo $post_type_name; ?>-all" class="tabs-panel tabs-panel-view-all <?php
 
754
                        echo ( 'all' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );
 
755
                ?>">
 
756
                        <?php if ( ! empty( $page_links ) ) : ?>
 
757
                                <div class="add-menu-item-pagelinks">
 
758
                                        <?php echo $page_links; ?>
 
759
                                </div>
 
760
                        <?php endif; ?>
 
761
                        <ul id="<?php echo $post_type_name; ?>checklist" data-wp-lists="list:<?php echo $post_type_name?>" class="categorychecklist form-no-clear">
 
762
                                <?php
 
763
                                $args['walker'] = $walker;
 
764
 
 
765
                                /*
 
766
                                 * If we're dealing with pages, let's put a checkbox for the front
 
767
                                 * page at the top of the list.
 
768
                                 */
 
769
                                if ( 'page' == $post_type_name ) {
 
770
                                        $front_page = 'page' == get_option('show_on_front') ? (int) get_option( 'page_on_front' ) : 0;
 
771
                                        if ( ! empty( $front_page ) ) {
 
772
                                                $front_page_obj = get_post( $front_page );
 
773
                                                $front_page_obj->front_or_home = true;
 
774
                                                array_unshift( $posts, $front_page_obj );
 
775
                                        } else {
 
776
                                                $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;
 
777
                                                array_unshift( $posts, (object) array(
 
778
                                                        'front_or_home' => true,
 
779
                                                        'ID' => 0,
 
780
                                                        'object_id' => $_nav_menu_placeholder,
 
781
                                                        'post_content' => '',
 
782
                                                        'post_excerpt' => '',
 
783
                                                        'post_parent' => '',
 
784
                                                        'post_title' => _x('Home', 'nav menu home label'),
 
785
                                                        'post_type' => 'nav_menu_item',
 
786
                                                        'type' => 'custom',
 
787
                                                        'url' => home_url('/'),
 
788
                                                ) );
 
789
                                        }
 
790
                                }
 
791
 
 
792
                                /**
 
793
                                 * Filter the posts displayed in the 'View All' tab of the current
 
794
                                 * post type's menu items meta box.
 
795
                                 *
 
796
                                 * The dynamic portion of the hook name, $post_type_name,
 
797
                                 * refers to the slug of the current post type.
 
798
                                 *
 
799
                                 * @since 3.2.0
 
800
                                 *
 
801
                                 * @see WP_Query::query()
 
802
                                 *
 
803
                                 * @param array  $posts     The posts for the current post type.
 
804
                                 * @param array  $args      An array of WP_Query arguments.
 
805
                                 * @param object $post_type The current post type object for this menu item meta box.
 
806
                                 */
 
807
                                $posts = apply_filters( "nav_menu_items_{$post_type_name}", $posts, $args, $post_type );
 
808
                                $checkbox_items = walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args );
 
809
 
 
810
                                if ( 'all' == $current_tab && ! empty( $_REQUEST['selectall'] ) ) {
 
811
                                        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
 
812
 
 
813
                                }
 
814
 
 
815
                                echo $checkbox_items;
 
816
                                ?>
 
817
                        </ul>
 
818
                        <?php if ( ! empty( $page_links ) ) : ?>
 
819
                                <div class="add-menu-item-pagelinks">
 
820
                                        <?php echo $page_links; ?>
 
821
                                </div>
 
822
                        <?php endif; ?>
 
823
                </div><!-- /.tabs-panel -->
 
824
 
 
825
                <p class="button-controls">
 
826
                        <span class="list-controls">
 
827
                                <a href="<?php
 
828
                                        echo esc_url( add_query_arg(
 
829
                                                array(
 
830
                                                        $post_type_name . '-tab' => 'all',
 
831
                                                        'selectall' => 1,
 
832
                                                ),
 
833
                                                remove_query_arg( $removed_args )
 
834
                                        ));
 
835
                                ?>#posttype-<?php echo $post_type_name; ?>" class="select-all"><?php _e('Select All'); ?></a>
 
836
                        </span>
 
837
 
 
838
                        <span class="add-to-menu">
 
839
                                <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-post-type-menu-item" id="<?php echo esc_attr( 'submit-posttype-' . $post_type_name ); ?>" />
 
840
                                <span class="spinner"></span>
 
841
                        </span>
 
842
                </p>
 
843
 
 
844
        </div><!-- /.posttypediv -->
 
845
        <?php
 
846
}
 
847
 
 
848
/**
 
849
 * Displays a metabox for a taxonomy menu item.
 
850
 *
 
851
 * @since 3.0.0
 
852
 *
 
853
 * @param string $object Not used.
 
854
 * @param string $taxonomy The taxonomy object.
 
855
 */
 
856
function wp_nav_menu_item_taxonomy_meta_box( $object, $taxonomy ) {
 
857
        global $nav_menu_selected_id;
 
858
        $taxonomy_name = $taxonomy['args']->name;
 
859
 
 
860
        // Paginate browsing for large numbers of objects.
 
861
        $per_page = 50;
 
862
        $pagenum = isset( $_REQUEST[$taxonomy_name . '-tab'] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1;
 
863
        $offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0;
 
864
 
 
865
        $args = array(
 
866
                'child_of' => 0,
 
867
                'exclude' => '',
 
868
                'hide_empty' => false,
 
869
                'hierarchical' => 1,
 
870
                'include' => '',
 
871
                'number' => $per_page,
 
872
                'offset' => $offset,
 
873
                'order' => 'ASC',
 
874
                'orderby' => 'name',
 
875
                'pad_counts' => false,
 
876
        );
 
877
 
 
878
        $terms = get_terms( $taxonomy_name, $args );
 
879
 
 
880
        if ( ! $terms || is_wp_error($terms) ) {
 
881
                echo '<p>' . __( 'No items.' ) . '</p>';
 
882
                return;
 
883
        }
 
884
 
 
885
        $num_pages = ceil( wp_count_terms( $taxonomy_name , array_merge( $args, array('number' => '', 'offset' => '') ) ) / $per_page );
 
886
 
 
887
        $page_links = paginate_links( array(
 
888
                'base' => add_query_arg(
 
889
                        array(
 
890
                                $taxonomy_name . '-tab' => 'all',
 
891
                                'paged' => '%#%',
 
892
                                'item-type' => 'taxonomy',
 
893
                                'item-object' => $taxonomy_name,
 
894
                        )
 
895
                ),
 
896
                'format' => '',
 
897
                'prev_text' => __('&laquo;'),
 
898
                'next_text' => __('&raquo;'),
 
899
                'total' => $num_pages,
 
900
                'current' => $pagenum
 
901
        ));
 
902
 
 
903
        $db_fields = false;
 
904
        if ( is_taxonomy_hierarchical( $taxonomy_name ) ) {
 
905
                $db_fields = array( 'parent' => 'parent', 'id' => 'term_id' );
 
906
        }
 
907
 
 
908
        $walker = new Walker_Nav_Menu_Checklist( $db_fields );
 
909
 
 
910
        $current_tab = 'most-used';
 
911
        if ( isset( $_REQUEST[$taxonomy_name . '-tab'] ) && in_array( $_REQUEST[$taxonomy_name . '-tab'], array('all', 'most-used', 'search') ) ) {
 
912
                $current_tab = $_REQUEST[$taxonomy_name . '-tab'];
 
913
        }
 
914
 
 
915
        if ( ! empty( $_REQUEST['quick-search-taxonomy-' . $taxonomy_name] ) ) {
 
916
                $current_tab = 'search';
 
917
        }
 
918
 
 
919
        $removed_args = array(
 
920
                'action',
 
921
                'customlink-tab',
 
922
                'edit-menu-item',
 
923
                'menu-item',
 
924
                'page-tab',
 
925
                '_wpnonce',
 
926
        );
 
927
 
 
928
        ?>
 
929
        <div id="taxonomy-<?php echo $taxonomy_name; ?>" class="taxonomydiv">
 
930
                <ul id="taxonomy-<?php echo $taxonomy_name; ?>-tabs" class="taxonomy-tabs add-menu-item-tabs">
 
931
                        <li <?php echo ( 'most-used' == $current_tab ? ' class="tabs"' : '' ); ?>>
 
932
                                <a class="nav-tab-link" data-type="tabs-panel-<?php echo esc_attr( $taxonomy_name ); ?>-pop" href="<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($taxonomy_name . '-tab', 'most-used', remove_query_arg($removed_args))); ?>#tabs-panel-<?php echo $taxonomy_name; ?>-pop">
 
933
                                        <?php _e( 'Most Used' ); ?>
 
934
                                </a>
 
935
                        </li>
 
936
                        <li <?php echo ( 'all' == $current_tab ? ' class="tabs"' : '' ); ?>>
 
937
                                <a class="nav-tab-link" data-type="tabs-panel-<?php echo esc_attr( $taxonomy_name ); ?>-all" href="<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($taxonomy_name . '-tab', 'all', remove_query_arg($removed_args))); ?>#tabs-panel-<?php echo $taxonomy_name; ?>-all">
 
938
                                        <?php _e( 'View All' ); ?>
 
939
                                </a>
 
940
                        </li>
 
941
                        <li <?php echo ( 'search' == $current_tab ? ' class="tabs"' : '' ); ?>>
 
942
                                <a class="nav-tab-link" data-type="tabs-panel-search-taxonomy-<?php echo esc_attr( $taxonomy_name ); ?>" href="<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($taxonomy_name . '-tab', 'search', remove_query_arg($removed_args))); ?>#tabs-panel-search-taxonomy-<?php echo $taxonomy_name; ?>">
 
943
                                        <?php _e( 'Search' ); ?>
 
944
                                </a>
 
945
                        </li>
 
946
                </ul><!-- .taxonomy-tabs -->
 
947
 
 
948
                <div id="tabs-panel-<?php echo $taxonomy_name; ?>-pop" class="tabs-panel <?php
 
949
                        echo ( 'most-used' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );
 
950
                ?>">
 
951
                        <ul id="<?php echo $taxonomy_name; ?>checklist-pop" class="categorychecklist form-no-clear" >
 
952
                                <?php
 
953
                                $popular_terms = get_terms( $taxonomy_name, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
 
954
                                $args['walker'] = $walker;
 
955
                                echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $popular_terms), 0, (object) $args );
 
956
                                ?>
 
957
                        </ul>
 
958
                </div><!-- /.tabs-panel -->
 
959
 
 
960
                <div id="tabs-panel-<?php echo $taxonomy_name; ?>-all" class="tabs-panel tabs-panel-view-all <?php
 
961
                        echo ( 'all' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );
 
962
                ?>">
 
963
                        <?php if ( ! empty( $page_links ) ) : ?>
 
964
                                <div class="add-menu-item-pagelinks">
 
965
                                        <?php echo $page_links; ?>
 
966
                                </div>
 
967
                        <?php endif; ?>
 
968
                        <ul id="<?php echo $taxonomy_name; ?>checklist" data-wp-lists="list:<?php echo $taxonomy_name?>" class="categorychecklist form-no-clear">
 
969
                                <?php
 
970
                                $args['walker'] = $walker;
 
971
                                echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $terms), 0, (object) $args );
 
972
                                ?>
 
973
                        </ul>
 
974
                        <?php if ( ! empty( $page_links ) ) : ?>
 
975
                                <div class="add-menu-item-pagelinks">
 
976
                                        <?php echo $page_links; ?>
 
977
                                </div>
 
978
                        <?php endif; ?>
 
979
                </div><!-- /.tabs-panel -->
 
980
 
 
981
                <div class="tabs-panel <?php
 
982
                        echo ( 'search' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );
 
983
                ?>" id="tabs-panel-search-taxonomy-<?php echo $taxonomy_name; ?>">
 
984
                        <?php
 
985
                        if ( isset( $_REQUEST['quick-search-taxonomy-' . $taxonomy_name] ) ) {
 
986
                                $searched = esc_attr( $_REQUEST['quick-search-taxonomy-' . $taxonomy_name] );
 
987
                                $search_results = get_terms( $taxonomy_name, array( 'name__like' => $searched, 'fields' => 'all', 'orderby' => 'count', 'order' => 'DESC', 'hierarchical' => false ) );
 
988
                        } else {
 
989
                                $searched = '';
 
990
                                $search_results = array();
 
991
                        }
 
992
                        ?>
 
993
                        <p class="quick-search-wrap">
 
994
                                <input type="search" class="quick-search input-with-default-title" title="<?php esc_attr_e('Search'); ?>" value="<?php echo $searched; ?>" name="quick-search-taxonomy-<?php echo $taxonomy_name; ?>" />
 
995
                                <span class="spinner"></span>
 
996
                                <?php submit_button( __( 'Search' ), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array( 'id' => 'submit-quick-search-taxonomy-' . $taxonomy_name ) ); ?>
 
997
                        </p>
 
998
 
 
999
                        <ul id="<?php echo $taxonomy_name; ?>-search-checklist" data-wp-lists="list:<?php echo $taxonomy_name?>" class="categorychecklist form-no-clear">
 
1000
                        <?php if ( ! empty( $search_results ) && ! is_wp_error( $search_results ) ) : ?>
 
1001
                                <?php
 
1002
                                $args['walker'] = $walker;
 
1003
                                echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args );
 
1004
                                ?>
 
1005
                        <?php elseif ( is_wp_error( $search_results ) ) : ?>
 
1006
                                <li><?php echo $search_results->get_error_message(); ?></li>
 
1007
                        <?php elseif ( ! empty( $searched ) ) : ?>
 
1008
                                <li><?php _e('No results found.'); ?></li>
 
1009
                        <?php endif; ?>
 
1010
                        </ul>
 
1011
                </div><!-- /.tabs-panel -->
 
1012
 
 
1013
                <p class="button-controls">
 
1014
                        <span class="list-controls">
 
1015
                                <a href="<?php
 
1016
                                        echo esc_url(add_query_arg(
 
1017
                                                array(
 
1018
                                                        $taxonomy_name . '-tab' => 'all',
 
1019
                                                        'selectall' => 1,
 
1020
                                                ),
 
1021
                                                remove_query_arg($removed_args)
 
1022
                                        ));
 
1023
                                ?>#taxonomy-<?php echo $taxonomy_name; ?>" class="select-all"><?php _e('Select All'); ?></a>
 
1024
                        </span>
 
1025
 
 
1026
                        <span class="add-to-menu">
 
1027
                                <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-taxonomy-menu-item" id="<?php echo esc_attr( 'submit-taxonomy-' . $taxonomy_name ); ?>" />
 
1028
                                <span class="spinner"></span>
 
1029
                        </span>
 
1030
                </p>
 
1031
 
 
1032
        </div><!-- /.taxonomydiv -->
 
1033
        <?php
 
1034
}
 
1035
 
 
1036
/**
 
1037
 * Save posted nav menu item data.
 
1038
 *
 
1039
 * @since 3.0.0
 
1040
 *
 
1041
 * @param int $menu_id The menu ID for which to save this item. $menu_id of 0 makes a draft, orphaned menu item.
 
1042
 * @param array $menu_data The unsanitized posted menu item data.
 
1043
 * @return array The database IDs of the items saved
 
1044
 */
 
1045
function wp_save_nav_menu_items( $menu_id = 0, $menu_data = array() ) {
 
1046
        $menu_id = (int) $menu_id;
 
1047
        $items_saved = array();
 
1048
 
 
1049
        if ( 0 == $menu_id || is_nav_menu( $menu_id ) ) {
 
1050
 
 
1051
                // Loop through all the menu items' POST values.
 
1052
                foreach( (array) $menu_data as $_possible_db_id => $_item_object_data ) {
 
1053
                        if (
 
1054
                                // Checkbox is not checked.
 
1055
                                empty( $_item_object_data['menu-item-object-id'] ) &&
 
1056
                                (
 
1057
                                        // And item type either isn't set.
 
1058
                                        ! isset( $_item_object_data['menu-item-type'] ) ||
 
1059
                                        // Or URL is the default.
 
1060
                                        in_array( $_item_object_data['menu-item-url'], array( 'http://', '' ) ) ||
 
1061
                                        ! ( 'custom' == $_item_object_data['menu-item-type'] && ! isset( $_item_object_data['menu-item-db-id'] ) ) || // or it's not a custom menu item (but not the custom home page)
 
1062
                                        // Or it *is* a custom menu item that already exists.
 
1063
                                        ! empty( $_item_object_data['menu-item-db-id'] )
 
1064
                                )
 
1065
                        ) {
 
1066
                                // Then this potential menu item is not getting added to this menu.
 
1067
                                continue;
 
1068
                        }
 
1069
 
 
1070
                        // If this possible menu item doesn't actually have a menu database ID yet.
 
1071
                        if (
 
1072
                                empty( $_item_object_data['menu-item-db-id'] ) ||
 
1073
                                ( 0 > $_possible_db_id ) ||
 
1074
                                $_possible_db_id != $_item_object_data['menu-item-db-id']
 
1075
                        ) {
 
1076
                                $_actual_db_id = 0;
 
1077
                        } else {
 
1078
                                $_actual_db_id = (int) $_item_object_data['menu-item-db-id'];
 
1079
                        }
 
1080
 
 
1081
                        $args = array(
 
1082
                                'menu-item-db-id' => ( isset( $_item_object_data['menu-item-db-id'] ) ? $_item_object_data['menu-item-db-id'] : '' ),
 
1083
                                'menu-item-object-id' => ( isset( $_item_object_data['menu-item-object-id'] ) ? $_item_object_data['menu-item-object-id'] : '' ),
 
1084
                                'menu-item-object' => ( isset( $_item_object_data['menu-item-object'] ) ? $_item_object_data['menu-item-object'] : '' ),
 
1085
                                'menu-item-parent-id' => ( isset( $_item_object_data['menu-item-parent-id'] ) ? $_item_object_data['menu-item-parent-id'] : '' ),
 
1086
                                'menu-item-position' => ( isset( $_item_object_data['menu-item-position'] ) ? $_item_object_data['menu-item-position'] : '' ),
 
1087
                                'menu-item-type' => ( isset( $_item_object_data['menu-item-type'] ) ? $_item_object_data['menu-item-type'] : '' ),
 
1088
                                'menu-item-title' => ( isset( $_item_object_data['menu-item-title'] ) ? $_item_object_data['menu-item-title'] : '' ),
 
1089
                                'menu-item-url' => ( isset( $_item_object_data['menu-item-url'] ) ? $_item_object_data['menu-item-url'] : '' ),
 
1090
                                'menu-item-description' => ( isset( $_item_object_data['menu-item-description'] ) ? $_item_object_data['menu-item-description'] : '' ),
 
1091
                                'menu-item-attr-title' => ( isset( $_item_object_data['menu-item-attr-title'] ) ? $_item_object_data['menu-item-attr-title'] : '' ),
 
1092
                                'menu-item-target' => ( isset( $_item_object_data['menu-item-target'] ) ? $_item_object_data['menu-item-target'] : '' ),
 
1093
                                'menu-item-classes' => ( isset( $_item_object_data['menu-item-classes'] ) ? $_item_object_data['menu-item-classes'] : '' ),
 
1094
                                'menu-item-xfn' => ( isset( $_item_object_data['menu-item-xfn'] ) ? $_item_object_data['menu-item-xfn'] : '' ),
 
1095
                        );
 
1096
 
 
1097
                        $items_saved[] = wp_update_nav_menu_item( $menu_id, $_actual_db_id, $args );
 
1098
 
 
1099
                }
 
1100
        }
 
1101
        return $items_saved;
 
1102
}
 
1103
 
 
1104
/**
 
1105
 * Adds custom arguments to some of the meta box object types.
 
1106
 *
 
1107
 * @since 3.0.0
 
1108
 *
 
1109
 * @access private
 
1110
 *
 
1111
 * @param object $object The post type or taxonomy meta-object.
 
1112
 * @return object The post type of taxonomy object.
 
1113
 */
 
1114
function _wp_nav_menu_meta_box_object( $object = null ) {
 
1115
        if ( isset( $object->name ) ) {
 
1116
 
 
1117
                if ( 'page' == $object->name ) {
 
1118
                        $object->_default_query = array(
 
1119
                                'orderby' => 'menu_order title',
 
1120
                                'post_status' => 'publish',
 
1121
                        );
 
1122
 
 
1123
                // Posts should show only published items.
 
1124
                } elseif ( 'post' == $object->name ) {
 
1125
                        $object->_default_query = array(
 
1126
                                'post_status' => 'publish',
 
1127
                        );
 
1128
 
 
1129
                // Categories should be in reverse chronological order.
 
1130
                } elseif ( 'category' == $object->name ) {
 
1131
                        $object->_default_query = array(
 
1132
                                'orderby' => 'id',
 
1133
                                'order' => 'DESC',
 
1134
                        );
 
1135
 
 
1136
                // Custom post types should show only published items.
 
1137
                } else {
 
1138
                        $object->_default_query = array(
 
1139
                                'post_status' => 'publish',
 
1140
                        );
 
1141
                }
 
1142
        }
 
1143
 
 
1144
        return $object;
 
1145
}
 
1146
 
 
1147
/**
 
1148
 * Returns the menu formatted to edit.
 
1149
 *
 
1150
 * @since 3.0.0
 
1151
 *
 
1152
 * @param string $menu_id The ID of the menu to format.
 
1153
 * @return string|WP_Error $output The menu formatted to edit or error object on failure.
 
1154
 */
 
1155
function wp_get_nav_menu_to_edit( $menu_id = 0 ) {
 
1156
        $menu = wp_get_nav_menu_object( $menu_id );
 
1157
 
 
1158
        // If the menu exists, get its items.
 
1159
        if ( is_nav_menu( $menu ) ) {
 
1160
                $menu_items = wp_get_nav_menu_items( $menu->term_id, array('post_status' => 'any') );
 
1161
                $result = '<div id="menu-instructions" class="post-body-plain';
 
1162
                $result .= ( ! empty($menu_items) ) ? ' menu-instructions-inactive">' : '">';
 
1163
                $result .= '<p>' . __( 'Add menu items from the column on the left.' ) . '</p>';
 
1164
                $result .= '</div>';
 
1165
 
 
1166
                if( empty($menu_items) )
 
1167
                        return $result . ' <ul class="menu" id="menu-to-edit"> </ul>';
 
1168
 
 
1169
                /**
 
1170
                 * Filter the Walker class used when adding nav menu items.
 
1171
                 *
 
1172
                 * @since 3.0.0
 
1173
                 *
 
1174
                 * @param string $class   The walker class to use. Default 'Walker_Nav_Menu_Edit'.
 
1175
                 * @param int    $menu_id ID of the menu being rendered.
 
1176
                 */
 
1177
                $walker_class_name = apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $menu_id );
 
1178
 
 
1179
                if ( class_exists( $walker_class_name ) )
 
1180
                        $walker = new $walker_class_name;
 
1181
                else
 
1182
                        return new WP_Error( 'menu_walker_not_exist', sprintf( __('The Walker class named <strong>%s</strong> does not exist.'), $walker_class_name ) );
 
1183
 
 
1184
                $some_pending_menu_items = $some_invalid_menu_items = false;
 
1185
                foreach( (array) $menu_items as $menu_item ) {
 
1186
                        if ( isset( $menu_item->post_status ) && 'draft' == $menu_item->post_status )
 
1187
                                $some_pending_menu_items = true;
 
1188
                        if ( ! empty( $menu_item->_invalid ) )
 
1189
                                $some_invalid_menu_items = true;
 
1190
                }
 
1191
 
 
1192
                if ( $some_pending_menu_items )
 
1193
                        $result .= '<div class="updated inline"><p>' . __('Click Save Menu to make pending menu items public.') . '</p></div>';
 
1194
 
 
1195
                if ( $some_invalid_menu_items )
 
1196
                        $result .= '<div class="error inline"><p>' . __('There are some invalid menu items. Please check or delete them.') . '</p></div>';
 
1197
 
 
1198
                $result .= '<ul class="menu" id="menu-to-edit"> ';
 
1199
                $result .= walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $menu_items), 0, (object) array('walker' => $walker ) );
 
1200
                $result .= ' </ul> ';
 
1201
                return $result;
 
1202
        } elseif ( is_wp_error( $menu ) ) {
 
1203
                return $menu;
 
1204
        }
 
1205
 
 
1206
}
 
1207
 
 
1208
/**
 
1209
 * Returns the columns for the nav menus page.
 
1210
 *
 
1211
 * @since 3.0.0
 
1212
 *
 
1213
 * @return string|WP_Error $output The menu formatted to edit or error object on failure.
 
1214
 */
 
1215
function wp_nav_menu_manage_columns() {
 
1216
        return array(
 
1217
                '_title' => __('Show advanced menu properties'),
 
1218
                'cb' => '<input type="checkbox" />',
 
1219
                'link-target' => __('Link Target'),
 
1220
                'css-classes' => __('CSS Classes'),
 
1221
                'xfn' => __('Link Relationship (XFN)'),
 
1222
                'description' => __('Description'),
 
1223
        );
 
1224
}
 
1225
 
 
1226
/**
 
1227
 * Deletes orphaned draft menu items
 
1228
 *
 
1229
 * @access private
 
1230
 * @since 3.0.0
 
1231
 *
 
1232
 */
 
1233
function _wp_delete_orphaned_draft_menu_items() {
 
1234
        global $wpdb;
 
1235
        $delete_timestamp = time() - ( DAY_IN_SECONDS * EMPTY_TRASH_DAYS );
 
1236
 
 
1237
        // Delete orphaned draft menu items.
 
1238
        $menu_items_to_delete = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts AS p LEFT JOIN $wpdb->postmeta AS m ON p.ID = m.post_id WHERE post_type = 'nav_menu_item' AND post_status = 'draft' AND meta_key = '_menu_item_orphaned' AND meta_value < '%d'", $delete_timestamp ) );
 
1239
 
 
1240
        foreach( (array) $menu_items_to_delete as $menu_item_id )
 
1241
                wp_delete_post( $menu_item_id, true );
 
1242
}
 
1243
add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items');
 
1244
 
 
1245
/**
 
1246
 * Saves nav menu items
 
1247
 *
 
1248
 * @since 3.6.0
 
1249
 *
 
1250
 * @uses wp_get_nav_menu_items() to retrieve the nav menu's menu items
 
1251
 * @uses wp_defer_term_counter() to enable then disable term counting
 
1252
 *
 
1253
 * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu
 
1254
 * @param string $nav_menu_selected_title Title of the currently-selected menu
 
1255
 * @return array $messages The menu updated message
 
1256
 */
 
1257
function wp_nav_menu_update_menu_items ( $nav_menu_selected_id, $nav_menu_selected_title ) {
 
1258
        $unsorted_menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array( 'orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID', 'post_status' => 'draft,publish' ) );
 
1259
 
 
1260
        $menu_items = array();
 
1261
        // Index menu items by db ID
 
1262
        foreach ( $unsorted_menu_items as $_item )
 
1263
                $menu_items[$_item->db_id] = $_item;
 
1264
 
 
1265
        $post_fields = array(
 
1266
                'menu-item-db-id', 'menu-item-object-id', 'menu-item-object',
 
1267
                'menu-item-parent-id', 'menu-item-position', 'menu-item-type',
 
1268
                'menu-item-title', 'menu-item-url', 'menu-item-description',
 
1269
                'menu-item-attr-title', 'menu-item-target', 'menu-item-classes', 'menu-item-xfn'
 
1270
        );
 
1271
 
 
1272
        wp_defer_term_counting( true );
 
1273
        // Loop through all the menu items' POST variables
 
1274
        if ( ! empty( $_POST['menu-item-db-id'] ) ) {
 
1275
                foreach( (array) $_POST['menu-item-db-id'] as $_key => $k ) {
 
1276
 
 
1277
                        // Menu item title can't be blank
 
1278
                        if ( ! isset( $_POST['menu-item-title'][ $_key ] ) || '' == $_POST['menu-item-title'][ $_key ] )
 
1279
                                continue;
 
1280
 
 
1281
                        $args = array();
 
1282
                        foreach ( $post_fields as $field )
 
1283
                                $args[$field] = isset( $_POST[$field][$_key] ) ? $_POST[$field][$_key] : '';
 
1284
 
 
1285
                        $menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, ( $_POST['menu-item-db-id'][$_key] != $_key ? 0 : $_key ), $args );
 
1286
 
 
1287
                        if ( is_wp_error( $menu_item_db_id ) )
 
1288
                                $messages[] = '<div id="message" class="error"><p>' . $menu_item_db_id->get_error_message() . '</p></div>';
 
1289
                        elseif ( isset( $menu_items[$menu_item_db_id] ) )
 
1290
                                unset( $menu_items[$menu_item_db_id] );
 
1291
                }
 
1292
        }
 
1293
 
 
1294
        // Remove menu items from the menu that weren't in $_POST
 
1295
        if ( ! empty( $menu_items ) ) {
 
1296
                foreach ( array_keys( $menu_items ) as $menu_item_id ) {
 
1297
                        if ( is_nav_menu_item( $menu_item_id ) ) {
 
1298
                                wp_delete_post( $menu_item_id );
 
1299
                        }
 
1300
                }
 
1301
        }
 
1302
 
 
1303
        // Store 'auto-add' pages.
 
1304
        $auto_add = ! empty( $_POST['auto-add-pages'] );
 
1305
        $nav_menu_option = (array) get_option( 'nav_menu_options' );
 
1306
        if ( ! isset( $nav_menu_option['auto_add'] ) )
 
1307
                $nav_menu_option['auto_add'] = array();
 
1308
        if ( $auto_add ) {
 
1309
                if ( ! in_array( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) )
 
1310
                        $nav_menu_option['auto_add'][] = $nav_menu_selected_id;
 
1311
        } else {
 
1312
                if ( false !== ( $key = array_search( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) ) )
 
1313
                        unset( $nav_menu_option['auto_add'][$key] );
 
1314
        }
 
1315
        // Remove nonexistent/deleted menus
 
1316
        $nav_menu_option['auto_add'] = array_intersect( $nav_menu_option['auto_add'], wp_get_nav_menus( array( 'fields' => 'ids' ) ) );
 
1317
        update_option( 'nav_menu_options', $nav_menu_option );
 
1318
 
 
1319
        wp_defer_term_counting( false );
 
1320
 
 
1321
        /** This action is documented in wp-includes/nav-menu.php */
 
1322
        do_action( 'wp_update_nav_menu', $nav_menu_selected_id );
 
1323
 
 
1324
        $messages[] = '<div id="message" class="updated"><p>' . sprintf( __( '<strong>%1$s</strong> has been updated.' ), $nav_menu_selected_title ) . '</p></div>';
 
1325
        unset( $menu_items, $unsorted_menu_items );
 
1326
 
 
1327
        return $messages;
 
1328
}