רכישה כמותית בווקומרס

איך להחיל הנחה על רכישה כמותית ולאפשר סינון לפי המחיר המוזל?
עדכן את אחוזי ההנחה שמעניקה כל כמות (במוצרים עם וריאציות ההנחה תוצג רק לאחר ההוספה לסל):

add_filter( 'woocommerce_price_filter_widget_step', '__return_zero' );
add_filter( 'woocommerce_price_filter_widget_min_amount' , '__return_zero' );
add_action( 'woocommerce_widget_price_filter_start', 'wc_add_quantity_field' );
add_filter( 'posts_clauses', 'wc_pre_price_filter_post_clauses', 8, 2 );
add_filter( 'posts_clauses', 'wc_price_filter_excluded_products', 20, 2 );
add_filter( 'the_posts', 'wc_handle_get_posts', 10, 2 );
add_action( 'wp_ajax_wc_save_products_quantity', 'wc_save_products_quantity' );
add_action( 'wp_ajax_nopriv_wc_save_products_quantity', 'wc_save_products_quantity' );
add_filter( 'woocommerce_loop_add_to_cart_args', 'wc_set_default_quantity', 10, 2 );
add_filter( 'woocommerce_product_add_to_cart_text', 'wc_set_text_quantity', 10, 2 );
add_filter( 'woocommerce_quantity_input_args', 'wc_quantity_input_args', 10, 2 );
add_action( 'woocommerce_before_calculate_totals', 'wc_quantity_based_pricing' );
add_action( 'woocommerce_after_add_to_cart_button', 'wc_product_price_quantity' );
add_action( 'wp_ajax_wc_display_total', 'wc_display_total' );
add_action( 'wp_ajax_nopriv_wc_display_total', 'wc_display_total' );
add_filter( 'woocommerce_get_price_suffix', 'wc_change_product_suffix', 10, 2 );
if ( ! is_admin() ) {
	add_filter( 'woocommerce_get_price_html', 'wc_adjust_price_display', 10, 2 );
}

function wc_get_discount( $product_id = '', $quantity = '' ) {
	$excluded_cat = [ '36' ];
	if ( empty( $quantity ) ) {
		$quantity = WC()->session->get( 'products_quantity' );
	}
	if ( $quantity && ( empty( $product_id ) || ! array_intersect( $excluded_cat, wc_get_product_cat_ids( $product_id ) ) ) ) {
		if ( 10 > $quantity ) {
			$percent = 0;
		} elseif ( 25 > $quantity ) {
			$percent = 10;
		} elseif ( 50 > $quantity ) {
			$percent = 12.5;
		} elseif ( 80 > $quantity ) {
			$percent = 16;
		} elseif ( 168 > $quantity ) {
			$percent = 20;
		} elseif ( 283 > $quantity ) {
			$percent = 23;
		} elseif ( 370 > $quantity ) {
			$percent = 27;
		} elseif ( 670 > $quantity ) {
			$percent = 30;
		} elseif ( 1050 > $quantity ) {
			$percent = 33;
		} elseif ( 1645 > $quantity ) {
			$percent = 36;
		} else {
			$percent = 40;
		}
		return $percent / 100;
	}
	return 0;
}

function wc_price_filter_excluded_products( $args, $wp_query ) {
	$excluded_cat = [ '36' ];
	$args['where'] = str_replace( 'wc_product_meta_lookup.max_price', 'wc_product_meta_lookup.max_price AND ( wp_posts.ID NOT IN ( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN ( ' . implode( ',', $excluded_cat ) . ' ) ) ) OR ( ( wp_posts.ID IN ( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN ( ' . implode( ',', $excluded_cat ) . ' ) ) ) AND (' . ( isset( $_POST['org_max_price'] ) ? $_POST['org_max_price'] : PHP_INT_MAX ) . '<wc_product_meta_lookup.min_price OR ' . ( isset( $_POST['org_min_price'] ) ? $_POST['org_min_price'] : 0 ) . '>wc_product_meta_lookup.max_price ) )', $args['where'] );
	return $args;
}

function wc_change_product_suffix( $html, $product ) {
	$excluded_cat = [ '36' ];
	return is_product() && is_single( $product->get_id() ) && ! array_intersect( $excluded_cat, wc_get_product_cat_ids( $product->get_id() ) ) ? " ליח'" : $html;
}

function wc_add_quantity_field() {
	woocommerce_form_field( 'products_quantity', [
		'type'		=> 'number',
		'label'		=> __( 'Quantity', 'woocommerce' ),
		'custom_attributes' => [ 'step' => '10', 'min' => '0' ],
	], WC()->session->get( 'products_quantity' ) ); ?>
	<script type="text/javascript">
	jQuery( function( $ ) {
		$( '#products_quantity' ).on( 'change', function() {
			var data = {
				'action'	: 'wc_save_products_quantity',
				'products_quantity'	: $( this ).val(),
			};
			$.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', data, function( response ) {
				location.reload();
			} );
		} );
	} );
	</script>
<?php }

