2011-08-09 15:16:18 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Product Variation Class
|
2012-08-10 13:21:10 +00:00
|
|
|
*
|
2011-08-10 17:11:11 +00:00
|
|
|
* The WooCommerce product variation class handles product variation data.
|
2011-08-09 15:16:18 +00:00
|
|
|
*
|
2012-01-27 16:38:39 +00:00
|
|
|
* @class WC_Product_Variation
|
2012-08-14 19:42:38 +00:00
|
|
|
* @version 1.6.4
|
2012-08-14 22:43:48 +00:00
|
|
|
* @package WooCommerce/Classes
|
2012-08-14 19:42:38 +00:00
|
|
|
* @author WooThemes
|
2011-08-09 15:16:18 +00:00
|
|
|
*/
|
2012-10-15 10:57:58 +00:00
|
|
|
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
|
|
|
|
2012-01-27 16:38:39 +00:00
|
|
|
class WC_Product_Variation extends WC_Product {
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-15 17:08:42 +00:00
|
|
|
/** @var array Stores variation data (attributes) for the current variation. */
|
2011-08-09 15:16:18 +00:00
|
|
|
var $variation_data;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var int ID of the variable product. */
|
2011-08-09 15:16:18 +00:00
|
|
|
var $variation_id;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has a length. */
|
2011-11-28 13:13:49 +00:00
|
|
|
var $variation_has_length;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has a width. */
|
2011-11-28 13:13:49 +00:00
|
|
|
var $variation_has_width;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has a height. */
|
2011-11-28 13:13:49 +00:00
|
|
|
var $variation_has_height;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has a weight. */
|
2011-08-09 15:16:18 +00:00
|
|
|
var $variation_has_weight;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has a price. */
|
2011-08-09 15:16:18 +00:00
|
|
|
var $variation_has_price;
|
2012-10-08 11:51:00 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has a regular price. */
|
|
|
|
var $variation_has_regular_price;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has a sale price. */
|
2011-08-09 15:16:18 +00:00
|
|
|
var $variation_has_sale_price;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has stock and is managing stock. */
|
2011-08-09 15:16:18 +00:00
|
|
|
var $variation_has_stock;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has a sku. */
|
2011-08-09 15:16:18 +00:00
|
|
|
var $variation_has_sku;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var string Stores the shipping class of the variation. */
|
2012-02-08 14:39:31 +00:00
|
|
|
var $variation_shipping_class;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var int Stores the shipping class ID of the variation. */
|
2012-06-26 12:17:08 +00:00
|
|
|
var $variation_shipping_class_id;
|
2012-08-15 17:08:42 +00:00
|
|
|
|
|
|
|
/** @var bool True if the variation has a tax class. */
|
2012-04-11 17:56:54 +00:00
|
|
|
var $variation_has_tax_class;
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-09 15:16:18 +00:00
|
|
|
/**
|
|
|
|
* Loads all product data from custom fields
|
|
|
|
*
|
2012-08-14 19:42:38 +00:00
|
|
|
* @access public
|
2012-10-18 10:33:47 +00:00
|
|
|
* @param int $variation_id ID of the variation to load
|
2012-11-22 11:48:16 +00:00
|
|
|
* @param array $args Array of the arguments containing parent product data
|
2012-08-14 19:42:38 +00:00
|
|
|
* @return void
|
2011-08-09 15:16:18 +00:00
|
|
|
*/
|
2012-11-22 11:37:41 +00:00
|
|
|
function __construct( $variation, $args ) {
|
|
|
|
$parent_id = $args['parent_id'];
|
|
|
|
$parent_custom_fields = $args['meta'];
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-11-21 18:07:45 +00:00
|
|
|
if ( is_object( $variation ) ) {
|
|
|
|
$this->variation_id = absint( $variation->ID );
|
|
|
|
} else {
|
|
|
|
$this->variation_id = absint( $variation );
|
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-09 15:16:18 +00:00
|
|
|
$product_custom_fields = get_post_custom( $this->variation_id );
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-09 15:16:18 +00:00
|
|
|
$this->variation_data = array();
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
foreach ( $product_custom_fields as $name => $value ) {
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( ! strstr( $name, 'attribute_' ) ) continue;
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-10-18 10:33:47 +00:00
|
|
|
$this->variation_data[ $name ] = $value[0];
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
}
|
2011-08-09 15:16:18 +00:00
|
|
|
|
|
|
|
/* Get main product data from parent */
|
2012-10-18 10:33:47 +00:00
|
|
|
$this->id = ( $parent_id > 0 ) ? intval( $parent_id ) : wp_get_post_parent_id( $this->variation_id );
|
|
|
|
|
|
|
|
if ( ! $parent_custom_fields ) $parent_custom_fields = get_post_custom( $this->id );
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-10-26 18:45:38 +00:00
|
|
|
// Define the data we're going to load from the parent: Key => Default value
|
2011-08-20 15:41:42 +00:00
|
|
|
$load_data = array(
|
2012-02-13 00:34:09 +00:00
|
|
|
'sku' => '',
|
2011-08-20 15:41:42 +00:00
|
|
|
'price' => 0,
|
|
|
|
'visibility' => 'hidden',
|
|
|
|
'stock' => 0,
|
|
|
|
'stock_status' => 'instock',
|
|
|
|
'backorders' => 'no',
|
|
|
|
'manage_stock' => 'no',
|
|
|
|
'sale_price' => '',
|
|
|
|
'regular_price' => '',
|
|
|
|
'weight' => '',
|
2011-11-26 18:22:22 +00:00
|
|
|
'length' => '',
|
|
|
|
'width' => '',
|
|
|
|
'height' => '',
|
2011-08-20 15:41:42 +00:00
|
|
|
'tax_status' => 'taxable',
|
|
|
|
'tax_class' => '',
|
|
|
|
'upsell_ids' => array(),
|
|
|
|
'crosssell_ids' => array()
|
|
|
|
);
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-20 15:41:42 +00:00
|
|
|
// Load the data from the custom fields
|
2012-08-10 13:21:10 +00:00
|
|
|
foreach ( $load_data as $key => $default )
|
2012-10-18 10:33:47 +00:00
|
|
|
$this->$key = ( isset( $parent_custom_fields['_' . $key ][0] ) && $parent_custom_fields['_' . $key ][0] !== '' ) ? $parent_custom_fields['_' . $key ][0] : $default;
|
2011-08-09 15:16:18 +00:00
|
|
|
|
|
|
|
$this->product_type = 'variable';
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-10-08 11:51:00 +00:00
|
|
|
$this->variation_has_sku = $this->variation_has_stock = $this->variation_has_weight = $this->variation_has_length = $this->variation_has_width = $this->variation_has_height = $this->variation_has_price = $this->variation_has_regular_price = $this->variation_has_sale_price = false;
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-20 15:41:42 +00:00
|
|
|
/* Override parent data with variation */
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( isset( $product_custom_fields['_sku'][0] ) && ! empty( $product_custom_fields['_sku'][0] ) ) {
|
2011-08-09 15:16:18 +00:00
|
|
|
$this->variation_has_sku = true;
|
2011-12-24 16:57:36 +00:00
|
|
|
$this->sku = $product_custom_fields['_sku'][0];
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( isset( $product_custom_fields['_stock'][0] ) && $product_custom_fields['_stock'][0] !== '' ) {
|
2011-08-09 15:16:18 +00:00
|
|
|
$this->variation_has_stock = true;
|
2011-08-21 13:28:54 +00:00
|
|
|
$this->manage_stock = 'yes';
|
2011-12-24 16:57:36 +00:00
|
|
|
$this->stock = $product_custom_fields['_stock'][0];
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( isset( $product_custom_fields['_weight'][0] ) && $product_custom_fields['_weight'][0] !== '' ) {
|
2011-08-09 15:16:18 +00:00
|
|
|
$this->variation_has_weight = true;
|
2011-12-24 16:57:36 +00:00
|
|
|
$this->weight = $product_custom_fields['_weight'][0];
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( isset( $product_custom_fields['_length'][0] ) && $product_custom_fields['_length'][0] !== '' ) {
|
2011-11-28 13:13:49 +00:00
|
|
|
$this->variation_has_length = true;
|
2011-12-24 16:57:36 +00:00
|
|
|
$this->length = $product_custom_fields['_length'][0];
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( isset( $product_custom_fields['_width'][0] ) && $product_custom_fields['_width'][0] !== '' ) {
|
2011-11-28 13:13:49 +00:00
|
|
|
$this->variation_has_width = true;
|
2011-12-24 16:57:36 +00:00
|
|
|
$this->width = $product_custom_fields['_width'][0];
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( isset( $product_custom_fields['_height'][0] ) && $product_custom_fields['_height'][0] !== '' ) {
|
2011-11-28 13:13:49 +00:00
|
|
|
$this->variation_has_height = true;
|
2011-12-24 16:57:36 +00:00
|
|
|
$this->height = $product_custom_fields['_height'][0];
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2012-10-08 11:51:00 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( isset( $product_custom_fields['_downloadable'][0] ) && $product_custom_fields['_downloadable'][0] == 'yes' ) {
|
2011-11-09 23:06:17 +00:00
|
|
|
$this->downloadable = 'yes';
|
2012-03-21 18:37:57 +00:00
|
|
|
} else {
|
2011-11-09 23:06:17 +00:00
|
|
|
$this->downloadable = 'no';
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( isset( $product_custom_fields['_virtual'][0] ) && $product_custom_fields['_virtual'][0] == 'yes' ) {
|
2011-11-09 23:06:17 +00:00
|
|
|
$this->virtual = 'yes';
|
2012-03-21 18:37:57 +00:00
|
|
|
} else {
|
2011-11-09 23:06:17 +00:00
|
|
|
$this->virtual = 'no';
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-04-11 17:56:54 +00:00
|
|
|
if ( isset( $product_custom_fields['_tax_class'][0] ) ) {
|
|
|
|
$this->variation_has_tax_class = true;
|
|
|
|
$this->tax_class = $product_custom_fields['_tax_class'][0];
|
|
|
|
}
|
2012-10-08 11:51:00 +00:00
|
|
|
|
|
|
|
if ( isset( $product_custom_fields['_price'][0] ) && $product_custom_fields['_price'][0] !== '' ) {
|
|
|
|
$this->variation_has_price = true;
|
|
|
|
$this->price = $product_custom_fields['_price'][0];
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( isset( $product_custom_fields['_regular_price'][0] ) && $product_custom_fields['_regular_price'][0] !== '' ) {
|
|
|
|
$this->variation_has_regular_price = true;
|
|
|
|
$this->regular_price = $product_custom_fields['_regular_price'][0];
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( isset( $product_custom_fields['_sale_price'][0] ) && $product_custom_fields['_sale_price'][0] !== '' ) {
|
|
|
|
$this->variation_has_sale_price = true;
|
|
|
|
$this->sale_price = $product_custom_fields['_sale_price'][0];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Backwards compat for prices
|
|
|
|
if ( $this->variation_has_price && ! $this->variation_has_regular_price ) {
|
|
|
|
update_post_meta( $this->variation_id, '_regular_price', $this->price );
|
|
|
|
$this->variation_has_regular_price = true;
|
|
|
|
$this->regular_price = $this->price;
|
|
|
|
|
|
|
|
if ( $this->variation_has_sale_price && $this->sale_price < $this->regular_price ) {
|
|
|
|
update_post_meta( $this->variation_id, '_price', $this->sale_price );
|
|
|
|
$this->price = $this->sale_price;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( isset( $product_custom_fields['_sale_price_dates_from'][0] ) )
|
|
|
|
$this->sale_price_dates_from = $product_custom_fields['_sale_price_dates_from'][0];
|
|
|
|
|
|
|
|
if ( isset( $product_custom_fields['_sale_price_dates_to'][0] ) )
|
|
|
|
$this->sale_price_dates_from = $product_custom_fields['_sale_price_dates_to'][0];
|
|
|
|
|
2011-08-21 13:28:54 +00:00
|
|
|
$this->total_stock = $this->stock;
|
2012-10-08 11:51:00 +00:00
|
|
|
|
|
|
|
// Check sale dates
|
|
|
|
$this->check_sale_price();
|
2011-08-09 15:16:18 +00:00
|
|
|
}
|
2012-06-29 17:56:42 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns whether or not the variation is visible.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @return bool
|
|
|
|
*/
|
2012-06-29 17:56:42 +00:00
|
|
|
function is_visible() {
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-06-29 17:56:42 +00:00
|
|
|
$visible = true;
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-06-29 17:56:42 +00:00
|
|
|
// Out of stock visibility
|
2012-08-10 13:21:10 +00:00
|
|
|
if ( get_option('woocommerce_hide_out_of_stock_items') == 'yes' && ! $this->is_in_stock() )
|
2012-06-29 17:56:42 +00:00
|
|
|
$visible = false;
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
return apply_filters( 'woocommerce_product_is_visible', $visible, $this->id );
|
2012-06-29 17:56:42 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns whether or not the variations parent is visible.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @return bool
|
|
|
|
*/
|
2012-06-29 17:56:42 +00:00
|
|
|
function parent_is_visible() {
|
2012-08-10 13:21:10 +00:00
|
|
|
return parent::is_visible();
|
2012-06-29 17:56:42 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-22 11:57:50 +00:00
|
|
|
/**
|
|
|
|
* Get variation ID
|
2012-08-10 13:21:10 +00:00
|
|
|
*
|
2011-08-22 11:57:50 +00:00
|
|
|
* @return int
|
|
|
|
*/
|
|
|
|
function get_variation_id() {
|
2012-11-19 14:05:03 +00:00
|
|
|
return absint( $this->variation_id );
|
2011-08-22 11:57:50 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-22 11:57:50 +00:00
|
|
|
/**
|
|
|
|
* Get variation attribute values
|
2012-08-10 13:21:10 +00:00
|
|
|
*
|
2011-08-22 11:57:50 +00:00
|
|
|
* @return array of attributes and their values for this variation
|
|
|
|
*/
|
|
|
|
function get_variation_attributes() {
|
|
|
|
return $this->variation_data;
|
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-22 11:57:50 +00:00
|
|
|
/**
|
|
|
|
* Get variation attribute values
|
2012-08-10 13:21:10 +00:00
|
|
|
*
|
2011-08-22 11:57:50 +00:00
|
|
|
* @return string containing the formatted price
|
|
|
|
*/
|
2011-08-09 15:16:18 +00:00
|
|
|
function get_price_html() {
|
2012-10-08 11:51:00 +00:00
|
|
|
if ( $this->variation_has_price ) {
|
2011-08-09 15:16:18 +00:00
|
|
|
$price = '';
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-10-08 11:51:00 +00:00
|
|
|
if ( $this->price !== '' ) {
|
|
|
|
if ( $this->price == $this->sale_price ) {
|
|
|
|
$price .= '<del>' . woocommerce_price( $this->regular_price ) . '</del> <ins>' . woocommerce_price( $this->sale_price ) . '</ins>';
|
|
|
|
$price = apply_filters( 'woocommerce_variation_sale_price_html', $price, $this );
|
|
|
|
} else {
|
2011-08-10 17:11:11 +00:00
|
|
|
$price .= woocommerce_price( $this->price );
|
2012-10-08 11:51:00 +00:00
|
|
|
$price = apply_filters( 'woocommerce_variation_price_html', $price, $this );
|
|
|
|
}
|
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-09 15:16:18 +00:00
|
|
|
return $price;
|
2012-10-08 11:51:00 +00:00
|
|
|
} else {
|
|
|
|
return woocommerce_price( parent::get_price() );
|
|
|
|
}
|
2011-08-09 15:16:18 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the main product image.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $size (default: 'shop_thumbnail')
|
|
|
|
* @return string
|
2012-08-10 13:21:10 +00:00
|
|
|
*/
|
2011-11-09 15:39:14 +00:00
|
|
|
function get_image( $size = 'shop_thumbnail' ) {
|
|
|
|
global $woocommerce;
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-12 11:41:26 +00:00
|
|
|
$image = '';
|
|
|
|
|
|
|
|
if ( $this->variation_id && has_post_thumbnail( $this->variation_id ) ) {
|
|
|
|
$image = get_the_post_thumbnail( $this->variation_id, $size );
|
|
|
|
} elseif ( has_post_thumbnail( $this->id ) ) {
|
|
|
|
$image = get_the_post_thumbnail( $this->id, $size );
|
|
|
|
} elseif ( $parent_id = wp_get_post_parent_id( $this->id ) && has_post_thumbnail( $parent_id ) ) {
|
|
|
|
$image = get_the_post_thumbnail( $parent_id, $size );
|
|
|
|
} else {
|
|
|
|
$image = '<img src="' . woocommerce_placeholder_img_src() . '" alt="Placeholder" width="' . $woocommerce->get_image_size( 'shop_thumbnail_image_width' ) . '" height="' . $woocommerce->get_image_size( 'shop_thumbnail_image_height' ) . '" />';
|
|
|
|
}
|
|
|
|
|
|
|
|
return $image;
|
2011-11-09 15:39:14 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
|
2011-08-09 15:16:18 +00:00
|
|
|
/**
|
2012-08-14 19:42:38 +00:00
|
|
|
* Reduce stock level of the product.
|
2011-08-09 15:16:18 +00:00
|
|
|
*
|
2012-08-14 19:42:38 +00:00
|
|
|
* @access public
|
|
|
|
* @param int $by (default: 1) Amount to reduce by
|
|
|
|
* @return int stock level
|
2011-08-09 15:16:18 +00:00
|
|
|
*/
|
|
|
|
function reduce_stock( $by = 1 ) {
|
2012-03-07 13:38:51 +00:00
|
|
|
global $woocommerce;
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( $this->variation_has_stock ) {
|
|
|
|
if ( $this->managing_stock() ) {
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-06-29 19:40:18 +00:00
|
|
|
$this->stock = $this->stock - $by;
|
|
|
|
$this->total_stock = $this->total_stock - $by;
|
2012-03-21 18:37:57 +00:00
|
|
|
update_post_meta( $this->variation_id, '_stock', $this->stock );
|
2012-06-29 19:40:18 +00:00
|
|
|
$woocommerce->clear_product_transients( $this->id ); // Clear transient
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-06-29 19:40:18 +00:00
|
|
|
// Check parents out of stock attribute
|
2012-03-21 18:37:57 +00:00
|
|
|
if ( ! $this->is_in_stock() ) {
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-21 16:47:49 +00:00
|
|
|
// Check parent
|
2012-11-21 18:07:45 +00:00
|
|
|
$parent_product = get_product( $this->id );
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-06-29 19:40:18 +00:00
|
|
|
// Only continue if the parent has backorders off
|
|
|
|
if ( ! $parent_product->backorders_allowed() && $parent_product->get_total_stock() <= 0 ) {
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-06-29 19:40:18 +00:00
|
|
|
update_post_meta( $this->id, '_stock_status', 'outofstock' );
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2011-08-21 16:47:49 +00:00
|
|
|
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-11-19 14:05:03 +00:00
|
|
|
return apply_filters( 'woocommerce_stock_amount', $this->stock );
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
|
|
|
} else {
|
2011-08-09 15:16:18 +00:00
|
|
|
return parent::reduce_stock( $by );
|
2012-03-21 18:37:57 +00:00
|
|
|
}
|
2011-08-09 15:16:18 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
|
2011-08-09 15:16:18 +00:00
|
|
|
/**
|
2012-08-14 19:42:38 +00:00
|
|
|
* Increase stock level of the product.
|
2011-08-09 15:16:18 +00:00
|
|
|
*
|
2012-08-14 19:42:38 +00:00
|
|
|
* @access public
|
|
|
|
* @param int $by (default: 1) Amount to increase by
|
|
|
|
* @return int stock level
|
2011-08-09 15:16:18 +00:00
|
|
|
*/
|
|
|
|
function increase_stock( $by = 1 ) {
|
2012-06-29 19:40:18 +00:00
|
|
|
global $woocommerce;
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-09 15:16:18 +00:00
|
|
|
if ($this->variation_has_stock) :
|
|
|
|
if ($this->managing_stock()) :
|
2011-08-21 16:47:49 +00:00
|
|
|
|
2012-06-29 19:40:18 +00:00
|
|
|
$this->stock = $this->stock + $by;
|
|
|
|
$this->total_stock = $this->total_stock + $by;
|
|
|
|
update_post_meta( $this->variation_id, '_stock', $this->stock );
|
|
|
|
$woocommerce->clear_product_transients( $this->id ); // Clear transient
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2011-08-21 16:47:49 +00:00
|
|
|
// Parents out of stock attribute
|
2012-08-10 13:21:10 +00:00
|
|
|
if ( $this->is_in_stock() )
|
2012-06-29 19:40:18 +00:00
|
|
|
update_post_meta( $this->id, '_stock_status', 'instock' );
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-11-19 14:05:03 +00:00
|
|
|
return apply_filters( 'woocommerce_stock_amount', $this->stock );
|
2011-08-09 15:16:18 +00:00
|
|
|
endif;
|
|
|
|
else :
|
|
|
|
return parent::increase_stock( $by );
|
|
|
|
endif;
|
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
|
2012-02-08 14:39:31 +00:00
|
|
|
/**
|
2012-08-14 19:42:38 +00:00
|
|
|
* Get the shipping class, and if not set, get the shipping class of the parent.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @return string
|
2012-02-08 14:39:31 +00:00
|
|
|
*/
|
|
|
|
function get_shipping_class() {
|
2012-10-18 10:33:47 +00:00
|
|
|
if ( ! $this->variation_shipping_class ) {
|
2012-02-10 12:16:21 +00:00
|
|
|
$classes = get_the_terms( $this->variation_id, 'product_shipping_class' );
|
2012-10-18 10:33:47 +00:00
|
|
|
|
|
|
|
if ( $classes && ! is_wp_error( $classes ) ) {
|
|
|
|
$this->variation_shipping_class = esc_attr( current( $classes )->slug );
|
|
|
|
} else {
|
|
|
|
$this->variation_shipping_class = parent::get_shipping_class();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-08 14:39:31 +00:00
|
|
|
return $this->variation_shipping_class;
|
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-14 19:42:38 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the product shipping class ID.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @return int
|
|
|
|
*/
|
2012-06-26 12:17:08 +00:00
|
|
|
function get_shipping_class_id() {
|
|
|
|
if ( ! $this->variation_shipping_class_id ) {
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-06-26 12:17:08 +00:00
|
|
|
$classes = get_the_terms( $this->variation_id, 'product_shipping_class' );
|
2012-08-10 13:21:10 +00:00
|
|
|
|
|
|
|
if ( $classes && ! is_wp_error( $classes ) )
|
|
|
|
$this->variation_shipping_class_id = current( $classes )->term_id;
|
|
|
|
else
|
2012-06-26 12:17:08 +00:00
|
|
|
$this->variation_shipping_class_id = parent::get_shipping_class_id();
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-06-26 12:17:08 +00:00
|
|
|
}
|
2012-11-19 14:05:03 +00:00
|
|
|
return absint( $this->variation_shipping_class_id );
|
2012-06-26 12:17:08 +00:00
|
|
|
}
|
2012-08-10 13:21:10 +00:00
|
|
|
|
2012-08-09 22:41:59 +00:00
|
|
|
/**
|
2012-08-28 15:21:54 +00:00
|
|
|
* Get file download path identified by $download_id
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $download_id file identifier
|
|
|
|
* @return array
|
2012-08-09 22:41:59 +00:00
|
|
|
*/
|
2012-08-28 15:21:54 +00:00
|
|
|
function get_file_download_path( $download_id ) {
|
|
|
|
|
|
|
|
$file_path = '';
|
|
|
|
$file_paths = apply_filters( 'woocommerce_file_download_paths', get_post_meta( $this->variation_id, '_file_paths', true ), $this->variation_id, null, null );
|
|
|
|
|
|
|
|
if ( ! $download_id && count( $file_paths ) == 1 ) {
|
|
|
|
// backwards compatibility for old-style download URLs and template files
|
|
|
|
$file_path = array_shift( $file_paths );
|
|
|
|
} elseif ( isset( $file_paths[ $download_id ] ) ) {
|
|
|
|
$file_path = $file_paths[ $download_id ];
|
|
|
|
}
|
2012-08-09 22:41:59 +00:00
|
|
|
|
2012-08-28 15:21:54 +00:00
|
|
|
// allow overriding based on the particular file being requested
|
|
|
|
return apply_filters( 'woocommerce_file_download_path', $file_path, $this->variation_id, $download_id );
|
2012-08-09 22:41:59 +00:00
|
|
|
}
|
2012-10-08 11:51:00 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks sale data to see if the product is due to go on sale/sale has expired, and updates the main price.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
function check_sale_price() {
|
2012-01-27 16:38:39 +00:00
|
|
|
|
2012-10-08 11:51:00 +00:00
|
|
|
if ( $this->sale_price_dates_from && $this->sale_price_dates_from < current_time('timestamp') ) {
|
|
|
|
|
|
|
|
if ( $this->sale_price && $this->price !== $this->sale_price ) {
|
|
|
|
|
|
|
|
// Update price
|
|
|
|
$this->price = $this->sale_price;
|
|
|
|
update_post_meta( $this->variation_id, '_price', $this->price );
|
|
|
|
|
|
|
|
// Variable product prices and sale status are affected by children
|
|
|
|
$this->variable_product_sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( $this->sale_price_dates_to && $this->sale_price_dates_to < current_time('timestamp') ) {
|
|
|
|
|
|
|
|
if ( $this->regular_price && $this->price !== $this->regular_price ) {
|
|
|
|
|
|
|
|
$this->price = $this->regular_price;
|
|
|
|
update_post_meta( $this->variation_id, '_price', $this->price );
|
|
|
|
|
|
|
|
// Sale has expired - clear the schedule boxes
|
|
|
|
update_post_meta( $this->variation_id, '_sale_price', '' );
|
|
|
|
update_post_meta( $this->variation_id, '_sale_price_dates_from', '' );
|
|
|
|
update_post_meta( $this->variation_id, '_sale_price_dates_to', '' );
|
|
|
|
|
|
|
|
// Variable product prices and sale status are affected by children
|
|
|
|
$this->variable_product_sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2011-08-09 15:16:18 +00:00
|
|
|
}
|