From 9e96365b8ed56a4eabb6c7a0a94957eb36dab0c0 Mon Sep 17 00:00:00 2001 From: Scott Taylor Date: Thu, 29 Aug 2013 16:44:36 +0000 Subject: [PATCH] Pass the taxonomy around to relevant nav menu actions to avoid arbitrarily deleting all items with `menu-item-type` of `taxonomy`. Adds unit test for `wp_get_associated_nav_menu_items()`. Props garyc40, SergeyBiryukov. Fixes #15264. git-svn-id: https://develop.svn.wordpress.org/trunk@25163 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/default-filters.php | 2 +- src/wp-includes/nav-menu.php | 10 ++++--- tests/tests/post/nav-menu.php | 41 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 tests/tests/post/nav-menu.php diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 7c55dfb4d1..b6c7527553 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -262,7 +262,7 @@ add_action( 'welcome_panel', 'wp_welcome_panel' // Navigation menu actions add_action( 'delete_post', '_wp_delete_post_menu_item' ); -add_action( 'delete_term', '_wp_delete_tax_menu_item' ); +add_action( 'delete_term', '_wp_delete_tax_menu_item', 10, 3 ); add_action( 'transition_post_status', '_wp_auto_add_pages_to_menu', 10, 3 ); // Post Thumbnail CSS class filtering diff --git a/src/wp-includes/nav-menu.php b/src/wp-includes/nav-menu.php index 794f4b2d11..eab50c9098 100644 --- a/src/wp-includes/nav-menu.php +++ b/src/wp-includes/nav-menu.php @@ -685,9 +685,10 @@ function wp_setup_nav_menu_item( $menu_item ) { * * @param int $object_id The ID of the original object. * @param string $object_type The type of object, such as "taxonomy" or "post_type." + * @param string $taxonomy If $object_type is "taxonomy", $taxonomy is the name of the tax that $object_id belongs to * @return array The array of menu item IDs; empty array if none; */ -function wp_get_associated_nav_menu_items( $object_id = 0, $object_type = 'post_type' ) { +function wp_get_associated_nav_menu_items( $object_id = 0, $object_type = 'post_type', $taxonomy = '' ) { $object_id = (int) $object_id; $menu_item_ids = array(); @@ -703,7 +704,8 @@ function wp_get_associated_nav_menu_items( $object_id = 0, $object_type = 'post_ ); foreach( (array) $menu_items as $menu_item ) { if ( isset( $menu_item->ID ) && is_nav_menu_item( $menu_item->ID ) ) { - if ( get_post_meta( $menu_item->ID, '_menu_item_type', true ) != $object_type ) + if ( get_post_meta( $menu_item->ID, '_menu_item_type', true ) !== $object_type || + get_post_meta( $menu_item->ID, '_menu_item_object', true ) !== $taxonomy ) continue; $menu_item_ids[] = (int) $menu_item->ID; @@ -741,10 +743,10 @@ function _wp_delete_post_menu_item( $object_id = 0 ) { * @param int $object_id The ID of the original object being trashed. * */ -function _wp_delete_tax_menu_item( $object_id = 0 ) { +function _wp_delete_tax_menu_item( $object_id = 0, $tt_id, $taxonomy ) { $object_id = (int) $object_id; - $menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'taxonomy' ); + $menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'taxonomy', $taxonomy ); foreach( (array) $menu_item_ids as $menu_item_id ) { wp_delete_post( $menu_item_id, true ); diff --git a/tests/tests/post/nav-menu.php b/tests/tests/post/nav-menu.php new file mode 100644 index 0000000000..00912879f6 --- /dev/null +++ b/tests/tests/post/nav-menu.php @@ -0,0 +1,41 @@ +menu_id = wp_create_nav_menu( rand_str() ); + } + + function test_wp_get_associated_nav_menu_items() { + $tag_id = $this->factory->tag->create(); + $cat_id = $this->factory->category->create(); + + $tag_insert = wp_update_nav_menu_item( $this->menu_id, 0, array( + 'menu-item-type' => 'taxonomy', + 'menu-item-object' => 'post_tag', + 'menu-item-object-id' => $tag_id, + 'menu-item-status' => 'publish' + ) ); + + $cat_insert = wp_update_nav_menu_item( $this->menu_id, 0, array( + 'menu-item-type' => 'taxonomy', + 'menu-item-object' => 'category', + 'menu-item-object-id' => $cat_id, + 'menu-item-status' => 'publish' + ) ); + + $tag_items = wp_get_associated_nav_menu_items( $tag_id, 'taxonomy', 'post_tag' ); + $this->assertEqualSets( array( $tag_insert ), $tag_items ); + $cat_items = wp_get_associated_nav_menu_items( $cat_id, 'taxonomy', 'category' ); + $this->assertEqualSets( array( $cat_insert ), $cat_items ); + } +} \ No newline at end of file