[wp-trac] [WordPress Trac] #63261: Menu items incorrectly marked as current when page and taxonomy share the same object_id

WordPress Trac noreply at wordpress.org
Thu Apr 10 21:16:26 UTC 2025


#63261: Menu items incorrectly marked as current when page and taxonomy share the
same object_id
--------------------------+------------------------------
 Reporter:  nuadagency    |       Owner:  (none)
     Type:  defect (bug)  |      Status:  new
 Priority:  normal        |   Milestone:  Awaiting Review
Component:  Menus         |     Version:  6.7.2
 Severity:  minor         |  Resolution:
 Keywords:                |     Focuses:  accessibility
--------------------------+------------------------------
Changes (by sabernhardt):

 * focuses:  accessibility, coding-standards => accessibility


Old description:

> == Description ==
> If a page and a taxonomy term (e.g., product_cat) share the same numeric
> ID, both can be incorrectly marked as active in menus (current-menu-item,
> aria-current="page").
>
> This occurs because WordPress checks only the object_id when determining
> the active menu item, without verifying that the object types match.
>
> == Steps to Reproduce ==
>
> Create a WordPress page (e.g., "About") — assume it has ID 23.
>
> Create a WooCommerce product category that also ends up with term_id =
> 23.
>
> Add both items to a navigation menu.
>
> Visit the product category archive (/product-category/boots/).
>
> Observe that ''both'' menu items ("About" and "Boots") are marked as
> current.
>
> == Expected Result ==
> Only the menu item representing the current object type (e.g., the
> product category) should be marked as current.
>
> == Actual Result ==
> Both items are incorrectly highlighted due to ID match, even though they
> represent different object types.
>
> == Cause ==
> In wp-includes/nav-menu-template.php, this comparison is made:
>
> {{{php if ( $menu_item->object_id === $queried_object_id ) {
> $menu_item->current = true; } }}}
>
> This does not check if the object type (e.g. page, product_cat) also
> matches.
>
> == Proposed Fix ==
> Enhance the condition to ensure both ID and object type match:
>
> {{{php $queried_object_type = ''; if ( isset( $queried_object->post_type
> ) ) { $queried_object_type = $queried_object->post_type; } elseif (
> isset( $queried_object->taxonomy ) ) { $queried_object_type =
> $queried_object->taxonomy; } if ( (int) $menu_item->object_id === (int)
> $queried_object_id && $menu_item->object === $queried_object_type ) {
> $menu_item->current = true; } }}}
>
> == Environment ==
>
> WordPress 6.7.2
>
> WooCommerce 9.7.1
>
> PHP 8.2
>

>
> == Notes ==
> This issue causes confusing menu behavior and accessibility
> inconsistencies. It's especially common with WooCommerce where term IDs
> frequently overlap with page IDs.

New description:

 == Description ==
 If a page and a taxonomy term (e.g., `product_cat`) share the same numeric
 ID, both can be incorrectly marked as active in menus (`current-menu-
 item`, `aria-current="page"`).

 This occurs because WordPress checks only the `object_id` when determining
 the active menu item, without verifying that the object types match.

 == Steps to Reproduce ==

 Create a WordPress page (e.g., "About") — assume it has ID 23.

 Create a WooCommerce product category that also ends up with `term_id` =
 23.

 Add both items to a navigation menu.

 Visit the product category archive (`/product-category/boots/`).

 Observe that ''both'' menu items ("About" and "Boots") are marked as
 current.

 == Expected Result ==
 Only the menu item representing the current object type (e.g., the product
 category) should be marked as current.

 == Actual Result ==
 Both items are incorrectly highlighted due to ID match, even though they
 represent different object types.

 == Cause ==
 In `wp-includes/nav-menu-template.php`, this comparison is made:

 {{{#!php
 if ( $menu_item->object_id === $queried_object_id ) { $menu_item->current
 = true; }
 }}}

 This does not check if the object type (e.g. `page`, `product_cat`) also
 matches.

 == Proposed Fix ==
 Enhance the condition to ensure both ID and object type match:

 {{{#!php
 $queried_object_type = '';
 if ( isset( $queried_object->post_type ) ) {
     $queried_object_type = $queried_object->post_type;
 } elseif ( isset( $queried_object->taxonomy ) ) {
     $queried_object_type = $queried_object->taxonomy;
 }
 if ( (int) $menu_item->object_id === (int) $queried_object_id
     && $menu_item->object === $queried_object_type ) {
     $menu_item->current = true;
 }
 }}}

 == Environment ==

 WordPress 6.7.2

 WooCommerce 9.7.1

 PHP 8.2



 == Notes ==
 This issue causes confusing menu behavior and accessibility
 inconsistencies. It's especially common with WooCommerce where term IDs
 frequently overlap with page IDs.

--

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/63261#comment:1>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list