Skip to content

Instantly share code, notes, and snippets.

@hakikz
Last active November 5, 2023 17:42
Show Gist options
  • Save hakikz/cb542a22fd23624046449da237ab2e53 to your computer and use it in GitHub Desktop.
Save hakikz/cb542a22fd23624046449da237ab2e53 to your computer and use it in GitHub Desktop.
Variation Price Display

Add the following wrapper in Product Wrapper field

Botiga Theme Quick View

.botiga-quick-view-popup-content-ajax

YITH Quick View Plugin

.yith-wcqv-wrapper

Disable/Enable whole plugin function based on selecting categories from Advanced tab

Copy the following code and add it using a plugin called Code Snippets

add_action('variation_price_display_frontend_loaded', function($vpd_frontend){
	remove_filter( 'woocommerce_reset_variations_link', array( $vpd_frontend, 'remove_reset_link' ), 20, 1 );
	add_filter( 'woocommerce_reset_variations_link', function($link){
		$cats = vpd_matched_cat_ids(get_the_ID());
		$exin_condition = Variation_Price_Display::get_options()->exin_condition;
		if( 'include' === $exin_condition && count( $cats) > 0 ){
			return false;
		}
		elseif( 'include' === $exin_condition && count( $cats) <= 0 ){
			return $link;
		}
		elseif( 'exclude' === $exin_condition && count( $cats) > 0 ){
			return $link;
		}
		elseif( 'exclude' === $exin_condition && count( $cats) <= 0 ){
			return false;
		}
		else{
			return false;
		}
	}, 20, 1 );
});

add_filter( 'disable_vpd_scripts', function($default){
	$cats = vpd_matched_cat_ids(get_the_ID());
	$exin_condition = Variation_Price_Display::get_options()->exin_condition;
	if( 'include' === $exin_condition && count( $cats) > 0 ){
		return $default;
	}
	elseif( 'include' === $exin_condition && count( $cats) <= 0 ){
		return true;
	}
	elseif( 'exclude' === $exin_condition && count( $cats) > 0 ){
		return true;
	}
	elseif( 'exclude' === $exin_condition && count( $cats) <= 0 ){
		return $default;
	}
	else{
		return $default;
	}
} );


