';
}
add_action( 'woocommerce_before_shop_loop_item', 'virtue_add_product_loop_open', 1 );
// Elementor Builder.
add_action( 'kadence_woocommerce_loop_builder_before', 'virtue_add_product_loop_open', 1 );
/**
* Product Class output
*
* @param mixed $class the added classes.
* @param mixed $product the product object or ID.
*/
function virtue_get_product_class( $class = null, $product = null ) {
if ( version_compare( WC_VERSION, '3.4', '>' ) ) {
$classes = wc_get_product_class( '', $product );
} else {
$classes = array();
}
if ( $class ) {
if ( ! is_array( $class ) ) {
$class = preg_split( '#\s+#', $class );
}
$classes = array_map( 'esc_attr', $class );
}
return array_filter( array_unique( $classes ) );
}
/**
* Woocommerce_after_shop_loop_item
*/
function virtue_add_product_loop_close() {
echo '';
}
add_action( 'woocommerce_after_shop_loop_item', 'virtue_add_product_loop_close', 100 );
add_action( 'kadence_woocommerce_loop_builder_after', 'virtue_add_product_loop_close', 100 );
function virtue_woocommerce_archive_content_wrap_start() {
echo '
';
}
add_action( 'woocommerce_shop_loop_item_title', 'virtue_woocommerce_archive_content_wrap_start', 5 );
function virtue_woocommerce_archive_title_wrap_start() {
echo '
';
}
add_action( 'woocommerce_shop_loop_item_title', 'virtue_woocommerce_archive_title_wrap_start', 6 );
// Wrap the title in a link
add_action( 'woocommerce_shop_loop_item_title', 'virtue_woocommerce_archive_title_link_start', 7 );
function virtue_woocommerce_archive_title_link_start() {
echo '
';
}
// Remove the woocommerce added title
remove_action( 'woocommerce_shop_loop_item_title', 'woocommerce_template_loop_product_title', 10 );
// Add the virtue product title
add_action( 'woocommerce_shop_loop_item_title', 'virtue_woocommerce_template_loop_product_title', 10);
function virtue_woocommerce_template_loop_product_title() {
echo '' . get_the_title() . '
';
}
// Close out the title wapped link
add_action( 'woocommerce_shop_loop_item_title', 'virtue_woocommerce_archive_title_link_end', 15 );
function virtue_woocommerce_archive_title_link_end() {
echo '';
}
function virtue_woocommerce_archive_excerpt() {
if ( apply_filters( 'kadence_product_archive_excerpt', true ) ) :
global $post ?>
post_excerpt ){
echo apply_filters( 'archive_woocommerce_short_description', $post->post_excerpt );
} else {
the_excerpt();
} ?>
';
}
add_action( 'woocommerce_shop_loop_item_title', 'virtue_woocommerce_archive_title_wrap_end', 50 );
function virtue_after_shop_loop_wrap_end() {
echo '
';
}
add_action( 'woocommerce_after_shop_loop_item', 'virtue_after_shop_loop_wrap_end', 50 );
// Shop Page Image link open
add_action( 'woocommerce_before_shop_loop_item_title', 'virtue_woocommerce_image_link_open', 5 );
function virtue_woocommerce_image_link_open() {
echo '
';
}
// Shop Page Image link Close
add_action( 'woocommerce_before_shop_loop_item_title', 'virtue_woocommerce_image_link_close', 50 );
function virtue_woocommerce_image_link_close() {
echo '';
}
// Remove woocommerce added archive image
remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );
// Add virtue archive image
add_action( 'woocommerce_before_shop_loop_item_title', 'virtue_woocommerce_template_loop_product_thumbnail', 10 );
function virtue_woocommerce_template_loop_product_thumbnail() {
global $virtue, $woocommerce_loop, $post;
// Store column count for displaying the grid
if ( empty( $woocommerce_loop['columns'] ) ) {
$woocommerce_loop['columns'] = apply_filters( 'loop_shop_columns', 4 );
}
if ($woocommerce_loop['columns'] == '3'){
$productimgwidth = 365;
$productimgheight = 365;
} else {
$productimgwidth = 268;
$productimgheight = 268;
}
if(isset($virtue[ 'product_img_resize' ]) && $virtue[ 'product_img_resize' ] == 0) {
$resizeimage = 0;
} else {
$resizeimage = 1;
}
if($resizeimage == 1) {
if ( has_post_thumbnail() ) {
$image_id = get_post_thumbnail_id( $post->ID );
$img = virtue_get_image_array( $productimgwidth, $productimgheight, true, null, null, $image_id );
if( empty( $img[ 'alt' ] ) ) { $img[ 'alt' ] = get_the_title(); }
ob_start(); ?>
;?>)
class="attachment-shop_catalog size- wp-post-image" alt="">
ID, $image_id, array($productimgwidth, $productimgheight), $attr = ''); // WPCS: XSS ok.
} elseif ( woocommerce_placeholder_img_src() ) {
echo woocommerce_placeholder_img( 'shop_catalog' ); // WPCS: XSS ok.
}
} else {
echo '
';
echo woocommerce_template_loop_product_thumbnail(); // WPCS: XSS ok.
echo '
';
}
}
// Remove woocommerce archive product links (theme adds these)
remove_action( 'woocommerce_before_shop_loop_item', 'woocommerce_template_loop_product_link_open', 10 );
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_product_link_close', 5 );
// define the woocommerce_loop_add_to_cart_link callback
add_filter('woocommerce_loop_add_to_cart_args', 'virtue_add_class_woocommerce_loop_add_to_cart_link', 10, 2);
function virtue_add_class_woocommerce_loop_add_to_cart_link( $array, $product ) {
$array['class'] .= ' kad-btn headerfont kad_add_to_cart';
return $array;
}
// Remove woocommerce category title
remove_action( 'woocommerce_shop_loop_subcategory_title', 'woocommerce_template_loop_category_title', 10 );
// Add woocommerce category title:
add_action( 'woocommerce_shop_loop_subcategory_title', 'virtue_woocommerce_template_loop_category_title', 10 );
function virtue_woocommerce_template_loop_category_title( $category ) { ?>
name );
if ( $category->count > 0 ) {
echo wp_kses_post( apply_filters( 'woocommerce_subcategory_count_html', ' (' . $category->count . ')', $category ) );
}
?>
slug, 'product_cat' ) ) . '" class="kt-woo-category-links">';
}
add_action( 'woocommerce_after_subcategory', 'virtue_woocommerce_template_loop_category_link_close', 10 );
function virtue_woocommerce_template_loop_category_link_close() {
echo '';
}
// Remove woo output of category images
remove_action( 'woocommerce_before_subcategory_title', 'woocommerce_subcategory_thumbnail', 10 );
// Add theme output of category images
add_action( 'woocommerce_before_subcategory_title', 'virtue_woocommerce_subcategory_thumbnail', 10 );
function virtue_woocommerce_subcategory_thumbnail( $category ) {
global $woocommerce_loop, $virtue;
if ( empty( $woocommerce_loop[ 'columns' ] ) ) {
$woocommerce_loop[ 'columns' ] = apply_filters( 'loop_shop_columns', 4 );
}
$product_cat_column = $woocommerce_loop['columns'];
if ( $product_cat_column == '3' ){
$catimgwidth = 380;
} else {
$catimgwidth = 270;
}
if( isset( $virtue[ 'product_cat_img_ratio' ] ) ) {
$img_ratio = $virtue[ 'product_cat_img_ratio' ];
} else {
$img_ratio = 'widelandscape';
}
if($img_ratio == 'portrait') {
$tempcatimgheight = $catimgwidth * 1.35;
$catimgheight = floor($tempcatimgheight);
} else if($img_ratio == 'landscape') {
$tempcatimgheight = $catimgwidth / 1.35;
$catimgheight = floor($tempcatimgheight);
} else if($img_ratio == 'square') {
$catimgheight = $catimgwidth;
} else {
$tempcatimgheight = $catimgwidth / 2;
$catimgheight = floor( $tempcatimgheight );
}
if ( 'off' == $img_ratio ) {
woocommerce_subcategory_thumbnail( $category );
} else {
$thumbnail_id = get_term_meta( $category->term_id, 'thumbnail_id', true );
if ( ! empty( $thumbnail_id ) ) {
$img = virtue_get_image_array( $catimgwidth, $catimgheight, true, null, null, $thumbnail_id, false );
echo '
';
echo '
![' . esc_attr( $img['alt'] ) . '](' . esc_url( $img['src'] ) . ')
';
echo '
';
} else {
$cat_image = array( virtue_img_placeholder(), $catimgwidth, $catimgheight );
if ( $cat_image[0] ) {
echo '
';
echo '
 . ')
';
echo '
';
}
}
}
}
/**
* Add support for pre woo 3.3
*/
function virtue_woo_cat_loop() {
if ( version_compare( WC_VERSION, '3.3', '<' ) ) {
if ( ! is_search() ) {
echo '
';
woocommerce_product_subcategories();
echo '
';
}
}
}
add_action( 'woocommerce_before_shop_loop', 'virtue_woo_cat_loop', 60 );
}