1

I have this code which has taken over 7 hours to put together through research but the last hours or so I have hit a brick wall!

I require the taxonomy title to be hidden if there are no posts associated with it.

Here is the page: http://cb.dannycheeseman.me/wine-menu/usa/california/

Here is my code:

/**********************************************/
//  CUSTOM WINE MENU SHORTCODE
/**********************************************/


add_shortcode( 'wine_list_per_cat', 'wine_list_per_cat' );

function wine_list_per_cat($atts){

    global $woocommerce_loop;

    extract(shortcode_atts(array(
        'cat' => '',    // list of categories in the format 0,1,2,3,4
        'tax' => 'product_cat', // taxonomy use
        'per_cat' => '3',   // max featured items to display per category
        'columns' => '3',   // columns size
    ), $atts));
?>

<ul id="wine-menu">

    <?php  

        $wine_type_terms = get_terms( 'wine-type' );

        foreach ( $wine_type_terms as $wine_type_term ) {

            $args = array(
                'post_type' => 'product',
                'showposts' => -1,
                'tax_query' => array(
                    'relation' => 'IN',
                    array(
                        'taxonomy' => 'wine-type',
                            'field' => 'slug',
                            'terms' => array( $wine_type_term->slug ),
                        ),
                        array(
                            'taxonomy' => 'product_cat',
                            'field' => 'slug',
                            'terms' => $cat
                        )
                    ));

            $wine_type_query = new WP_Query($args);?>
            <li>
            <h2><?php echo $wine_type_term->name; ?></h2>
            <ul>
                <?php  while ( $wine_type_query->have_posts() ) : $wine_type_query->the_post();global $product ?>
                    <li class="wine-item"> 
                        <h3><?php the_title(); ?></h3>
                        <span class="wine-bottle-size">Size: <?php echo get_post_meta( get_the_ID(),'wine_bottle_size', true );?></span><br/>
                        <span class="wine-percentage">Percentage: <?php echo get_post_meta( get_the_ID(), 'wine_percentage', true );?></span><br/>
                        <span class="wine-year">Year: <?php echo get_post_meta( get_the_ID(), 'wine_year', true );?></span><br/>
                        <span class="wine-price">Price: <?php echo $product->get_price_html(); ?></span><br/>
                        <div class="wine-content"><?php echo get_post_meta( get_the_ID(), 'wine_menu_content', true );?></div>
                        <?php woocommerce_template_loop_add_to_cart( $wine_type_query->post, $product ); ?>
                    </li>


                <?php endwhile;?>
                <?php wp_reset_postdata(); ?>
            </ul>


         </li>               
        <?php } ?>

        <?php wp_reset_query(); ?>

</ul><!--/.products-->
<?php } 

UPDATE! OK!!! Woooohooo! Found out what it was.. I should have been calling if have posts before the call for $tax->name; Here is my final, and working code! :)

/**********************************************/
//  CUSTOM WINE MENU SHORTCODE
/**********************************************/


add_shortcode( 'wine_list_per_cat', 'wine_list_per_cat' );

