On a fresh website custom menus are never added to the menu_default_active_menus variable and this variable is never created at all. The reason is in different default values used for this variable in menu_save() function and menu_set_active_menu_names(). In the first one default value contains only custom menus (including saved menu) and in the latter one default value is system menus list.

In menu_save():

function menu_save($menu) {
  $status = db_merge('menu_custom')
    ->key(array('menu_name' => $menu['menu_name']))
    ->fields(array(
      'title' => $menu['title'],
      'description' => $menu['description'],
    ))
    ->execute();
  menu_cache_clear_all();

  switch ($status) {
    case SAVED_NEW:
      // Make sure the menu is present in the active menus variable so that its
      // items may appear in the menu active trail.
      // @see menu_set_active_menu_names()
      $active_menus = variable_get('menu_default_active_menus', array_keys(menu_get_menus()));
      if (!in_array($menu['menu_name'], $active_menus)) {
        // Never happens, because $active_menus contains custom menus returned as a default value.
        $active_menus[] = $menu['menu_name'];
        variable_set('menu_default_active_menus', $active_menus);
      }

      module_invoke_all('menu_insert', $menu);
      break;

    case SAVED_UPDATED:
      module_invoke_all('menu_update', $menu);
      break;
  }
}

As a result menu_set_active_menu_names() returns system menus:

function menu_set_active_menu_names($menu_names = NULL) {
  $active = &drupal_static(__FUNCTION__);

  if (isset($menu_names) && is_array($menu_names)) {
    $active = $menu_names;
  }
  elseif (!isset($active)) {
    $active = variable_get('menu_default_active_menus', array_keys(menu_list_system_menus()));
  }
  return $active;
}

This problem also exists in D8. Is it a bug or a feature?

Comments

jax’s picture

Just hit the same bug. It's a bug, default values should be the same everywhere or things won't work.

jax’s picture

Issue summary: View changes

Added functions source code.

Status: Active » Closed (outdated)

Automatically closed because Drupal 7 security and bugfix support has ended as of 5 January 2025. If the issue verifiably applies to later versions, please reopen with details and update the version.