function wc_pre_price_filter_post_clauses( $args, $wp_query ) {
	if ( isset( $_GET['min_price'] ) ) {
		$_POST['org_min_price'] = wc_clean( $_GET['min_price'] );
		$_GET['min_price'] = floor( $_GET['min_price'] / ( 1 - wc_get_discount() ) );
	}
	if ( isset( $_GET['max_price'] ) ) {
		$_POST['org_max_price'] = wc_clean( $_GET['max_price'] );
		$_GET['max_price'] = ceil( $_GET['max_price'] / ( 1 - wc_get_discount() ) );
	}
	return $args;
}

function wc_handle_get_posts( $posts, $query ) {
	if ( 'product_query' === $query->get( 'wc_query' ) ) {
		remove_filter( 'posts_clauses', 'wc_pre_price_filter_post_clauses', 8, 2 );
		if ( isset( $_POST['org_min_price'], $_GET['min_price'] ) ) {
			$_GET['min_price'] = $_POST['org_min_price'];
		}
		if ( isset( $_POST['org_max_price'], $_GET['max_price'] ) ) {
			$_GET['max_price'] = $_POST['org_max_price'];
		}
	}
	return $posts;
}

function wc_save_products_quantity() {
	if ( isset( $_POST['products_quantity'] ) ) {
		if ( isset( WC()->session ) && ! WC()->session->has_session() ) {
			WC()->session->set_customer_session_cookie( true );
		}
		WC()->session->set( 'products_quantity', wc_clean( $_POST['products_quantity'] ) );
	}
	wp_send_json( '' );
}

function wc_set_default_quantity( $args, $product ) {
	$quantity = WC()->session->get( 'products_quantity' );
	if ( $quantity ) {
		$args['quantity'] = $quantity;
	}
	return $args;
}

function wc_set_text_quantity( $text, $product ) {
	return $product->is_purchasable() && $product->is_in_stock() ? $text . ' ' . WC()->session->get( 'products_quantity' ) : $text;
}

function wc_quantity_input_args( $args, $product ) {
	$quantity = WC()->session->get( 'products_quantity' );
	if ( $quantity && 'quantity' === $args['input_name'] ) {
		$args['input_value'] = $quantity;
	}
	return $args;
}

function wc_quantity_based_pricing( $cart ) {
	if ( ( ! is_admin() || wp_doing_ajax() ) && 2 > did_action( 'woocommerce_before_calculate_totals' ) ) {
		foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
			$discount = wc_get_discount( $cart_item['data']->get_id(), $cart_item['quantity'] );
			if ( $discount ) {
				$cart_item['data']->set_price( round( $cart_item['data']->get_price() * ( 1 - $discount ), wc_get_price_decimals() ) );
			}
		}
	}
}

function wc_product_price_quantity() {
	global $product;
	if ( $product->is_type( 'simple' ) ) {
		echo '<div id="subtotal" style="display: inline-block;"></div>'; ?>
		<script type="text/javascript">
		jQuery( function( $ ) {
			$( 'input[name=quantity]' ).each( function() { display_prices( $( this ) ) } );
			$( 'input[name=quantity]' ).on( 'change', function() { display_prices( $( this ) ) } );
			function display_prices( field ) {
				var data = {
					'action'	: 'wc_display_total',
					'quantity'	: field.val(),
					'product_id'	: $( '.single_add_to_cart_button' ).val(),
				};
				$.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', data, function( response ) {
					if ( 'discount' in response ) {
						$( '#subtotal' ).html( '<strong>סה"כ</strong> ' + response.subtotal + '<br><strong>בקנייה זו תוכלו לחסוך</strong> ' + response.discount + '<br><strong>סה"כ לאחר הנחה</strong> ' + response.total );
					} else {
						$( '#subtotal' ).html( '<strong>סה"כ</strong> ' + response.subtotal );
					}
				} );
			}
		} );
		</script>
	<?php }
}

function wc_display_total() {
	if ( isset( WC()->session ) && ! WC()->session->has_session() ) {
		WC()->session->set_customer_session_cookie( true );
	}
	WC()->session->set( 'products_quantity', wc_clean( $_POST['quantity'] ) );
	$discount_percent = wc_get_discount( $_POST['product_id'], $_POST['quantity'] );
	$subtotal = wc_get_price_to_display( wc_get_product( $_POST['product_id'] ) ) * $_POST['quantity'];
	if ( $discount_percent ) {
		$total = $subtotal * ( 1 - $discount_percent );
		wp_send_json( [ 'subtotal' => wc_price( $subtotal ), 'total' => wc_price( $total ), 'discount' => wc_price( $subtotal - $total ) ] );
	} else {
		wp_send_json( [ 'subtotal' => wc_price( $subtotal ) ] );
	}
}

function wc_adjust_price_display( $price_html, $product ) {
	$quantity = WC()->session->get( 'products_quantity' );
	$discount = wc_get_discount( $product->get_id() );
	return $quantity && $product->is_type( 'simple' ) && is_archive() && $discount ? '<span style="color:red;"><del>מחיר רגיל: ' . $price_html . '</del></span><br>מחיר בהנחה: ' . wc_price( wc_get_price_to_display( $product ) * ( 1 - $discount ) ) : $price_html;
}

השאירו תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *