woocommerce/classes/product_variation.class.php

180 lines
5.0 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
*
2011-08-10 17:11:11 +00:00
* @class woocommerce_product_variation
* @package WooCommerce
* @category Class
* @author WooThemes
2011-08-09 15:16:18 +00:00
*/
2011-08-10 17:11:11 +00:00
class woocommerce_product_variation extends woocommerce_product {
2011-08-09 15:16:18 +00:00
var $variation;
var $variation_data;
var $variation_id;
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
*/
2011-08-10 17:11:11 +00:00
function woocommerce_product_variation( $variation_id ) {
2011-08-09 15:16:18 +00:00
$this->variation_id = $variation_id;
$product_custom_fields = get_post_custom( $this->variation_id );
$this->variation_data = array();
foreach ($product_custom_fields as $name => $value) :
if (!strstr($name, 'tax_')) continue;
$this->variation_data[$name] = $value[0];
endforeach;
$this->get_variation_post_data();
/* Get main product data from parent */
$this->id = $this->variation->post_parent;
$parent_custom_fields = get_post_custom( $this->id );
2011-08-20 15:41:42 +00:00
// Define the data we're going to load: Key => Default value
$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' => '',
'tax_status' => 'taxable',
'tax_class' => '',
'upsell_ids' => array(),
'crosssell_ids' => array()
);
// Load the data from the custom fields
foreach ($load_data as $key => $default) :
if (isset($parent_custom_fields[$key][0]) && !empty($parent_custom_fields[$key][0])) :
$this->$key = $parent_custom_fields[$key][0];
else :
$this->$key = $default;
endif;
endforeach;
// Load serialised data, unserialise twice to fix WP bug
if (isset($product_custom_fields['product_attributes'][0])) $this->attributes = maybe_unserialize( maybe_unserialize( $product_custom_fields['product_attributes'][0] )); else $this->attributes = array();
2011-08-09 15:16:18 +00:00
$this->product_type = 'variable';
2011-08-20 15:41:42 +00:00
if ($parent_custom_fields) :
2011-08-09 15:16:18 +00:00
$this->exists = true;
else :
$this->exists = false;
endif;
2011-08-20 15:41:42 +00:00
/* Override parent data with variation */
2011-08-17 23:42:07 +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-08-17 23:42:07 +00:00
$this->sku = $product_custom_fields['sku'][0];
2011-08-09 15:16:18 +00:00
endif;
if (isset($product_custom_fields['stock'][0]) && !empty($product_custom_fields['stock'][0])) :
$this->variation_has_stock = true;
$this->stock = $product_custom_fields['stock'][0];
endif;
if (isset($product_custom_fields['weight'][0]) && !empty($product_custom_fields['weight'][0])) :
$this->variation_has_weight = true;
2011-08-17 23:42:07 +00:00
$this->weight = $product_custom_fields['weight'][0];
2011-08-09 15:16:18 +00:00
endif;
if (isset($product_custom_fields['price'][0]) && !empty($product_custom_fields['price'][0])) :
$this->variation_has_price = true;
$this->price = $product_custom_fields['price'][0];
2011-08-20 15:41:42 +00:00
$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]) && !empty($product_custom_fields['sale_price'][0])) :
$this->variation_has_sale_price = true;
2011-08-17 23:42:07 +00:00
$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;
}
/** Get the product's post data */
function get_variation_post_data() {
if (empty($this->variation)) :
$this->variation = get_post( $this->variation_id );
endif;
return $this->variation;
}
/** Returns the price in html format */
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>';
2011-08-09 15:16:18 +00:00
else :
2011-08-10 17:11:11 +00:00
$price .= woocommerce_price( $this->price );
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;
}
/**
* 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()) :
$reduce_to = $this->stock - $by;
update_post_meta($this->variation_id, 'stock', $reduce_to);
return $reduce_to;
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()) :
$increase_to = $this->stock + $by;
update_post_meta($this->variation_id, 'stock', $increase_to);
return $increase_to;
endif;
else :
return parent::increase_stock( $by );
endif;
}
}