<li class="cc-product-grid-item">

    <div class="cc-product-grid-image-container">
        <a href="<?php 
echo get_permalink();
?>
" title="<?php 
the_title();
?>
"><img src="<?php 
echo cc_primary_image_for_product($post->ID);
?>
" class="cc-grid-item-image"  alt="<?php 
echo $alt;
?>
" /></a>
    </div>

    <p class="cc-product-grid-title"><?php 
the_title();
?>
</p>

    <?php 
$post = get_post();
if (!empty($post->post_excerpt)) {
    ?>
    <p class="cc-product-grid-excerpt"><?php 
    echo $post->post_excerpt;
    ?>
</p>
 /**
  * Show the product catalog
  *
  * Params:
  *  - category: Limit the list to a certain product category slug (default "all")
  *  - max: The max number of products to list per page. (default 6)
  *  - sort: How to sort the products
  *    - price_asc
  *    - price_desc
  *    - name_asc
  *    - name_desc
  *    - menu
  */
 public static function cc_product_catalog($args, $content)
 {
     // Look for limit
     $no_paging = false;
     $limit = null;
     if (isset($args['limit']) && is_numeric($args['limit']) && $args['limit'] >= 1) {
         $no_paging = true;
         $limit = $args['limit'];
     }
     // Look for page
     $page = get_query_var('paged') ? get_query_var('paged') : 1;
     if ($page == 1) {
         $page = get_query_var('page') ? get_query_var('page') : 1;
     }
     // Look for number of posts to show per page
     $per_page = isset($args['max']) ? (int) $args['max'] : 6;
     if ($per_page < 1) {
         $per_page = 6;
     }
     // Look for catalog title
     $title = null;
     if (isset($args['title'])) {
         $title = $args['title'];
     }
     $params = array('post_type' => 'cc_product', 'posts_per_page' => $per_page, 'post_status' => 'publish', 'paged' => $page, 'nopaging' => $no_paging);
     // Limit by category
     if (isset($args['category'])) {
         $category = strtolower($args['category']);
         if ('all' != $category) {
             $params['product-category'] = $category;
         }
     }
     // Order the posts
     $params['orderby'] = 'menu_order';
     if (isset($args['sort'])) {
         switch ($args['sort']) {
             case 'price_asc':
                 $params['orderby'] = array('meta_value_num' => 'ASC', 'menu_order' => 'ASC');
                 $params['meta_key'] = '_cc_product_price';
                 break;
             case 'price_desc':
                 $params['orderby'] = array('meta_value_num' => 'DESC', 'menu_order' => 'ASC');
                 $params['meta_key'] = '_cc_product_price';
                 break;
             case 'name_asc':
                 $params['orderby'] = 'title';
                 $params['order'] = 'ASC';
                 break;
             case 'name_desc':
                 $params['orderby'] = 'title';
                 $params['order'] = 'DESC';
                 break;
             case 'menu':
                 $params['orderby'] = 'menu_order';
                 break;
         }
     }
     // $products = get_posts( $params );
     global $post;
     $wp_query = new WP_Query($params);
     $product_count = 0;
     $out = '';
     if ($wp_query->have_posts()) {
         if (isset($title)) {
             $out .= '<h3 class="cc-catalog-title">' . $title . '</h3>';
         }
         // Include title in output if provided
         $out .= '<ul class="cc-product-list">';
         while ($wp_query->have_posts()) {
             $wp_query->the_post();
             $src = cc_primary_image_for_product($post->ID);
             $out .= CC_View::get(CC_PATH . 'templates/partials/grid-item.php', array('post' => $post, 'thumbnail_src' => $src));
             if (isset($limit)) {
                 $product_count += 1;
                 if ($product_count >= $limit) {
                     break;
                 }
             }
         }
         $out .= '</ul>';
         // Include catalog pagination
         $out .= CC_View::get(CC_PATH . 'templates/partials/pagination.php', array('query' => $wp_query, 'page' => $page));
     }
     return $out;
 }