Come aggiungere la classe active alla voce di menu della pagina corrente?
Ho due link: Prodotti e News.
Quando clicco su Prodotti o News, mi porta a una pagina di archivio che contiene alcuni post, quando clicco su un post mi porta alla pagina singola di quel post.
Nel menu uso questo codice sul <li>
per aggiungere una classe chiamata active se la pagina è home:
<li<?php if(is_home()) {?> class="active"<?php } ?>>
Ma non so come fare quando ho due pagine di archivio e due pagine singole.
Se uso if( is_archive() || is_single() )
aggiungerà la classe a entrambe le voci di menu.
Qualsiasi aiuto sarebbe apprezzato.

Puoi aggiungere classi condizionali per ciascun elemento nel file functions del tuo child theme:
Ecco un esempio che puoi modificare in base alle tue esigenze.
add_filter('nav_menu_css_class' , 'wpsites_nav_class' , 10 , 2);
function wpsites_nav_class($classes, $item){
if( is_archive() && $item->title == "Prodotti"){
$classes[] = "products-class";
}
return $classes;
Fonte http://codex.wordpress.org/Function_Reference/wp_nav_menu#Adding_Conditional_Classes_to_Menu_Items
Puoi quindi stilizzare il tuo menu di navigazione utilizzando la nuova classe nel file style.css del tuo child theme.
.products-class {
Le tue dichiarazioni CSS
}
Questo codice CSS è condizionale in base al codice PHP sopra riportato.

dove dovrei inserire questo codice? in function.php? e dove apparirà questa "products-class"?

Inserisci il codice alla fine del tuo file functions.php. Usa la classe nel file style.css del tuo child theme.

Intendo, dove questa funzione aggiunge la classe nel codice? nel body
?

Aggiunge l'elemento al menu di navigazione che includi nel codice PHP. Lo aggiunge condizionalmente solo alla voce del menu prodotti quando sei su una pagina di archivio. Modifica semplicemente i tag condizionali in base alle tue esigenze.http://codex.wordpress.org/Conditional_Tags

Suppongo che i tuoi post Prodotti
e News
siano custom post.
Per entrambi i conditional tag, esiste un equivalente specifico per $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'))) {
// ...
}
Quindi, per Prodotti, sarebbe:
if (is_post_type_archive('products') || is_singular('products'))
News di conseguenza.
Riferimenti:
