image_size=self::SingleImageSize;
if('custom' === themify_get( 'setting-product_single_image_size',false,true )){
add_filter( 'woocommerce_gallery_image_size', array(__CLASS__,'single_product_image_size'), 100 );
add_filter( 'woocommerce_gallery_image_html_attachment_image_params', array(__CLASS__,'single_product_image_attrs'), 100 );
}
list($themify->width,$themify->height)=self::getSingleImageSize();
$themify->layout = themify_get_both('custom_post_product_single','setting-single_product_layout','sidebar1');
$themify->hide_title='no';
$themify->display_content='content';
if(themify_check( 'setting-hide_shop_single_breadcrumbs',true )){
remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20 );
}
//related Limit
if (themify_check( 'setting-related_products',true) ) {
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
}
else{
add_filter( 'woocommerce_output_related_products_args', array(__CLASS__,'related_limit'), 100 );
}
//review tabs
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_rating');
if(themify_check('setting-product_reviews',true)){
add_filter( 'woocommerce_product_tabs', array(__CLASS__,'product_reviews'),100,1);
}
elseif(themify_check('setting-product_reviews_empty',true)){
add_action('woocommerce_single_product_summary',array(__CLASS__,'show_product_rating'), 15 );// Always show Rating
}
else{
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_rating',15 );//Change position of rating
}
add_filter( 'woocommerce_available_variation',array(__CLASS__,'variation_image_size'));//Set variation image sizes
//Change OnSale Position
add_action('woocommerce_product_thumbnails','woocommerce_show_product_sale_flash');
//Increase variation limit
add_filter( 'woocommerce_ajax_variation_threshold', array(__CLASS__,'variation_limit'));
}
else{
$themify->products_hover_image = themify_check( 'setting-product_hover_image', true );
if( themify_check('setting-hide_shop_sorting',true)){
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );
}
$themify->image_size=self::LoopImageSize;
list($themify->width,$themify->height)=self::getLoopImageSize();
if ( is_search() ) { // ?post_type=product&s= pages
$themify->layout = themify_get('setting-search-result_layout', 'sidebar1', true);
} else {
$sidebar_layout = themify_get('page_layout','default');
if ('default' === $sidebar_layout ) {
$key = themify_is_shop()?'setting-shop_layout':'setting-shop_archive_layout';
$sidebar_layout = themify_get($key,'default',true);
if($sidebar_layout==='default'){
$sidebar_layout = themify_get('setting-default_layout','sidebar1',true);
}
}
$themify->layout=$sidebar_layout;
}
$themify->post_layout_type = themify_get( 'setting-product_content_layout','',true);
$themify->post_layout =themify_get('setting-products_layout','grid4',true );
$themify->display_content=themify_get('setting-product_archive_show_short','none',true);
$themify->hide_title=themify_get('setting-product_archive_hide_title','no',true);
//Archive Result Count
if(themify_check( 'setting-hide_shop_count',true )){
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_result_count', 20 );
}
//Archive breadcrumbs
if(themify_check( 'setting-hide_shop_breadcrumbs',true )){
remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20 );
}
if($themify->display_content!=='none'){
// Show excerpt or content in product archive pages
add_action('woocommerce_after_shop_loop_item',array(__CLASS__,'loop_description'), 9);
}
}
//Product price
if(themify_get('setting-product_archive_hide_price',false,true)=== 'yes'){
remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price');// No product price in product archive pages
}
//product rating
if(themify_check( 'setting-hide_product_rating_stars',true )){
remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 );
}
elseif(themify_check('setting-products_reviews_empty',true)){
add_filter( 'woocommerce_product_get_rating_html', array(__CLASS__,'loop_rating_html'), 100, 3 );// Always show rating even for 0 rating
}
}
}
public static function loop_wrapper_start():void{
?>
get_title();
}
$hover_image = '';
$wc_shortcode=wc_get_loop_prop( 'is_shortcode' );
if ( $themify->products_hover_image !== false ) {
$gallery = $product->get_gallery_image_ids();
if(!empty($gallery)){
$second_alt=wp_get_attachment_caption($gallery[0]);
if(!$second_alt){
$second_alt=$alt;
}
if($wc_shortcode){
$hover_image=wp_get_attachment_image( $gallery[0], 'woocommerce_thumbnail', false, array('class'=>'themify_product_second_image tf_abs tf_opacity','alt'=>$second_alt) );
}else{
$hover_image=themify_get_image(array('alt'=>$second_alt,'w'=>$themify->width,'h'=>$themify->height,'image_size'=>$themify->image_size,'src'=>$gallery[0],'class'=>'themify_product_second_image tf_abs tf_opacity'));
}
}
}
if($wc_shortcode){
$product=$oldProduct;
return $image.$hover_image;
}
$src=$product->get_image_id();
if(!$src){
$p=$product->get_parent_id();
if ( $p ) {
$parent_product = wc_get_product( $p );
if ( $parent_product ) {
$src = $parent_product->get_image_id();
}
unset($parent_product,$p);
}
if(!$src){
$src=wc_placeholder_img_src();
}
}
ob_start();
?>
is_on_sale()):?>
unlink_image!=='yes' ):?>
$alt,'w'=>$themify->width,'h'=>$themify->height,'image_size'=>$themify->image_size,'src'=>$src));?>
unlink_image!=='yes' ):?>
get_rating_count();
$review_count = $product->get_review_count();
$average = $product->get_average_rating();
if ( $rating_count >= 0 ) : ?>
hide_title!=='yes'){
themify_post_title(array('tag'=>'h2','class'=>apply_filters( 'woocommerce_product_loop_title_classes', 'woocommerce-loop-product__title' ),'link_class'=>'woocommerce-LoopProduct-link woocommerce-loop-product__link'));
}
}
public static function product_title_class($class):string{
return 'product_title woocommerce-loop-product__title';
}
public static function loop_rating_html( $rating_html, $rating, $count):string{
if('0' == $rating){
/* translators: %s: rating */
$label = __( 'Rated 0 out of 5', 'themify' );
$rating_html = '' . wc_get_star_rating_html( $rating, $count ) . '
';
}
return $rating_html;
}
/**
* Set number of products shown in shop
* @return int Number of products based on user choice
*/
public static function products_per_page($limit){
return themify_get('setting-shop_products_per_page',$limit,true);
}
/**
* Outputs product short description or full content depending on the setting.
*/
public static function loop_description(){
global $themify;
if ( $themify->display_content==='none' || ! empty( Themify_Builder::$is_loop ) || wc_get_loop_prop( 'is_shortcode' ) ) {
return;
}
if ( $themify->display_content === 'excerpt' ) {
add_filter( 'get_the_excerpt', [ __CLASS__, 'remove_builder_static_content' ] );
}
?>
display_content === 'excerpt' ? the_excerpt() : the_content(); ?>
display_content === 'excerpt' ) {
remove_filter( 'get_the_excerpt', [ __CLASS__, 'remove_builder_static_content' ] );
}
}
public static function remove_builder_static_content(string $content ):string {
if ( ThemifyBuilder_Data_Manager::has_static_content( $content ) ) {
$content = ThemifyBuilder_Data_Manager::update_static_content_string( '', $content );
}
return $content;
}
public static function description_wrap(string $desc):string{
return '' . $desc . '
';
}
/**
* Remove (unnecessary) success message after a product was added to cart through theme's AJAX method.
* @since 1.5.5
*/
public static function add_to_cart_message($message='' ){
if ( isset( $_REQUEST['wc-ajax'] ) && 'theme_add_to_cart' === $_REQUEST['wc-ajax'] ) {
//Adding cart ajax on single product page
add_action( 'wc_ajax_theme_add_to_cart',array(__CLASS__,'ajax_add_to_cart_refresh') );
add_action( 'wc_ajax_nopriv_theme_add_to_cart', array(__CLASS__,'ajax_add_to_cart_refresh') );//when Redirect to the cart page isn`t checked
add_filter('woocommerce_add_to_cart_redirect',array(__CLASS__,'ajax_add_to_cart_refresh'),1,100);//when Redirect to the cart page is checked
if(current_filter()!=='woocommerce_add_to_cart_quantity'){
$message = '';
}
}
return $message;
}
/**
* Add to cart ajax on single product page
* @return json
*/
public static function ajax_add_to_cart_refresh() {
remove_filter('woocommerce_add_to_cart_redirect',array(__CLASS__,'ajax_add_to_cart_refresh'),1,100);
remove_action( 'wc_ajax_nopriv_theme_add_to_cart', array(__CLASS__,'ajax_add_to_cart_refresh') );
remove_action( 'wc_ajax_theme_add_to_cart',array(__CLASS__,'ajax_add_to_cart_refresh') );
$errors=wc_get_notices('error');
wc_clear_notices();
if(!empty($errors)){
$data=array();
foreach($errors as $e){
$data[]=$e['notice'];
}
wp_send_json_error($data);
}
WC_AJAX::get_refreshed_fragments();
}
/**
* Add cart total and shopdock cart to the WC Fragments
* @param array $fragments
* @return array
*/
public static function add_to_cart_fragments(array $fragments ):array {
// cart list
ob_start();
get_template_part( 'includes/shopdock' );
$fragments['#shopdock-ultra'] = ob_get_clean();
$count = WC()->cart->get_cart_contents_count();
$fragments['.cart-icon-link span'] =$count===0?' ': sprintf( '%s ', $count );
return $fragments;
}
/**
* Specific for infinite scroll themes
*/
public static function pagination() {
if ( wc_get_loop_prop( 'is_shortcode' ) ) {
$name=wc_get_loop_prop( 'name' );
if(in_array($name,array('products','recent_products','sale_products','best_selling_products','top_rated_products','featured_products'))){
woocommerce_pagination();
}
} else {
get_template_part( 'includes/pagination');
}
}
public static function getSingleImageSize():array{
if('custom' === themify_get( 'setting-product_single_image_size',false,true )){
$width=themify_get('setting-default_product_single_image_post_width',false,true);
$height=themify_get('setting-default_product_single_image_post_height',false,true);
}
else{
$width=$height=false;
}
if($width===false && $height===false){
$size = wc_get_image_size( self::SingleImageSize );
$width= $size['width'];
$height= $size['height'];
}
return array($width,$height);
}
public static function getLoopImageSize():array{
if('custom' === themify_get( 'setting-product_shop_image_size',false,true )){
$width=themify_get('setting-default_product_index_image_post_width',false,true);
$height=themify_get( 'setting-default_product_index_image_post_height',false,true);
}
else{
$width=$height=false;
}
if($width===false && $height===false){
$size = wc_get_image_size(self::LoopImageSize );
$width= $size['width'];
$height= $size['height'];
}
return array($width,$height);
}
public static function variation_image_size(array $data ):array{
if( ! empty( $data[ 'image' ] ) ) {
list($data[ 'image' ][ 'src_w' ],$data[ 'image' ][ 'src_h' ])=self::getSingleImageSize();
$data[ 'image' ][ 'src' ]=themify_get_image( array('src'=>$data[ 'image' ][ 'src' ],'w'=>$data[ 'image' ][ 'src_w' ],'h'=>$data[ 'image' ][ 'src_h' ],'urlonly'=>true,'image_size'=>self::SingleImageSize) );
}
return $data;
}
public static function hide_shop_products( $q ) {
if ( themify_is_shop() ) {
query_posts( array( 'post__in' => array( 0 ) ) );
remove_action( 'woocommerce_no_products_found', 'wc_no_products_found' );
}
}
public static function load_wc_styles($template_name, $template_path, $located, $args){
if($template_name==='loop/orderby.php'){
Themify_Enqueue_Assets::loadThemeWCStyleModule( 'orderby' );
}
elseif($template_name==='single-product/tabs/tabs.php'){
Themify_Enqueue_Assets::loadThemeWCStyleModule( 'tabs' );
}
elseif($template_name==='loop/pagination.php'){
self::load_pagination_styles();
}
elseif(($template_name==='single-product/related.php' && !empty($args['related_products'])) || ($template_name==='single-product/up-sells.php' && !empty($args['upsells']))){
Themify_Enqueue_Assets::loadThemeWCStyleModule('related');
$width = themify_get( 'setting-product_related_image_width',false,true );
$height = themify_get( 'setting-product_related_image_height',false,true );
if($height===false && $width===false){
list($width,$height)=self::getLoopImageSize();
}
global $themify;
self::$themify_save = clone $themify;
$themify->width=$width;
$themify->height=$height;
add_action( 'woocommerce_after_template_part',array(__CLASS__,'reset_themify_property'),10,5);
}
}
public static function reset_themify_property($template_name, $template_path, $located, $args){
if(($template_name==='single-product/related.php' && !empty($args['related_products'])) || ($template_name==='single-product/up-sells.php' && !empty($args['upsells']))){
remove_action( 'woocommerce_after_template_part',array(__CLASS__,'reset_themify_property'),10,5);
if(self::$themify_save!==null){
global $themify;
$themify = clone self::$themify_save;
self::$themify_save=null;
}
}
}
public static function load_pagination_styles($args=array()){
remove_filter('woocommerce_pagination_args', array(__CLASS__,'load_pagination_styles'));
remove_filter('woocommerce_comment_pagination_args', array(__CLASS__,'load_pagination_styles'));
remove_action('woocommerce_before_account_orders_pagination', array(__CLASS__,'load_pagination_styles'));
Themify_Enqueue_Assets::loadThemeWCStyleModule( 'pagination' );
return $args;
}
public static function before_loop(){
add_action('tf_wc_loop_end',array(__CLASS__,'after_loop'));
add_filter( 'woocommerce_product_get_image', array(__CLASS__,'loop_image'),100,5);
if(wc_get_loop_prop( 'is_shortcode' )){
add_action( 'woocommerce_before_shop_loop_item', 'woocommerce_template_loop_product_link_open' );
add_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_product_link_close', 5 );
}
}
public static function after_loop(){
remove_action('tf_wc_loop_end',array(__CLASS__,'after_loop'));
remove_filter( 'woocommerce_product_get_image', array(__CLASS__,'loop_image'),100,5);
}
public static function single_product_image_size($size){
if('woocommerce_single' === $size){
global $themify;
if(!empty($themify->width || !empty($themify->height))){
$size = array((int)$themify->width,(int)$themify->height);
}
}
return $size;
}
public static function single_product_image_attrs( $attrs ) {
if(!themify_is_image_script_disabled()){
global $themify;
if(!empty($themify->width || !empty($themify->height))){
$attr = array('urlonly'=>true,'w'=>$themify->width,'h'=>$themify->height);
$attrs['data-src'] = themify_get_image($attr);
}
}
return $attrs;
}
}
//get Cart Style
function themify_get_cart_style():bool {
static $is = null;
if ($is===null) {
$is = themify_is_woocommerce_active()?themify_get_both('cart_style','setting-cart_style','dropdown'):false;
}
return $is;
}
add_action('woocommerce_init', array('Themify_WC','before_init') );