Вариант 1, решение на коленке, которое нужно здесь и сейчас.
Написать костыль на JS в виде функции, которая возьмет подстроку из текущего url и произведет поиск нужной ссылки в меню с таким же href атрибутом, и поставит найденному html элементу класс активного элемента (или контейнеру ссылки - li элементу). Не забудьте прогуляться до первого уровня меню и тоже расставить классы активного элемента, если у вас меню многоуровневое.
Вариант 2, как должно быть.
У вас во входном скрипте index.php должен быть реализован примитивный роутинг url.
Благодаря роутеру для каждой страницы вы точно можете получить путь из компонентов адреса.
Например, site.com/page1/subpage2.
От роутера вы легко можете получить путь к странице, хотя бы в таком виде:
$page_path = ['page1', 'subpage2'];
Также меню должно формироваться динамически, из какой-то сохраненной структуры, пусть структура будет статичной.
$site_menu =
[
'page1' =>
[
'title' => 'Страница 1',
'child' =>
[
'subpage2' => ['title' => 'Субстраница 2', 'child' => []]
]
],
'page2' =>
[
'title' => 'Страница 2',
'child' => []
],
];
Примерная функция для формирования меню:
// рекурсивная функция для получения сверстанного меню из структуры
function get_main_menu(
$curr_menu, //часть меню текущего уровня
$level, // номер текущего уровня
$menu_path, // путь к текущему уровню меню
&$page_path // путь к текущей странице
)
{
$out = '';
if(count($curr_menu) > 0)
{
$out .= '<ul class="main-menu main-menu_level-'.$level.'">';
foreach($curr_menu as $key_item => $menu_item)
{
$out .= '<li class="main-menu__item '
.($page_path[$level] == $key_item ? 'main-menu__curent' : '') // определяем текущий пункт меню
.'"><a href="'.$menu_path.'/'.$key_item.'">'.$menu_item['title'].'</a>';
get_main_menu($curr_menu['child'], $level + 1, $menu_path.'/'.$key_item, $page_path); // рекурсивный вызов функции для прорисовки следующего уровня
$out .= '</li>';
}
$out .= '</ul>';
}
return $out;
}
// получаем html-фрагмент меню по структуре
$out_site_menu = get_main_menu($site_menu, 0, '', $page_path);