Как добавить активный класс для текущего пункта меню на странице?
У меня есть две ссылки: Продукты и Новости.
Когда я нажимаю на Продукты или Новости, открывается архивная страница, содержащая некоторые записи, а когда я нажимаю на запись, открывается отдельная страница этой записи.
В меню я использую этот код для <li>
, чтобы добавить класс active, если страница является главной:
<li<?php if(is_home()) {?> class="active"<?php } ?>>
Но я не знаю, как это сделать, когда у меня есть две архивные страницы и две отдельные страницы.
Если я использую if( is_archive() || is_single() )
, это добавит класс к обоим пунктам меню.
Буду благодарен за помощь.

Вы можете добавить условные классы для каждого элемента в файле функций вашей дочерней темы:
Вот один из примеров, который вы можете модифицировать под свои нужды.
add_filter('nav_menu_css_class' , 'wpsites_nav_class' , 10 , 2);
function wpsites_nav_class($classes, $item){
if( is_archive() && $item->title == "Products"){
$classes[] = "products-class";
}
return $classes;
Источник http://codex.wordpress.org/Function_Reference/wp_nav_menu#Adding_Conditional_Classes_to_Menu_Items
Затем вы можете стилизовать свое навигационное меню, используя новый класс в файле style.css вашей дочерней темы.
.products-class {
Ваши CSS-правила
}
Этот CSS-код является условным, основанным на приведенном выше PHP-коде.

Куда мне нужно вставить этот код? В function.php? И где появится этот класс "products-class"?

Поместите код в конец вашего файла functions.php. Используйте класс в файле style.css вашей дочерней темы.

Я имею в виду, куда эта функция добавляет класс в коде? В body
?

Добавляет его к пункту навигационного меню, который вы включаете в PHP-код. Условно добавляет его только к пункту меню продуктов, когда вы находитесь на странице архива. Просто измените условные теги в соответствии с вашими потребностями.http://codex.wordpress.org/Условные_Теги

Предполагаю, что ваши записи Products
и News
являются пользовательскими типами записей.
Для обоих условных тегов существуют эквиваленты, специфичные для $post_type
:
if (is_post_type_archive('products')) {
// ...
} elseif (is_post_type_archive(array('news', 'something'))) {
// ...
} elseif (is_singular('products')) {
// ...
} elseif (is_singular(array('news', 'something'))) {
// ...
}
Таким образом, для Products это будет:
if (is_post_type_archive('products') || is_singular('products'))
Для News соответственно.
Ссылки:
