$font ) {
if ( ! array_key_exists( $key, $ktblocks_instance::$gfonts ) ) {
$add_font = array(
'fontfamily' => $font['fontfamily'],
'fontvariants' => ( isset( $font['fontvariants'] ) && ! empty( $font['fontvariants'] ) && is_array( $font['fontvariants'] ) ? $font['fontvariants'] : array() ),
'fontsubsets' => ( isset( $font['fontsubsets'] ) && ! empty( $font['fontsubsets'] ) && is_array( $font['fontsubsets'] ) ? $font['fontsubsets'] : array() ),
);
$ktblocks_instance::$gfonts[ $key ] = $add_font;
} else {
foreach ( $font['fontvariants'] as $variant ) {
if ( ! in_array( $variant, $ktblocks_instance::$gfonts[ $key ]['fontvariants'], true ) ) {
array_push( $ktblocks_instance::$gfonts[ $key ]['fontvariants'], $variant );
}
}
}
}
} else {
add_filter( 'kadence_theme_google_fonts_array', array( $this, 'filter_in_fonts' ) );
}
}
/**
* Filters in pro fronts for output with free.
*
* @param array $font_array any custom css.
* @return array
*/
public function filter_in_fonts( $font_array ) {
// Enqueue Google Fonts.
foreach ( self::$google_fonts as $key => $font ) {
if ( ! array_key_exists( $key, $font_array ) ) {
$add_font = array(
'fontfamily' => $font['fontfamily'],
'fontvariants' => ( isset( $font['fontvariants'] ) && ! empty( $font['fontvariants'] ) && is_array( $font['fontvariants'] ) ? $font['fontvariants'] : array() ),
'fontsubsets' => ( isset( $font['fontsubsets'] ) && ! empty( $font['fontsubsets'] ) && is_array( $font['fontsubsets'] ) ? $font['fontsubsets'] : array() ),
);
$font_array[ $key ] = $add_font;
} else {
foreach ( $font['fontvariants'] as $variant ) {
if ( ! in_array( $variant, $font_array[ $key ]['fontvariants'], true ) ) {
array_push( $font_array[ $key ]['fontvariants'], $variant );
}
}
}
}
return $font_array;
}
/**
* Add filters for element content output.
*/
public function setup_shop_content_filter() {
global $wp_embed;
add_filter( 'kadence_theme_shop_content', array( $wp_embed, 'run_shortcode' ), 8 );
add_filter( 'kadence_theme_shop_content', array( $wp_embed, 'autoembed' ), 8 );
add_filter( 'kadence_theme_shop_content', 'do_blocks' );
add_filter( 'kadence_theme_shop_content', 'wptexturize' );
add_filter( 'kadence_theme_shop_content', 'convert_chars' );
add_filter( 'kadence_theme_shop_content', 'shortcode_unautop' );
add_filter( 'kadence_theme_shop_content', 'do_shortcode', 11 );
add_filter( 'kadence_theme_shop_content', 'convert_smilies', 20 );
}
/**
* Show a shop page description on product archives.
*/
public function add_product_archive_description() {
// Don't display the description on search results page.
if ( is_search() ) {
return;
}
if ( is_post_type_archive( 'product' ) && in_array( absint( get_query_var( 'paged' ) ), array( 0, 1 ), true ) ) {
$shop_page = get_post( wc_get_page_id( 'shop' ) );
if ( $shop_page ) {
if ( has_blocks( $shop_page->post_content ) ) {
$description = apply_filters( 'kadence_theme_shop_content', $shop_page->post_content );
} else {
$allowed_html = wp_kses_allowed_html( 'post' );
// This is needed for the search product block to work.
$allowed_html = array_merge(
$allowed_html,
array(
'form' => array(
'action' => true,
'accept' => true,
'accept-charset' => true,
'enctype' => true,
'method' => true,
'name' => true,
'target' => true,
),
'input' => array(
'type' => true,
'id' => true,
'class' => true,
'placeholder' => true,
'name' => true,
'value' => true,
),
'button' => array(
'type' => true,
'class' => true,
'label' => true,
),
'svg' => array(
'hidden' => true,
'role' => true,
'focusable' => true,
'xmlns' => true,
'width' => true,
'height' => true,
'viewbox' => true,
),
'path' => array(
'd' => true,
),
)
);
$description = wc_format_content( wp_kses( $shop_page->post_content, $allowed_html ) );
}
if ( $description ) {
echo '
' . $description . '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
}
}
}
/**
* Add a class for the account navigation.
*
* @param array $classes for the gallery ratio.
* @return array updated classes array.
*/
public function add_account_navigation_class( $classes ) {
$classes[] = 'menu-item';
return $classes;
}
/**
* Add a class for the initial gallery ratio.
*
* @param array $classes for the gallery ratio.
* @return array updated classes array.
*/
public function single_product_image_initial_ratio( $classes ) {
global $product;
if ( is_object( $product ) ) {
$attachment_ids = $product->get_gallery_image_ids();
if ( $attachment_ids && $product->get_image_id() ) {
$classes[] = 'gallery-has-thumbnails';
}
}
return $classes;
}
/**
* Maybe remove product tab heading.
*
* @param string $heading for the tab.
* @return string/bool string or false if disabled.
*/
public function remove_product_tab_heading( $heading ) {
if ( ! kadence()->option( 'product_tab_title' ) ) {
return false;
}
return $heading;
}
/**
* Just make sure the toggle script is added.
*
* @param array $args the query args.
* @return array the query args.
*/
public function category_widget_toggle_script( $args ) {
wp_enqueue_script( 'kadence-shop-toggle' );
return $args;
}
/**
* Remove the normal archive description.
*/
public function action_remove_normal_archive_description() {
remove_action( 'woocommerce_archive_description', 'woocommerce_taxonomy_archive_description' );
}
/**
* Sets columns for related columns.
*
* @param array $args for the related columns.
* @return array updated args array.
*/
public function related_products_columns( $args ) {
$columns = absint( kadence()->option( 'product_related_columns' ) );
$args['posts_per_page'] = $columns;
$args['columns'] = $columns;
return $args;
}
/**
* Sets classes for the product loop.
*
* @param string/array $classes for the product loop.
* @return array updated classes string.
*/
public function add_product_archive_loop_classes_shopkit( $classes ) {
$product_image_hover_style = kadence()->option( 'product_archive_image_hover_switch' );
$product_btn_style = kadence()->option( 'product_archive_button_style' );
$hover_style = 'woo-archive-image-hover-' . esc_attr( $product_image_hover_style );
$button_style = 'woo-archive-btn-' . esc_attr( $product_btn_style );
if ( ! empty( $classes ) && is_array( $classes ) ) {
$classes[] = $hover_style;
$classes[] = $button_style;
} else if ( ! empty( $classes ) ) {
$classes = array( $hover_style, $button_style, $classes );
} else {
$classes = array( $hover_style, $button_style );
}
return $classes;
}
/**
* Adds arrow icon to product action buttons.
*
* @param string $html the html for the product block.
* @param object $data block product object.
* @param object $product block product object.
* @return string updated html.
*/
public function custom_block_html( $html, $data, $product ) {
$attributes = array(
'aria-label' => $product->add_to_cart_description(),
'data-quantity' => '1',
'data-product_id' => $product->get_id(),
'data-product_sku' => $product->get_sku(),
'rel' => 'nofollow',
'class' => 'wp-block-button__link add_to_cart_button',
);
if ( $product->supports( 'ajax_add_to_cart' ) && $product->is_purchasable() && ( $product->is_in_stock() || $product->backorders_allowed() ) ) {
$attributes['class'] .= ' ajax_add_to_cart';
}
$product_btn_style = kadence()->option( 'product_archive_button_style' );
$product_image_hover_style = kadence()->option( 'product_archive_image_hover_switch' );
if ( 'button' === $product_btn_style ) {
$cart_text = sprintf(
'%s ',
esc_url( $product->add_to_cart_url() ),
wc_implode_html_attributes( $attributes ),
esc_html( $product->add_to_cart_text() ) . '' . kadence()->get_icon( 'spinner' ) . '' . kadence()->get_icon( 'check' )
);
} else {
$cart_text = sprintf(
'%s ',
esc_url( $product->add_to_cart_url() ),
wc_implode_html_attributes( $attributes ),
esc_html( $product->add_to_cart_text() ) . '' . kadence()->get_icon( 'arrow-right-alt' ) . '' . kadence()->get_icon( 'spinner' ) . '' . kadence()->get_icon( 'check' )
);
}
$action_button = '' . $cart_text . '
';
$secondary_image_output = '';
if ( 'none' !== $product_image_hover_style ) {
if ( is_a( $product, 'WC_Product' ) ) {
$attachment_ids = $product->get_gallery_image_ids();
if ( $attachment_ids ) {
$attachment_ids = array_values( $attachment_ids );
$secondary_image_id = $attachment_ids['0'];
$secondary_image_alt = get_post_meta( $secondary_image_id, '_wp_attachment_image_alt', true );
$secondary_image_title = get_the_title( $secondary_image_id );
$secondary_image_output = wp_get_attachment_image(
$secondary_image_id,
apply_filters( 'single_product_archive_thumbnail_size', 'woocommerce_thumbnail' ),
false,
array(
'class' => 'secondary-product-image attachment-woocommerce_thumbnail attachment-shop-catalog wp-post-image wp-post-image--secondary',
'alt' => $secondary_image_alt,
'title' => $secondary_image_title,
)
);
}
}
}
$product_image = $data->image;
if ( is_a( $product, 'WC_Product' ) && ! empty( $product_image ) ) {
$image_size = apply_filters( 'single_product_archive_thumbnail_size', 'woocommerce_thumbnail' );
$product_image = $product->get_image( $image_size );
}
$new_data = (object) array(
'permalink' => $data->permalink,
'image' => $product_image,
'second_image' => $secondary_image_output,
'title' => $data->title,
'rating' => $data->rating,
'price' => $data->price,
'badge' => $data->badge,
'button' => ( ! empty ( $data->button ) ? $action_button : '' ),
);
$align_archive_button = 'block-align-button-normal';
if ( kadence()->option( 'product_archive_button_align' ) ) {
$align_archive_button = 'block-align-buttons-bottom';
}
$product_style = kadence()->option( 'product_archive_style' );
$action_style = 'woo-archive-' . esc_attr( $product_style );
$button_style = 'woo-archive-btn-' . esc_attr( $product_btn_style );
$hover_style = 'woo-archive-image-hover-' . esc_attr( $product_image_hover_style );
if ( $product_image_hover_style !== 'none' && ! empty( $secondary_image_output ) ) {
$product_image_link = 'wc-block-grid__product-link woocommerce-loop-image-link woocommerce-LoopProduct-link woocommerce-loop-product__link product-has-hover-image';
} else {
$product_image_link = 'wc-block-grid__product-link woocommerce-loop-image-link woocommerce-LoopProduct-link woocommerce-loop-product__link';
}
$boxed = kadence()->option( 'product_archive_content_style' );
if ( 'unboxed' === $boxed || 'boxed' === $boxed ) {
$boxed_class = 'product-loop-' . $boxed;
} else {
$boxed_class = 'product-loop-unboxed';
}
$output = "";
if ( $product_image ) {
$output .= "permalink}\" class=\"{$product_image_link}\">
{$new_data->image}
{$new_data->second_image}
";
}
$output .= "{$new_data->badge}
";
return $output;
}
/**
* Adds comment css for reviews.
*/
public function single_product_comment_css() {
kadence()->print_styles( 'kadence-comments' );
}
/**
* Removes hooks and triggers other hooks realted to the single product page.
*/
public function single_product_layout() {
// Product Single Cat.
$category_element = kadence()->option( 'product_content_element_category' );
if ( isset( $category_element ) && is_array( $category_element ) && true === $category_element['enabled'] ) {
add_action( 'woocommerce_single_product_summary', array( $this, 'woocommerce_product_single_category' ), 3 );
}
// Product Title.
$title_element = kadence()->option( 'product_content_element_title' );
if ( isset( $title_element ) && is_array( $title_element ) && false === $title_element['enabled'] ) {
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_title', 5 );
}
// Product Rating.
$rating_element = kadence()->option( 'product_content_element_rating' );
if ( isset( $rating_element ) && is_array( $rating_element ) && false === $rating_element['enabled'] ) {
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_rating' );
}
// Product Price.
$price_element = kadence()->option( 'product_content_element_price' );
if ( isset( $price_element ) && is_array( $price_element ) && false === $price_element['enabled'] ) {
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price' );
} else {
if ( isset( $price_element ) && is_array( $price_element ) && true === $price_element['show_shipping'] ) {
add_filter( 'woocommerce_get_price_html', array( $this, 'add_shipping_statement_price' ), 10, 2 );
}
}
// Product Excerpt.
$excerpt_element = kadence()->option( 'product_content_element_excerpt' );
if ( isset( $excerpt_element ) && is_array( $excerpt_element ) && false === $excerpt_element['enabled'] ) {
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_excerpt', 20 );
}
// Product Cart.
$add_to_cart_element = kadence()->option( 'product_content_element_add_to_cart' );
if ( isset( $add_to_cart_element ) && is_array( $add_to_cart_element ) && false === $add_to_cart_element['enabled'] ) {
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
}
// Product Extras.
$extras_element = kadence()->option( 'product_content_element_extras' );
if ( isset( $extras_element ) && is_array( $extras_element ) && true === $extras_element['enabled'] ) {
add_action( 'woocommerce_single_product_summary', array( $this, 'woocommerce_product_single_extras' ), 35 );
}
// Product Payments.
$payments_element = kadence()->option( 'product_content_element_payments' );
if ( isset( $payments_element ) && is_array( $payments_element ) && true === $payments_element['enabled'] ) {
add_action( 'woocommerce_single_product_summary', array( $this, 'woocommerce_product_single_payments' ), 38 );
}
// Product Meta.
$meta_element = kadence()->option( 'product_content_element_product_meta' );
if ( isset( $meta_element ) && is_array( $meta_element ) && false === $meta_element['enabled'] ) {
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_meta', 40 );
}
// Product Sharing.
$sharing_element = kadence()->option( 'product_content_element_sharing' );
if ( isset( $sharing_element ) && is_array( $sharing_element ) && false === $sharing_element['enabled'] ) {
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_sharing', 50 );
}
// Remove Weight and Dimensions.
if ( false === kadence()->option( 'product_additional_weight_dimensions' ) ) {
add_filter( 'wc_product_enable_dimensions_display', '__return_false' );
}
// Related Products.
if ( false === kadence()->option( 'product_related' ) ) {
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
}
}
/**
* Adds a shipping price after the price on single product pages.
*
* @param string $price the price for the product.
* @param object $object product object.
* @return string Filtered body classes.
*/
public function add_shipping_statement_price( $price, $object ) {
if ( is_product() && get_queried_object_id() === $object->get_id() ) {
$price_element = kadence()->option( 'product_content_element_price' );
if ( isset( $price_element ) && is_array( $price_element ) && isset( $price_element['shipping_statement'] ) && ! empty( $price_element['shipping_statement'] ) ) {
$price = $price . ' ' . $price_element['shipping_statement'] . ' ';
}
}
return $price;
}
/**
* Adds single product category.
*/
public function woocommerce_product_single_category() {
global $post;
$main_term = false;
if ( class_exists( 'WPSEO_Primary_Term' ) ) {
$wpseo_term = new WPSEO_Primary_Term( 'product_cat', $post->ID );
$wpseo_term = $wpseo_term->get_primary_term();
$wpseo_term = get_term( $wpseo_term );
if ( is_wp_error( $wpseo_term ) ) {
$main_term = false;
} else {
$main_term = $wpseo_term;
}
} elseif ( class_exists( 'RankMath' ) ) {
$wpseo_term = get_post_meta( $post->ID, 'rank_math_primary_product_cat', true );
if ( $wpseo_term ) {
$wpseo_term = get_term( $wpseo_term );
if ( is_wp_error( $wpseo_term ) ) {
$main_term = false;
} else {
$main_term = $wpseo_term;
}
} else {
$main_term = false;
}
}
if ( false === $main_term ) {
$main_term = '';
$terms = wp_get_post_terms(
$post->ID,
'product_cat',
array(
'orderby' => 'parent',
'order' => 'DESC',
)
);
if ( $terms && ! is_wp_error( $terms ) ) {
if ( is_array( $terms ) ) {
$main_term = $terms[0];
}
}
}
if ( $main_term ) {
$term_title = $main_term->name;
echo '';
}
}
/**
* Adds Product Extras just below the button.
*/
public function woocommerce_product_single_extras() {
$extras_element = kadence()->option( 'product_content_element_extras' );
echo '';
}
/**
* Adds Product Payments just below the button.
*/
public function woocommerce_product_single_payments() {
$payments_element = kadence()->option( 'product_content_element_payments' );
$colors = ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['card_color'] ) && ! empty( $payments_element['card_color'] ) ? $payments_element['card_color'] : 'inherit' );
echo '';
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['title'] ) && ! empty( $payments_element['title'] ) ) {
echo '' . wp_kses_post( $payments_element['title'] ) . ' ';
}
echo '';
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['stripe'] ) && true === $payments_element['stripe'] ) {
echo '' . kadence()->get_icon( 'stripe' ) . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['visa'] ) && true === $payments_element['visa'] ) {
echo '' . kadence()->get_icon( ( 'inherit' !== $colors ? 'visa_gray' : 'visa' ) ) . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['mastercard'] ) && true === $payments_element['mastercard'] ) {
echo '' . kadence()->get_icon( ( 'inherit' !== $colors ? 'mastercard_gray' : 'mastercard' ) ) . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['amex'] ) && true === $payments_element['amex'] ) {
echo '' . kadence()->get_icon( ( 'inherit' !== $colors ? 'amex_gray' : 'amex' ) ) . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['discover'] ) && true === $payments_element['discover'] ) {
echo '' . kadence()->get_icon( ( 'inherit' !== $colors ? 'discover_gray' : 'discover' ) ) . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['paypal'] ) && true === $payments_element['paypal'] ) {
echo '' . kadence()->get_icon( ( 'inherit' !== $colors ? 'paypal_gray' : 'paypal' ) ) . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['applepay'] ) && true === $payments_element['applepay'] ) {
echo '' . kadence()->get_icon( ( 'inherit' !== $colors ? 'applepay_gray' : 'applepay' ) ) . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['custom_enable_01'] ) && true === $payments_element['custom_enable_01'] && isset( $payments_element['custom_img_01'] ) && ! empty( $payments_element['custom_img_01'] ) ) {
echo ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['custom_enable_02'] ) && true === $payments_element['custom_enable_02'] && isset( $payments_element['custom_img_02'] ) && ! empty( $payments_element['custom_img_02'] ) ) {
echo ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['custom_enable_03'] ) && true === $payments_element['custom_enable_03'] && isset( $payments_element['custom_img_03'] ) && ! empty( $payments_element['custom_img_03'] ) ) {
echo ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['custom_enable_04'] ) && true === $payments_element['custom_enable_04'] && isset( $payments_element['custom_img_04'] ) && ! empty( $payments_element['custom_img_04'] ) ) {
echo ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
if ( isset( $payments_element ) && is_array( $payments_element ) && isset( $payments_element['custom_enable_05'] ) && true === $payments_element['custom_enable_05'] && isset( $payments_element['custom_img_05'] ) && ! empty( $payments_element['custom_img_05'] ) ) {
echo ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
echo ' ';
echo ' ';
}
/**
* Removes filter to add svgs to add to cart link for product archives.
*
* @param string $html the html to end a loop.
* @return string $html the html to end a loop.
*/
public function remove_filter_for_add_to_cart_link( $html ) {
remove_filter( 'woocommerce_loop_add_to_cart_link', array( $this, 'filter_add_to_cart_link_link' ), 10, 3 );
return $html;
}
/**
* Adds filter to add svgs to add to cart link for product archives.
*
* @param string $html the html to start a loop.
* @return string $html the html to start a loop.
*/
public function add_filter_for_add_to_cart_link( $html ) {
add_filter( 'woocommerce_loop_add_to_cart_link', array( $this, 'filter_add_to_cart_link_link' ), 9, 3 );
return $html;
}
/**
* Adds custom classes to body tab related to woocommerce.
*
* @param array $classes Classes for the body element.
* @return array Filtered body classes.
*/
public function woo_extra_body_classes( $classes ) {
// Store Notice Body class.
if ( is_store_notice_showing() ) {
$placement = kadence()->option( 'woo_store_notice_placement' );
$classes[] = esc_attr( 'kadence-store-notice-placement-' . $placement );
if ( 'above' === $placement ) {
if ( kadence()->option( 'woo_store_notice_hide_dismiss' ) ) {
add_filter( 'woocommerce_demo_store', array( $this, 'woocommerce_demo_store_remove_dismiss' ), 15, 2 );
}
remove_action( 'wp_footer', 'woocommerce_demo_store' );
add_action( 'kadence_before_header', 'woocommerce_demo_store' );
}
}
if ( is_archive() && is_tax() ) {
$slug = ( is_search() && ! is_post_type_archive( 'product' ) ? 'search' : get_post_type() );
if ( empty( $slug ) ) {
$queried_object = get_queried_object();
if ( property_exists( $queried_object, 'taxonomy' ) ) {
$current_tax = get_taxonomy( $queried_object->taxonomy );
if ( property_exists( $current_tax, 'object_type' ) ) {
$post_types = $current_tax->object_type;
$slug = $post_types[0];
if ( 'product' === $slug ) {
$classes[] = 'tax-woo-product';
}
}
}
} else if ( 'product' === $slug ) {
$classes[] = 'tax-woo-product';
}
}
return $classes;
}
/**
* Filters woocommerce demo store to remove dismiss option.
*
* @param string $notice_html html for the notice.
* @param string $notice text for the notice.
* @return string new html for the notice.
*/
public function woocommerce_demo_store_remove_dismiss( $notice_html, $notice ) {
$notice_id = md5( $notice );
return '' . wp_kses_post( $notice ) . '
';
}
/**
* Adds custom classes to indicate whether a sidebar is present to the array of body classes.
*
* @param array $classes Classes for the body element.
* @return array Filtered body classes.
*/
public function my_account_body_classes( array $classes ) : array {
if ( is_account_page() ) {
$classes[] = 'kadence-account-nav-' . esc_attr( kadence()->option( 'woo_account_navigation_layout' ) );
}
return $classes;
}
/**
* Adds custom classes to indicate the button size for the single products.
*
* @param array $classes Classes for the body element.
* @return array Filtered body classes.
*/
public function single_product_body_classes( array $classes ) : array {
if ( is_product() ) {
$cart_element = kadence()->option( 'product_content_element_add_to_cart' );
if ( isset( $cart_element ) && is_array( $cart_element ) && isset( $cart_element['button_size'] ) && ! empty( $cart_element['button_size'] ) ) {
$size = $cart_element['button_size'];
} else if ( kadence()->option( 'product_large_cart_button' ) ) {
$size = 'large';
} else {
$size = 'normal';
}
$classes[] = 'product-tab-style-' . esc_attr( kadence()->option( 'product_tab_style' ) );
$classes[] = 'product-variation-style-' . esc_attr( kadence()->option( 'variation_direction' ) );
$classes[] = 'kadence-cart-button-' . esc_attr( $size );
}
return $classes;
}
/**
* Refresh the cart for ajax adds.
*
* @param object $fragments the cart object.
*/
public function get_refreshed_fragments_class( $fragments ) {
// Get cart items.
ob_start();
?>
';
woocommerce_mini_cart();
echo '';
$fragments['div.kadence-mini-cart-refresh'] = ob_get_clean();
return $fragments;
}
/**
* Checks to see if theme needs to hook into cart fragments.
*/
public function check_for_fragment_support() {
add_filter( 'woocommerce_add_to_cart_fragments', array( $this, 'get_refreshed_fragments_class' ), 11 );
if ( kadence()->option( 'header_cart_show_total' ) ) {
self::$show_cart_total = true;
add_filter( 'woocommerce_add_to_cart_fragments', array( $this, 'get_refreshed_fragments_number' ), 11 );
}
if ( 'slide' === kadence()->option( 'header_cart_style' ) || 'slide' === kadence()->option( 'header_mobile_cart_style' ) || 'dropdown' === kadence()->option( 'header_cart_style' ) ) {
self::$show_mini_cart = true;
add_filter( 'woocommerce_add_to_cart_fragments', array( $this, 'get_refreshed_fragments_mini' ), 11 );
}
}
/**
* Checks to see if themes conditional header needs to hook into cart fragments.
*/
public function check_conditional_for_fragment_support() {
if ( kadence()->option( 'header_cart_show_total' ) && ! self::$show_cart_total ) {
self::$show_cart_total = true;
add_filter( 'woocommerce_add_to_cart_fragments', array( $this, 'get_refreshed_fragments_number' ) );
}
if ( ( 'slide' === kadence()->option( 'header_cart_style' ) || 'slide' === kadence()->option( 'header_mobile_cart_style' ) || 'dropdown' === kadence()->option( 'header_cart_style' ) ) && ! self::$show_mini_cart ) {
self::$show_mini_cart = true;
add_filter( 'woocommerce_add_to_cart_fragments', array( $this, 'get_refreshed_fragments_mini' ) );
}
}
/**
* Checks to see if theme needs to hook into cart fragments.
*/
public function cart_in_header() {
$in_header = false;
$elements = kadence()->option( 'header_desktop_items' );
if ( isset( $elements ) && is_array( $elements ) ) {
foreach ( array( 'top', 'main', 'bottom' ) as $row ) {
if ( isset( $elements[ $row ] ) && is_array( $elements[ $row ] ) ) {
foreach ( array( 'left', 'left_center', 'center', 'right_center', 'right' ) as $column ) {
if ( isset( $elements[ $row ][ $row . '_' . $column ] ) && is_array( $elements[ $row ][ $row . '_' . $column ] ) ) {
if ( in_array( 'cart', $elements[ $row ][ $row . '_' . $column ], true ) ) {
$in_header = true;
break;
}
}
}
}
}
}
return $in_header;
}
/**
* Enqueues a script for product CLS.
*/
public function action_enqueue_product_scripts() {
if ( class_exists( 'woocommerce' ) && is_product() ) {
wp_enqueue_script(
'kadence-product-cls',
get_theme_file_uri( '/assets/js/product-cls.min.js' ),
array( 'jquery' ),
KADENCE_VERSION,
true
);
// wp_script_add_data( 'kadence-product-cls', 'async', true );
// wp_script_add_data( 'kadence-product-cls', 'precache', true );
}
}
/**
* Enqueues a script for shop toggle.
*/
public function action_enqueue_scripts() {
// If the AMP plugin is active, return early.
if ( kadence()->is_amp() ) {
return;
}
if ( kadence()->option( 'custom_quantity' ) ) {
// Enqueue the quantity script.
wp_enqueue_script(
'kadence-shop-spinner',
get_theme_file_uri( '/assets/js/shop-spinner.min.js' ),
array( 'jquery' ),
KADENCE_VERSION,
true
);
wp_script_add_data( 'kadence-shop-spinner', 'async', true );
wp_script_add_data( 'kadence-shop-spinner', 'precache', true );
}
if ( class_exists( 'woocommerce' ) && is_cart() ) {
// Enqueue the quantity script.
wp_enqueue_script(
'kadence-cart-update',
get_theme_file_uri( '/assets/js/cart-update.min.js' ),
array( 'jquery' ),
KADENCE_VERSION,
true
);
wp_script_add_data( 'kadence-cart-update', 'async', true );
wp_script_add_data( 'kadence-cart-update', 'precache', true );
}
// Enqueue the toggle script.
wp_register_script(
'kadence-shop-toggle',
get_theme_file_uri( '/assets/js/shop-toggle.min.js' ),
array(),
KADENCE_VERSION,
true
);
wp_script_add_data( 'kadence-shop-toggle', 'async', true );
wp_script_add_data( 'kadence-shop-toggle', 'precache', true );
wp_localize_script(
'kadence-shop-toggle',
'kadenceShopConfig',
array(
'siteSlug' => sanitize_title( get_bloginfo( 'name' ) ),
)
);
}
/**
* Print the notices on none woocommerce pages.
*/
public function wc_print_notices_none_woo() {
if ( ! is_shop() && ! is_woocommerce() && ! is_cart() && ! is_checkout() && ! is_account_page() ) {
if ( function_exists( 'wc_print_notices' ) ) {
echo '';
echo wc_print_notices( true );
echo '
';
}
}
}
/**
* Set Cross sells limit.
*
* @param string $limit the current product limit.
*/
public function cross_sell_limit( $limit ) {
return 4;
}
/**
* Set Cross sells columns.
*
* @param string $columns the current column count.
*/
public function cross_sell_columns( $columns ) {
return 4;
}
/**
* Insert the Cart summary title
*/
public function cart_summary_title() {
echo '
' . esc_html__( 'Cart Summary', 'kadence' ) . ' ';
}
/**
* Insert the Cart Form wrap.
*/
public function cart_form_wrap_before() {
echo '';
}
/**
* Close the Cart Form wrap.
*/
public function cart_form_wrap_after() {
echo '
';
}
/**
* Insert the myaccount navigation wrap.
*/
public function myaccount_nav_wrap_start() {
echo '';
}
/**
* Close the myaccount navigation wrap.
*/
public function myaccount_nav_wrap_end() {
echo '
';
}
/**
* Avatar for myaccount page.
*/
public function myaccount_nav_avatar() {
$current_user = wp_get_current_user();
if ( kadence()->option( 'woo_account_navigation_avatar' ) && 0 !== $current_user->ID ) {
?>
option( 'product_archive_button_align' ) ) {
$align_archive_button = 'align-buttons-bottom';
}
$product_style = kadence()->option( 'product_archive_style' );
$product_btn_style = kadence()->option( 'product_archive_button_style' );
$product_image_hover_style = kadence()->option( 'product_archive_image_hover_switch' );
if ( is_main_query() && is_archive() && wc_get_loop_prop( 'is_paginated' ) && apply_filters( 'kadence_enabled_product_archive_attributes', true, $GLOBALS['woocommerce_loop'] ) ) {
$attributes = $this->get_archive_infinite_attributes();
} else {
$attributes = '';
}
return '';
}
/**
* Get Archive infinite attributes
*
* @return string $attributes for the archive container.
*/
public function get_archive_infinite_attributes() {
$attributes = '';
return apply_filters( 'kadence_product_archive_infinite_attributes', $attributes );
}
/**
* Insert the opening anchor tag for products image in the loop.
*/
public function archive_loop_image_link_open() {
global $product;
$link = apply_filters( 'woocommerce_loop_product_link', get_the_permalink(), $product ); // phpcs:ignore WPThemeReview.CoreFunctionality.PrefixAllGlobals.NonPrefixedHooknameFound
$has_hover_image = '';
if ( 'none' !== kadence()->option( 'product_archive_image_hover_switch' ) ) {
if ( is_a( $product, 'WC_Product' ) ) {
$attachment_ids = $product->get_gallery_image_ids();
if ( $attachment_ids ) {
$has_hover_image = ' product-has-hover-image';
}
}
}
echo '';
}
/**
* Insert the closing anchor tag for products image in the loop.
*/
public function archive_loop_image_link_close() {
echo ' ';
}
/**
* Insert a second product image if enabled and if image exists.
*/
public function archive_loop_second_image() {
if ( 'none' !== kadence()->option( 'product_archive_image_hover_switch' ) ) {
global $product;
if ( is_a( $product, 'WC_Product' ) ) {
$attachment_ids = $product->get_gallery_image_ids();
if ( $attachment_ids ) {
$attachment_ids = array_values( $attachment_ids );
$secondary_image_id = $attachment_ids['0'];
$secondary_image_alt = get_post_meta( $secondary_image_id, '_wp_attachment_image_alt', true );
$secondary_image_title = get_the_title( $secondary_image_id );
echo wp_get_attachment_image(
$secondary_image_id,
apply_filters( 'single_product_archive_thumbnail_size', 'woocommerce_thumbnail' ),
false,
array(
'class' => 'secondary-product-image attachment-woocommerce_thumbnail attachment-shop-catalog wp-post-image wp-post-image--secondary',
'alt' => $secondary_image_alt,
'title' => $secondary_image_title,
)
);
}
}
}
}
/**
* Insert the content wrap.
*/
public function archive_content_wrap_start() {
echo apply_filters( 'kadence_archive_content_wrap_start', '' );
}
/**
* Close the content wrap.
*/
public function archive_content_wrap_end() {
echo apply_filters( 'kadence_archive_content_wrap_end', '
' );
}
/**
* Show the product title in the product loop. By default this is an H2.
*/
public function archive_title_with_link() {
global $product;
$link = apply_filters( 'woocommerce_loop_product_link', get_the_permalink(), $product ); // phpcs:ignore WPThemeReview.CoreFunctionality.PrefixAllGlobals.NonPrefixedHooknameFound
echo ''; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
// phpcs:ignore WPThemeReview.CoreFunctionality.PrefixAllGlobals.NonPrefixedHooknameFound
}
/**
* Show the product excerpt if single or if toggle is on, only for archives.
*/
public function archive_excerpt() {
if ( is_main_query() && is_archive() ) {
$columns = wc_get_loop_prop( 'columns' );
if ( 1 === $columns || kadence()->option( 'product_archive_toggle' ) ) {
global $post;
echo '';
if ( $post->post_excerpt ) {
echo wp_kses_post( apply_filters( 'archive_woocommerce_short_description', $post->post_excerpt ) ); // phpcs:ignore WPThemeReview.CoreFunctionality.PrefixAllGlobals.NonPrefixedHooknameFound
} else {
the_excerpt();
}
echo '
';
}
}
}
/**
* Wrap Action buttons.
*/
public function archive_action_wrap_start() {
echo '';
}
/**
* Close Action buttons wrap.
*/
public function archive_action_wrap_end() {
echo '
';
}
/**
* Adds Arrow to add to cart button.
*
* @param string $button Current classes.
* @param object $product Product object.
* @param array $args The Product args.
*/
public function filter_add_to_cart_link_link( $button, $product, $args = array() ) {
$product_btn_style = kadence()->option( 'product_archive_button_style' );
if ( 'button' === $product_btn_style ) {
$button = sprintf(
'%s ',
esc_url( $product->add_to_cart_url() ),
esc_attr( isset( $args['quantity'] ) ? $args['quantity'] : 1 ),
esc_attr( isset( $args['class'] ) ? $args['class'] : 'button' ),
isset( $args['attributes'] ) ? wc_implode_html_attributes( $args['attributes'] ) : '',
esc_html( $product->add_to_cart_text() ) . '' . kadence()->get_icon( 'spinner' ) . '' . kadence()->get_icon( 'check' )
);
} else {
$button = sprintf(
'%s ',
esc_url( $product->add_to_cart_url() ),
esc_attr( isset( $args['quantity'] ) ? $args['quantity'] : 1 ),
esc_attr( isset( $args['class'] ) ? $args['class'] : 'button' ),
isset( $args['attributes'] ) ? wc_implode_html_attributes( $args['attributes'] ) : '',
esc_html( $product->add_to_cart_text() ) . '' . kadence()->get_icon( 'arrow-right-alt' ) . '' . kadence()->get_icon( 'spinner' ) . '' . kadence()->get_icon( 'check' )
);
}
return $button;
}
/**
* Adds results count and catalog ordering.
*
* @param array $classes Current classes.
* @param string|array $class Additional class.
* @param int $post_id Post ID.
*/
public function add_woo_entry_classes( $classes, $class = '', $post_id = 0 ) {
if ( ! $post_id || ! in_array( get_post_type( $post_id ), array( 'product', 'product_variation' ), true ) ) {
return $classes;
}
$product = wc_get_product( $post_id );
if ( ! $product ) {
return $classes;
}
$classes[] = 'entry';
$classes[] = 'content-bg';
if ( is_singular() && is_main_query() && get_queried_object_id() === $post_id ) {
$classes[] = 'entry-content-wrap';
} else {
$classes[] = 'loop-entry';
}
return $classes;
}
/**
* Adds results count and catalog ordering.
*
* @param array $classes Current classes.
* @param string|array $class Additional class.
* @param int $post_id Post ID.
*/
public function add_woo_cat_entry_classes( $classes, $class = '', $post_id = 0 ) {
$classes[] = 'entry';
$classes[] = 'content-bg';
$classes[] = 'loop-entry';
return $classes;
}
/**
* Adds results count and catalog ordering.
*/
public function archive_loop_top() {
global $wp_query;
if ( 0 === $wp_query->found_posts || ! woocommerce_products_will_display() ) {
return;
}
if ( kadence()->option( 'product_archive_show_results_count' ) || kadence()->option( 'product_archive_show_order' ) || kadence()->option( 'product_archive_toggle' ) || apply_filters( 'kadence_product_archive_show_top_row', false ) ) {
echo '';
do_action( 'kadence_woocommerce_before_shop_loop_top_row' );
if ( kadence()->option( 'product_archive_show_results_count' ) ) {
echo '
';
woocommerce_result_count();
echo '
';
}
if ( kadence()->option( 'product_archive_show_order' ) ) {
echo '
';
woocommerce_catalog_ordering();
echo '
';
}
if ( kadence()->option( 'product_archive_toggle' ) ) {
echo '
';
$this->toggle_list();
echo '
';
}
do_action( 'kadence_woocommerce_after_shop_loop_top_row' );
echo '
';
}
}
/**
* Adds toggle list option.
*/
public function toggle_list() {
wp_enqueue_script( 'kadence-shop-toggle' );
if ( 1 === wc_get_loop_prop( 'columns' ) ) {
echo '';
echo '';
kadence()->print_icon( 'list', '', false );
echo ' ';
echo '';
kadence()->print_icon( 'grid', '', false );
echo ' ';
echo '
';
} else {
echo '';
echo '';
kadence()->print_icon( 'grid', '', false );
echo ' ';
echo '';
kadence()->print_icon( 'list', '', false );
echo ' ';
echo '
';
}
}
/**
* Adds theme support for the Woocommerce plugin.
*/
public function action_add_woocommerce_support() {
add_theme_support( 'woocommerce' );
add_theme_support( 'wc-product-gallery-zoom' );
add_theme_support( 'wc-product-gallery-slider' );
add_theme_support( 'wc-product-gallery-lightbox' );
add_filter( 'woocommerce_enqueue_styles', '__return_empty_array' );
}
/**
* Adds Breadcrumb for single products.
*/
public function output_product_above() {
if ( is_product() && 'breadcrumbs' === kadence()->option( 'product_above_layout' ) ) {
// Make sure not using elementor template.
if ( class_exists( '\ElementorPro\Plugin' ) ) {
$conditions_manager = \ElementorPro\Plugin::instance()->modules_manager->get_modules( 'theme-builder' )->get_conditions_manager();
$documents = $conditions_manager->get_documents_for_location( 'single' );
if ( empty( $documents ) ) {
echo '';
get_template_part( 'template-parts/title/breadcrumb' );
echo '
';
}
} else {
echo '';
get_template_part( 'template-parts/title/breadcrumb' );
echo '
';
}
}
}
/**
* Adds Title Area for single products.
*/
public function output_product_above_title() {
if ( is_product() && 'title' === kadence()->option( 'product_above_layout' ) ) {
get_template_part( 'template-parts/content/entry_hero' );
}
}
/**
* Adds theme output Wrapper.
*/
public function output_content_wrapper() {
kadence()->print_styles( 'kadence-content' );
/**
* Hook for Hero Section
*/
do_action( 'kadence_hero_header' );
echo '';
if ( ! is_product() && kadence()->show_in_content_title() ) {
get_template_part( 'template-parts/content/archive_header' );
}
}
/**
* Adds theme end output Wrapper.
*/
public function output_content_wrapper_end() {
echo ' ';
get_sidebar();
echo '
';
}
/**
* Generates the dynamic css based on customizer options.
*
* @param string $css any custom css.
* @return string
*/
public function dynamic_css( $css ) {
$generated_css = $this->generate_woo_css();
if ( ! empty( $generated_css ) ) {
$css .= "\n/* Kadence Woo CSS */\n" . $generated_css;
}
return $css;
}
/**
* Generates the dynamic css based on page options.
*
* @return string
*/
public function generate_woo_css() {
$css = new Kadence_CSS();
$media_query = array();
$media_query['mobile'] = apply_filters( 'kadence_mobile_media_query', '(max-width: 767px)' );
$media_query['tablet'] = apply_filters( 'kadence_tablet_media_query', '(max-width: 1024px)' );
$media_query['desktop'] = apply_filters( 'kadence_desktop_media_query', '(min-width: 1025px)' );
if ( kadence()->option( 'custom_quantity' ) ) {
$css->set_selector( '.woocommerce table.shop_table td.product-quantity' );
$css->add_property( 'min-width', '130px' );
}
// Shop Notice.
$css->set_selector( '.woocommerce-demo-store .woocommerce-store-notice' );
$css->add_property( 'background', $css->render_color( kadence()->sub_option( 'woo_store_notice_background', 'color' ) ) );
$css->set_selector( '.woocommerce-demo-store .woocommerce-store-notice a, .woocommerce-demo-store .woocommerce-store-notice' );
$css->render_font( kadence()->option( 'woo_store_notice_font' ), $css );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.woocommerce-demo-store .woocommerce-store-notice a, .woocommerce-demo-store .woocommerce-store-notice' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_title_breadcrumb_font' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_title_breadcrumb_font' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_title_breadcrumb_font' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.woocommerce-demo-store .woocommerce-store-notice a, .woocommerce-demo-store .woocommerce-store-notice' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_title_breadcrumb_font' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_title_breadcrumb_font' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_title_breadcrumb_font' ), 'mobile' ) );
$css->stop_media_query();
// Above Product Title.
$css->set_selector( '.product-hero-section .entry-hero-container-inner' );
$css->render_background( kadence()->sub_option( 'product_title_background', 'desktop' ), $css );
$css->add_property( 'border-top', $css->render_border( kadence()->sub_option( 'product_title_top_border', 'desktop' ) ) );
$css->add_property( 'border-bottom', $css->render_border( kadence()->sub_option( 'product_title_bottom_border', 'desktop' ) ) );
$css->set_selector( '.entry-hero.product-hero-section .entry-header' );
$css->add_property( 'min-height', $css->render_range( kadence()->option( 'product_title_height' ), 'desktop' ) );
$css->set_selector( '.product-hero-section .hero-section-overlay' );
$css->add_property( 'background', $css->render_color_or_gradient( kadence()->sub_option( 'product_title_overlay_color', 'color' ) ) );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.product-hero-section .entry-hero-container-inner' );
$css->render_background( kadence()->sub_option( 'product_title_background', 'tablet' ), $css );
$css->add_property( 'border-top', $css->render_border( kadence()->sub_option( 'product_title_top_border', 'tablet' ) ) );
$css->add_property( 'border-bottom', $css->render_border( kadence()->sub_option( 'product_title_bottom_border', 'tablet' ) ) );
$css->set_selector( '.entry-hero.product-hero-section .entry-header' );
$css->add_property( 'min-height', $css->render_range( kadence()->option( 'product_title_height' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.product-hero-section .entry-hero-container-inner' );
$css->render_background( kadence()->sub_option( 'product_title_background', 'mobile' ), $css );
$css->add_property( 'border-top', $css->render_border( kadence()->sub_option( 'product_title_top_border', 'mobile' ) ) );
$css->add_property( 'border-bottom', $css->render_border( kadence()->sub_option( 'product_title_bottom_border', 'mobile' ) ) );
$css->set_selector( '.entry-hero.product-hero-section .entry-header' );
$css->add_property( 'min-height', $css->render_range( kadence()->option( 'product_title_height' ), 'mobile' ) );
$css->stop_media_query();
// Product Breadcrumbs.
$css->set_selector( '.product-title .kadence-breadcrumbs' );
$css->render_font( kadence()->option( 'product_title_breadcrumb_font' ), $css );
$css->add_property( 'color', $css->render_color( kadence()->sub_option( 'product_title_breadcrumb_color', 'color' ) ) );
$css->set_selector( '.product-title .kadence-breadcrumbs a:hover' );
$css->add_property( 'color', $css->render_color( kadence()->sub_option( 'product_title_breadcrumb_color', 'hover' ) ) );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.product-title .kadence-breadcrumbs' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_title_breadcrumb_font' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_title_breadcrumb_font' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_title_breadcrumb_font' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.product-title .kadence-breadcrumbs' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_title_breadcrumb_font' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_title_breadcrumb_font' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_title_breadcrumb_font' ), 'mobile' ) );
$css->stop_media_query();
// Product Title Category.
$css->set_selector( '.product-title .single-category' );
$css->render_font( kadence()->option( 'product_above_category_font' ), $css );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.product-title .single-category' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_above_category_font' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_above_category_font' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_above_category_font' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.product-title .single-category' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_above_category_font' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_above_category_font' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_above_category_font' ), 'mobile' ) );
$css->stop_media_query();
// Product Above Extra Title.
$css->set_selector( '.wp-site-blocks .product-hero-section .extra-title' );
$css->render_font( kadence()->option( 'product_above_title_font' ), $css, 'heading' );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.wp-site-blocks .product-hero-section .extra-title' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_above_title_font' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_above_title_font' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_above_title_font' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.wp-site-blocks .product-hero-section .extra-title' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_above_title_font' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_above_title_font' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_above_title_font' ), 'mobile' ) );
$css->stop_media_query();
// Product Title.
$css->set_selector( '.woocommerce div.product .product_title' );
$css->render_font( kadence()->option( 'product_title_font' ), $css, 'heading' );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.woocommerce div.product .product_title' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_title_font' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_title_font' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_title_font' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.woocommerce div.product .product_title' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_title_font' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_title_font' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_title_font' ), 'mobile' ) );
$css->stop_media_query();
$css->set_selector( '.woocommerce div.product .product-single-category' );
$css->render_font( kadence()->option( 'product_single_category_font' ), $css );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.woocommerce div.product .product-single-category' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_single_category_font' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_single_category_font' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_single_category_font' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.woocommerce div.product .product-single-category' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_single_category_font' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_single_category_font' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_single_category_font' ), 'mobile' ) );
$css->stop_media_query();
// Product Single Backgrounds.
$css->set_selector( 'body.single-product' );
$css->render_background( kadence()->sub_option( 'product_background', 'desktop' ), $css );
$css->set_selector( 'body.single-product .content-bg, body.content-style-unboxed.single-product .site' );
$css->render_background( kadence()->sub_option( 'product_content_background', 'desktop' ), $css );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( 'body.single-product' );
$css->render_background( kadence()->sub_option( 'product_background', 'tablet' ), $css );
$css->set_selector( 'body.single-product .content-bg, body.content-style-unboxed.single-product .site' );
$css->render_background( kadence()->sub_option( 'product_content_background', 'tablet' ), $css );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( 'body.single-product' );
$css->render_background( kadence()->sub_option( 'product_background', 'mobile' ), $css );
$css->set_selector( 'body.single-product .content-bg, body.content-style-unboxed.single-product .site' );
$css->render_background( kadence()->sub_option( 'product_content_background', 'mobile' ), $css );
$css->stop_media_query();
// Product Archive Backgrounds.
$css->set_selector( 'body.archive.tax-woo-product, body.post-type-archive-product' );
$css->render_background( kadence()->sub_option( 'product_archive_background', 'desktop' ), $css );
$css->set_selector( 'body.archive.tax-woo-product .content-bg, body.content-style-unboxed.archive.tax-woo-product .site, body.post-type-archive-product .content-bg, body.content-style-unboxed.archive.post-type-archive-product .site, body.content-style-unboxed.archive.tax-woo-product .content-bg.loop-entry .content-bg:not(.loop-entry), body.content-style-unboxed.post-type-archive-product .content-bg.loop-entry .content-bg:not(.loop-entry)' );
$css->render_background( kadence()->sub_option( 'product_archive_content_background', 'desktop' ), $css );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( 'body.archive.tax-woo-product, body.post-type-archive-product' );
$css->render_background( kadence()->sub_option( 'product_archive_background', 'tablet' ), $css );
$css->set_selector( 'body.archive.tax-woo-product .content-bg, body.content-style-unboxed.archive.tax-woo-product .site, body.post-type-archive-product .content-bg, body.content-style-unboxed.archive.post-type-archive-product .site, body.content-style-unboxed.archive.tax-woo-product .content-bg.loop-entry .content-bg:not(.loop-entry), body.content-style-unboxed.post-type-archive-product .content-bg.loop-entry .content-bg:not(.loop-entry)' );
$css->render_background( kadence()->sub_option( 'product_archive_content_background', 'tablet' ), $css );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( 'body.archive.tax-woo-product, body.post-type-archive-product' );
$css->render_background( kadence()->sub_option( 'product_archive_background', 'mobile' ), $css );
$css->set_selector( 'body.archive.tax-woo-product .content-bg, body.content-style-unboxed.archive.tax-woo-product .site, body.post-type-archive-product .content-bg, body.content-style-unboxed.archive.post-type-archive-product .site, body.content-style-unboxed.archive.tax-woo-product .content-bg.loop-entry .content-bg:not(.loop-entry), body.content-style-unboxed.post-type-archive-product .content-bg.loop-entry .content-bg:not(.loop-entry)' );
$css->render_background( kadence()->sub_option( 'product_archive_content_background', 'mobile' ), $css );
$css->stop_media_query();
// Product Archive Columns Mobile.
if ( 'twocolumn' === kadence()->option( 'product_archive_mobile_columns' ) ) {
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.woocommerce ul.products:not(.products-list-view), .wp-site-blocks .wc-block-grid:not(.has-2-columns):not(.has-1-columns) .wc-block-grid__products' );
$css->add_property( 'grid-template-columns', 'repeat(2, minmax(0, 1fr))' );
$css->add_property( 'column-gap', '0.5rem' );
$css->add_property( 'grid-row-gap', '0.5rem' );
$css->stop_media_query();
}
// Product Archive Title.
$css->set_selector( '.product-archive-hero-section .entry-hero-container-inner' );
$css->render_background( kadence()->sub_option( 'product_archive_title_background', 'desktop' ), $css );
$css->add_property( 'border-top', $css->render_border( kadence()->sub_option( 'product_archive_title_top_border', 'desktop' ) ) );
$css->add_property( 'border-bottom', $css->render_border( kadence()->sub_option( 'product_archive_title_bottom_border', 'desktop' ) ) );
$css->set_selector( '.entry-hero.product-archive-hero-section .entry-header' );
$css->add_property( 'min-height', $css->render_range( kadence()->option( 'product_archive_title_height' ), 'desktop' ) );
$css->set_selector( '.product-archive-hero-section .hero-section-overlay' );
$css->add_property( 'background', $css->render_color_or_gradient( kadence()->sub_option( 'product_archive_title_overlay_color', 'color' ) ) );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.product-archive-hero-section .entry-hero-container-inner' );
$css->render_background( kadence()->sub_option( 'product_archive_title_background', 'tablet' ), $css );
$css->add_property( 'border-top', $css->render_border( kadence()->sub_option( 'product_archive_title_top_border', 'tablet' ) ) );
$css->add_property( 'border-bottom', $css->render_border( kadence()->sub_option( 'product_archive_title_bottom_border', 'tablet' ) ) );
$css->set_selector( '.entry-hero.product-archive-hero-section .entry-header' );
$css->add_property( 'min-height', $css->render_range( kadence()->option( 'product_archive_title_height' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.product-archive-hero-section .entry-hero-container-inner' );
$css->render_background( kadence()->sub_option( 'product_archive_title_background', 'mobile' ), $css );
$css->add_property( 'border-top', $css->render_border( kadence()->sub_option( 'product_archive_title_top_border', 'mobile' ) ) );
$css->add_property( 'border-bottom', $css->render_border( kadence()->sub_option( 'product_archive_title_bottom_border', 'mobile' ) ) );
$css->set_selector( '.entry-hero.product-archive-hero-section .entry-header' );
$css->add_property( 'min-height', $css->render_range( kadence()->option( 'product_archive_title_height' ), 'mobile' ) );
$css->stop_media_query();
$css->set_selector( '.wp-site-blocks .product-archive-title h1' );
$css->render_font( kadence()->option( 'product_archive_title_heading_font' ), $css, 'heading' );
$css->add_property( 'color', $css->render_color( kadence()->sub_option( 'product_archive_title_color', 'color' ) ) );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.wp-site-blocks .product-archive-title h1' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_archive_title_heading_font' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_archive_title_heading_font' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_archive_title_heading_font' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.wp-site-blocks .product-archive-title h1' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_archive_title_heading_font' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_archive_title_heading_font' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_archive_title_heading_font' ), 'mobile' ) );
$css->stop_media_query();
$css->set_selector( '.product-archive-title .kadence-breadcrumbs' );
$css->add_property( 'color', $css->render_color( kadence()->sub_option( 'product_archive_title_breadcrumb_color', 'color' ) ) );
$css->set_selector( '.product-archive-title .kadence-breadcrumbs a:hover' );
$css->add_property( 'color', $css->render_color( kadence()->sub_option( 'product_archive_title_breadcrumb_color', 'hover' ) ) );
$css->set_selector( '.product-archive-title .archive-description' );
$css->add_property( 'color', $css->render_color( kadence()->sub_option( 'product_archive_title_description_color', 'color' ) ) );
$css->set_selector( '.product-archive-title .archive-description a:hover' );
$css->add_property( 'color', $css->render_color( kadence()->sub_option( 'product_archive_title_description_color', 'hover' ) ) );
// Product Archive Title Font.
$css->set_selector( '.woocommerce ul.products li.product h3, .woocommerce ul.products li.product .product-details .woocommerce-loop-product__title, .woocommerce ul.products li.product .product-details .woocommerce-loop-category__title, .wc-block-grid__products .wc-block-grid__product .wc-block-grid__product-title' );
$css->render_font( kadence()->option( 'product_archive_title_font' ), $css );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.woocommerce ul.products li.product h3, .woocommerce ul.products li.product .product-details .woocommerce-loop-product__title, .woocommerce ul.products li.product .product-details .woocommerce-loop-category__title, .wc-block-grid__products .wc-block-grid__product .wc-block-grid__product-title' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_archive_title_font' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_archive_title_font' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_archive_title_font' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.woocommerce ul.products li.product h3, .woocommerce ul.products li.product .product-details .woocommerce-loop-product__title, .woocommerce ul.products li.product .product-details .woocommerce-loop-category__title, .wc-block-grid__products .wc-block-grid__product .wc-block-grid__product-title' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_archive_title_font' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_archive_title_font' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_archive_title_font' ), 'mobile' ) );
$css->stop_media_query();
// Product Archive Price Font.
$css->set_selector( '.woocommerce ul.products li.product .product-details .price, .wc-block-grid__products .wc-block-grid__product .wc-block-grid__product-price' );
$css->render_font( kadence()->option( 'product_archive_price_font' ), $css );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.woocommerce ul.products li.product .product-details .price, .wc-block-grid__products .wc-block-grid__product .wc-block-grid__product-price' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_archive_price_font' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_archive_price_font' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_archive_price_font' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.woocommerce ul.products li.product .product-details .price, .wc-block-grid__products .wc-block-grid__product .wc-block-grid__product-price' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_archive_price_font' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_archive_price_font' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_archive_price_font' ), 'mobile' ) );
$css->stop_media_query();
// Product Archive Button Font.
$css->set_selector( '.woocommerce ul.products.woo-archive-btn-button .product-action-wrap .button:not(.kb-button), .woocommerce ul.products li.woo-archive-btn-button .button:not(.kb-button), .wc-block-grid__product.woo-archive-btn-button .product-details .wc-block-grid__product-add-to-cart .wp-block-button__link' );
$css->add_property( 'border-radius', $css->render_measure( kadence()->option( 'product_archive_button_radius' ) ) );
$css->add_property( 'color', $css->render_color( kadence()->sub_option( 'product_archive_button_color', 'color' ) ) );
$css->add_property( 'background', $css->render_color( kadence()->sub_option( 'product_archive_button_background', 'color' ) ) );
$css->add_property( 'border', $css->render_border( kadence()->option( 'product_archive_button_border' ) ) );
$css->add_property( 'border-color', $css->render_color( kadence()->sub_option( 'product_archive_button_border_colors', 'color' ) ) );
$css->add_property( 'box-shadow', $css->render_shadow( kadence()->option( 'product_archive_button_shadow' ), kadence()->default( 'product_archive_button_shadow' ) ) );
$css->render_font( kadence()->option( 'product_archive_button_typography' ), $css );
$css->set_selector( '.woocommerce ul.products.woo-archive-btn-button .product-action-wrap .button:not(.kb-button):hover, .woocommerce ul.products li.woo-archive-btn-button .button:not(.kb-button):hover, .wc-block-grid__product.woo-archive-btn-button .product-details .wc-block-grid__product-add-to-cart .wp-block-button__link:hover' );
$css->add_property( 'color', $css->render_color( kadence()->sub_option( 'product_archive_button_color', 'hover' ) ) );
$css->add_property( 'background', $css->render_color( kadence()->sub_option( 'product_archive_button_background', 'hover' ) ) );
$css->add_property( 'border-color', $css->render_color( kadence()->sub_option( 'product_archive_button_border_colors', 'hover' ) ) );
$css->add_property( 'box-shadow', $css->render_shadow( kadence()->option( 'product_archive_button_shadow_hover' ), kadence()->default( 'product_archive_button_shadow_hover' ) ) );
$css->start_media_query( $media_query['tablet'] );
$css->set_selector( '.woocommerce ul.products.woo-archive-btn-button .product-action-wrap .button:not(.kb-button), .woocommerce ul.products li.woo-archive-btn-button .button:not(.kb-button), .wc-block-grid__product.woo-archive-btn-button .product-details .wc-block-grid__product-add-to-cart .wp-block-button__link' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_archive_button_typography' ), 'tablet' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_archive_button_typography' ), 'tablet' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_archive_button_typography' ), 'tablet' ) );
$css->stop_media_query();
$css->start_media_query( $media_query['mobile'] );
$css->set_selector( '.woocommerce ul.products.woo-archive-btn-button .product-action-wrap .button:not(.kb-button), .woocommerce ul.products li.woo-archive-btn-button .button:not(.kb-button), .wc-block-grid__product.woo-archive-btn-button .product-details .wc-block-grid__product-add-to-cart .wp-block-button__link' );
$css->add_property( 'font-size', $css->render_font_size( kadence()->option( 'product_archive_button_typography' ), 'mobile' ) );
$css->add_property( 'line-height', $css->render_font_height( kadence()->option( 'product_archive_button_typography' ), 'mobile' ) );
$css->add_property( 'letter-spacing', $css->render_font_spacing( kadence()->option( 'product_archive_button_typography' ), 'mobile' ) );
$css->stop_media_query();
self::$google_fonts = $css->fonts_output();
return $css->css_output();
}
}