phpwordpresswoocommerceshortcodecustom-taxonomy

Create shortcode to show specific nav menu depending on product category


I need to create a shortcode that displays a specific wordpress menu on a Woocommerce product depending on the category the product belongs to. Both the category and menu are identified by ID but I can't seem to make it work.

Here's my code:

function view_color_menu( $category ) {
    $catarray = get_the_category( $post->ID );
    foreach ($catarray as $cat) {
        $catid = $cat->term_id;
        if ($catid == 31) {
          wp_nav_menu( array( 'menu_id' => '16' ) ); 
        }
        if ($catid == 35) {
          wp_nav_menu( array( 'menu_id' => '17' ) ); 
        }
        if ($catid == 42) {
          wp_nav_menu( array( 'menu_id' => '21' ) ); 
        }
    }
}
add_shortcode('get_color_menu', 'view_color_menu');

Solution

  • There are multiple mistakes with your code:

    Try the following revised code:

    add_shortcode('color_menu', 'color_menu_shortcode');
    function color_menu_shortcode( $atts ) {
        extract( shortcode_atts( array(
            'product_id'  => get_the_ID()
        ), $atts, 'color_menu' ) );
    
        // Array of associated term ID with Menu ID pairs
        $data_term_menu = array(
            '31' => '16',
            '35' => '17',
            '42' => '21',
        );
    
        ob_start(); // start buffering printed content
        
        // Loop through associated Term ID(s) Key / Menu ID(s) value
        foreach ( $data_term_menu as $term_id => $menu_id ) {
            // Check if the current term ID is set in the product
            if ( has_term( intval($term_id), 'product_cat', $product_id ) ) {
                wp_nav_menu( array( 'menu' => intval($menu_id) ) );
            }
        }
        return ob_get_clean(); // Return the buffered content
    }
    

    It should work…

    Shortcode usage