Viewing 8 replies - 1 through 8 (of 8 total)
  • alfabetasdgadga

    (@alfabetasdgadga)

    Hi neol56, I have the same problem, any idea how to solve it?

    alfabetasdgadga

    (@alfabetasdgadga)

    More info:

    My principal page (only shows 12 items/page): http://goo.gl/LolvnD
    My category “frases” (about 42 items in the category only shows 12 items): http://goo.gl/4E8l1f <- no pagination

    Thanks..

    Thread Starter neol56

    (@neol56)

    Still not found a solution. If any of us do find a solution, pls post it here 🙂

    Well there is a workaround.
    Yes, I know it’s a bit ugly but it has a great advantage – it works, at least for me.
    1) navigate to /wp-content/plugins/woocommerce/classes/ and make backup of class-wc-shortcodes.php
    2) edit class-wc-shortcodes.php go to function product_attribute( $atts ) {
    in my case it is line #966
    to the following code

    $args = array(
    			'post_type'           => 'product',
    			'post_status'         => 'publish',
    			'ignore_sticky_posts' => 1,

    add the following line
    'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1,

    so the whole array initialization looks like the following

    $args = array(
    			'post_type'           => 'product',
    			'post_status'         => 'publish',
    			'ignore_sticky_posts' => 1,
    			'paged'								=> (get_query_var('paged')) ? get_query_var('paged') : 1,
    			'posts_per_page'      => $per_page,
    			'orderby'             => $orderby,
    			'order'               => $order,
    			'meta_query'          => array(
    				array(
    					'key'               => '_visibility',
    					'value'             => array('catalog', 'visible'),
    					'compare'           => 'IN'
    				)
    			),
    			'tax_query' 			=> array(
    				array(
    					'taxonomy' 	=> $attribute,
    					'terms' 	=> $filter,
    					'field' 	=> 'slug'
    				)
    			)
    		);

    3) change the line #1020
    <?php woocommerce_product_loop_end(); ?>
    to the following

    <?php woocommerce_product_loop_end();
    				global $wp_query;
    				$wp_query->max_num_pages = $products->max_num_pages;
    							woocommerce_pagination();
    			?>

    Again, yes I know that solution can be more elegant, I just don’t need it.

    It worked for me. Thank you so much.

    I have the same problem with @alfabetasdgadga, my home page didn’t show pagination although i already post more then 12 products. Here is the screenshot of my page : http://gyazo.com/00dbc135219b7054a8d34c48596ddd67

    I already try what kolinus suggest but i still can’t make it works.

    any other way to fix this?

    here is my class-wc-shortcodes.php code

    <?php
    /**
     * WC_Shortcodes class.
     *
     * @class 		WC_Shortcodes
     * @version		2.1.0
     * @package		WooCommerce/Classes
     * @category	Class
     * @author 		WooThemes
     */
    class WC_Shortcodes {
    
    	/**
    	 * Init shortcodes
    	 */
    	public static function init() {
    		// Define shortcodes
    		$shortcodes = array(
    			'product'                    => __CLASS__ . '::product',
    			'product_page'               => __CLASS__ . '::product_page',
    			'product_category'           => __CLASS__ . '::product_category',
    			'product_categories'         => __CLASS__ . '::product_categories',
    			'add_to_cart'                => __CLASS__ . '::product_add_to_cart',
    			'add_to_cart_url'            => __CLASS__ . '::product_add_to_cart_url',
    			'products'                   => __CLASS__ . '::products',
    			'recent_products'            => __CLASS__ . '::recent_products',
    			'sale_products'              => __CLASS__ . '::sale_products',
    			'best_selling_products'      => __CLASS__ . '::best_selling_products',
    			'top_rated_products'         => __CLASS__ . '::top_rated_products',
    			'featured_products'          => __CLASS__ . '::featured_products',
    			'product_attribute'          => __CLASS__ . '::product_attribute',
    			'related_products'           => __CLASS__ . '::related_products',
    			'shop_messages'              => __CLASS__ . '::shop_messages',
    			'woocommerce_order_tracking' => __CLASS__ . '::order_tracking',
    			'woocommerce_cart'           => __CLASS__ . '::cart',
    			'woocommerce_checkout'       => __CLASS__ . '::checkout',
    			'woocommerce_my_account'     => __CLASS__ . '::my_account',
    		);
    
    		foreach ( $shortcodes as $shortcode => $function ) {
    			add_shortcode( apply_filters( "{$shortcode}_shortcode_tag", $shortcode ), $function );
    		}
    
    		// Alias for pre 2.1 compatibility
    		add_shortcode( 'woocommerce_messages', __CLASS__ . '::shop_messages' );
    	}
    
    	/**
    	 * Shortcode Wrapper
    	 *
    	 * @param mixed $function
    	 * @param array $atts (default: array())
    	 * @return string
    	 */
    	public static function shortcode_wrapper(
    		$function,
    		$atts    = array(),
    		$wrapper = array(
    			'class'  => 'woocommerce',
    			'before' => null,
    			'after'  => null
    		)
    	) {
    		ob_start();
    
    		$before 	= empty( $wrapper['before'] ) ? '<div class="' . esc_attr( $wrapper['class'] ) . '">' : $wrapper['before'];
    		$after 		= empty( $wrapper['after'] ) ? '</div>' : $wrapper['after'];
    
    		echo $before;
    		call_user_func( $function, $atts );
    		echo $after;
    
    		return ob_get_clean();
    	}
    
    	/**
    	 * Cart page shortcode.
    	 *
    	 * @access public
    	 * @param mixed $atts
    	 * @return string
    	 */
    	public static function cart( $atts ) {
    		return self::shortcode_wrapper( array( 'WC_Shortcode_Cart', 'output' ), $atts );
    	}
    
    	/**
    	 * Checkout page shortcode.
    	 *
    	 * @access public
    	 * @param mixed $atts
    	 * @return string
    	 */
    	public static function checkout( $atts ) {
    		return self::shortcode_wrapper( array( 'WC_Shortcode_Checkout', 'output' ), $atts );
    	}
    
    	/**
    	 * Order tracking page shortcode.
    	 *
    	 * @access public
    	 * @param mixed $atts
    	 * @return string
    	 */
    	public static function order_tracking( $atts ) {
    		return self::shortcode_wrapper( array( 'WC_Shortcode_Order_Tracking', 'output' ), $atts );
    	}
    
    	/**
    	 * Cart shortcode.
    	 *
    	 * @access public
    	 * @param mixed $atts
    	 * @return string
    	 */
    	public static function my_account( $atts ) {
    		return self::shortcode_wrapper( array( 'WC_Shortcode_My_Account', 'output' ), $atts );
    	}
    
    	/**
    	 * List products in a category shortcode
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function product_category( $atts ) {
    		global $woocommerce_loop;
    
    		if ( empty( $atts ) ) return '';
    
    		extract( shortcode_atts( array(
    			'per_page' 		=> '12',
    			'columns' 		=> '4',
    			'orderby'   	=> 'title',
    			'order'     	=> 'desc',
    			'category'		=> '',
    			'operator'      => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'.
    			), $atts ) );
    
    		if ( ! $category ) return '';
    
    		// Default ordering args
    		$ordering_args = WC()->query->get_catalog_ordering_args( $orderby, $order );
    
    		$args = array(
    			'post_type'				=> 'product',
    			'post_status' 			=> 'publish',
    			'ignore_sticky_posts'	=> 1,
    			'orderby' 				=> $ordering_args['orderby'],
    			'order' 				=> $ordering_args['order'],
    			'posts_per_page' 		=> $per_page,
    			'meta_query' 			=> array(
    				array(
    					'key' 			=> '_visibility',
    					'value' 		=> array('catalog', 'visible'),
    					'compare' 		=> 'IN'
    				)
    			),
    			'tax_query' 			=> array(
    				array(
    					'taxonomy' 		=> 'product_cat',
    					'terms' 		=> array( esc_attr( $category ) ),
    					'field' 		=> 'slug',
    					'operator' 		=> $operator
    				)
    			)
    		);
    
    		if ( isset( $ordering_args['meta_key'] ) ) {
    			$args['meta_key'] = $ordering_args['meta_key'];
    		}
    
    		ob_start();
    
    		$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );
    
    		$woocommerce_loop['columns'] = $columns;
    
    		if ( $products->have_posts() ) : ?>
    
    			<?php woocommerce_product_loop_start(); ?>
    
    				<?php while ( $products->have_posts() ) : $products->the_post(); ?>
    
    					<?php wc_get_template_part( 'content', 'product' ); ?>
    
    				<?php endwhile; // end of the loop. ?>
    
    			<?php woocommerce_product_loop_end(); ?>
    
    		<?php endif;
    
    		woocommerce_reset_loop();
    		wp_reset_postdata();
    
    		return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * List all (or limited) product categories
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function product_categories( $atts ) {
    		global $woocommerce_loop;
    
    		extract( shortcode_atts( array(
    			'number'     => null,
    			'orderby'    => 'name',
    			'order'      => 'ASC',
    			'columns' 	 => '4',
    			'hide_empty' => 1,
    			'parent'     => ''
    		), $atts ) );
    
    		if ( isset( $atts[ 'ids' ] ) ) {
    			$ids = explode( ',', $atts[ 'ids' ] );
    			$ids = array_map( 'trim', $ids );
    		} else {
    			$ids = array();
    		}
    
    		$hide_empty = ( $hide_empty == true || $hide_empty == 1 ) ? 1 : 0;
    
    		// get terms and workaround WP bug with parents/pad counts
    		$args = array(
    			'orderby'    => $orderby,
    			'order'      => $order,
    			'hide_empty' => $hide_empty,
    			'include'    => $ids,
    			'pad_counts' => true,
    			'child_of'   => $parent
    		);
    
    		$product_categories = get_terms( 'product_cat', $args );
    
    		if ( $parent !== "" ) {
    			$product_categories = wp_list_filter( $product_categories, array( 'parent' => $parent ) );
    		}
    
    		if ( $hide_empty ) {
    			foreach ( $product_categories as $key => $category ) {
    				if ( $category->count == 0 ) {
    					unset( $product_categories[ $key ] );
    				}
    			}
    		}
    
    		if ( $number ) {
    			$product_categories = array_slice( $product_categories, 0, $number );
    		}
    
    		$woocommerce_loop['columns'] = $columns;
    
    		ob_start();
    
    		// Reset loop/columns globals when starting a new loop
    		$woocommerce_loop['loop'] = $woocommerce_loop['column'] = '';
    
    		if ( $product_categories ) {
    
    			woocommerce_product_loop_start();
    
    			foreach ( $product_categories as $category ) {
    
    				wc_get_template( 'content-product_cat.php', array(
    					'category' => $category
    				) );
    
    			}
    
    			woocommerce_product_loop_end();
    
    		}
    
    		woocommerce_reset_loop();
    
    		return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * Recent Products shortcode
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function recent_products( $atts ) {
    		global $woocommerce_loop;
    
    		extract( shortcode_atts( array(
    			'per_page' 	=> '12',
    			'columns' 	=> '4',
    			'orderby' 	=> 'date',
    			'order' 	=> 'desc'
    		), $atts ) );
    
    		$meta_query = WC()->query->get_meta_query();
    
    		$args = array(
    			'post_type'				=> 'product',
    			'post_status'			=> 'publish',
    			'ignore_sticky_posts'	=> 1,
    			'posts_per_page' 		=> $per_page,
    			'orderby' 				=> $orderby,
    			'order' 				=> $order,
    			'meta_query' 			=> $meta_query
    		);
    
    		ob_start();
    
    		$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );
    
    		$woocommerce_loop['columns'] = $columns;
    
    		if ( $products->have_posts() ) : ?>
    
    			<?php woocommerce_product_loop_start(); ?>
    
    				<?php while ( $products->have_posts() ) : $products->the_post(); ?>
    
    					<?php wc_get_template_part( 'content', 'product' ); ?>
    
    				<?php endwhile; // end of the loop. ?>
    
    			<?php woocommerce_product_loop_end(); ?>
    
    		<?php endif;
    
    		wp_reset_postdata();
    
    		return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * List multiple products shortcode
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function products( $atts ) {
    		global $woocommerce_loop;
    
    		if ( empty( $atts ) ) return '';
    
    		extract( shortcode_atts( array(
    			'columns' 	=> '4',
    			'orderby'   => 'title',
    			'order'     => 'asc'
    		), $atts ) );
    
    		$args = array(
    			'post_type'				=> 'product',
    			'post_status' 			=> 'publish',
    			'ignore_sticky_posts'	=> 1,
    			'orderby' 				=> $orderby,
    			'order' 				=> $order,
    			'posts_per_page' 		=> -1,
    			'meta_query' 			=> array(
    				array(
    					'key' 		=> '_visibility',
    					'value' 	=> array('catalog', 'visible'),
    					'compare' 	=> 'IN'
    				)
    			)
    		);
    
    		if ( isset( $atts['skus'] ) ) {
    			$skus = explode( ',', $atts['skus'] );
    			$skus = array_map( 'trim', $skus );
    			$args['meta_query'][] = array(
    				'key' 		=> '_sku',
    				'value' 	=> $skus,
    				'compare' 	=> 'IN'
    			);
    		}
    
    		if ( isset( $atts['ids'] ) ) {
    			$ids = explode( ',', $atts['ids'] );
    			$ids = array_map( 'trim', $ids );
    			$args['post__in'] = $ids;
    		}
    
    		ob_start();
    
    		$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );
    
    		$woocommerce_loop['columns'] = $columns;
    
    		if ( $products->have_posts() ) : ?>
    
    			<?php woocommerce_product_loop_start(); ?>
    
    				<?php while ( $products->have_posts() ) : $products->the_post(); ?>
    
    					<?php wc_get_template_part( 'content', 'product' ); ?>
    
    				<?php endwhile; // end of the loop. ?>
    
    			<?php woocommerce_product_loop_end(); ?>
    
    		<?php endif;
    
    		wp_reset_postdata();
    
    		return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * Display a single product
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function product( $atts ) {
    		if ( empty( $atts ) ) return '';
    
    		$args = array(
    			'post_type' 		=> 'product',
    			'posts_per_page' 	=> 1,
    			'no_found_rows' 	=> 1,
    			'post_status' 		=> 'publish',
    			'meta_query' 		=> array(
    				array(
    					'key' 		=> '_visibility',
    					'value' 	=> array('catalog', 'visible'),
    					'compare' 	=> 'IN'
    				)
    			)
    		);
    
    		if ( isset( $atts['sku'] ) ) {
    			$args['meta_query'][] = array(
    				'key' 		=> '_sku',
    				'value' 	=> $atts['sku'],
    				'compare' 	=> '='
    			);
    		}
    
    		if ( isset( $atts['id'] ) ) {
    			$args['p'] = $atts['id'];
    		}
    
    		ob_start();
    
    		$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );
    
    		if ( $products->have_posts() ) : ?>
    
    			<?php woocommerce_product_loop_start(); ?>
    
    				<?php while ( $products->have_posts() ) : $products->the_post(); ?>
    
    					<?php wc_get_template_part( 'content', 'product' ); ?>
    
    				<?php endwhile; // end of the loop. ?>
    
    			<?php woocommerce_product_loop_end(); ?>
    
    		<?php endif;
    
    		wp_reset_postdata();
    
    		return '<div class="woocommerce">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * Display a single product price + cart button
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function product_add_to_cart( $atts ) {
    		global $wpdb, $post;
    
    		if ( empty( $atts ) ) return '';
    
    		extract( shortcode_atts( array(
    			'id'         => '',
    			'sku'        => '',
    			'style'      => 'border:4px solid #ccc; padding: 12px;',
    			'show_price' => 'true'
    		), $atts ) );
    
    		if ( ! empty( $id ) ) {
    			$product_data = get_post( $id );
    		} elseif ( ! empty( $sku ) ) {
    			$product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );
    			$product_data = get_post( $product_id );
    		} else {
    			return '';
    		}
    
    		$product = wc_setup_product_data( $product_data );
    
    		if ( ! $product ) {
    			return '';
    		}
    
    		ob_start();
    		?>
    		<p class="product woocommerce" style="<?php echo $style; ?>">
    
    			<?php if ( $show_price == 'true' ) : ?>
    				<?php echo $product->get_price_html(); ?>
    			<?php endif; ?>
    
    			<?php woocommerce_template_loop_add_to_cart(); ?>
    
    		</p><?php
    
    		// Restore Product global in case this is shown inside a product post
    		wc_setup_product_data( $post );
    
    		return ob_get_clean();
    	}
    
    	/**
    	 * Get the add to cart URL for a product
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function product_add_to_cart_url( $atts ) {
    		global $wpdb;
    
    		if ( empty( $atts ) ) return '';
    
    		if ( isset( $atts['id'] ) ) {
    			$product_data = get_post( $atts['id'] );
    		} elseif ( isset( $atts['sku'] ) ) {
    			$product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $atts['sku'] ) );
    			$product_data = get_post( $product_id );
    		} else {
    			return '';
    		}
    
    		if ( 'product' !== $product_data->post_type ) {
    			return '';
    		}
    
    		$_product = get_product( $product_data );
    
    		return esc_url( $_product->add_to_cart_url() );
    	}
    
    	/**
    	 * List all products on sale
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function sale_products( $atts ) {
    		global $woocommerce_loop;
    
    		extract( shortcode_atts( array(
    			'per_page'      => '12',
    			'columns'       => '4',
    			'orderby'       => 'title',
    			'order'         => 'asc'
    		), $atts ) );
    
    		// Get products on sale
    		$product_ids_on_sale = wc_get_product_ids_on_sale();
    
    		$meta_query   = array();
    		$meta_query[] = WC()->query->visibility_meta_query();
    		$meta_query[] = WC()->query->stock_status_meta_query();
    		$meta_query   = array_filter( $meta_query );
    
    		$args = array(
    			'posts_per_page'	=> $per_page,
    			'orderby' 			=> $orderby,
    			'order' 			=> $order,
    			'no_found_rows' 	=> 1,
    			'post_status' 		=> 'publish',
    			'post_type' 		=> 'product',
    			'meta_query' 		=> $meta_query,
    			'post__in'			=> array_merge( array( 0 ), $product_ids_on_sale )
    		);
    
    		ob_start();
    
    		$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );
    
    		$woocommerce_loop['columns'] = $columns;
    
    		if ( $products->have_posts() ) : ?>
    
    			<?php woocommerce_product_loop_start(); ?>
    
    				<?php while ( $products->have_posts() ) : $products->the_post(); ?>
    
    					<?php wc_get_template_part( 'content', 'product' ); ?>
    
    				<?php endwhile; // end of the loop. ?>
    
    			<?php woocommerce_product_loop_end(); ?>
    
    		<?php endif;
    
    		wp_reset_postdata();
    
    		return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * List best selling products on sale
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function best_selling_products( $atts ) {
    		global $woocommerce_loop;
    
    		extract( shortcode_atts( array(
    			'per_page'      => '12',
    			'columns'       => '4'
    		), $atts ) );
    
    		$args = array(
    			'post_type' 			=> 'product',
    			'post_status' 			=> 'publish',
    			'ignore_sticky_posts'   => 1,
    			'posts_per_page'		=> $per_page,
    			'meta_key' 		 		=> 'total_sales',
    			'orderby' 		 		=> 'meta_value_num',
    			'meta_query' 			=> array(
    				array(
    					'key' 		=> '_visibility',
    					'value' 	=> array( 'catalog', 'visible' ),
    					'compare' 	=> 'IN'
    				)
    			)
    		);
    
    		ob_start();
    
    		$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );
    
    		$woocommerce_loop['columns'] = $columns;
    
    		if ( $products->have_posts() ) : ?>
    
    			<?php woocommerce_product_loop_start(); ?>
    
    				<?php while ( $products->have_posts() ) : $products->the_post(); ?>
    
    					<?php wc_get_template_part( 'content', 'product' ); ?>
    
    				<?php endwhile; // end of the loop. ?>
    
    			<?php woocommerce_product_loop_end(); ?>
    
    		<?php endif;
    
    		wp_reset_postdata();
    
    		return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * List top rated products on sale
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function top_rated_products( $atts ) {
    		global $woocommerce_loop;
    
    		extract( shortcode_atts( array(
    			'per_page'      => '12',
    			'columns'       => '4',
    			'orderby'       => 'title',
    			'order'         => 'asc'
    			), $atts ) );
    
    		$args = array(
    			'post_type' 			=> 'product',
    			'post_status' 			=> 'publish',
    			'ignore_sticky_posts'   => 1,
    			'orderby' 				=> $orderby,
    			'order'					=> $order,
    			'posts_per_page' 		=> $per_page,
    			'meta_query' 			=> array(
    				array(
    					'key' 			=> '_visibility',
    					'value' 		=> array('catalog', 'visible'),
    					'compare' 		=> 'IN'
    				)
    			)
    		);
    
    		ob_start();
    
    		add_filter( 'posts_clauses', array( __CLASS__, 'order_by_rating_post_clauses' ) );
    
    		$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );
    
    		remove_filter( 'posts_clauses', array( __CLASS__, 'order_by_rating_post_clauses' ) );
    
    		$woocommerce_loop['columns'] = $columns;
    
    		if ( $products->have_posts() ) : ?>
    
    			<?php woocommerce_product_loop_start(); ?>
    
    				<?php while ( $products->have_posts() ) : $products->the_post(); ?>
    
    					<?php wc_get_template_part( 'content', 'product' ); ?>
    
    				<?php endwhile; // end of the loop. ?>
    
    			<?php woocommerce_product_loop_end(); ?>
    
    		<?php endif;
    
    		wp_reset_postdata();
    
    		return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * Output featured products
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function featured_products( $atts ) {
    		global $woocommerce_loop;
    
    		extract( shortcode_atts( array(
    			'per_page' 	=> '12',
    			'columns' 	=> '4',
    			'orderby' 	=> 'date',
    			'order' 	=> 'desc'
    		), $atts ) );
    
    		$args = array(
    			'post_type'				=> 'product',
    			'post_status' 			=> 'publish',
    			'ignore_sticky_posts'	=> 1,
    			'posts_per_page' 		=> $per_page,
    			'orderby' 				=> $orderby,
    			'order' 				=> $order,
    			'meta_query'			=> array(
    				array(
    					'key' 		=> '_visibility',
    					'value' 	=> array('catalog', 'visible'),
    					'compare'	=> 'IN'
    				),
    				array(
    					'key' 		=> '_featured',
    					'value' 	=> 'yes'
    				)
    			)
    		);
    
    		ob_start();
    
    		$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );
    
    		$woocommerce_loop['columns'] = $columns;
    
    		if ( $products->have_posts() ) : ?>
    
    			<?php woocommerce_product_loop_start(); ?>
    
    				<?php while ( $products->have_posts() ) : $products->the_post(); ?>
    
    					<?php wc_get_template_part( 'content', 'product' ); ?>
    
    				<?php endwhile; // end of the loop. ?>
    
    			<?php woocommerce_product_loop_end(); ?>
    
    		<?php endif;
    
    		wp_reset_postdata();
    
    		return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * Show a single product page
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function product_page( $atts ) {
    		if ( empty( $atts ) ) return '';
    
    		if ( ! isset( $atts['id'] ) && ! isset( $atts['sku'] ) ) return '';
    
    		$args = array(
    			'posts_per_page' 		=> 1,
    			'post_type'				=> 'product',
    			'post_status' 			=> 'publish',
    			'ignore_sticky_posts'	=> 1,
    			'no_found_rows' 		=> 1
    		);
    
    		if ( isset( $atts['sku'] ) ) {
    			$args['meta_query'][] = array(
    				'key'     => '_sku',
    				'value'   => $atts['sku'],
    				'compare' => '='
    			);
    		}
    
    		if ( isset( $atts['id'] ) ) {
    			$args['p'] = $atts['id'];
    		}
    
    		$single_product = new WP_Query( $args );
    
    		ob_start();
    
    		while ( $single_product->have_posts() ) : $single_product->the_post(); wp_enqueue_script( 'wc-single-product' ); ?>
    
    			<div class="single-product">
    
    				<?php wc_get_template_part( 'content', 'single-product' ); ?>
    
    			</div>
    
    		<?php endwhile; // end of the loop.
    
    		wp_reset_postdata();
    
    		return '<div class="woocommerce">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * Show messages
    	 *
    	 * @access public
    	 * @return string
    	 */
    	public static function shop_messages() {
    		ob_start();
    
    		wc_print_notices();
    
    		return '<div class="woocommerce">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * woocommerce_order_by_rating_post_clauses function.
    	 *
    	 * @access public
    	 * @param array $args
    	 * @return array
    	 */
    	public static function order_by_rating_post_clauses( $args ) {
    		global $wpdb;
    
    		$args['where'] .= " AND $wpdb->commentmeta.meta_key = 'rating' ";
    
    		$args['join'] .= "
    			LEFT JOIN $wpdb->comments ON($wpdb->posts.ID = $wpdb->comments.comment_post_ID)
    			LEFT JOIN $wpdb->commentmeta ON($wpdb->comments.comment_ID = $wpdb->commentmeta.comment_id)
    		";
    
    		$args['orderby'] = "$wpdb->commentmeta.meta_value DESC";
    
    		$args['groupby'] = "$wpdb->posts.ID";
    
    		return $args;
    	}
    
    	/**
    	 * List products with an attribute shortcode
    	 * Example [product_attribute attribute='color' filter='black']
    	 *
    	 * @access public
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function product_attribute( $atts ) {
    		global $woocommerce_loop;
    
    		extract( shortcode_atts( array(
    			'per_page'  => '12',
    			'columns'   => '4',
    			'orderby'   => 'title',
    			'order'     => 'asc',
    			'attribute' => '',
    			'filter'    => ''
    		), $atts ) );
    
    		$attribute 	= strstr( $attribute, 'pa_' ) ? sanitize_title( $attribute ) : 'pa_' . sanitize_title( $attribute );
    
    		$args = array(
    			'post_type'           => 'product',
    			'post_status'         => 'publish',
    			'ignore_sticky_posts' => 1,
    			'paged'               => (get_query_var('paged')) ? get_query_var('paged') : 1,
    			'posts_per_page'      => $per_page,
    			'orderby'             => $orderby,
    			'order'               => $order,
    			'meta_query'          => array(
    				array(
    					'key'               => '_visibility',
    					'value'             => array('catalog', 'visible'),
    					'compare'           => 'IN'
    				)
    			),
    			'tax_query' 			=> array(
    				array(
    					'taxonomy' 	=> $attribute,
    					'terms' 	=> $filter,
    					'field' 	=> 'slug'
    				)
    			)
    		);
    
    		ob_start();
    
    		$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );
    
    		$woocommerce_loop['columns'] = $columns;
    
    		if ( $products->have_posts() ) : ?>
    
    			<?php woocommerce_product_loop_start(); ?>
    
    				<?php while ( $products->have_posts() ) : $products->the_post(); ?>
    
    					<?php wc_get_template_part( 'content', 'product' ); ?>
    
    				<?php endwhile; // end of the loop. ?>
    
    			<?php woocommerce_product_loop_end();
    				global $wp_query;
    				$wp_query->max_num_pages = $products->max_num_pages;
    							woocommerce_pagination();
    			?>
    
    		<?php endif;
    
    		wp_reset_postdata();
    
    		return '<div class="woocommerce">' . ob_get_clean() . '</div>';
    	}
    
    	/**
    	 * @param array $atts
    	 * @return string
    	 */
    	public static function related_products( $atts ) {
    
    		$atts = shortcode_atts( array(
    			'posts_per_page' => '2',
    			'columns' 	     => '2',
    			'orderby'        => 'rand',
    		), $atts );
    
    		if ( isset( $atts['per_page'] ) ) {
    			_deprecated_argument( __CLASS__ . '->' . __FUNCTION__, '2.1', __( 'Use $args["posts_per_page"] instead. Deprecated argument will be removed in WC 2.2.', 'woocommerce' ) );
    			$atts['posts_per_page'] = $atts['per_page'];
    			unset( $atts['per_page'] );
    		}
    
    		ob_start();
    
    		woocommerce_related_products( $atts );
    
    		return ob_get_clean();
    	}
    }

    I made the changes kolinus suggested too but still no results. I even copied the shortcode from class-wc-shortcodes.php and created a custom shortcode in functions.php in my child-theme (with add_shortcode() and such) the output is still white space. Any help would be appreciated.

Viewing 8 replies - 1 through 8 (of 8 total)

The topic ‘pagination not working’ is closed to new replies.