function vpd_matched_cat_ids($product_id){
    $terms = wc_get_product_term_ids ( $product_id, 'product_cat' );
	$selected_cats = Variation_Price_Display::get_options()->categories;
	$cats_int = array_map('intval',$selected_cats);
	return array_intersect( $terms, $cats_int );
}
// Display list all variation on single but price type from settings on shop/archive page [it will display list variations on related products]
add_filter('vpd_woocommerce_variable_price_html', function($prices, $product, $price, $price_types){
if( is_single() ){
return variation_price_display()->get_frontend()->list_variations_price($prices, $product, $price, 'list_variations');
}
return $prices;
}, 30, 4);
// Display list all variation on single but price type from settings on shop/archive page [it will display price types from plugin settings on related products like shop page]
add_filter('vpd_woocommerce_variable_price_html', function($prices, $product, $price, $price_types){
if( did_action('woocommerce_single_product_summary') === 1 && did_action('woocommerce_after_single_product_summary') === 0 ){
return variation_price_display()->get_frontend()->list_variations_price($prices, $product, $price, 'list_variations');
}
else{
return $prices;
}
}, 30, 4);
/* Price type: Custom
* Display custom price (Starts at: $12) on shop page
* but list all variation with price on the single product page
* but display Starts at: $12 on the single product page related product section
*/
add_filter('vpd_woocommerce_variable_price_html', function($prices, $product, $price, $price_types){
if( is_single() && did_action('woocommerce_single_product_summary') === 0 ){
return variation_price_display()->get_frontend()->list_variations_price($prices, $product, $price, 'list_variations');
}
return $prices;
}, 30, 4);
//Display only the variation not the product name
add_filter('vpd_pro_list_variation_name', function($value, $variation){
return ucwords( implode( ' , ', $variation->get_variation_attributes() ) );
},10,2);
add_action('variation_price_display_frontend_loaded', function($Variation_Price_Display_Front){
remove_filter( 'woocommerce_variable_price_html', array( $Variation_Price_Display_Front, 'get_price_html' ), 10, 2 );
add_filter( 'woocommerce_variable_price_html', array( $Variation_Price_Display_Front, 'get_price_html' ), 101, 2 );
},10, 1);
add_filter('vpd_woocommerce_variable_price_html', function( $price, $product ){
$Router = new \Wdr\App\Router();
$Wooc = new \Wdr\App\Helpers\Woocommerce();
$ManageDiscount = $Router::$manage_discount;
$original_prices_list = $sale_prices_lists = $discount_prices_lists = array();
$available_variations = $Wooc::getProductChildren($product);
if (!empty($available_variations)) {
$consider_out_of_stock_variants = apply_filters('advanced_woo_discount_rules_do_strikeout_for_out_of_stock_variants', false);
$variants_check_limit = (int) apply_filters('advanced_woo_discount_rules_check variants_limit_for_variable_strikeout', 20);
$variations = [];
if (count($available_variations) > $variants_check_limit) {
$variation_prices = $ManageDiscount::$woocommerce_helper->getVariationPrices($product);
$calculate_discount_from = $ManageDiscount::$config->getConfig('calculate_discount_from', 'sale_price');
$original_prices = ($calculate_discount_from) == 'regular_price' ? $variation_prices['regular_price'] : $variation_prices['price'];
$variations[] = array_keys($original_prices, min($original_prices))[0];
$variations[] = array_keys($original_prices, max($original_prices))[0];
} else {
$variations = $available_variations;
}
foreach ($variations as $variation_id) {
if (empty($variation_id)) {
continue;
}
$variation = $Wooc::getProduct($variation_id);
if(!$Wooc::variationIsVisible($variation)){
continue;
}
if(!$Wooc::isProductHasStock($variation) && !$consider_out_of_stock_variants) {
continue;
}
$prices = $ManageDiscount::calculateInitialAndDiscountedPrice($variation, 1);
if (!isset($prices['initial_price']) || !isset($prices['discounted_price'])) {
$original_prices_list[] = $Wooc::getProductRegularPrice($variation);
$sale_prices_lists[] = $Wooc::getProductPrice($variation);
continue;
}
$original_prices_list[] = $prices['initial_price'];
$discount_prices_lists[] = $prices['discounted_price'];
}
}
$discount_prices_lists = array_unique($discount_prices_lists);
$original_prices_list = array_unique($original_prices_list);
$min_price = min($discount_prices_lists);
$max_price = max($discount_prices_lists);
$min_original_price = min($original_prices_list);
$max_original_price = max($original_prices_list);
$calculator = $ManageDiscount::$calculator;
// VPD Plugin Options
$price_types = Variation_Price_Display::get_options()->price_types;
$from_before_min_price = !empty( get_option('variation_price_display_option') ) ? Variation_Price_Display::get_options()->from_before_min_price : 'yes';
$up_to_before_max_price = Variation_Price_Display::get_options()->up_to_before_max_price;
$format_sale_price = Variation_Price_Display::get_options()->format_sale_price;
switch ($price_types) {
case "min":
$before_min_price = ( $from_before_min_price === 'yes' ) ? __('From ', 'variation-price-display') : '';
// $min_price = wc_price( $product->get_variation_price( 'min', true ) );
$prices = apply_filters( 'vpd_wdr_prefix_min_price', $before_min_price ) . wc_price( $min_price );
break;
case "max":
$before_max_price = ( $up_to_before_max_price === 'yes' ) ? __('Up To ', 'variation-price-display') : '';
$prices = apply_filters( 'vpd_wdr_prefix_max_price', $before_max_price ) . wc_price( $max_price );
break;
case "max_to_min":
if( $max_price === $min_price ){
$prices = wc_price( $max_price );
}
else{
$prices = wc_format_price_range($max_price , $min_price );
}
break;
default:
if( $min_price === $max_price ){
$prices = wc_price( $min_price );
}
else{
// $prices = wc_format_price_range($product->get_variation_price( 'min', true ) , $product->get_variation_price( 'max', true ) );
$prices = wc_format_price_range($min_price , $max_price );
}
}
return $prices;
}, 50, 4);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment