Skip to content

Commit 9d6a0a3

Browse files
committed
Menus: Reset menu_item_parent to 0 when the parent is set to the item itself.
Props: peterwilsoncc, SergeyBiryukov, azaozz. Fixes #57169. git-svn-id: https://develop.svn.wordpress.org/trunk@54973 602fd350-edb4-49c9-b593-d223f7449a82
1 parent c317dc5 commit 9d6a0a3

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

src/wp-admin/nav-menus.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@
117117
if ( ! is_wp_error( $parent_object ) ) {
118118
$parent_data = (array) $parent_object;
119119
$menu_item_data['menu_item_parent'] = $parent_data['menu_item_parent'];
120+
121+
// Reset invalid `menu_item_parent`.
122+
$menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );
123+
120124
update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
121125
}
122126

@@ -126,6 +130,10 @@
126130
$menu_item_data['menu_order'] = $menu_item_data['menu_order'] + 1;
127131

128132
$menu_item_data['menu_item_parent'] = $next_item_data['ID'];
133+
134+
// Reset invalid `menu_item_parent`.
135+
$menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );
136+
129137
update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
130138

131139
wp_update_post( $menu_item_data );
@@ -137,6 +145,10 @@
137145
&& in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true )
138146
) {
139147
$menu_item_data['menu_item_parent'] = (int) get_post_meta( $menu_item_data['menu_item_parent'], '_menu_item_menu_item_parent', true );
148+
149+
// Reset invalid `menu_item_parent`.
150+
$menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );
151+
140152
update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
141153
}
142154
}
@@ -247,6 +259,10 @@
247259
) {
248260
// Just make it a child of the previous; keep the order.
249261
$menu_item_data['menu_item_parent'] = (int) $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ];
262+
263+
// Reset invalid `menu_item_parent`.
264+
$menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );
265+
250266
update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
251267
wp_update_post( $menu_item_data );
252268
}

src/wp-includes/nav-menu-template.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,11 @@ function wp_nav_menu( $args = array() ) {
199199
$menu_items_tree = array();
200200
$menu_items_with_children = array();
201201
foreach ( (array) $menu_items as $menu_item ) {
202+
// Fix invalid `menu_item_parent`. See: https://core.trac.wordpress.org/ticket/56926.
203+
if ( (int) $menu_item->ID === (int) $menu_item->menu_item_parent ) {
204+
$menu_item->menu_item_parent = 0;
205+
}
206+
202207
$sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
203208
$menu_items_tree[ $menu_item->ID ] = $menu_item->menu_item_parent;
204209
if ( $menu_item->menu_item_parent ) {

src/wp-includes/nav-menu.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,11 @@ function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item
563563

564564
$menu_item_db_id = (int) $menu_item_db_id;
565565

566+
// Reset invalid `menu_item_parent`.
567+
if ( (int) $args['menu-item-parent-id'] === $menu_item_db_id ) {
568+
$args['menu-item-parent-id'] = 0;
569+
}
570+
566571
update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key( $args['menu-item-type'] ) );
567572
update_post_meta( $menu_item_db_id, '_menu_item_menu_item_parent', (string) ( (int) $args['menu-item-parent-id'] ) );
568573
update_post_meta( $menu_item_db_id, '_menu_item_object_id', (string) ( (int) $args['menu-item-object-id'] ) );
@@ -1273,3 +1278,31 @@ function wp_map_nav_menu_locations( $new_nav_menu_locations, $old_nav_menu_locat
12731278

12741279
return $new_nav_menu_locations;
12751280
}
1281+
1282+
/**
1283+
* Prevents menu items from being their own parent.
1284+
*
1285+
* Resets menu_item_parent to 0 when the parent is set to the item itself.
1286+
* For use before saving `_menu_item_menu_item_parent` in nav-menus.php.
1287+
*
1288+
* @since 6.1.2
1289+
* @access private
1290+
*
1291+
* @param array $menu_item_data The menu item data array.
1292+
* @return array The menu item data with reset menu_item_parent.
1293+
*/
1294+
function _wp_reset_invalid_menu_item_parent( $menu_item_data ) {
1295+
if ( ! is_array( $menu_item_data ) ) {
1296+
return $menu_item_data;
1297+
}
1298+
1299+
if (
1300+
! empty( $menu_item_data['ID'] ) &&
1301+
! empty( $menu_item_data['menu_item_parent'] ) &&
1302+
(int) $menu_item_data['ID'] === (int) $menu_item_data['menu_item_parent']
1303+
) {
1304+
$menu_item_data['menu_item_parent'] = 0;
1305+
}
1306+
1307+
return $menu_item_data;
1308+
}

0 commit comments

Comments
 (0)