2011-08-09 15:16:18 +00:00
< ? php
2017-10-09 19:19:24 +00:00
/**
* WooCommerce product base class .
*
2020-08-05 16:36:24 +00:00
* @ package WooCommerce\Abstracts
2017-10-09 19:19:24 +00:00
*/
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 .
*/
2018-03-05 12:46:34 +00:00
require_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
*
2018-12-10 16:34:12 +00:00
* @ version 3.0 . 0
2020-08-05 16:36:24 +00:00
* @ package WooCommerce\Abstracts
2016-09-23 07:19:35 +00:00
*/
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' ,
2018-06-07 13:37:06 +00:00
'low_stock_amount' => '' ,
2016-11-02 18:50:42 +00:00
'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 ,
2019-01-29 16:04:00 +00:00
'post_password' => '' ,
2016-11-02 18:50:42 +00:00
'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
*
2018-12-10 16:34:12 +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-09-23 07:19:35 +00:00
/**
* Get product name .
*
2018-12-10 16:34:12 +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
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
2018-12-10 16:34:12 +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 .
2018-12-10 16:34:12 +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
}
2018-05-27 04:40:58 +00:00
/**
* Get low stock amount .
*
* @ param string $context What the value is for . Valid values are view and edit .
2018-06-19 11:40:27 +00:00
* @ since 3.5 . 0
* @ return int | string Returns empty string if value not set
2018-05-27 04:40:58 +00:00
*/
public function get_low_stock_amount ( $context = 'view' ) {
return $this -> get_prop ( 'low_stock_amount' , $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 .
2018-12-10 16:34:12 +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
*
2018-12-10 16:34:12 +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
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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
}
2019-01-29 16:04:00 +00:00
/**
* Get post password .
*
* @ since 3.6 . 0
* @ param string $context What the value is for . Valid values are view and edit .
* @ return int
*/
public function get_post_password ( $context = 'view' ) {
return $this -> get_prop ( 'post_password' , $context );
}
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
*
2018-12-10 16:34:12 +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
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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
*
2018-12-10 16:34:12 +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 .
*
2018-12-10 16:34:12 +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 .
2018-12-10 16:34:12 +00:00
* @ param string $visibility Options : 'hidden' , 'visible' , 'search' and 'catalog' .
2016-09-23 07:19:35 +00:00
*/
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 .
*
2018-12-10 16:34:12 +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 .
2018-12-10 16:34:12 +00:00
* @ param string $sku Product SKU .
2016-09-23 07:19:35 +00:00
*/
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 ) {
2019-07-15 06:50:11 +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 ) {
2019-07-15 06:50:11 +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 ) {
2019-07-15 06:50:11 +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 .
*
2018-12-10 16:34:12 +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 .
2018-12-10 16:34:12 +00:00
* @ param string $status Tax status .
2016-09-23 07:19:35 +00:00
*/
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
2018-06-15 10:35:22 +00:00
if ( ! in_array ( $class , $valid_classes , true ) ) {
2017-08-18 16:06:22 +00:00
$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 .
*/
2017-11-21 22:08:17 +00:00
public function set_stock_status ( $status = 'instock' ) {
2017-11-14 21:49:22 +00:00
$valid_statuses = wc_get_product_stock_status_options ();
2017-11-14 21:40:03 +00:00
2017-11-21 22:08:17 +00:00
if ( isset ( $valid_statuses [ $status ] ) ) {
2017-11-14 21:40:03 +00:00
$this -> set_prop ( 'stock_status' , $status );
} else {
$this -> set_prop ( 'stock_status' , '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
}
2018-05-27 04:40:58 +00:00
/**
* Set low stock amount .
*
2018-08-15 16:24:09 +00:00
* @ param int | string $amount Empty string if value not set .
2018-06-19 11:40:27 +00:00
* @ since 3.5 . 0
2018-05-27 04:40:58 +00:00
*/
public function set_low_stock_amount ( $amount ) {
2018-06-19 11:40:27 +00:00
$this -> set_prop ( 'low_stock_amount' , '' === $amount ? '' : absint ( $amount ) );
2018-05-27 04:40:58 +00:00
}
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 :
2018-03-05 12:46:34 +00:00
* 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 .
2016-10-26 17:02:50 +00:00
*
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' ) ) {
2018-09-19 18:35:46 +00:00
$attributes [ sanitize_title ( $attribute -> get_name () ) ] = $attribute ;
2016-10-26 17:02:50 +00:00
}
}
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
}
/**
2018-06-13 13:33:13 +00:00
* Set default attributes . These will be saved as strings and should map to attribute values .
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 ) {
2018-06-13 13:33:13 +00:00
$this -> set_prop ( 'default_attributes' , array_map ( 'strval' , 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
}
2019-01-29 16:04:00 +00:00
/**
* Set post password .
*
* @ since 3.6 . 0
* @ param int $post_password Post password .
*/
public function set_post_password ( $post_password ) {
$this -> set_prop ( 'post_password' , $post_password );
}
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 {
2018-01-03 11:02:38 +00:00
$download_object = new WC_Product_Download ();
2016-12-06 11:09:03 +00:00
2017-08-23 02:27:42 +00:00
// If we don't have a previous hash, generate UUID for download.
if ( empty ( $download [ 'download_id' ] ) ) {
2017-08-05 04:42:31 +00:00
$download [ 'download_id' ] = wp_generate_uuid4 ();
}
2016-12-06 11:09:03 +00:00
2017-08-05 04:42:31 +00:00
$download_object -> set_id ( $download [ 'download_id' ] );
2016-11-11 15:31:00 +00:00
$download_object -> set_name ( $download [ 'name' ] );
$download_object -> set_file ( $download [ 'file' ] );
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 () ) {
2018-03-05 12:46:34 +00:00
/* translators: %1$s: Downloadable file */
2017-04-06 20:39:36 +00:00
$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 () ) {
2018-03-05 12:46:34 +00:00
/* translators: %s: Downloadable file */
2017-04-06 20:39:36 +00:00
$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 );
$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 () {
2018-05-27 04:40:58 +00:00
// Before updating, ensure stock props are all aligned. Qty, backorders and low stock amount are not needed if not stock managed.
2016-11-09 12:26:46 +00:00
if ( ! $this -> get_manage_stock () ) {
$this -> set_stock_quantity ( '' );
$this -> set_backorders ( 'no' );
2018-05-27 04:40:58 +00:00
$this -> set_low_stock_amount ( '' );
2020-05-27 09:53:16 +00:00
return ;
}
2016-11-09 12:26:46 +00:00
2020-05-27 09:53:16 +00:00
$stock_is_above_notification_threshold = ( $this -> get_stock_quantity () > get_option ( 'woocommerce_notify_no_stock_amount' , 0 ) );
$backorders_are_allowed = ( 'no' !== $this -> get_backorders () );
2017-11-15 18:48:39 +00:00
2020-05-27 09:53:16 +00:00
if ( $stock_is_above_notification_threshold ) {
$new_stock_status = 'instock' ;
} elseif ( $backorders_are_allowed ) {
$new_stock_status = 'onbackorder' ;
} else {
$new_stock_status = 'outofstock' ;
2016-11-09 12:26:46 +00:00
}
2020-05-27 09:53:16 +00:00
$this -> set_stock_status ( $new_stock_status );
2016-11-09 12:26:46 +00:00
}
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
*
2018-12-10 16:34:12 +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
2019-04-17 11:47:35 +00:00
if ( ! $this -> data_store ) {
return $this -> get_id ();
}
2016-12-19 17:09:52 +00:00
2019-04-17 11:47:35 +00:00
/**
* Trigger action before saving to the DB . Allows you to adjust object props before save .
*
* @ param WC_Data $this The object being saved .
* @ param WC_Data_Store_WP $data_store THe data store persisting the data .
*/
do_action ( 'woocommerce_before_' . $this -> object_type . '_object_save' , $this , $this -> data_store );
if ( $this -> get_id () ) {
$this -> data_store -> update ( $this );
} else {
$this -> data_store -> create ( $this );
}
2020-05-28 12:07:51 +00:00
$this -> maybe_defer_product_sync ();
2019-04-17 11:47:35 +00:00
/**
* Trigger action after saving to the DB .
*
* @ param WC_Data $this The object being saved .
* @ param WC_Data_Store_WP $data_store THe data store persisting the data .
*/
do_action ( 'woocommerce_after_' . $this -> object_type . '_object_save' , $this , $this -> data_store );
2017-07-20 17:01:14 +00:00
return $this -> get_id ();
2016-10-24 09:32:15 +00:00
}
2020-05-28 12:07:51 +00:00
/**
* Delete the product , set its ID to 0 , and return result .
*
* @ param bool $force_delete Should the product be deleted permanently .
* @ return bool result
*/
public function delete ( $force_delete = false ) {
$deleted = parent :: delete ( $force_delete );
if ( $deleted ) {
$this -> maybe_defer_product_sync ();
}
return $deleted ;
}
/**
* If this is a child product , queue its parent for syncing at the end of the request .
*/
protected function maybe_defer_product_sync () {
$parent_id = $this -> get_parent_id ();
if ( $parent_id ) {
wc_deferred_product_sync ( $parent_id );
}
}
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 .
*
2018-12-10 16:34:12 +00:00
* @ param string $feature string The name of a feature to test support for .
2016-10-20 14:02:25 +00:00
* @ return bool True if the product supports the feature , false otherwise .
2018-12-10 16:34:12 +00:00
* @ since 2.5 . 0
2016-10-20 14:02:25 +00:00
*/
public function supports ( $feature ) {
2018-11-28 18:34:10 +00:00
return apply_filters ( 'woocommerce_product_supports' , in_array ( $feature , $this -> supports , true ), $feature , $this );
2016-10-20 14:02:25 +00:00
}
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
*
2018-12-10 16:34:12 +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 ) {
2018-11-28 18:34:10 +00:00
return ( $this -> get_type () === $type || ( is_array ( $type ) && in_array ( $this -> get_type (), $type , true ) ) );
2016-10-20 14:02:25 +00:00
}
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 () {
2020-04-23 13:07:09 +00:00
$visible = $this -> is_visible_core ();
return apply_filters ( 'woocommerce_product_is_visible' , $visible , $this -> get_id () );
}
/**
* Returns whether or not the product is visible in the catalog ( doesn ' t trigger filters ) .
*
* @ return bool
*/
protected function is_visible_core () {
2016-10-20 14:02:25 +00:00
$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
2017-12-06 13:47:09 +00:00
if ( 'trash' === $this -> get_status () ) {
$visible = false ;
} elseif ( 'publish' !== $this -> get_status () && ! current_user_can ( 'edit_post' , $this -> get_id () ) ) {
2016-10-20 14:02:25 +00:00
$visible = false ;
}
2017-11-01 12:52:58 +00:00
if ( $this -> get_parent_id () ) {
$parent_product = wc_get_product ( $this -> get_parent_id () );
if ( $parent_product && 'publish' !== $parent_product -> get_status () ) {
$visible = false ;
}
}
2016-10-20 14:02:25 +00:00
if ( 'yes' === get_option ( 'woocommerce_hide_out_of_stock_items' ) && ! $this -> is_in_stock () ) {
$visible = false ;
}
2020-04-23 13:07:09 +00:00
return $visible ;
2016-10-20 14:02:25 +00:00
}
/**
* 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
2019-12-20 17:23:05 +00:00
if ( $this -> get_date_on_sale_from ( $context ) && $this -> get_date_on_sale_from ( $context ) -> getTimestamp () > time () ) {
2017-01-16 21:59:53 +00:00
$on_sale = false ;
2016-10-20 16:15:03 +00:00
}
2019-12-20 17:23:05 +00:00
if ( $this -> get_date_on_sale_to ( $context ) && $this -> get_date_on_sale_to ( $context ) -> getTimestamp () < time () ) {
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
}
/**
2017-11-21 22:08:17 +00:00
* Returns whether or not the product can be purchased .
* This returns true for 'instock' and 'onbackorder' stock statuses .
2016-10-20 14:02:25 +00:00
*
* @ return bool
*/
public function is_in_stock () {
2017-11-15 21:04:24 +00:00
return apply_filters ( 'woocommerce_product_is_in_stock' , 'outofstock' !== $this -> get_stock_status (), $this );
2016-10-20 14:02:25 +00:00
}
/**
* 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 () {
2017-11-20 19:14:23 +00:00
return $this -> needs_shipping () && ( $this -> get_tax_status () === 'taxable' || $this -> get_tax_status () === 'shipping' );
2016-10-20 14:02:25 +00:00
}
/**
* 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 .
*
2018-12-10 16:34:12 +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 ) {
2017-11-20 19:19:06 +00:00
if ( 'onbackorder' === $this -> get_stock_status () ) {
return true ;
}
2018-03-21 22:57:10 +00:00
return $this -> managing_stock () && $this -> backorders_allowed () && ( $this -> get_stock_quantity () - $qty_in_cart ) < 0 ;
2016-10-20 14:02:25 +00:00
}
/**
* Returns whether or not the product has enough stock for the order .
*
2018-12-10 16:34:12 +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 ?
*
2018-12-10 16:34:12 +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 ?
*
2018-12-10 16:34:12 +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
*
2018-12-10 16:34:12 +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 () {
2020-08-28 18:01:11 +00:00
return apply_filters ( 'woocommerce_product_has_options' , false , $this );
2017-04-03 11:05:28 +00:00
}
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 );
}
2017-11-14 11:45:16 +00:00
/**
* Get the add to cart button text description - used in aria tags .
*
2018-12-10 16:34:12 +00:00
* @ since 3.3 . 0
2017-11-14 11:45:16 +00:00
* @ return string
*/
public function add_to_cart_description () {
/* translators: %s: Product title */
return apply_filters ( 'woocommerce_product_add_to_cart_description' , sprintf ( __ ( 'Read more about “%s”' , 'woocommerce' ), $this -> get_name () ), $this );
}
2016-10-20 14:02:25 +00:00
/**
* Returns the main product image .
*
2018-12-10 16:34:12 +00:00
* @ param string $size ( default : 'woocommerce_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
*/
2017-11-07 18:48:51 +00:00
public function get_image ( $size = 'woocommerce_thumbnail' , $attr = array (), $placeholder = true ) {
2018-11-28 18:41:12 +00:00
$image = '' ;
2018-06-28 12:10:25 +00:00
if ( $this -> get_image_id () ) {
2018-10-17 22:34:27 +00:00
$image = wp_get_attachment_image ( $this -> get_image_id (), $size , false , $attr );
2018-06-28 12:10:25 +00:00
} elseif ( $this -> get_parent_id () ) {
$parent_product = wc_get_product ( $this -> get_parent_id () );
2018-11-28 18:41:12 +00:00
if ( $parent_product ) {
$image = $parent_product -> get_image ( $size , $attr , $placeholder );
}
}
if ( ! $image && $placeholder ) {
2019-10-30 15:08:19 +00:00
$image = wc_placeholder_img ( $size , $attr );
2016-10-20 14:02:25 +00:00
}
2018-02-15 15:22:30 +00:00
2018-05-08 08:16:53 +00:00
return apply_filters ( 'woocommerce_product_get_image' , $image , $this , $size , $attr , $placeholder , $image );
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 () {
2020-05-28 12:07:51 +00:00
$class_id = $this -> get_shipping_class_id ();
if ( $class_id ) {
2016-10-26 17:02:50 +00:00
$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
*
2018-12-10 16:34:12 +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
*
2018-12-10 16:34:12 +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 = '' ;
2020-05-28 12:07:51 +00:00
$suffix = get_option ( 'woocommerce_price_display_suffix' );
if ( $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 (
2018-03-05 12:46:34 +00:00
'{price_including_tax}' => wc_price ( wc_get_price_including_tax ( $this , array ( 'qty' => $qty , 'price' => $price ) ) ), // @phpcs:ignore WordPress.Arrays.ArrayDeclarationSpacing.ArrayItemNoNewLine, WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
'{price_excluding_tax}' => wc_price ( wc_get_price_excluding_tax ( $this , array ( 'qty' => $qty , 'price' => $price ) ) ), // @phpcs:ignore WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
2016-12-02 17:02:06 +00:00
);
2018-11-28 18:34:10 +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 () {
2018-11-28 18:34:10 +00:00
return apply_filters (
'woocommerce_get_availability' ,
array (
'availability' => $this -> get_availability_text (),
'class' => $this -> get_availability_class (),
),
$this
);
2016-12-02 16:46:35 +00:00
}
/**
* 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' ) : '' ;
2019-09-02 07:10:44 +00:00
} elseif ( ! $this -> managing_stock () && $this -> is_on_backorder ( 1 ) ) {
$availability = __ ( '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' ;
2019-09-02 07:10:44 +00:00
} elseif ( ( $this -> managing_stock () && $this -> is_on_backorder ( 1 ) ) || ( ! $this -> managing_stock () && $this -> is_on_backorder ( 1 ) ) ) {
2016-12-02 16:46:35 +00:00
$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
}