mirror of
https://github.com/pronamic/woocommerce-subscriptions.git
synced 2025-10-10 11:32:54 +00:00
2.3.2
This commit is contained in:

committed by
Remco Tolsma

parent
5fb62b0e6a
commit
1039aec2d9
@@ -16,8 +16,18 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||
|
||||
class WC_Product_Variable_Subscription extends WC_Product_Variable {
|
||||
|
||||
private $min_max_variation_data = array();
|
||||
/**
|
||||
* A cache of the variable product's min and max data generated by @see wcs_get_min_max_variation_data().
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $min_max_variation_data = array();
|
||||
|
||||
/**
|
||||
* A cache of the variable product's sorted variation prices.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $sorted_variation_prices = array();
|
||||
|
||||
/**
|
||||
@@ -141,15 +151,10 @@ class WC_Product_Variable_Subscription extends WC_Product_Variable {
|
||||
|
||||
if ( empty( $this->sorted_variation_prices[ $prices_hash ] ) ) {
|
||||
|
||||
$child_variation_ids = array_keys( $prices );
|
||||
$variation_hash = md5( json_encode( $child_variation_ids ) );
|
||||
$min_max_variation_data = $this->get_min_and_max_variation_data( array_keys( $prices ) );
|
||||
|
||||
if ( empty( $this->min_max_variation_data[ $variation_hash ] ) ) {
|
||||
$this->min_max_variation_data[ $variation_hash ] = wcs_get_min_max_variation_data( $this, $child_variation_ids );
|
||||
}
|
||||
|
||||
$min_variation_id = $this->min_max_variation_data[ $variation_hash ]['min']['variation_id'];
|
||||
$max_variation_id = $this->min_max_variation_data[ $variation_hash ]['max']['variation_id'];
|
||||
$min_variation_id = $min_max_variation_data['min']['variation_id'];
|
||||
$max_variation_id = $min_max_variation_data['max']['variation_id'];
|
||||
|
||||
// Reorder the variable price arrays to reflect the min and max values so that WooCommerce will find them in the correct order
|
||||
$min_price = $prices[ $min_variation_id ];
|
||||
@@ -168,6 +173,66 @@ class WC_Product_Variable_Subscription extends WC_Product_Variable {
|
||||
return $this->sorted_variation_prices[ $prices_hash ];
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the product's min and max variation data.
|
||||
*
|
||||
* @param array $min_and_max_data The min and max variation data returned by @see wcs_get_min_max_variation_data(). Optional.
|
||||
* @param array $variation_ids The child variation IDs. Optional. By default this value be generated by @see WC_Product_Variable->get_visible_children().
|
||||
* @since 2.3.0
|
||||
*/
|
||||
public function set_min_and_max_variation_data( $min_and_max_data = array(), $variation_ids = array() ) {
|
||||
|
||||
if ( empty( $variation_ids ) ) {
|
||||
$variation_ids = $this->get_visible_children();
|
||||
}
|
||||
|
||||
if ( empty( $min_and_max_data ) ) {
|
||||
$min_and_max_data = wcs_get_min_max_variation_data( $this, $variation_ids );
|
||||
}
|
||||
|
||||
$this->add_meta_data( '_min_max_variation_data', $min_and_max_data, true );
|
||||
$this->add_meta_data( '_min_max_variation_ids_hash', $this->get_variation_ids_hash( $variation_ids ), true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the min and max variation data.
|
||||
*
|
||||
* This is a wrapper for @see wcs_get_min_max_variation_data() but to avoid calling
|
||||
* that resource intensive function multiple times per request, check the value
|
||||
* stored in meta or cached in memory before calling that function.
|
||||
*
|
||||
* @param array $variation_ids An array of variation IDs.
|
||||
* @return array The variable product's min and max variation data.
|
||||
* @since 2.3.0
|
||||
*/
|
||||
public function get_min_and_max_variation_data( $variation_ids ) {
|
||||
$variation_ids_hash = $this->get_variation_ids_hash( $variation_ids );
|
||||
|
||||
if ( $variation_ids_hash === $this->get_meta( '_min_max_variation_ids_hash', true ) ) {
|
||||
$min_and_max_variation_data = $this->get_meta( '_min_max_variation_data', true );
|
||||
} elseif ( ! empty( $this->min_max_variation_data[ $variation_ids_hash ] ) ) {
|
||||
$min_and_max_variation_data = $this->min_max_variation_data[ $variation_ids_hash ];
|
||||
} else {
|
||||
$min_and_max_variation_data = wcs_get_min_max_variation_data( $this, $variation_ids );
|
||||
$this->min_max_variation_data[ $variation_ids_hash ] = $min_and_max_variation_data;
|
||||
}
|
||||
|
||||
return $min_and_max_variation_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a unique hash from an array of variation IDs.
|
||||
*
|
||||
* @param array $variation_ids
|
||||
* @return string
|
||||
*/
|
||||
protected static function get_variation_ids_hash( $variation_ids ) {
|
||||
// Sort the variation IDs so the hash isn't different for the same array of IDs
|
||||
sort( $variation_ids );
|
||||
|
||||
return md5( json_encode( $variation_ids ) );
|
||||
}
|
||||
|
||||
/* Deprecated Functions */
|
||||
|
||||
/**
|
||||
@@ -235,15 +300,11 @@ class WC_Product_Variable_Subscription extends WC_Product_Variable {
|
||||
*/
|
||||
protected function get_price_prefix( $prices ) {
|
||||
|
||||
$child_variation_ids = array_keys( $prices['price'] );
|
||||
$min_max_variation_data = $this->get_min_and_max_variation_data( $child_variation_ids );
|
||||
|
||||
// Are the subscription details of all variations identical?
|
||||
$child_variation_ids = array_keys( $prices['price'] );
|
||||
$variation_hash = md5( json_encode( $child_variation_ids ) );
|
||||
|
||||
if ( empty( $this->min_max_variation_data[ $variation_hash ] ) ) {
|
||||
$this->min_max_variation_data[ $variation_hash ] = wcs_get_min_max_variation_data( $this, $child_variation_ids );
|
||||
}
|
||||
|
||||
if ( $this->min_max_variation_data[ $variation_hash ]['identical'] ) {
|
||||
if ( $min_max_variation_data['identical'] ) {
|
||||
$prefix = '';
|
||||
} else {
|
||||
$prefix = wcs_get_price_html_from_text( $this );
|
||||
|
Reference in New Issue
Block a user