Give loops names, and set class outside of template files
Closes #10028
This commit is contained in:
parent
f750d71409
commit
a778c0b234
|
@ -87,6 +87,7 @@ class WC_Shortcodes {
|
||||||
$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $query_args, $atts, $loop_name ) );
|
$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $query_args, $atts, $loop_name ) );
|
||||||
$columns = absint( $atts['columns'] );
|
$columns = absint( $atts['columns'] );
|
||||||
$woocommerce_loop['columns'] = $columns;
|
$woocommerce_loop['columns'] = $columns;
|
||||||
|
$woocommerce_loop['name'] = $loop_name;
|
||||||
|
|
||||||
ob_start();
|
ob_start();
|
||||||
|
|
||||||
|
|
|
@ -106,13 +106,14 @@ if ( ! function_exists( 'woocommerce_reset_loop' ) ) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset the loop's index and columns when we're done outputting a product loop.
|
* Reset the loop's index and columns when we're done outputting a product loop.
|
||||||
*
|
|
||||||
* @subpackage Loop
|
* @subpackage Loop
|
||||||
*/
|
*/
|
||||||
function woocommerce_reset_loop() {
|
function woocommerce_reset_loop() {
|
||||||
global $woocommerce_loop;
|
$GLOBALS['woocommerce_loop'] = array(
|
||||||
// Reset loop/columns globals when starting a new loop
|
'loop' => '',
|
||||||
$woocommerce_loop['loop'] = $woocommerce_loop['columns'] = '';
|
'columns' => '',
|
||||||
|
'name' => '',
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
add_filter( 'loop_end', 'woocommerce_reset_loop' );
|
add_filter( 'loop_end', 'woocommerce_reset_loop' );
|
||||||
|
@ -220,6 +221,26 @@ function wc_product_cat_class( $class = '', $category = null ) {
|
||||||
echo 'class="' . esc_attr( join( ' ', wc_get_product_cat_class( $class, $category ) ) ) . '"';
|
echo 'class="' . esc_attr( join( ' ', wc_get_product_cat_class( $class, $category ) ) ) . '"';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get classname for loops based on $woocommerce_loop global.
|
||||||
|
* @since 2.6.0
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function wc_get_loop_class() {
|
||||||
|
global $woocommerce_loop;
|
||||||
|
|
||||||
|
$woocommerce_loop['loop'] = ! empty( $woocommerce_loop['loop'] ) ? $woocommerce_loop['loop'] + 1 : 1;
|
||||||
|
$woocommerce_loop['columns'] = ! empty( $woocommerce_loop['columns'] ) ? $woocommerce_loop['columns'] : apply_filters( 'loop_shop_columns', 4 );
|
||||||
|
|
||||||
|
if ( 0 === ( $woocommerce_loop['loop'] - 1 ) % $woocommerce_loop['columns'] || 1 === $woocommerce_loop['columns'] ) {
|
||||||
|
return 'first';
|
||||||
|
} elseif ( 0 === $woocommerce_loop['loop'] % $woocommerce_loop['columns'] ) {
|
||||||
|
return 'last';
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the classes for the product cat div.
|
* Get the classes for the product cat div.
|
||||||
*
|
*
|
||||||
|
@ -228,20 +249,10 @@ function wc_product_cat_class( $class = '', $category = null ) {
|
||||||
* @param object $category object Optional.
|
* @param object $category object Optional.
|
||||||
*/
|
*/
|
||||||
function wc_get_product_cat_class( $class = '', $category = null ) {
|
function wc_get_product_cat_class( $class = '', $category = null ) {
|
||||||
global $woocommerce_loop;
|
|
||||||
|
|
||||||
$classes = is_array( $class ) ? $class : array_map( 'trim', explode( ' ', $class ) );
|
$classes = is_array( $class ) ? $class : array_map( 'trim', explode( ' ', $class ) );
|
||||||
$classes[] = 'product-category';
|
$classes[] = 'product-category';
|
||||||
$classes[] = 'product';
|
$classes[] = 'product';
|
||||||
|
$classes[] = wc_get_loop_class();
|
||||||
if ( 0 === ( $woocommerce_loop['loop'] - 1 ) % $woocommerce_loop['columns'] || 1 === $woocommerce_loop['columns'] ) {
|
|
||||||
$classes[] = 'first';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 0 === $woocommerce_loop['loop'] % $woocommerce_loop['columns'] ) {
|
|
||||||
$classes[] = 'last';
|
|
||||||
}
|
|
||||||
|
|
||||||
$classes = apply_filters( 'product_cat_class', $classes, $class, $category );
|
$classes = apply_filters( 'product_cat_class', $classes, $class, $category );
|
||||||
|
|
||||||
return array_unique( array_filter( $classes ) );
|
return array_unique( array_filter( $classes ) );
|
||||||
|
@ -264,6 +275,9 @@ function wc_product_post_class( $classes, $class = '', $post_id = '' ) {
|
||||||
$product = wc_get_product( $post_id );
|
$product = wc_get_product( $post_id );
|
||||||
|
|
||||||
if ( $product ) {
|
if ( $product ) {
|
||||||
|
$classes[] = wc_get_loop_class();
|
||||||
|
$classes[] = $product->stock_status;
|
||||||
|
|
||||||
if ( $product->is_on_sale() ) {
|
if ( $product->is_on_sale() ) {
|
||||||
$classes[] = 'sale';
|
$classes[] = 'sale';
|
||||||
}
|
}
|
||||||
|
@ -299,6 +313,7 @@ function wc_product_post_class( $classes, $class = '', $post_id = '' ) {
|
||||||
$classes[] = 'has-children';
|
$classes[] = 'has-children';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$categories = get_the_terms( $product->id, 'product_cat' );
|
$categories = get_the_terms( $product->id, 'product_cat' );
|
||||||
if ( ! empty( $categories ) ) {
|
if ( ! empty( $categories ) ) {
|
||||||
$slugs = wp_list_pluck( $categories, 'slug' );
|
$slugs = wp_list_pluck( $categories, 'slug' );
|
||||||
|
@ -306,7 +321,6 @@ function wc_product_post_class( $classes, $class = '', $post_id = '' ) {
|
||||||
$classes[] = 'product-cat-' . $slug;
|
$classes[] = 'product-cat-' . $slug;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$classes[] = $product->stock_status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( false !== ( $key = array_search( 'hentry', $classes ) ) ) {
|
if ( false !== ( $key = array_search( 'hentry', $classes ) ) ) {
|
||||||
|
@ -479,6 +493,7 @@ if ( ! function_exists( 'woocommerce_product_loop_start' ) ) {
|
||||||
*/
|
*/
|
||||||
function woocommerce_product_loop_start( $echo = true ) {
|
function woocommerce_product_loop_start( $echo = true ) {
|
||||||
ob_start();
|
ob_start();
|
||||||
|
$GLOBALS['woocommerce_loop']['loop'] = 0;
|
||||||
wc_get_template( 'loop/loop-start.php' );
|
wc_get_template( 'loop/loop-start.php' );
|
||||||
if ( $echo )
|
if ( $echo )
|
||||||
echo ob_get_clean();
|
echo ob_get_clean();
|
||||||
|
|
|
@ -17,16 +17,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( ! defined( 'ABSPATH' ) ) {
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
exit; // Exit if accessed directly
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
global $product, $woocommerce_loop;
|
global $product, $woocommerce_loop;
|
||||||
|
|
||||||
$crosssells = WC()->cart->get_cross_sells();
|
if ( ! $crosssells = WC()->cart->get_cross_sells() ) {
|
||||||
|
return;
|
||||||
if ( 0 === sizeof( $crosssells ) ) return;
|
}
|
||||||
|
|
||||||
$meta_query = WC()->query->get_meta_query();
|
|
||||||
|
|
||||||
$args = array(
|
$args = array(
|
||||||
'post_type' => 'product',
|
'post_type' => 'product',
|
||||||
|
@ -35,11 +33,11 @@ $args = array(
|
||||||
'posts_per_page' => apply_filters( 'woocommerce_cross_sells_total', $posts_per_page ),
|
'posts_per_page' => apply_filters( 'woocommerce_cross_sells_total', $posts_per_page ),
|
||||||
'orderby' => $orderby,
|
'orderby' => $orderby,
|
||||||
'post__in' => $crosssells,
|
'post__in' => $crosssells,
|
||||||
'meta_query' => $meta_query
|
'meta_query' => WC()->query->get_meta_query()
|
||||||
);
|
);
|
||||||
|
|
||||||
$products = new WP_Query( $args );
|
$products = new WP_Query( $args );
|
||||||
|
$woocommerce_loop['name'] = 'cross-sells';
|
||||||
$woocommerce_loop['columns'] = apply_filters( 'woocommerce_cross_sells_columns', $columns );
|
$woocommerce_loop['columns'] = apply_filters( 'woocommerce_cross_sells_columns', $columns );
|
||||||
|
|
||||||
if ( $products->have_posts() ) : ?>
|
if ( $products->have_posts() ) : ?>
|
||||||
|
|
|
@ -20,37 +20,14 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||||
exit; // Exit if accessed directly
|
exit; // Exit if accessed directly
|
||||||
}
|
}
|
||||||
|
|
||||||
global $product, $woocommerce_loop;
|
global $product;
|
||||||
|
|
||||||
// Store loop count we're currently on
|
|
||||||
if ( empty( $woocommerce_loop['loop'] ) ) {
|
|
||||||
$woocommerce_loop['loop'] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store column count for displaying the grid
|
|
||||||
if ( empty( $woocommerce_loop['columns'] ) ) {
|
|
||||||
$woocommerce_loop['columns'] = apply_filters( 'loop_shop_columns', 4 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure visibility
|
// Ensure visibility
|
||||||
if ( ! $product || ! $product->is_visible() ) {
|
if ( empty( $product ) || ! $product->is_visible() ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Increase loop count
|
|
||||||
$woocommerce_loop['loop']++;
|
|
||||||
|
|
||||||
// Extra post classes
|
|
||||||
$classes = array();
|
|
||||||
if ( 0 === ( $woocommerce_loop['loop'] - 1 ) % $woocommerce_loop['columns'] || 1 === $woocommerce_loop['columns'] ) {
|
|
||||||
$classes[] = 'first';
|
|
||||||
}
|
|
||||||
if ( 0 === $woocommerce_loop['loop'] % $woocommerce_loop['columns'] ) {
|
|
||||||
$classes[] = 'last';
|
|
||||||
}
|
|
||||||
?>
|
?>
|
||||||
<li <?php post_class( $classes ); ?>>
|
<li <?php post_class(); ?>>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* woocommerce_before_shop_loop_item hook.
|
* woocommerce_before_shop_loop_item hook.
|
||||||
|
@ -90,5 +67,4 @@ if ( 0 === $woocommerce_loop['loop'] % $woocommerce_loop['columns'] ) {
|
||||||
*/
|
*/
|
||||||
do_action( 'woocommerce_after_shop_loop_item' );
|
do_action( 'woocommerce_after_shop_loop_item' );
|
||||||
?>
|
?>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -19,21 +19,6 @@
|
||||||
if ( ! defined( 'ABSPATH' ) ) {
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
global $woocommerce_loop;
|
|
||||||
|
|
||||||
// Store loop count we're currently on.
|
|
||||||
if ( empty( $woocommerce_loop['loop'] ) ) {
|
|
||||||
$woocommerce_loop['loop'] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store column count for displaying the grid.
|
|
||||||
if ( empty( $woocommerce_loop['columns'] ) ) {
|
|
||||||
$woocommerce_loop['columns'] = apply_filters( 'loop_shop_columns', 4 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Increase loop count.
|
|
||||||
$woocommerce_loop['loop']++;
|
|
||||||
?>
|
?>
|
||||||
<li <?php wc_product_cat_class( '', $category ); ?>>
|
<li <?php wc_product_cat_class( '', $category ); ?>>
|
||||||
<?php
|
<?php
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( ! defined( 'ABSPATH' ) ) {
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
exit; // Exit if accessed directly
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
global $product, $woocommerce_loop;
|
global $product, $woocommerce_loop;
|
||||||
|
@ -26,9 +26,9 @@ if ( empty( $product ) || ! $product->exists() ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$related = $product->get_related( $posts_per_page );
|
if ( ! $related = $product->get_related( $posts_per_page ) ) {
|
||||||
|
return;
|
||||||
if ( sizeof( $related ) === 0 ) return;
|
}
|
||||||
|
|
||||||
$args = apply_filters( 'woocommerce_related_products_args', array(
|
$args = apply_filters( 'woocommerce_related_products_args', array(
|
||||||
'post_type' => 'product',
|
'post_type' => 'product',
|
||||||
|
@ -41,8 +41,8 @@ $args = apply_filters( 'woocommerce_related_products_args', array(
|
||||||
) );
|
) );
|
||||||
|
|
||||||
$products = new WP_Query( $args );
|
$products = new WP_Query( $args );
|
||||||
|
$woocommerce_loop['name'] = 'related';
|
||||||
$woocommerce_loop['columns'] = $columns;
|
$woocommerce_loop['columns'] = apply_filters( 'woocommerce_related_products_columns', $columns );
|
||||||
|
|
||||||
if ( $products->have_posts() ) : ?>
|
if ( $products->have_posts() ) : ?>
|
||||||
|
|
||||||
|
|
|
@ -17,19 +17,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( ! defined( 'ABSPATH' ) ) {
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
exit; // Exit if accessed directly
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
global $product, $woocommerce_loop;
|
global $product, $woocommerce_loop;
|
||||||
|
|
||||||
$upsells = $product->get_upsells();
|
if ( ! $upsells = $product->get_upsells() ) {
|
||||||
|
|
||||||
if ( sizeof( $upsells ) === 0 ) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$meta_query = WC()->query->get_meta_query();
|
|
||||||
|
|
||||||
$args = array(
|
$args = array(
|
||||||
'post_type' => 'product',
|
'post_type' => 'product',
|
||||||
'ignore_sticky_posts' => 1,
|
'ignore_sticky_posts' => 1,
|
||||||
|
@ -38,16 +34,16 @@ $args = array(
|
||||||
'orderby' => $orderby,
|
'orderby' => $orderby,
|
||||||
'post__in' => $upsells,
|
'post__in' => $upsells,
|
||||||
'post__not_in' => array( $product->id ),
|
'post__not_in' => array( $product->id ),
|
||||||
'meta_query' => $meta_query
|
'meta_query' => WC()->query->get_meta_query()
|
||||||
);
|
);
|
||||||
|
|
||||||
$products = new WP_Query( $args );
|
$products = new WP_Query( $args );
|
||||||
|
$woocommerce_loop['name'] = 'up-sells';
|
||||||
$woocommerce_loop['columns'] = $columns;
|
$woocommerce_loop['columns'] = apply_filters( 'woocommerce_up_sells_columns', $columns );
|
||||||
|
|
||||||
if ( $products->have_posts() ) : ?>
|
if ( $products->have_posts() ) : ?>
|
||||||
|
|
||||||
<div class="upsells products">
|
<div class="up-sells upsells products">
|
||||||
|
|
||||||
<h2><?php _e( 'You may also like…', 'woocommerce' ) ?></h2>
|
<h2><?php _e( 'You may also like…', 'woocommerce' ) ?></h2>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue