Статейка от
Taras Petrichuk сильно устаревшая, но в целом направление понятное и правильное. В целом маркап настраивается нормально в wp_nav_menu(), что касается классов - зависит от того насколько сильно надо менять. Есть фильтры, есть кастомный Walker. Фильтрами быстро и удобно, вокером - гибко и надежно, всегда можно получить ровно то, что нужно.
Лучще всего изучить именно код родных функий и класса Walker_Nav_Menu, чтобы четко понимать как менюха собирается. Из кода и документации в нем все станет понятно.