Хотя это может быть и не лучшее решение, оно работает довольно быстро и безболезненно:
Drupal хранит кэшированную версию всех ваших меню в таблице cache_menu. Я запустил этот запрос, чтобы получить сериализованную строку, содержащую все содержимое меню:
SELECT data FROM menu_cache WHERE serialized = 1 AND cid LIKE 'links:primary_links:%';
Замените primary_links на любое имя вашего меню и вызовите unserialize для $ row-> data, чтобы получить структурированный массив всего, что вам нужно для создания пользовательского меню.
Я вызываю функцию в hook_preprocess_block, которая заменяет содержимое блока меню своим собственным, и все, кажется, работает нормально.