web-dev-qa-db-fra.com

wp_nav_menu () perd les classes 'current-menu- *' sur une seule page de produit dans la catégorie

J'ai mon menu mis en place comme suit:

  • Boutique en ligne (page "Produits" de WPeC)
    • Catégorie de produit (Catégorie WPeC)
    • Catégorie de produit (Catégorie WPeC)
      • Sous-catégorie de produit (Catégorie WPeC)
      • Sous-catégorie de produit (Catégorie WPeC)
    • ...

Les pages de produit uniques peuvent être consultées à partir de n'importe quelle catégorie ou page de sous-catégorie car elles affichent toutes les deux la vue de la liste de produits.

Maintenant, lorsque je sélectionne Shop Online , une catégorie de produit ou une sous-catégorie, le menu met à jour ses classes CSS afin de faire correspondre la hiérarchie actuelle à l'habituel (exemple) current-menu-page, current-menu-ancestor et current-menu-parent, entre autres. Peu importe si je clique sur le menu ou la liste des catégories sur la page Shop Online pour y accéder.

Pour une raison quelconque, dès que je visualise un produit de manière singulière (domain.tld/product-cat/sub-cat/product-single ou domain.tld/product-cat/product-single), les classes de menu sont supprimées et je perds ma mise en surbrillance du menu car les classes n'y sont plus.

Est-il possible de refléter la vue unique du produit dans le menu en mettant en surbrillance la/les catégorie (s) actuelle (s) dans laquelle se trouve le produit, ainsi que l'élément de menu Shop Online/le lien respectif indiquant comment vous êtes parvenu au produit?

WP v3.5

WPeC v3.8.9.4

3
Jarryd

A la recherche d'une solution au même problème, je suis tombé sur ceci:

add_filter( 'nav_menu_css_class', 'add_parent_url_menu_class', 10, 2 );

function add_parent_url_menu_class( $classes = array(), $item = false ) {
    // Get current URL
    $current_url = current_url();

    // Get homepage URL
    $homepage_url = trailingslashit( get_bloginfo( 'url' ) );

    // Exclude 404 and homepage
    if( is_404() or $item->url == $homepage_url ) return $classes;

    if ( strstr( $current_url, $item->url) ) {
        // Add the 'parent_url' class
        $classes[] = 'parent_url';
    }

    return $classes;
}

function current_url() {
    // Protocol
    $url = ( 'on' == $_SERVER['HTTPS'] ) ? 'https://' : 'http://';
    $url .= $_SERVER['SERVER_NAME'];

    // Port
    $url .= ( '80' == $_SERVER['SERVER_PORT'] ) ? '' : ':' . $_SERVER['SERVER_PORT'];
    $url .= $_SERVER['REQUEST_URI'];
    return trailingslashit( $url );
}

Code de: http://www.rarescosma.com/2010/11/add-a-class-to-wp_nav_menu-items-with-urls-included-in-the-current-url/

J'espère que ça aide!

3
Ryan

Si vous utilisez le plugin Woocommerce, vous pouvez ajouter une classe comme celle-ci

    if (
        ($post->post_type == 'product') &&
        ($item->object_id == get_option('woocommerce_shop_page_id'))
    ) {
        array_Push($classes, 'current-page-ancestor');
    }

Comment obtenir les identifiants de page WooCommerce

get_option( 'woocommerce_shop_page_id' ); 
get_option( 'woocommerce_cart_page_id' ); 
get_option( 'woocommerce_checkout_page_id' );
get_option( 'woocommerce_pay_page_id' ); 
get_option( 'woocommerce_thanks_page_id' ); 
get_option( 'woocommerce_myaccount_page_id' ); 
get_option( 'woocommerce_edit_address_page_id' ); 
get_option( 'woocommerce_view_order_page_id' ); 
get_option( 'woocommerce_terms_page_id' ); 
0
dpolyakov