woocommerce/classes/class-woocommerce-product-v...

264 lines
8.3 KiB
PHP
Raw Normal View History

2011-08-09 15:16:18 +00:00
<?php
/**
* Product Variation Class
*
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
*
* @class Woocommerce_Product_Variation
2011-08-10 17:11:11 +00:00
* @package WooCommerce
* @category Class
* @author WooThemes
2011-08-09 15:16:18 +00:00
*/
class Woocommerce_Product_Variation extends Woocommerce_Product {
2011-08-09 15:16:18 +00:00
var $variation_data;
var $variation_id;
var $variation_has_length;
var $variation_has_width;
var $variation_has_height;
2011-08-09 15:16:18 +00:00
var $variation_has_weight;
var $variation_has_price;
var $variation_has_sale_price;
var $variation_has_stock;
var $variation_has_sku;
/**
* Loads all product data from custom fields
*
* @param int $id ID of the product to load
*/
function woocommerce_product_variation( $variation_id, $parent_id = '', $parent_custom_fields = '' ) {
2011-08-09 15:16:18 +00:00
$this->variation_id = $variation_id;
$product_custom_fields = get_post_custom( $this->variation_id );
$this->exists = (sizeof($product_custom_fields)>0) ? true : false;
2011-08-09 15:16:18 +00:00
$this->variation_data = array();
foreach ($product_custom_fields as $name => $value) :
if (!strstr($name, 'attribute_')) continue;
2011-08-09 15:16:18 +00:00
$this->variation_data[$name] = $value[0];
endforeach;
/* Get main product data from parent */
$this->id = ($parent_id>0) ? $parent_id : wp_get_post_parent_id( $this->variation_id );
if (!$parent_custom_fields) $parent_custom_fields = get_post_custom( $this->id );
2011-08-20 15:41:42 +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(
'sku' => $this->id,
'price' => 0,
'visibility' => 'hidden',
'stock' => 0,
'stock_status' => 'instock',
'backorders' => 'no',
'manage_stock' => 'no',
'sale_price' => '',
'regular_price' => '',
'weight' => '',
'length' => '',
'width' => '',
'height' => '',
2011-08-20 15:41:42 +00:00
'tax_status' => 'taxable',
'tax_class' => '',
'upsell_ids' => array(),
'crosssell_ids' => array()
);
// Load the data from the custom fields
foreach ($load_data as $key => $default) $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';
$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_sale_price = false;
2011-08-20 15:41:42 +00:00
/* Override parent data with variation */
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;
$this->sku = $product_custom_fields['_sku'][0];
2011-08-09 15:16:18 +00:00
endif;
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;
$this->manage_stock = 'yes';
$this->stock = $product_custom_fields['_stock'][0];
2011-08-09 15:16:18 +00:00
endif;
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;
$this->weight = $product_custom_fields['_weight'][0];
2011-08-09 15:16:18 +00:00
endif;
if (isset($product_custom_fields['_length'][0]) && $product_custom_fields['_length'][0]!=='') :
$this->variation_has_length = true;
$this->length = $product_custom_fields['_length'][0];
endif;
if (isset($product_custom_fields['_width'][0]) && $product_custom_fields['_width'][0]!=='') :
$this->variation_has_width = true;
$this->width = $product_custom_fields['_width'][0];
endif;
if (isset($product_custom_fields['_height'][0]) && $product_custom_fields['_height'][0]!=='') :
$this->variation_has_height = true;
$this->height = $product_custom_fields['_height'][0];
endif;
if (isset($product_custom_fields['_price'][0]) && $product_custom_fields['_price'][0]!=='') :
2011-08-09 15:16:18 +00:00
$this->variation_has_price = true;
$this->price = $product_custom_fields['_price'][0];
$this->regular_price = $product_custom_fields['_price'][0];
2011-08-09 15:16:18 +00:00
endif;
if (isset($product_custom_fields['_sale_price'][0]) && $product_custom_fields['_sale_price'][0]!=='') :
2011-08-09 15:16:18 +00:00
$this->variation_has_sale_price = true;
$this->sale_price = $product_custom_fields['_sale_price'][0];
2011-08-20 15:41:42 +00:00
if ($this->sale_price < $this->price) $this->price = $this->sale_price;
2011-08-09 15:16:18 +00:00
endif;
if (isset($product_custom_fields['_downloadable'][0]) && $product_custom_fields['_downloadable'][0]=='yes') :
$this->downloadable = 'yes';
else :
$this->downloadable = 'no';
endif;
if (isset($product_custom_fields['_virtual'][0]) && $product_custom_fields['_virtual'][0]=='yes') :
$this->virtual = 'yes';
else :
$this->virtual = 'no';
endif;
$this->total_stock = $this->stock;
2011-08-09 15:16:18 +00:00
}
2011-08-22 11:57:50 +00:00
/**
* Get variation ID
*
* @return int
*/
function get_variation_id() {
return (int) $this->variation_id;
}
/**
* Get variation attribute values
*
* @return array of attributes and their values for this variation
*/
function get_variation_attributes() {
return $this->variation_data;
}
/**
* Get variation attribute values
*
* @return string containing the formatted price
*/
2011-08-09 15:16:18 +00:00
function get_price_html() {
2011-08-20 15:41:42 +00:00
if ($this->variation_has_price || $this->variation_has_sale_price) :
2011-08-09 15:16:18 +00:00
$price = '';
if ($this->price) :
if ($this->variation_has_sale_price) :
2011-08-20 15:41:42 +00:00
$price .= '<del>'.woocommerce_price( $this->regular_price ).'</del> <ins>'.woocommerce_price( $this->sale_price ).'</ins>';
2012-01-14 16:42:04 +00:00
$price = apply_filters('woocommerce_variation_sale_price_html', $price, $this);
2011-08-09 15:16:18 +00:00
else :
2011-08-10 17:11:11 +00:00
$price .= woocommerce_price( $this->price );
2012-01-14 16:42:04 +00:00
$price = apply_filters('woocommerce_variation_price_html', $price, $this);
2011-08-09 15:16:18 +00:00
endif;
endif;
return $price;
else :
2011-08-10 17:11:11 +00:00
return woocommerce_price(parent::get_price());
2011-08-09 15:16:18 +00:00
endif;
}
/**
* Gets the main product image
*/
function get_image( $size = 'shop_thumbnail' ) {
global $woocommerce;
if ($this->variation_id && has_post_thumbnail($this->variation_id)) :
echo get_the_post_thumbnail($this->variation_id, $size);
elseif (has_post_thumbnail($this->id)) :
echo get_the_post_thumbnail($this->id, $size);
elseif ($parent_id = wp_get_post_parent_id( $this->id ) && has_post_thumbnail($parent_id)) :
echo get_the_post_thumbnail($parent_id, $size);
else :
echo '<img src="'.$woocommerce->plugin_url(). '/assets/images/placeholder.png" alt="Placeholder" width="'.$woocommerce->get_image_size('shop_thumbnail_image_width').'" height="'.$woocommerce->get_image_size('shop_thumbnail_image_height').'" />';
endif;
}
2011-08-09 15:16:18 +00:00
/**
* Reduce stock level of the product
*
* @param int $by Amount to reduce by
*/
function reduce_stock( $by = 1 ) {
if ($this->variation_has_stock) :
if ($this->managing_stock()) :
2011-08-21 16:47:49 +00:00
$this->stock = $this->stock - $by;
2011-11-13 02:15:00 +00:00
$this->total_stock = $this->get_total_stock() - $by;
update_post_meta($this->variation_id, '_stock', $this->stock);
2011-08-21 16:47:49 +00:00
// Parents out of stock attribute
if (!$this->is_in_stock()) :
// Check parent
$parent_product = new Woocommerce_Product( $this->id );
2011-08-21 16:47:49 +00:00
if ($parent_product->managing_stock()) :
if (!$parent_product->backorders_allowed()) :
2011-11-13 02:15:00 +00:00
if ($parent_product->get_total_stock()==0 || $parent_product->get_total_stock()<0) :
update_post_meta($this->id, '_stock_status', 'outofstock');
2011-11-13 12:07:29 +00:00
$woocommerce->clear_product_transients( $this->id ); // Clear transient
2011-08-21 16:47:49 +00:00
endif;
endif;
else :
2011-11-13 02:15:00 +00:00
if ($parent_product->get_total_stock()==0 || $parent_product->get_total_stock()<0) :
update_post_meta($this->id, '_stock_status', 'outofstock');
2011-11-13 12:07:29 +00:00
$woocommerce->clear_product_transients( $this->id ); // Clear transient
2011-08-21 16:47:49 +00:00
endif;
endif;
endif;
return $this->stock;
2011-08-09 15:16:18 +00:00
endif;
else :
return parent::reduce_stock( $by );
endif;
}
/**
* Increase stock level of the product
*
* @param int $by Amount to increase by
*/
function increase_stock( $by = 1 ) {
if ($this->variation_has_stock) :
if ($this->managing_stock()) :
2011-08-21 16:47:49 +00:00
$this->stock = $this->stock + $by;
2011-11-13 02:15:00 +00:00
$this->total_stock = $this->get_total_stock() + $by;
update_post_meta($this->variation_id, '_stock', $this->stock);
2011-08-21 16:47:49 +00:00
// Parents out of stock attribute
if ($this->is_in_stock()) update_post_meta($this->id, '_stock_status', 'instock');
2011-08-21 16:47:49 +00:00
return $this->stock;
2011-08-09 15:16:18 +00:00
endif;
else :
return parent::increase_stock( $by );
endif;
}
}