2011-08-09 15:16:18 +00:00
< ? php
2017-10-09 19:19:24 +00:00
/**
* WooCommerce product base class .
*
* @ package WooCommerce / Classes
*/
2016-11-02 18:50:42 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ;
}
/**
* Legacy product contains all deprecated methods for this class and can be
* removed in the future .
*/
2017-02-16 16:39:56 +00:00
include_once ( WC_ABSPATH . 'includes/legacy/abstract-wc-legacy-product.php' );
2016-11-02 18:50:42 +00:00
2011-08-09 15:16:18 +00:00
/**
2015-11-03 13:53:50 +00:00
* Abstract Product Class
2012-08-06 23:33:52 +00:00
*
2011-08-10 17:11:11 +00:00
* The WooCommerce product class handles individual product data .
2011-08-09 15:16:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ version 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ package WooCommerce / Abstracts
* @ category Abstract Class
* @ author WooThemes
*/
class WC_Product extends WC_Abstract_Legacy_Product {
2016-12-19 17:09:52 +00:00
/**
* This is the name of this object type .
2017-10-09 19:19:24 +00:00
*
2016-12-19 17:09:52 +00:00
* @ var string
*/
protected $object_type = 'product' ;
2016-11-02 18:50:42 +00:00
/**
* Post type .
2017-10-09 19:19:24 +00:00
*
2016-11-02 18:50:42 +00:00
* @ var string
*/
protected $post_type = 'product' ;
2016-11-17 11:16:07 +00:00
/**
* Cache group .
2017-10-09 19:19:24 +00:00
*
2016-11-17 11:16:07 +00:00
* @ var string
*/
protected $cache_group = 'products' ;
2016-09-23 07:19:35 +00:00
/**
2016-10-17 20:22:38 +00:00
* Stores product data .
2016-09-23 07:19:35 +00:00
*
* @ var array
*/
protected $data = array (
2016-11-02 18:50:42 +00:00
'name' => '' ,
'slug' => '' ,
2017-03-13 19:52:44 +00:00
'date_created' => null ,
'date_modified' => null ,
2016-11-02 18:50:42 +00:00
'status' => false ,
'featured' => false ,
2016-11-16 18:56:40 +00:00
'catalog_visibility' => 'visible' ,
2016-11-02 18:50:42 +00:00
'description' => '' ,
'short_description' => '' ,
'sku' => '' ,
'price' => '' ,
'regular_price' => '' ,
'sale_price' => '' ,
2017-03-13 19:52:44 +00:00
'date_on_sale_from' => null ,
'date_on_sale_to' => null ,
2016-11-02 18:50:42 +00:00
'total_sales' => '0' ,
'tax_status' => 'taxable' ,
'tax_class' => '' ,
'manage_stock' => false ,
'stock_quantity' => null ,
2016-12-12 13:56:35 +00:00
'stock_status' => 'instock' ,
2016-11-02 18:50:42 +00:00
'backorders' => 'no' ,
'sold_individually' => false ,
'weight' => '' ,
'length' => '' ,
'width' => '' ,
'height' => '' ,
'upsell_ids' => array (),
'cross_sell_ids' => array (),
'parent_id' => 0 ,
'reviews_allowed' => true ,
'purchase_note' => '' ,
'attributes' => array (),
'default_attributes' => array (),
'menu_order' => 0 ,
'virtual' => false ,
'downloadable' => false ,
'category_ids' => array (),
'tag_ids' => array (),
'shipping_class_id' => 0 ,
'downloads' => array (),
'image_id' => '' ,
'gallery_image_ids' => array (),
'download_limit' => - 1 ,
'download_expiry' => - 1 ,
2016-11-11 15:31:00 +00:00
'rating_counts' => array (),
'average_rating' => 0 ,
'review_count' => 0 ,
2016-09-23 07:19:35 +00:00
);
/**
* Supported features such as 'ajax_add_to_cart' .
*
* @ var array
*/
protected $supports = array ();
/**
* Get the product if ID is passed , otherwise the product is new and empty .
* This class should NOT be instantiated , but the wc_get_product () function
* should be used . It is possible , but the wc_get_product () is preferred .
*
* @ param int | WC_Product | object $product Product to init .
*/
2016-10-26 17:02:50 +00:00
public function __construct ( $product = 0 ) {
2016-10-17 20:22:38 +00:00
parent :: __construct ( $product );
2016-09-23 07:19:35 +00:00
if ( is_numeric ( $product ) && $product > 0 ) {
2016-11-11 14:31:15 +00:00
$this -> set_id ( $product );
2016-09-23 07:19:35 +00:00
} elseif ( $product instanceof self ) {
2016-11-11 14:31:15 +00:00
$this -> set_id ( absint ( $product -> get_id () ) );
2016-09-23 07:19:35 +00:00
} elseif ( ! empty ( $product -> ID ) ) {
2016-11-11 14:31:15 +00:00
$this -> set_id ( absint ( $product -> ID ) );
} else {
$this -> set_object_read ( true );
}
2016-11-22 13:54:51 +00:00
$this -> data_store = WC_Data_Store :: load ( 'product-' . $this -> get_type () );
2016-11-11 14:31:15 +00:00
if ( $this -> get_id () > 0 ) {
$this -> data_store -> read ( $this );
2016-09-23 07:19:35 +00:00
}
}
2016-10-17 13:46:46 +00:00
/**
2016-11-02 18:50:42 +00:00
* Get internal type . Should return string and * should be overridden * by child classes .
2017-02-13 14:31:43 +00:00
*
2017-07-17 10:10:52 +00:00
* The product_type property is deprecated but is used here for BW compatibility with child classes which may be defining product_type and not have a get_type method .
2017-02-13 14:31:43 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-10-17 13:46:46 +00:00
* @ return string
*/
public function get_type () {
2017-02-13 14:31:43 +00:00
return isset ( $this -> product_type ) ? $this -> product_type : 'simple' ;
2016-10-17 13:46:46 +00:00
}
2016-11-03 12:03:19 +00:00
/*
|--------------------------------------------------------------------------
| Getters
|--------------------------------------------------------------------------
|
| Methods for getting data from the product object .
*/
2016-09-23 07:19:35 +00:00
/**
* Get product name .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_name ( $context = 'view' ) {
return $this -> get_prop ( 'name' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get product slug .
2016-11-03 12:03:19 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_slug ( $context = 'view' ) {
return $this -> get_prop ( 'slug' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get product created date .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2017-03-13 19:52:44 +00:00
* @ return WC_DateTime | NULL object if the date is set or null if there is no date .
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_date_created ( $context = 'view' ) {
return $this -> get_prop ( 'date_created' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get product modified date .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2017-03-13 19:52:44 +00:00
* @ return WC_DateTime | NULL object if the date is set or null if there is no date .
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_date_modified ( $context = 'view' ) {
return $this -> get_prop ( 'date_modified' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get product status .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_status ( $context = 'view' ) {
return $this -> get_prop ( 'status' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* If the product is featured .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-17 13:46:46 +00:00
* @ return boolean
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_featured ( $context = 'view' ) {
return $this -> get_prop ( 'featured' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get catalog visibility .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_catalog_visibility ( $context = 'view' ) {
return $this -> get_prop ( 'catalog_visibility' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get product description .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_description ( $context = 'view' ) {
return $this -> get_prop ( 'description' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get product short description .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_short_description ( $context = 'view' ) {
return $this -> get_prop ( 'short_description' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get SKU ( Stock - keeping unit ) - product unique ID .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_sku ( $context = 'view' ) {
return $this -> get_prop ( 'sku' , $context );
2016-09-23 07:19:35 +00:00
}
2016-10-20 16:15:03 +00:00
/**
* Returns the product ' s active price .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-20 16:15:03 +00:00
* @ return string price
*/
2016-11-03 12:03:19 +00:00
public function get_price ( $context = 'view' ) {
return $this -> get_prop ( 'price' , $context );
2016-10-20 16:15:03 +00:00
}
2016-09-23 07:19:35 +00:00
/**
* Returns the product ' s regular price .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string price
*/
2016-11-03 12:03:19 +00:00
public function get_regular_price ( $context = 'view' ) {
return $this -> get_prop ( 'regular_price' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Returns the product ' s sale price .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string price
*/
2016-11-03 12:03:19 +00:00
public function get_sale_price ( $context = 'view' ) {
return $this -> get_prop ( 'sale_price' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get date on sale from .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2017-03-13 19:52:44 +00:00
* @ return WC_DateTime | NULL object if the date is set or null if there is no date .
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_date_on_sale_from ( $context = 'view' ) {
return $this -> get_prop ( 'date_on_sale_from' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get date on sale to .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2017-03-13 19:52:44 +00:00
* @ return WC_DateTime | NULL object if the date is set or null if there is no date .
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_date_on_sale_to ( $context = 'view' ) {
return $this -> get_prop ( 'date_on_sale_to' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get number total of sales .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return int
*/
2016-11-03 12:03:19 +00:00
public function get_total_sales ( $context = 'view' ) {
return $this -> get_prop ( 'total_sales' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Returns the tax status .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_tax_status ( $context = 'view' ) {
return $this -> get_prop ( 'tax_status' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Returns the tax class .
2016-11-03 12:03:19 +00:00
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_tax_class ( $context = 'view' ) {
return $this -> get_prop ( 'tax_class' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Return if product manage stock .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-17 13:46:46 +00:00
* @ return boolean
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_manage_stock ( $context = 'view' ) {
return $this -> get_prop ( 'manage_stock' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Returns number of items available for sale .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-17 13:46:46 +00:00
* @ return int | null
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_stock_quantity ( $context = 'view' ) {
return $this -> get_prop ( 'stock_quantity' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Return the stock status .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_stock_status ( $context = 'view' ) {
return $this -> get_prop ( 'stock_status' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get backorders .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-10-17 13:46:46 +00:00
* @ return string yes no or notify
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_backorders ( $context = 'view' ) {
return $this -> get_prop ( 'backorders' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Return if should be sold individually .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-10-17 13:46:46 +00:00
* @ return boolean
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_sold_individually ( $context = 'view' ) {
return $this -> get_prop ( 'sold_individually' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Returns the product ' s weight .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_weight ( $context = 'view' ) {
return $this -> get_prop ( 'weight' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Returns the product length .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_length ( $context = 'view' ) {
return $this -> get_prop ( 'length' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Returns the product width .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_width ( $context = 'view' ) {
return $this -> get_prop ( 'width' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Returns the product height .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_height ( $context = 'view' ) {
return $this -> get_prop ( 'height' , $context );
2016-09-23 07:19:35 +00:00
}
2016-11-11 15:31:00 +00:00
/**
* Returns formatted dimensions .
*
2017-10-09 19:19:24 +00:00
* @ param bool $formatted True by default for legacy support - will be false / not set in future versions to return the array only . Use wc_format_dimensions for formatted versions instead .
2016-11-11 15:31:00 +00:00
* @ return string | array
*/
public function get_dimensions ( $formatted = true ) {
if ( $formatted ) {
2017-03-15 16:36:53 +00:00
wc_deprecated_argument ( 'WC_Product::get_dimensions' , '3.0' , 'By default, get_dimensions has an argument set to true so that HTML is returned. This is to support the legacy version of the method. To get HTML dimensions, instead use wc_format_dimensions() function. Pass false to this method to return an array of dimensions. This will be the new default behavior in future versions.' );
2016-11-11 15:31:00 +00:00
return apply_filters ( 'woocommerce_product_dimensions' , wc_format_dimensions ( $this -> get_dimensions ( false ) ), $this );
}
return array (
'length' => $this -> get_length (),
'width' => $this -> get_width (),
'height' => $this -> get_height (),
);
}
2016-09-23 07:19:35 +00:00
/**
2017-07-17 10:10:52 +00:00
* Get upsell IDs .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-17 13:46:46 +00:00
* @ return array
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_upsell_ids ( $context = 'view' ) {
return $this -> get_prop ( 'upsell_ids' , $context );
2016-09-23 07:19:35 +00:00
}
/**
2016-10-17 13:46:46 +00:00
* Get cross sell IDs .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-17 13:46:46 +00:00
* @ return array
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_cross_sell_ids ( $context = 'view' ) {
return $this -> get_prop ( 'cross_sell_ids' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get parent ID .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-29 23:02:50 +00:00
* @ return int
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_parent_id ( $context = 'view' ) {
return $this -> get_prop ( 'parent_id' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Return if reviews is allowed .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return bool
*/
2016-11-03 12:03:19 +00:00
public function get_reviews_allowed ( $context = 'view' ) {
return $this -> get_prop ( 'reviews_allowed' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get purchase note .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_purchase_note ( $context = 'view' ) {
return $this -> get_prop ( 'purchase_note' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Returns product attributes .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return array
*/
2016-11-03 12:03:19 +00:00
public function get_attributes ( $context = 'view' ) {
return $this -> get_prop ( 'attributes' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get default attributes .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-29 23:02:50 +00:00
* @ return array
2016-09-23 07:19:35 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_default_attributes ( $context = 'view' ) {
return $this -> get_prop ( 'default_attributes' , $context );
2016-09-23 07:19:35 +00:00
}
/**
* Get menu order .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-09-23 07:19:35 +00:00
* @ return int
*/
2016-11-03 12:03:19 +00:00
public function get_menu_order ( $context = 'view' ) {
return $this -> get_prop ( 'menu_order' , $context );
2016-09-23 07:19:35 +00:00
}
2016-10-17 20:22:38 +00:00
/**
2016-10-24 09:32:15 +00:00
* Get category ids .
2016-10-17 20:22:38 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-24 09:32:15 +00:00
* @ return array
2016-10-17 20:22:38 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_category_ids ( $context = 'view' ) {
return $this -> get_prop ( 'category_ids' , $context );
2016-10-17 20:22:38 +00:00
}
/**
2016-10-24 09:32:15 +00:00
* Get tag ids .
2016-10-17 20:22:38 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-17 20:22:38 +00:00
* @ return array
*/
2016-11-03 12:03:19 +00:00
public function get_tag_ids ( $context = 'view' ) {
return $this -> get_prop ( 'tag_ids' , $context );
2016-10-17 20:22:38 +00:00
}
2016-10-26 17:02:50 +00:00
/**
* Get virtual .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-26 17:02:50 +00:00
* @ return bool
*/
2016-11-03 12:03:19 +00:00
public function get_virtual ( $context = 'view' ) {
return $this -> get_prop ( 'virtual' , $context );
2016-10-26 17:02:50 +00:00
}
2016-10-25 20:24:27 +00:00
/**
* Returns the gallery attachment ids .
*
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-25 20:24:27 +00:00
* @ return array
*/
2016-11-03 12:03:19 +00:00
public function get_gallery_image_ids ( $context = 'view' ) {
return $this -> get_prop ( 'gallery_image_ids' , $context );
2016-10-25 20:24:27 +00:00
}
2016-10-26 17:02:50 +00:00
/**
* Get shipping class ID .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-26 17:02:50 +00:00
* @ return int
*/
2016-11-03 12:03:19 +00:00
public function get_shipping_class_id ( $context = 'view' ) {
return $this -> get_prop ( 'shipping_class_id' , $context );
2016-10-26 17:02:50 +00:00
}
/**
* Get downloads .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-26 17:02:50 +00:00
* @ return array
*/
2016-11-03 12:03:19 +00:00
public function get_downloads ( $context = 'view' ) {
return $this -> get_prop ( 'downloads' , $context );
2016-10-26 17:02:50 +00:00
}
2016-10-25 20:24:27 +00:00
/**
* Get download expiry .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-25 20:24:27 +00:00
* @ return int
*/
2016-11-03 12:03:19 +00:00
public function get_download_expiry ( $context = 'view' ) {
return $this -> get_prop ( 'download_expiry' , $context );
2016-10-25 20:24:27 +00:00
}
/**
2016-10-28 15:13:46 +00:00
* Get downloadable .
2016-10-25 20:24:27 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-28 15:13:46 +00:00
* @ return bool
2016-10-25 20:24:27 +00:00
*/
2016-11-03 12:03:19 +00:00
public function get_downloadable ( $context = 'view' ) {
return $this -> get_prop ( 'downloadable' , $context );
2016-10-28 15:13:46 +00:00
}
/**
* Get download limit .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-28 15:13:46 +00:00
* @ return int
*/
2016-11-03 12:03:19 +00:00
public function get_download_limit ( $context = 'view' ) {
return $this -> get_prop ( 'download_limit' , $context );
2016-10-25 20:24:27 +00:00
}
/**
2016-11-09 16:59:14 +00:00
* Get main image ID .
2016-10-25 20:24:27 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-25 20:24:27 +00:00
* @ return string
*/
2016-11-03 12:03:19 +00:00
public function get_image_id ( $context = 'view' ) {
return $this -> get_prop ( 'image_id' , $context );
2016-10-25 20:24:27 +00:00
}
2016-11-11 15:31:00 +00:00
/**
* Get rating count .
2017-10-09 19:19:24 +00:00
*
* @ param string $context What the value is for . Valid values are view and edit .
2016-11-11 15:31:00 +00:00
* @ return array of counts
*/
public function get_rating_counts ( $context = 'view' ) {
return $this -> get_prop ( 'rating_counts' , $context );
}
/**
* Get average rating .
2017-10-09 19:19:24 +00:00
*
* @ param string $context What the value is for . Valid values are view and edit .
2016-11-11 15:31:00 +00:00
* @ return float
*/
public function get_average_rating ( $context = 'view' ) {
return $this -> get_prop ( 'average_rating' , $context );
}
/**
* Get review count .
2017-10-09 19:19:24 +00:00
*
* @ param string $context What the value is for . Valid values are view and edit .
2016-11-11 15:31:00 +00:00
* @ return int
*/
public function get_review_count ( $context = 'view' ) {
return $this -> get_prop ( 'review_count' , $context );
}
2016-09-23 07:19:35 +00:00
/*
|--------------------------------------------------------------------------
| Setters
|--------------------------------------------------------------------------
|
| Functions for setting product data . These should not update anything in the
| database itself and should only change what is stored in the class
| object .
*/
/**
* Set product name .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ param string $name Product name .
*/
public function set_name ( $name ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'name' , $name );
2016-09-23 07:19:35 +00:00
}
/**
* Set product slug .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ param string $slug Product slug .
*/
public function set_slug ( $slug ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'slug' , $slug );
2016-09-23 07:19:35 +00:00
}
/**
* Set product created date .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-03-13 19:52:44 +00:00
* @ param string | integer | null $date UTC timestamp , or ISO 8601 DateTime . If the DateTime string has no timezone or offset , WordPress site timezone will be assumed . Null if their is no date .
2016-09-23 07:19:35 +00:00
*/
2017-03-13 19:52:44 +00:00
public function set_date_created ( $date = null ) {
$this -> set_date_prop ( 'date_created' , $date );
2016-09-23 07:19:35 +00:00
}
/**
2016-09-29 23:02:50 +00:00
* Set product modified date .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-03-13 19:52:44 +00:00
* @ param string | integer | null $date UTC timestamp , or ISO 8601 DateTime . If the DateTime string has no timezone or offset , WordPress site timezone will be assumed . Null if their is no date .
2016-09-23 07:19:35 +00:00
*/
2017-03-13 19:52:44 +00:00
public function set_date_modified ( $date = null ) {
$this -> set_date_prop ( 'date_modified' , $date );
2016-09-23 07:19:35 +00:00
}
/**
2016-09-29 23:02:50 +00:00
* Set product status .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ param string $status Product status .
*/
public function set_status ( $status ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'status' , $status );
2016-09-23 07:19:35 +00:00
}
/**
* Set if the product is featured .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param bool | string $featured Whether the product is featured or not .
2016-09-23 07:19:35 +00:00
*/
public function set_featured ( $featured ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'featured' , wc_string_to_bool ( $featured ) );
2016-09-23 07:19:35 +00:00
}
/**
* Set catalog visibility .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ throws WC_Data_Exception Throws exception when invalid data is found .
2016-09-23 07:19:35 +00:00
* @ param string $visibility Options : 'hidden' , 'visible' , 'search' and 'catalog' .
*/
public function set_catalog_visibility ( $visibility ) {
$options = array_keys ( wc_get_product_visibility_options () );
if ( ! in_array ( $visibility , $options , true ) ) {
$this -> error ( 'product_invalid_catalog_visibility' , __ ( 'Invalid catalog visibility option.' , 'woocommerce' ) );
}
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'catalog_visibility' , $visibility );
2016-09-23 07:19:35 +00:00
}
/**
* Set product description .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ param string $description Product description .
*/
public function set_description ( $description ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'description' , $description );
2016-09-23 07:19:35 +00:00
}
/**
* Set product short description .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ param string $short_description Product short description .
*/
public function set_short_description ( $short_description ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'short_description' , $short_description );
2016-09-23 07:19:35 +00:00
}
/**
* Set SKU .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ throws WC_Data_Exception Throws exception when invalid data is found .
2016-09-23 07:19:35 +00:00
* @ param string $sku Product SKU .
*/
public function set_sku ( $sku ) {
2016-10-26 17:02:50 +00:00
$sku = ( string ) $sku ;
2016-12-08 10:56:45 +00:00
if ( $this -> get_object_read () && ! empty ( $sku ) && ! wc_product_has_unique_sku ( $this -> get_id (), $sku ) ) {
2017-01-23 19:34:49 +00:00
$sku_found = wc_get_product_id_by_sku ( $sku );
$this -> error ( 'product_invalid_sku' , __ ( 'Invalid or duplicated SKU.' , 'woocommerce' ), 400 , array ( 'resource_id' => $sku_found ) );
2016-09-23 07:19:35 +00:00
}
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'sku' , $sku );
2016-09-23 07:19:35 +00:00
}
2016-10-20 16:15:03 +00:00
/**
* Set the product ' s active price .
*
* @ param string $price Price .
*/
public function set_price ( $price ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'price' , wc_format_decimal ( $price ) );
2016-10-20 16:15:03 +00:00
}
2016-09-23 07:19:35 +00:00
/**
* Set the product ' s regular price .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ param string $price Regular price .
*/
public function set_regular_price ( $price ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'regular_price' , wc_format_decimal ( $price ) );
2016-09-23 07:19:35 +00:00
}
/**
* Set the product ' s sale price .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ param string $price sale price .
*/
public function set_sale_price ( $price ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'sale_price' , wc_format_decimal ( $price ) );
2016-09-23 07:19:35 +00:00
}
/**
* Set date on sale from .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-03-13 19:52:44 +00:00
* @ param string | integer | null $date UTC timestamp , or ISO 8601 DateTime . If the DateTime string has no timezone or offset , WordPress site timezone will be assumed . Null if their is no date .
2016-09-23 07:19:35 +00:00
*/
2017-03-13 19:52:44 +00:00
public function set_date_on_sale_from ( $date = null ) {
$this -> set_date_prop ( 'date_on_sale_from' , $date );
2016-09-23 07:19:35 +00:00
}
/**
* Set date on sale to .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-03-13 19:52:44 +00:00
* @ param string | integer | null $date UTC timestamp , or ISO 8601 DateTime . If the DateTime string has no timezone or offset , WordPress site timezone will be assumed . Null if their is no date .
2016-09-23 07:19:35 +00:00
*/
2017-03-13 19:52:44 +00:00
public function set_date_on_sale_to ( $date = null ) {
$this -> set_date_prop ( 'date_on_sale_to' , $date );
2016-09-23 07:19:35 +00:00
}
/**
* Set number total of sales .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ param int $total Total of sales .
*/
public function set_total_sales ( $total ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'total_sales' , absint ( $total ) );
2016-09-23 07:19:35 +00:00
}
/**
* Set the tax status .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ throws WC_Data_Exception Throws exception when invalid data is found .
2016-09-23 07:19:35 +00:00
* @ param string $status Tax status .
*/
public function set_tax_status ( $status ) {
$options = array (
'taxable' ,
'shipping' ,
'none' ,
);
2016-09-29 23:16:42 +00:00
// Set default if empty.
if ( empty ( $status ) ) {
$status = 'taxable' ;
}
2016-09-23 07:19:35 +00:00
if ( ! in_array ( $status , $options , true ) ) {
$this -> error ( 'product_invalid_tax_status' , __ ( 'Invalid product tax status.' , 'woocommerce' ) );
}
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'tax_status' , $status );
2016-09-23 07:19:35 +00:00
}
/**
* Set the tax class .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-23 07:19:35 +00:00
* @ param string $class Tax class .
*/
public function set_tax_class ( $class ) {
2017-08-18 16:06:22 +00:00
$class = sanitize_title ( $class );
$class = 'standard' === $class ? '' : $class ;
2017-10-09 19:20:03 +00:00
$valid_classes = $this -> get_valid_tax_classes ();
2017-08-18 16:06:22 +00:00
if ( ! in_array ( $class , $valid_classes ) ) {
$class = '' ;
}
2017-02-07 17:22:04 +00:00
$this -> set_prop ( 'tax_class' , $class );
2016-09-23 07:19:35 +00:00
}
2017-10-09 19:20:03 +00:00
/**
* Return an array of valid tax classes
*
* @ return array valid tax classes
*/
protected function get_valid_tax_classes () {
return WC_Tax :: get_tax_class_slugs ();
}
2016-09-23 07:19:35 +00:00
/**
2016-09-29 23:02:50 +00:00
* Set if product manage stock .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param bool $manage_stock Whether or not manage stock is enabled .
2016-09-23 07:19:35 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_manage_stock ( $manage_stock ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'manage_stock' , wc_string_to_bool ( $manage_stock ) );
2016-09-23 07:19:35 +00:00
}
/**
2016-09-29 23:02:50 +00:00
* Set number of items available for sale .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-29 23:02:50 +00:00
* @ param float | null $quantity Stock quantity .
2016-09-23 07:19:35 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_stock_quantity ( $quantity ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'stock_quantity' , '' !== $quantity ? wc_stock_amount ( $quantity ) : null );
2016-09-23 07:19:35 +00:00
}
/**
* Set stock status .
*
* @ param string $status New status .
*/
2016-11-11 14:31:15 +00:00
public function set_stock_status ( $status = '' ) {
2016-11-09 12:26:46 +00:00
$this -> set_prop ( 'stock_status' , 'outofstock' === $status ? 'outofstock' : 'instock' );
2016-09-23 07:19:35 +00:00
}
/**
2016-09-29 23:02:50 +00:00
* Set backorders .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-29 23:02:50 +00:00
* @ param string $backorders Options : 'yes' , 'no' or 'notify' .
2016-09-23 07:19:35 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_backorders ( $backorders ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'backorders' , $backorders );
2016-09-23 07:19:35 +00:00
}
/**
2016-09-29 23:02:50 +00:00
* Set if should be sold individually .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param bool $sold_individually Whether or not product is sold individually .
2016-09-23 07:19:35 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_sold_individually ( $sold_individually ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'sold_individually' , wc_string_to_bool ( $sold_individually ) );
2016-09-23 07:19:35 +00:00
}
/**
2016-09-29 23:02:50 +00:00
* Set the product ' s weight .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-25 14:36:50 +00:00
* @ param float | string $weight Total weight .
2016-09-23 07:19:35 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_weight ( $weight ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'weight' , '' === $weight ? '' : wc_format_decimal ( $weight ) );
2016-09-23 07:19:35 +00:00
}
2012-08-06 23:33:52 +00:00
2015-02-10 15:01:04 +00:00
/**
2016-09-29 23:02:50 +00:00
* Set the product length .
2015-02-10 15:01:04 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-25 14:36:50 +00:00
* @ param float | string $length Total length .
2015-02-10 15:01:04 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_length ( $length ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'length' , '' === $length ? '' : wc_format_decimal ( $length ) );
2016-09-23 07:19:35 +00:00
}
2012-08-15 17:08:42 +00:00
2015-01-20 13:00:56 +00:00
/**
2016-09-29 23:02:50 +00:00
* Set the product width .
2015-02-10 15:01:04 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-25 14:36:50 +00:00
* @ param float | string $width Total width .
2015-02-10 15:01:04 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_width ( $width ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'width' , '' === $width ? '' : wc_format_decimal ( $width ) );
2016-09-23 07:19:35 +00:00
}
2012-08-15 17:08:42 +00:00
2015-02-10 15:01:04 +00:00
/**
2016-09-29 23:02:50 +00:00
* Set the product height .
2015-02-10 15:01:04 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-25 14:36:50 +00:00
* @ param float | string $height Total height .
2015-02-10 15:01:04 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_height ( $height ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'height' , '' === $height ? '' : wc_format_decimal ( $height ) );
2016-09-23 07:19:35 +00:00
}
2012-11-21 18:07:45 +00:00
2015-02-10 15:01:04 +00:00
/**
2016-10-17 13:46:46 +00:00
* Set upsell IDs .
2015-02-10 15:01:04 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-11 14:31:15 +00:00
* @ param array $upsell_ids IDs from the up - sell products .
2015-02-10 15:01:04 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_upsell_ids ( $upsell_ids ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'upsell_ids' , array_filter ( ( array ) $upsell_ids ) );
2016-09-23 07:19:35 +00:00
}
2015-01-20 13:00:56 +00:00
2015-02-10 15:01:04 +00:00
/**
2016-10-17 13:46:46 +00:00
* Set crosssell IDs .
2015-02-10 15:01:04 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-11 14:31:15 +00:00
* @ param array $cross_sell_ids IDs from the cross - sell products .
2015-02-10 15:01:04 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_cross_sell_ids ( $cross_sell_ids ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'cross_sell_ids' , array_filter ( ( array ) $cross_sell_ids ) );
2016-09-23 07:19:35 +00:00
}
2015-01-20 13:00:56 +00:00
2016-09-23 07:19:35 +00:00
/**
2016-09-29 23:02:50 +00:00
* Set parent ID .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-29 23:02:50 +00:00
* @ param int $parent_id Product parent ID .
2016-09-23 07:19:35 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_parent_id ( $parent_id ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'parent_id' , absint ( $parent_id ) );
2016-09-23 07:19:35 +00:00
}
2015-12-02 11:46:51 +00:00
2015-11-02 11:23:50 +00:00
/**
2016-09-29 23:02:50 +00:00
* Set if reviews is allowed .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-29 23:02:50 +00:00
* @ param bool $reviews_allowed Reviews allowed or not .
2015-11-02 11:23:50 +00:00
*/
2016-09-29 23:02:50 +00:00
public function set_reviews_allowed ( $reviews_allowed ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'reviews_allowed' , wc_string_to_bool ( $reviews_allowed ) );
2016-09-23 07:19:35 +00:00
}
2015-11-02 11:23:50 +00:00
2011-08-09 15:16:18 +00:00
/**
2016-09-29 23:02:50 +00:00
* Set purchase note .
2012-11-27 16:22:47 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-29 23:02:50 +00:00
* @ param string $purchase_note Purchase note .
2011-08-09 15:16:18 +00:00
*/
2016-09-29 23:16:42 +00:00
public function set_purchase_note ( $purchase_note ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'purchase_note' , $purchase_note );
2011-08-09 15:16:18 +00:00
}
2012-11-27 16:22:47 +00:00
2012-12-19 23:04:25 +00:00
/**
2016-10-17 20:22:38 +00:00
* Set product attributes .
2012-12-19 23:04:25 +00:00
*
2016-10-26 17:02:50 +00:00
* Attributes are made up of :
* id - 0 for product level attributes . ID for global attributes .
* name - Attribute name .
* options - attribute value or array of term ids / names .
* position - integer sort order .
* visible - If visible on frontend .
* variation - If used for variations .
* Indexed by unqiue key to allow clearing old ones after a set .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-10-26 17:02:50 +00:00
* @ param array $raw_attributes Array of WC_Product_Attribute objects .
2016-09-23 07:19:35 +00:00
*/
2016-10-26 17:02:50 +00:00
public function set_attributes ( $raw_attributes ) {
2016-11-09 12:26:46 +00:00
$attributes = array_fill_keys ( array_keys ( $this -> get_attributes ( 'edit' ) ), null );
2016-10-26 17:02:50 +00:00
foreach ( $raw_attributes as $attribute ) {
if ( is_a ( $attribute , 'WC_Product_Attribute' ) ) {
$attributes [ sanitize_title ( $attribute -> get_name () ) ] = $attribute ;
}
}
uasort ( $attributes , 'wc_product_attribute_uasort_comparison' );
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'attributes' , $attributes );
2016-09-23 07:19:35 +00:00
}
/**
2016-10-17 13:46:46 +00:00
* Set default attributes .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-10-17 13:46:46 +00:00
* @ param array $default_attributes List of default attributes .
2012-12-19 23:04:25 +00:00
*/
2016-10-17 13:46:46 +00:00
public function set_default_attributes ( $default_attributes ) {
Fix bug #15103 where site operator cannot assign a variation with value of '0' as the default choice on the customer facing form.
The WC_Product::set_default_attributes function uses an array_filter (using the default callback for filtration)
to remove null and false values from the defaults array for a given product. The issue here is that, in the above use case,
the array_filter will evaluate '0' as 0 and therefore as false. Ultimately, array_filter then prevents the value from being
recorded, moving forward.
I've added a new filter callback to includes/wc-attribute-functions which will disregard all FALSE PHP equivalents except for
'0' (as a a string). Also, I've updated the filter_array call in WC_Product::set_default_attributes so that it uses this new callback,
instead of the PHP default. Finally, I've added a phpunit test to assert that, when storing default variations / attributes on a product,
the false/true PHP synonyms are evaluating and storing like one would normally expect, with the exception that (string) '0'
evaluates as true in this special case.
This solution could potentially be broadened to facililate similar rules elsewhere, but the need raised in the bug is specific and
this is a specific solution.
2017-05-18 09:43:14 +00:00
$this -> set_prop ( 'default_attributes' ,
2017-10-09 19:19:24 +00:00
array_filter ( ( array ) $default_attributes , 'wc_array_filter_default_attributes' ) );
2012-12-19 23:04:25 +00:00
}
2012-11-27 16:22:47 +00:00
2012-11-21 18:07:45 +00:00
/**
2016-10-17 13:46:46 +00:00
* Set menu order .
2012-11-27 16:22:47 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-10-17 13:46:46 +00:00
* @ param int $menu_order Menu order .
2012-11-21 18:07:45 +00:00
*/
2016-10-17 13:46:46 +00:00
public function set_menu_order ( $menu_order ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'menu_order' , intval ( $menu_order ) );
2016-10-17 13:46:46 +00:00
}
/**
2016-10-24 09:32:15 +00:00
* Set the product categories .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-10-24 09:32:15 +00:00
* @ param array $term_ids List of terms IDs .
2016-09-23 07:19:35 +00:00
*/
2016-10-24 09:32:15 +00:00
public function set_category_ids ( $term_ids ) {
2017-03-03 19:26:57 +00:00
$this -> set_prop ( 'category_ids' , array_unique ( array_map ( 'intval' , $term_ids ) ) );
2016-09-23 07:19:35 +00:00
}
2012-12-20 11:54:38 +00:00
2016-09-23 07:19:35 +00:00
/**
2016-10-24 09:32:15 +00:00
* Set the product tags .
2016-09-23 07:19:35 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-10-24 09:32:15 +00:00
* @ param array $term_ids List of terms IDs .
2016-09-23 07:19:35 +00:00
*/
2016-10-24 09:32:15 +00:00
public function set_tag_ids ( $term_ids ) {
2017-03-03 19:26:57 +00:00
$this -> set_prop ( 'tag_ids' , array_unique ( array_map ( 'intval' , $term_ids ) ) );
2016-09-23 07:19:35 +00:00
}
2012-12-20 11:54:38 +00:00
2016-10-26 17:02:50 +00:00
/**
* Set if the product is virtual .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param bool | string $virtual Whether product is virtual or not .
2016-10-26 17:02:50 +00:00
*/
public function set_virtual ( $virtual ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'virtual' , wc_string_to_bool ( $virtual ) );
2016-10-26 17:02:50 +00:00
}
/**
2016-10-28 15:13:46 +00:00
* Set shipping class ID .
2016-10-26 17:02:50 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param int $id Product shipping class id .
2016-10-26 17:02:50 +00:00
*/
2016-10-28 15:13:46 +00:00
public function set_shipping_class_id ( $id ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'shipping_class_id' , absint ( $id ) );
2016-10-26 17:02:50 +00:00
}
/**
2016-10-28 15:13:46 +00:00
* Set if the product is downloadable .
2016-10-26 17:02:50 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param bool | string $downloadable Whether product is downloadable or not .
2016-10-26 17:02:50 +00:00
*/
2016-10-28 15:13:46 +00:00
public function set_downloadable ( $downloadable ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'downloadable' , wc_string_to_bool ( $downloadable ) );
2016-10-26 17:02:50 +00:00
}
/**
* Set downloads .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param array $downloads_array Array of WC_Product_Download objects or arrays .
2016-10-26 17:02:50 +00:00
*/
2016-11-11 15:31:00 +00:00
public function set_downloads ( $downloads_array ) {
$downloads = array ();
$errors = array ();
2016-10-26 17:02:50 +00:00
2016-11-11 15:31:00 +00:00
foreach ( $downloads_array as $download ) {
if ( is_a ( $download , 'WC_Product_Download' ) ) {
$download_object = $download ;
2016-10-26 17:02:50 +00:00
} else {
2016-12-06 11:09:03 +00:00
$download_object = new WC_Product_Download ();
$download [ 'previous_hash' ] = isset ( $download [ 'previous_hash' ] ) ? $download [ 'previous_hash' ] : '' ;
$file_hash = apply_filters ( 'woocommerce_downloadable_file_hash' , md5 ( $download [ 'file' ] ), $this -> get_id (), $download [ 'name' ], $download [ 'file' ], $download [ 'previous_hash' ] );
$download_object -> set_id ( $file_hash );
2016-11-11 15:31:00 +00:00
$download_object -> set_name ( $download [ 'name' ] );
$download_object -> set_file ( $download [ 'file' ] );
2016-12-06 11:09:03 +00:00
$download_object -> set_previous_hash ( $download [ 'previous_hash' ] );
2016-10-26 17:02:50 +00:00
}
2017-10-09 19:19:24 +00:00
// Validate the file extension.
2016-11-11 15:31:00 +00:00
if ( ! $download_object -> is_allowed_filetype () ) {
2017-04-06 20:39:36 +00:00
if ( $this -> get_object_read () ) {
$errors [] = sprintf ( __ ( 'The downloadable file %1$s cannot be used as it does not have an allowed file type. Allowed types include: %2$s' , 'woocommerce' ), '<code>' . basename ( $download_object -> get_file () ) . '</code>' , '<code>' . implode ( ', ' , array_keys ( $download_object -> get_allowed_mime_types () ) ) . '</code>' );
}
2016-11-11 15:31:00 +00:00
continue ;
2016-10-26 17:02:50 +00:00
}
2016-11-02 18:50:42 +00:00
// Validate the file exists.
2016-11-11 15:31:00 +00:00
if ( ! $download_object -> file_exists () ) {
2017-04-06 20:39:36 +00:00
if ( $this -> get_object_read () ) {
$errors [] = sprintf ( __ ( 'The downloadable file %s cannot be used as it does not exist on the server.' , 'woocommerce' ), '<code>' . $download_object -> get_file () . '</code>' );
}
2016-11-11 15:31:00 +00:00
continue ;
2016-10-26 17:02:50 +00:00
}
2016-11-11 15:31:00 +00:00
$downloads [ $download_object -> get_id () ] = $download_object ;
2016-10-26 17:02:50 +00:00
}
if ( $errors ) {
$this -> error ( 'product_invalid_download' , $errors [ 0 ] );
}
2016-11-11 15:31:00 +00:00
$this -> set_prop ( 'downloads' , $downloads );
2016-10-26 17:02:50 +00:00
}
2016-10-25 20:24:27 +00:00
/**
* Set download limit .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param int | string $download_limit Product download limit .
2016-10-25 20:24:27 +00:00
*/
public function set_download_limit ( $download_limit ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'download_limit' , - 1 === ( int ) $download_limit || '' === $download_limit ? - 1 : absint ( $download_limit ) );
2016-10-25 20:24:27 +00:00
}
/**
* Set download expiry .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param int | string $download_expiry Product download expiry .
2016-10-25 20:24:27 +00:00
*/
public function set_download_expiry ( $download_expiry ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'download_expiry' , - 1 === ( int ) $download_expiry || '' === $download_expiry ? - 1 : absint ( $download_expiry ) );
2016-10-25 20:24:27 +00:00
}
/**
2016-10-28 15:13:46 +00:00
* Set gallery attachment ids .
2016-10-25 20:24:27 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param array $image_ids List of image ids .
2016-10-25 20:24:27 +00:00
*/
2016-11-03 12:03:19 +00:00
public function set_gallery_image_ids ( $image_ids ) {
2016-12-08 16:08:10 +00:00
$image_ids = wp_parse_id_list ( $image_ids );
if ( $this -> get_object_read () ) {
$image_ids = array_filter ( $image_ids , 'wp_attachment_is_image' );
}
$this -> set_prop ( 'gallery_image_ids' , $image_ids );
2016-10-25 20:24:27 +00:00
}
/**
2016-11-02 18:50:42 +00:00
* Set main image ID .
2016-10-25 20:24:27 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-09 19:19:24 +00:00
* @ param int | string $image_id Product image id .
2016-10-25 20:24:27 +00:00
*/
2016-11-02 18:50:42 +00:00
public function set_image_id ( $image_id = '' ) {
2016-11-03 12:03:19 +00:00
$this -> set_prop ( 'image_id' , $image_id );
2016-10-25 20:24:27 +00:00
}
2016-11-11 15:31:00 +00:00
/**
* Set rating counts . Read only .
2017-10-09 19:19:24 +00:00
*
* @ param array $counts Product rating counts .
2016-11-11 15:31:00 +00:00
*/
public function set_rating_counts ( $counts ) {
$this -> set_prop ( 'rating_counts' , array_filter ( array_map ( 'absint' , ( array ) $counts ) ) );
}
/**
* Set average rating . Read only .
2017-10-09 19:19:24 +00:00
*
* @ param float $average Product average rating .
2016-11-11 15:31:00 +00:00
*/
public function set_average_rating ( $average ) {
$this -> set_prop ( 'average_rating' , wc_format_decimal ( $average ) );
}
/**
* Set review count . Read only .
2017-10-09 19:19:24 +00:00
*
* @ param int $count Product review count .
2016-11-11 15:31:00 +00:00
*/
public function set_review_count ( $count ) {
$this -> set_prop ( 'review_count' , absint ( $count ) );
}
2016-09-23 07:19:35 +00:00
/*
|--------------------------------------------------------------------------
2016-11-11 14:31:15 +00:00
| Other Methods
2016-09-23 07:19:35 +00:00
|--------------------------------------------------------------------------
*/
2012-12-20 11:54:38 +00:00
2016-11-09 12:26:46 +00:00
/**
* Ensure properties are set correctly before save .
2017-10-09 19:19:24 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-09 12:26:46 +00:00
*/
public function validate_props () {
// Before updating, ensure stock props are all aligned. Qty and backorders are not needed if not stock managed.
if ( ! $this -> get_manage_stock () ) {
$this -> set_stock_quantity ( '' );
$this -> set_backorders ( 'no' );
2017-10-09 19:19:24 +00:00
// If we are stock managing and we don't have stock, force out of stock status.
2016-11-09 12:26:46 +00:00
} elseif ( $this -> get_stock_quantity () <= get_option ( 'woocommerce_notify_no_stock_amount' ) && 'no' === $this -> get_backorders () ) {
$this -> set_stock_status ( 'outofstock' );
2017-10-09 19:19:24 +00:00
// If the stock level is changing and we do now have enough, force in stock status.
2016-11-09 12:26:46 +00:00
} elseif ( $this -> get_stock_quantity () > get_option ( 'woocommerce_notify_no_stock_amount' ) && array_key_exists ( 'stock_quantity' , $this -> get_changes () ) ) {
$this -> set_stock_status ( 'instock' );
}
}
2015-12-04 20:17:25 +00:00
/**
2016-09-23 07:19:35 +00:00
* Save data ( either create or update depending on if we are working on an existing product ) .
2015-12-04 20:17:25 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-07-20 17:01:14 +00:00
* @ return int
2015-12-04 20:17:25 +00:00
*/
2016-09-23 07:19:35 +00:00
public function save () {
2016-11-09 12:26:46 +00:00
$this -> validate_props ();
2016-11-03 12:03:19 +00:00
2016-11-11 14:31:15 +00:00
if ( $this -> data_store ) {
2016-12-19 17:09:52 +00:00
// Trigger action before saving to the DB. Use a pointer to adjust object props before save.
do_action ( 'woocommerce_before_' . $this -> object_type . '_object_save' , $this , $this -> data_store );
2016-11-11 14:31:15 +00:00
if ( $this -> get_id () ) {
$this -> data_store -> update ( $this );
2016-11-11 11:58:57 +00:00
} else {
2016-11-11 14:31:15 +00:00
$this -> data_store -> create ( $this );
2016-10-26 17:02:50 +00:00
}
2016-11-16 12:17:00 +00:00
if ( $this -> get_parent_id () ) {
2017-04-06 11:25:34 +00:00
wc_deferred_product_sync ( $this -> get_parent_id () );
2016-11-16 12:17:00 +00:00
}
2016-10-26 17:02:50 +00:00
}
2017-07-20 17:01:14 +00:00
return $this -> get_id ();
2016-10-24 09:32:15 +00:00
}
2016-09-23 07:19:35 +00:00
/*
|--------------------------------------------------------------------------
2016-10-20 14:02:25 +00:00
| Conditionals
2016-09-23 07:19:35 +00:00
|--------------------------------------------------------------------------
*/
2016-10-20 14:02:25 +00:00
/**
* Check if a product supports a given feature .
*
* Product classes should override this to declare support ( or lack of support ) for a feature .
*
* @ param string $feature string The name of a feature to test support for .
* @ return bool True if the product supports the feature , false otherwise .
* @ since 2.5 . 0
*/
public function supports ( $feature ) {
return apply_filters ( 'woocommerce_product_supports' , in_array ( $feature , $this -> supports ) ? true : false , $feature , $this );
}
2014-02-07 17:31:25 +00:00
/**
2016-10-20 14:02:25 +00:00
* Returns whether or not the product post exists .
2014-02-07 17:31:25 +00:00
*
2016-10-20 14:02:25 +00:00
* @ return bool
2014-02-07 17:31:25 +00:00
*/
2016-10-20 14:02:25 +00:00
public function exists () {
return false !== $this -> get_status ();
2014-02-07 17:31:25 +00:00
}
/**
2016-10-20 14:02:25 +00:00
* Checks the product type .
2015-11-14 16:34:47 +00:00
*
2017-07-17 10:10:52 +00:00
* Backwards compatibility with downloadable / virtual .
2016-10-20 14:02:25 +00:00
*
2017-10-09 19:19:24 +00:00
* @ param string | array $type Array or string of types .
2016-10-20 14:02:25 +00:00
* @ return bool
2014-02-07 17:31:25 +00:00
*/
2016-10-20 14:02:25 +00:00
public function is_type ( $type ) {
return ( $this -> get_type () === $type || ( is_array ( $type ) && in_array ( $this -> get_type (), $type ) ) );
}
2016-01-27 13:00:50 +00:00
2016-10-20 14:02:25 +00:00
/**
* Checks if a product is downloadable .
*
* @ return bool
*/
public function is_downloadable () {
2016-11-09 12:26:46 +00:00
return apply_filters ( 'woocommerce_is_downloadable' , true === $this -> get_downloadable (), $this );
2014-02-07 17:31:25 +00:00
}
2012-08-06 23:33:52 +00:00
2012-12-28 09:59:20 +00:00
/**
2016-10-20 14:02:25 +00:00
* Checks if a product is virtual ( has no shipping ) .
*
* @ return bool
2012-12-28 09:59:20 +00:00
*/
2016-10-20 14:02:25 +00:00
public function is_virtual () {
2016-11-09 12:26:46 +00:00
return apply_filters ( 'woocommerce_is_virtual' , true === $this -> get_virtual (), $this );
2014-04-25 14:27:58 +00:00
}
2013-08-13 15:56:09 +00:00
2014-04-25 14:27:58 +00:00
/**
2016-10-20 14:02:25 +00:00
* Returns whether or not the product is featured .
2014-04-25 14:27:58 +00:00
*
2016-10-20 14:02:25 +00:00
* @ return bool
*/
public function is_featured () {
return true === $this -> get_featured ();
}
/**
* Check if a product is sold individually ( no quantities ) .
2014-04-25 14:27:58 +00:00
*
2016-10-20 14:02:25 +00:00
* @ return bool
2014-04-25 14:27:58 +00:00
*/
2016-10-20 14:02:25 +00:00
public function is_sold_individually () {
return apply_filters ( 'woocommerce_is_sold_individually' , true === $this -> get_sold_individually (), $this );
}
2014-04-25 14:27:58 +00:00
2016-10-20 14:02:25 +00:00
/**
* Returns whether or not the product is visible in the catalog .
*
* @ return bool
*/
public function is_visible () {
$visible = 'visible' === $this -> get_catalog_visibility () || ( is_search () && 'search' === $this -> get_catalog_visibility () ) || ( ! is_search () && 'catalog' === $this -> get_catalog_visibility () );
2014-04-25 14:27:58 +00:00
2016-10-20 14:02:25 +00:00
if ( 'publish' !== $this -> get_status () && ! current_user_can ( 'edit_post' , $this -> get_id () ) ) {
$visible = false ;
}
if ( 'yes' === get_option ( 'woocommerce_hide_out_of_stock_items' ) && ! $this -> is_in_stock () ) {
$visible = false ;
}
return apply_filters ( 'woocommerce_product_is_visible' , $visible , $this -> get_id () );
}
/**
* Returns false if the product cannot be bought .
*
* @ return bool
*/
public function is_purchasable () {
2016-11-09 12:26:46 +00:00
return apply_filters ( 'woocommerce_is_purchasable' , $this -> exists () && ( 'publish' === $this -> get_status () || current_user_can ( 'edit_post' , $this -> get_id () ) ) && '' !== $this -> get_price (), $this );
2016-10-20 14:02:25 +00:00
}
/**
* Returns whether or not the product is on sale .
*
2017-01-16 21:59:53 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-10-20 14:02:25 +00:00
* @ return bool
*/
2017-01-16 15:33:30 +00:00
public function is_on_sale ( $context = 'view' ) {
if ( '' !== ( string ) $this -> get_sale_price ( $context ) && $this -> get_regular_price ( $context ) > $this -> get_sale_price ( $context ) ) {
2017-01-16 21:59:53 +00:00
$on_sale = true ;
2016-10-20 16:15:03 +00:00
2017-04-27 13:35:33 +00:00
if ( $this -> get_date_on_sale_from ( $context ) && $this -> get_date_on_sale_from ( $context ) -> getTimestamp () > current_time ( 'timestamp' , true ) ) {
2017-01-16 21:59:53 +00:00
$on_sale = false ;
2016-10-20 16:15:03 +00:00
}
2017-04-27 13:35:33 +00:00
if ( $this -> get_date_on_sale_to ( $context ) && $this -> get_date_on_sale_to ( $context ) -> getTimestamp () < current_time ( 'timestamp' , true ) ) {
2017-01-16 21:59:53 +00:00
$on_sale = false ;
2016-10-20 16:15:03 +00:00
}
} else {
2017-01-16 21:59:53 +00:00
$on_sale = false ;
2016-10-20 16:15:03 +00:00
}
2017-01-16 21:59:53 +00:00
return 'view' === $context ? apply_filters ( 'woocommerce_product_is_on_sale' , $on_sale , $this ) : $on_sale ;
2016-10-20 14:02:25 +00:00
}
/**
* Returns whether or not the product has dimensions set .
*
* @ return bool
*/
public function has_dimensions () {
2016-11-11 15:31:00 +00:00
return ( $this -> get_length () || $this -> get_height () || $this -> get_width () ) && ! $this -> get_virtual ();
2016-10-20 14:02:25 +00:00
}
/**
* Returns whether or not the product has weight set .
*
* @ return bool
*/
public function has_weight () {
2016-11-11 15:31:00 +00:00
return $this -> get_weight () && ! $this -> get_virtual ();
2016-10-20 14:02:25 +00:00
}
/**
* Returns whether or not the product is in stock .
*
* @ return bool
*/
public function is_in_stock () {
return apply_filters ( 'woocommerce_product_is_in_stock' , 'instock' === $this -> get_stock_status (), $this );
}
/**
* Checks if a product needs shipping .
*
* @ return bool
*/
public function needs_shipping () {
return apply_filters ( 'woocommerce_product_needs_shipping' , ! $this -> is_virtual (), $this );
}
/**
* Returns whether or not the product is taxable .
*
* @ return bool
*/
public function is_taxable () {
return apply_filters ( 'woocommerce_product_is_taxable' , $this -> get_tax_status () === 'taxable' && wc_tax_enabled (), $this );
}
/**
* Returns whether or not the product shipping is taxable .
*
* @ return bool
*/
public function is_shipping_taxable () {
return $this -> get_tax_status () === 'taxable' || $this -> get_tax_status () === 'shipping' ;
}
/**
* Returns whether or not the product is stock managed .
*
* @ return bool
*/
public function managing_stock () {
2016-11-09 12:26:46 +00:00
if ( 'yes' === get_option ( 'woocommerce_manage_stock' ) ) {
return $this -> get_manage_stock ();
}
return false ;
2016-10-20 14:02:25 +00:00
}
/**
* Returns whether or not the product can be backordered .
*
* @ return bool
*/
public function backorders_allowed () {
return apply_filters ( 'woocommerce_product_backorders_allowed' , ( 'yes' === $this -> get_backorders () || 'notify' === $this -> get_backorders () ), $this -> get_id (), $this );
}
/**
* Returns whether or not the product needs to notify the customer on backorder .
*
* @ return bool
*/
public function backorders_require_notification () {
return apply_filters ( 'woocommerce_product_backorders_require_notification' , ( $this -> managing_stock () && 'notify' === $this -> get_backorders () ), $this );
}
/**
* Check if a product is on backorder .
*
2017-10-09 19:19:24 +00:00
* @ param int $qty_in_cart ( default : 0 ) .
2016-10-20 14:02:25 +00:00
* @ return bool
*/
public function is_on_backorder ( $qty_in_cart = 0 ) {
2016-11-02 18:50:42 +00:00
return $this -> managing_stock () && $this -> backorders_allowed () && ( $this -> get_stock_quantity () - $qty_in_cart ) < 0 ? true : false ;
2016-10-20 14:02:25 +00:00
}
/**
* Returns whether or not the product has enough stock for the order .
*
2017-10-09 19:19:24 +00:00
* @ param mixed $quantity Quantity of a product added to an order .
2016-10-20 14:02:25 +00:00
* @ return bool
*/
public function has_enough_stock ( $quantity ) {
2016-11-09 12:26:46 +00:00
return ! $this -> managing_stock () || $this -> backorders_allowed () || $this -> get_stock_quantity () >= $quantity ;
2016-10-20 14:02:25 +00:00
}
2016-10-26 17:02:50 +00:00
/**
* Returns whether or not the product has any visible attributes .
*
* @ return boolean
*/
public function has_attributes () {
foreach ( $this -> get_attributes () as $attribute ) {
if ( $attribute -> get_visible () ) {
return true ;
}
}
return false ;
}
2016-10-27 13:08:16 +00:00
/**
* Returns whether or not the product has any child product .
*
* @ return bool
*/
public function has_child () {
return 0 < count ( $this -> get_children () );
}
2016-11-11 15:31:00 +00:00
/**
* Does a child have dimensions ?
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-11 15:31:00 +00:00
* @ return bool
*/
public function child_has_dimensions () {
return false ;
}
/**
* Does a child have a weight ?
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-11 15:31:00 +00:00
* @ return boolean
*/
public function child_has_weight () {
return false ;
}
/**
* Check if downloadable product has a file attached .
*
* @ since 1.6 . 2
*
2017-10-09 19:19:24 +00:00
* @ param string $download_id file identifier .
2016-11-11 15:31:00 +00:00
* @ return bool Whether downloadable product has a file attached .
*/
public function has_file ( $download_id = '' ) {
return $this -> is_downloadable () && $this -> get_file ( $download_id );
}
2017-04-03 11:05:28 +00:00
/**
2017-07-10 05:56:28 +00:00
* Returns whether or not the product has additional options that need
2017-04-03 11:05:28 +00:00
* selecting before adding to cart .
*
* @ since 3.0 . 0
* @ return boolean
*/
public function has_options () {
return false ;
}
2016-10-20 14:02:25 +00:00
/*
|--------------------------------------------------------------------------
| Non - CRUD Getters
|--------------------------------------------------------------------------
*/
2016-11-24 14:19:52 +00:00
/**
2016-11-25 10:41:42 +00:00
* Get the product ' s title . For products this is the product name .
2016-11-24 14:19:52 +00:00
*
* @ return string
*/
public function get_title () {
return apply_filters ( 'woocommerce_product_title' , $this -> get_name (), $this );
}
2016-11-02 18:50:42 +00:00
/**
* Product permalink .
2017-10-09 19:19:24 +00:00
*
2016-11-02 18:50:42 +00:00
* @ return string
*/
public function get_permalink () {
return get_permalink ( $this -> get_id () );
}
2016-10-27 13:08:16 +00:00
/**
* Returns the children IDs if applicable . Overridden by child classes .
*
* @ return array of IDs
*/
public function get_children () {
return array ();
}
2016-11-09 12:26:46 +00:00
/**
* If the stock level comes from another product ID , this should be modified .
2017-10-09 19:19:24 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-09 12:26:46 +00:00
* @ return int
*/
public function get_stock_managed_by_id () {
return $this -> get_id ();
}
2016-10-20 16:15:03 +00:00
/**
* Returns the price in html format .
2017-05-15 11:50:52 +00:00
*
2017-10-09 19:19:24 +00:00
* @ param string $deprecated Deprecated param .
2017-05-15 11:50:52 +00:00
*
2016-10-20 16:15:03 +00:00
* @ return string
*/
public function get_price_html ( $deprecated = '' ) {
if ( '' === $this -> get_price () ) {
2017-04-26 17:37:30 +00:00
$price = apply_filters ( 'woocommerce_empty_price_html' , '' , $this );
2017-04-27 12:01:52 +00:00
} elseif ( $this -> is_on_sale () ) {
2016-12-02 17:02:06 +00:00
$price = wc_format_sale_price ( wc_get_price_to_display ( $this , array ( 'price' => $this -> get_regular_price () ) ), wc_get_price_to_display ( $this ) ) . $this -> get_price_suffix ();
2016-10-20 16:15:03 +00:00
} else {
2016-12-02 17:02:06 +00:00
$price = wc_price ( wc_get_price_to_display ( $this ) ) . $this -> get_price_suffix ();
2016-10-20 16:15:03 +00:00
}
return apply_filters ( 'woocommerce_get_price_html' , $price , $this );
}
2016-10-20 14:06:44 +00:00
/**
* Get product name with SKU or ID . Used within admin .
*
* @ return string Formatted product name
*/
public function get_formatted_name () {
if ( $this -> get_sku () ) {
$identifier = $this -> get_sku ();
} else {
$identifier = '#' . $this -> get_id ();
}
2016-12-23 15:14:27 +00:00
return sprintf ( '%2$s (%1$s)' , $identifier , $this -> get_name () );
2016-10-20 14:06:44 +00:00
}
2017-02-17 15:52:39 +00:00
/**
* Get min quantity which can be purchased at once .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-02-17 15:52:39 +00:00
* @ return int
*/
public function get_min_purchase_quantity () {
return 1 ;
}
/**
* Get max quantity which can be purchased at once .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-02-17 15:52:39 +00:00
* @ return int Quantity or - 1 if unlimited .
*/
public function get_max_purchase_quantity () {
2017-05-30 10:02:56 +00:00
return $this -> is_sold_individually () ? 1 : ( $this -> backorders_allowed () || ! $this -> managing_stock () ? - 1 : $this -> get_stock_quantity () );
2017-02-17 15:52:39 +00:00
}
2016-10-20 14:02:25 +00:00
/**
* Get the add to url used mainly in loops .
*
* @ return string
*/
public function add_to_cart_url () {
2016-11-02 18:50:42 +00:00
return apply_filters ( 'woocommerce_product_add_to_cart_url' , $this -> get_permalink (), $this );
2016-10-20 14:02:25 +00:00
}
/**
* Get the add to cart button text for the single page .
*
* @ return string
*/
public function single_add_to_cart_text () {
return apply_filters ( 'woocommerce_product_single_add_to_cart_text' , __ ( 'Add to cart' , 'woocommerce' ), $this );
}
/**
* Get the add to cart button text .
*
* @ return string
*/
public function add_to_cart_text () {
return apply_filters ( 'woocommerce_product_add_to_cart_text' , __ ( 'Read more' , 'woocommerce' ), $this );
}
/**
* Returns the main product image .
*
2017-10-09 19:19:24 +00:00
* @ param string $size ( default : 'shop_thumbnail' ) .
* @ param array $attr Image attributes .
* @ param bool $placeholder True to return $placeholder if no image is found , or false to return an empty string .
2016-10-20 14:02:25 +00:00
* @ return string
*/
public function get_image ( $size = 'shop_thumbnail' , $attr = array (), $placeholder = true ) {
if ( has_post_thumbnail ( $this -> get_id () ) ) {
$image = get_the_post_thumbnail ( $this -> get_id (), $size , $attr );
} elseif ( ( $parent_id = wp_get_post_parent_id ( $this -> get_id () ) ) && has_post_thumbnail ( $parent_id ) ) {
$image = get_the_post_thumbnail ( $parent_id , $size , $attr );
} elseif ( $placeholder ) {
$image = wc_placeholder_img ( $size );
} else {
$image = '' ;
}
2017-09-08 11:20:03 +00:00
return apply_filters ( 'woocommerce_product_get_image' , wc_get_relative_url ( $image ), $this , $size , $attr , $placeholder );
2016-10-20 14:02:25 +00:00
}
2016-10-26 17:02:50 +00:00
/**
* Returns the product shipping class SLUG .
*
* @ return string
*/
public function get_shipping_class () {
if ( $class_id = $this -> get_shipping_class_id () ) {
$term = get_term_by ( 'id' , $class_id , 'product_shipping_class' );
if ( $term && ! is_wp_error ( $term ) ) {
return $term -> slug ;
}
}
return '' ;
}
/**
* Returns a single product attribute as a string .
2017-10-09 19:19:24 +00:00
*
2016-10-26 17:02:50 +00:00
* @ param string $attribute to get .
* @ return string
*/
public function get_attribute ( $attribute ) {
$attributes = $this -> get_attributes ();
$attribute = sanitize_title ( $attribute );
if ( isset ( $attributes [ $attribute ] ) ) {
$attribute_object = $attributes [ $attribute ];
} elseif ( isset ( $attributes [ 'pa_' . $attribute ] ) ) {
$attribute_object = $attributes [ 'pa_' . $attribute ];
} else {
return '' ;
}
2017-01-16 23:11:56 +00:00
return $attribute_object -> is_taxonomy () ? implode ( ', ' , wc_get_product_terms ( $this -> get_id (), $attribute_object -> get_name (), array ( 'fields' => 'names' ) ) ) : wc_implode_text_attributes ( $attribute_object -> get_options () );
2016-10-26 17:02:50 +00:00
}
2013-09-20 16:01:09 +00:00
/**
2016-11-11 15:31:00 +00:00
* Get the total amount ( COUNT ) of ratings , or just the count for one rating e . g . number of 5 star ratings .
2017-10-09 19:19:24 +00:00
*
2016-11-11 15:31:00 +00:00
* @ param int $value Optional . Rating value to get the count for . By default returns the count of all rating values .
* @ return int
2013-09-20 16:01:09 +00:00
*/
2016-11-11 15:31:00 +00:00
public function get_rating_count ( $value = null ) {
$counts = $this -> get_rating_counts ();
2016-11-11 11:58:57 +00:00
2017-02-02 17:43:43 +00:00
if ( is_null ( $value ) ) {
2016-11-11 15:31:00 +00:00
return array_sum ( $counts );
} elseif ( isset ( $counts [ $value ] ) ) {
return absint ( $counts [ $value ] );
} else {
return 0 ;
2013-09-20 16:01:09 +00:00
}
}
/**
2015-11-03 12:28:01 +00:00
* Get a file by $download_id .
2013-09-20 16:01:09 +00:00
*
2017-10-09 19:19:24 +00:00
* @ param string $download_id file identifier .
2013-09-20 16:01:09 +00:00
* @ return array | false if not found
*/
2014-04-24 15:00:35 +00:00
public function get_file ( $download_id = '' ) {
2016-11-11 15:31:00 +00:00
$files = $this -> get_downloads ();
2013-09-20 16:01:09 +00:00
2014-04-24 15:00:35 +00:00
if ( '' === $download_id ) {
2017-10-09 19:19:24 +00:00
$file = count ( $files ) ? current ( $files ) : false ;
2014-04-24 15:00:35 +00:00
} elseif ( isset ( $files [ $download_id ] ) ) {
2013-09-20 16:01:09 +00:00
$file = $files [ $download_id ];
2013-11-24 10:42:36 +00:00
} else {
2013-09-20 16:01:09 +00:00
$file = false ;
2013-11-24 10:42:36 +00:00
}
2013-09-20 16:01:09 +00:00
2013-12-16 23:27:57 +00:00
return apply_filters ( 'woocommerce_product_file' , $file , $this , $download_id );
2012-07-31 11:58:00 +00:00
}
2012-11-27 16:22:47 +00:00
2012-08-28 15:21:54 +00:00
/**
2015-11-03 12:28:01 +00:00
* Get file download path identified by $download_id .
2012-11-27 16:22:47 +00:00
*
2017-10-09 19:19:24 +00:00
* @ param string $download_id file identifier .
2013-09-20 16:01:09 +00:00
* @ return string
2012-08-28 15:21:54 +00:00
*/
2013-07-23 10:28:59 +00:00
public function get_file_download_path ( $download_id ) {
2016-11-11 15:31:00 +00:00
$files = $this -> get_downloads ();
$file_path = isset ( $files [ $download_id ] ) ? $files [ $download_id ] -> get_file () : '' ;
2012-08-28 15:21:54 +00:00
2017-10-09 19:19:24 +00:00
// allow overriding based on the particular file being requested.
2013-12-16 23:27:57 +00:00
return apply_filters ( 'woocommerce_product_file_download_path' , $file_path , $this , $download_id );
2012-08-28 15:21:54 +00:00
}
2016-12-02 16:46:35 +00:00
2016-12-02 17:02:06 +00:00
/**
* Get the suffix to display after prices > 0.
*
2017-10-09 19:19:24 +00:00
* @ param string $price to calculate , left blank to just use get_price () .
* @ param integer $qty passed on to get_price_including_tax () or get_price_excluding_tax () .
2016-12-02 17:02:06 +00:00
* @ return string
*/
public function get_price_suffix ( $price = '' , $qty = 1 ) {
$html = '' ;
2017-02-11 00:08:49 +00:00
if ( ( $suffix = get_option ( 'woocommerce_price_display_suffix' ) ) && wc_tax_enabled () && 'taxable' === $this -> get_tax_status () ) {
2016-12-02 17:02:06 +00:00
if ( '' === $price ) {
$price = $this -> get_price ();
}
$replacements = array (
'{price_including_tax}' => wc_price ( wc_get_price_including_tax ( $this , array ( 'qty' => $qty , 'price' => $price ) ) ),
'{price_excluding_tax}' => wc_price ( wc_get_price_excluding_tax ( $this , array ( 'qty' => $qty , 'price' => $price ) ) ),
);
2017-03-07 13:25:52 +00:00
$html = str_replace ( array_keys ( $replacements ), array_values ( $replacements ), ' <small class="woocommerce-price-suffix">' . wp_kses_post ( $suffix ) . '</small>' );
2016-12-02 17:02:06 +00:00
}
2017-03-07 13:25:52 +00:00
return apply_filters ( 'woocommerce_get_price_suffix' , $html , $this , $price , $qty );
2016-12-02 17:02:06 +00:00
}
2016-12-02 16:46:35 +00:00
/**
* Returns the availability of the product .
*
2017-04-06 04:32:36 +00:00
* @ return string []
2016-12-02 16:46:35 +00:00
*/
public function get_availability () {
return apply_filters ( 'woocommerce_get_availability' , array (
'availability' => $this -> get_availability_text (),
'class' => $this -> get_availability_class (),
), $this );
}
/**
* Get availability text based on stock status .
*
* @ return string
*/
protected function get_availability_text () {
if ( ! $this -> is_in_stock () ) {
$availability = __ ( 'Out of stock' , 'woocommerce' );
} elseif ( $this -> managing_stock () && $this -> is_on_backorder ( 1 ) ) {
2017-04-19 15:57:49 +00:00
$availability = $this -> backorders_require_notification () ? __ ( 'Available on backorder' , 'woocommerce' ) : '' ;
2016-12-02 16:46:35 +00:00
} elseif ( $this -> managing_stock () ) {
2017-01-11 12:17:18 +00:00
$availability = wc_format_stock_for_display ( $this );
2016-12-02 16:46:35 +00:00
} else {
$availability = '' ;
}
return apply_filters ( 'woocommerce_get_availability_text' , $availability , $this );
}
/**
* Get availability classname based on stock status .
*
* @ return string
*/
protected function get_availability_class () {
if ( ! $this -> is_in_stock () ) {
$class = 'out-of-stock' ;
} elseif ( $this -> managing_stock () && $this -> is_on_backorder ( 1 ) ) {
$class = 'available-on-backorder' ;
} else {
$class = 'in-stock' ;
}
return apply_filters ( 'woocommerce_get_availability_class' , $class , $this );
}
2013-12-02 11:34:27 +00:00
}