function wine_list_per_cat($atts){

    global $woocommerce_loop;

    extract(shortcode_atts(array(
        'cat' => '',    // list of categories in the format 0,1,2,3,4
        'tax' => 'product_cat', // taxonomy use
        'per_cat' => '3',   // max featured items to display per category
        'columns' => '3',   // columns size
    ), $atts));
?>

<ul id="wine-menu">

    <?php  

        $taxonomy = get_terms( 'wine-type', array('hide_empty' => true, 'pad_counts' => true));

        foreach ( $taxonomy as $tax ) {

            $args = array(
                'post_type' => 'product',
                'orderby' => 'title',
                'showposts' => -1,
                'tax_query' => array(
                    'relation' => 'AND',
                    array(
                        'taxonomy' => 'product_cat',
                        'field' => 'slug',
                        'terms' => $cat,
                        'operator' => 'IN'
                    ),
                    array(
                        'taxonomy' => 'wine-type',
                        'field' => 'slug',
                        'terms' => array( $tax->slug ),
                        'operator' => 'IN'
                    ),

                ));

            $wine_type_query = null;

            $wine_type_query = new WP_Query($args);

            if( $wine_type_query->have_posts() ) : ?>

                <li id="wine-type">
                    <h2><?php echo $tax->name; ?></h2>

                    <ul>
                        <?php while ( $wine_type_query->have_posts() ) : $wine_type_query->the_post();global $product ?>
                        <li class="wine-item"> 
                            <h3><?php the_title(); ?></h3>
                            <span class="wine-bottle-size">Size: <?php echo get_post_meta( get_the_ID(),'wine_bottle_size', true );?></span><br/>
                            <span class="wine-percentage">Percentage: <?php echo get_post_meta( get_the_ID(), 'wine_percentage', true );?></span><br/>
                            <span class="wine-year">Year: <?php echo get_post_meta( get_the_ID(), 'wine_year', true );?></span><br/>
                            <span class="wine-price">Price: <?php echo $product->get_price_html(); ?></span><br/>
                            <div class="wine-content"><?php echo get_post_meta( get_the_ID(), 'wine_menu_content', true );?></div>
                            <?php woocommerce_template_loop_add_to_cart( $wine_type_query->post, $product ); ?>
                        </li>
                        <?php endwhile;?>

                    </ul>

                </li> 
            <?php endif; wp_reset_query(); ?>

    <?php } ?>

</ul><!--/.products-->
<?php } 
  • I must misunderstand because the default hide_empty argument for get_terms is to not show terms without posts associated with them. – s_ha_dum Apr 4 '14 at 0:22
  • I know, thats what I thought but it is showing them?? – user49899 Apr 4 '14 at 0:23
  • Perhaps a plugin or your theme has added a filter? You can try explicitly setting that argument though that is a long shot. – s_ha_dum Apr 4 '14 at 0:25
  • I have tried.. $wine_type_terms = get_terms( 'wine-type', array('hide_empty' => 1)); – user49899 Apr 4 '14 at 0:28
  • 1
    Post your solution in the "Answer" box, please, and not as an edit to the question. – s_ha_dum Apr 4 '14 at 4:06
0

UPDATE! OK!!! Woooohooo! Found out what it was.. I should have been calling if have posts before the call for $tax->name; Here is my final, and working code! :)

<?php
/**********************************************/
//  CUSTOM WINE MENU SHORTCODE
/**********************************************/


add_shortcode( 'wine_list_per_cat', 'wine_list_per_cat' );

function wine_list_per_cat($atts){

    global $woocommerce_loop;

    extract(shortcode_atts(array(
        'cat' => '',    // list of categories in the format 0,1,2,3,4
        'tax' => 'product_cat', // taxonomy use
        'per_cat' => '3',   // max featured items to display per category
        'columns' => '3',   // columns size
    ), $atts));
?>

<ul id="wine-menu">

    <?php  

        $taxonomy = get_terms( 'wine-type', array('hide_empty' => true, 'pad_counts' => true));

        foreach ( $taxonomy as $tax ) {

            $args = array(
                'post_type' => 'product',
                'orderby' => 'title',
                'showposts' => -1,
                'tax_query' => array(
                    'relation' => 'AND',
                    array(
                        'taxonomy' => 'product_cat',
                        'field' => 'slug',
                        'terms' => $cat,
                        'operator' => 'IN'
                    ),
                    array(
                        'taxonomy' => 'wine-type',
                        'field' => 'slug',
                        'terms' => array( $tax->slug ),
                        'operator' => 'IN'
                    ),

                ));

            $wine_type_query = null;

            $wine_type_query = new WP_Query($args);

            if( $wine_type_query->have_posts() ) : ?>

                <li id="wine-type">
                    <h2><?php echo $tax->name; ?></h2>

                    <ul>
                        <?php while ( $wine_type_query->have_posts() ) : $wine_type_query->the_post();global $product ?>
                        <li class="wine-item"> 
                            <h3><?php the_title(); ?></h3>
                            <span class="wine-bottle-size">Size: <?php echo get_post_meta( get_the_ID(),'wine_bottle_size', true );?></span><br/>
                            <span class="wine-percentage">Percentage: <?php echo get_post_meta( get_the_ID(), 'wine_percentage', true );?></span><br/>
                            <span class="wine-year">Year: <?php echo get_post_meta( get_the_ID(), 'wine_year', true );?></span><br/>
                            <span class="wine-price">Price: <?php echo $product->get_price_html(); ?></span><br/>
                            <div class="wine-content"><?php echo get_post_meta( get_the_ID(), 'wine_menu_content', true );?></div>
                            <?php woocommerce_template_loop_add_to_cart( $wine_type_query->post, $product ); ?>
                        </li>
                        <?php endwhile;?>

                    </ul>

                </li> 
            <?php endif; wp_reset_query(); ?>

    <?php } ?>

</ul><!--/.products-->
<?php } 

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.