web-dev-qa-db-fra.com

Navigation taxonomique personnalisée, avec les éléments de menu actuels pour les enfants?

Est-il possible d'avoir une navigation de taxonomie personnalisée, avec des classes de menu actif/actuel ajoutées si la publication sur laquelle vous vous trouvez est dans cette catégorie/taxe personnalisée?

par exemple, vous avez une taxonomie personnalisée appelée ... Météo. Dans ce que vous avez ensoleillé, venteux, il pleut.

Chaque fois que vous apparaissez sur une page Sunny, que ce soit l'archive de la taxonomie personnalisée, un single.php ou, plus important encore, une publication enfantine d'une publication sur la page ensoleillée, le bouton Sunny est-il mis en surbrillance?

Est-ce que le seul moyen de lister manuellement les catégories puis s’applique alors si en écho est actif?

J’ai essayé d’ajouter un menu personnalisé et via l’administrateur, mais il ne contenait que l’élément de menu habituel, cela n’indiquait pas avoir d’enfants ni quoi que ce soit.

Je ne sais pas si cela est possible du tout.

1
user4630

Je crois que le comportement que vous espérez ne fait pas partie du noyau de WordPress. La dernière fois que j'en ai eu besoin, j'ai adapté quelques fonctions du plugin Post Type Archive Link utilisées pour améliorer la mise en surbrillance du type de message. Pour l'utiliser, ajoutez simplement les éléments de menu de la manière habituelle et mettez ces fonctions dans un plugin ou un thème.

// Get menus to play nicely with the submenu script
// blissfully borrowed from Post Type Archive Links plugin, thanks @stephenharris, @F J Kaiser, @ryancurban
function mrw_tax_archive_current( $items ) {
    foreach ( $items as $item ) {
        if ( 'taxonomy' !== $item->type )
            continue;

        global $post;

        if( !$post )
            continue;

        $taxonomy = $item->object;
        $taxonomy_term = $item->object_id;
        if (
            ! is_tax( $taxonomy, $taxonomy_term )
            AND ! has_term( $taxonomy_term, $taxonomy, $post->ID )
        )
            continue;

        // Make item current
        $item->current = true;
        $item->classes[] = 'current-menu-item';

        // Loop through ancestors and give them 'parent' or 'ancestor' class
        $active_anc_item_ids = mrw_get_item_ancestors( $item );
        foreach ( $items as $key => $parent_item ) {
            $classes = (array) $parent_item->classes;

            // If menu item is the parent
            if ( $parent_item->db_id == $item->menu_item_parent ) {
                $classes[] = 'current-menu-parent';
                $items[ $key ]->current_item_parent = true;
            }

            // If menu item is an ancestor
            if ( in_array( intval( $parent_item->db_id ), $active_anc_item_ids ) ) {
                $classes[] = 'current-menu-ancestor';
                $items[ $key ]->current_item_ancestor = true;
            }

            $items[ $key ]->classes = array_unique( $classes );
        }
    }

    return $items;
}
add_filter('wp_nav_menu_objects','mrw_tax_archive_current');

function mrw_get_item_ancestors( $item ) {
    $anc_id = absint( $item->db_id );

    $active_anc_item_ids = array();
    while (
        $anc_id = get_post_meta( $anc_id, '_menu_item_menu_item_parent', true )
        AND ! in_array( $anc_id, $active_anc_item_ids )
    )
        $active_anc_item_ids[] = $anc_id;

    return $active_anc_item_ids;
}
1
mrwweb