¿Cómo agregar la clase active en el elemento del menú de la página actual?
Tengo dos enlaces: Productos y Noticias.
Cuando hago clic en Productos o Noticias, me devuelve una página de archivo que contiene algunas entradas, cuando hago clic en una entrada me devuelve una página individual de esta entrada.
En el menú uso este código en <li>
para agregar una clase llamada active si la página es inicio:
<li<?php if(is_home()) {?> class="active"<?php } ?>>
Pero no sé cómo hacerlo cuando tengo dos páginas de archivo y dos páginas individuales.
Si uso if( is_archive() || is_single() )
agregará la clase en ambos elementos del menú.
Cualquier ayuda sería apreciada.

Podrías agregar clases condicionales para cada uno en el archivo de funciones de tu tema hijo:
Aquí hay un ejemplo que puedes modificar para adaptarlo a tus necesidades.
add_filter('nav_menu_css_class' , 'wpsites_nav_class' , 10 , 2);
function wpsites_nav_class($classes, $item){
if( is_archive() && $item->title == "Productos"){
$classes[] = "products-class";
}
return $classes;
Fuente http://codex.wordpress.org/Function_Reference/wp_nav_menu#Adding_Conditional_Classes_to_Menu_Items
Luego puedes estilizar tu menú de navegación usando la nueva clase en el archivo style.css de tu tema hijo.
.products-class {
Tus declaraciones CSS
}
Este código CSS es condicional basado en el código PHP anterior.

¿Dónde se supone que debo poner este código? ¿en functions.php? ¿y dónde aparecerá esta clase "products-class"?

Coloca el código al final de tu archivo functions.php. Usa la clase en tu archivo style.css del tema hijo.

Me refiero a ¿dónde añade esta función la clase en el código? ¿en el body
?

Lo agrega al elemento del menú de navegación que incluyes en el código PHP. Lo añade condicionalmente solo al elemento del menú de productos cuando estás en una página de archivo. Simplemente cambia las etiquetas condicionales según tus necesidades.http://codex.wordpress.org/Conditional_Tags

Supongo que tus publicaciones de Productos
y Noticias
son tipos de publicaciones personalizados.
Para ambas etiquetas condicionales, hay un equivalente específico para $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'))) {
// ...
}
Entonces, para Productos, sería:
if (is_post_type_archive('products') || is_singular('products'))
Para Noticias de manera similar.
Referencias:
