2016-03-11 19:50:44 +00:00
< ? php
if ( ! defined ( 'ABSPATH' ) ) {
exit ;
}
/**
2016-09-02 02:40:36 +00:00
* Abstract WC Data Class
*
* Implemented by classes using the same CRUD ( s ) pattern .
*
* @ version 2.6 . 0
* @ package WooCommerce / Abstracts
* @ category Abstract Class
* @ author WooThemes
*/
2016-03-11 19:50:44 +00:00
abstract class WC_Data {
2016-09-09 12:34:49 +00:00
/**
* ID for this object .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-09 12:34:49 +00:00
* @ var int
*/
protected $id = 0 ;
2016-03-17 15:22:29 +00:00
/**
2016-08-25 12:31:03 +00:00
* Core data for this object . Name value pairs ( name + default value ) .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-08-24 11:34:19 +00:00
* @ var array
*/
2016-09-09 12:34:49 +00:00
protected $data = array ();
2016-08-24 11:34:19 +00:00
2016-11-08 10:16:16 +00:00
/**
* Core data changes for this object .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 10:16:16 +00:00
* @ var array
*/
protected $changes = array ();
/**
* This is false until the object is read from the DB .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 10:16:16 +00:00
* @ var bool
*/
protected $object_read = false ;
2016-12-19 17:09:52 +00:00
/**
* This is the name of this object type .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-12-19 17:09:52 +00:00
* @ var string
*/
protected $object_type = 'data' ;
2016-11-08 09:39:47 +00:00
/**
* Extra data for this object . Name value pairs ( name + default value ) .
* Used as a standard way for sub classes ( like product types ) to add
* additional information to an inherited class .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 09:39:47 +00:00
* @ var array
*/
protected $extra_data = array ();
2016-08-24 11:34:19 +00:00
/**
2016-08-25 12:31:03 +00:00
* Set to _data on construct so we can track and reset data if needed .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-03-17 15:22:29 +00:00
* @ var array
*/
2016-09-09 12:34:49 +00:00
protected $default_data = array ();
2016-03-17 15:22:29 +00:00
2016-11-08 09:39:47 +00:00
/**
* Contains a reference to the data store for this class .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 09:39:47 +00:00
* @ var object
*/
protected $data_store ;
2016-03-11 19:50:44 +00:00
/**
* Stores meta in cache for future reads .
* A group must be set to to enable caching .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-03-11 19:50:44 +00:00
* @ var string
*/
2016-09-09 12:34:49 +00:00
protected $cache_group = '' ;
2016-03-11 19:50:44 +00:00
/**
2017-03-28 17:58:51 +00:00
* Stores additional meta data .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-03-11 19:50:44 +00:00
* @ var array
*/
2016-12-09 12:18:21 +00:00
protected $meta_data = null ;
2016-03-11 19:50:44 +00:00
2016-08-25 12:31:03 +00:00
/**
* Default constructor .
2017-02-06 17:06:18 +00:00
*
2016-08-25 12:31:03 +00:00
* @ param int | object | array $read ID to load from the DB ( optional ) or already queried data .
*/
public function __construct ( $read = 0 ) {
2017-03-21 17:42:34 +00:00
$this -> data = array_merge ( $this -> data , $this -> extra_data );
$this -> default_data = $this -> data ;
}
2017-02-01 20:44:51 +00:00
2017-03-21 17:42:34 +00:00
/**
* Only store the object ID to avoid serializing the data object instance .
*
* @ return array
*/
public function __sleep () {
return array ( 'id' );
}
2017-02-01 20:44:51 +00:00
2017-03-21 17:42:34 +00:00
/**
* Re - run the constructor with the object ID .
2017-03-21 18:31:38 +00:00
*
* If the object no longer exists , remove the ID .
2017-03-21 17:42:34 +00:00
*/
public function __wakeup () {
2017-03-21 18:31:38 +00:00
try {
$this -> __construct ( absint ( $this -> id ) );
} catch ( Exception $e ) {
$this -> set_id ( 0 );
$this -> set_object_read ( true );
}
2016-08-25 12:31:03 +00:00
}
2017-04-10 16:12:17 +00:00
/**
* When the object is cloned , make sure meta is duplicated correctly .
2017-04-10 20:52:06 +00:00
*
* @ since 3.0 . 2
2017-04-10 16:12:17 +00:00
*/
public function __clone () {
$this -> maybe_read_meta_data ();
if ( ! empty ( $this -> meta_data ) ) {
foreach ( $this -> meta_data as $array_key => $meta ) {
2017-05-03 13:37:01 +00:00
$this -> meta_data [ $array_key ] = clone $meta ;
2017-04-10 16:12:17 +00:00
if ( ! empty ( $meta -> id ) ) {
2017-10-17 04:05:29 +00:00
$this -> meta_data [ $array_key ] -> id = null ;
2017-04-10 16:12:17 +00:00
}
}
}
}
WIP - Product CRUD (#12065)
* Created function to get the catalog visibility options
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* Hardcode the get_type per product class
* Initial look through getters and setters and abstract data
* Missing var
* Add related product functions and deprecate those in class.
* No need to exclude ID
* Fixed coding standards and improved the docblocks
* Get cached terms from wc_get_related_terms()
* Fixed wrong variable in wc_get_related_terms
* Use count() instead of sizeof()
* Sanitize ids later
* Remove unneeded comments
* wc_get_product_term_ids instead of related wording and use in other places.
get_the_terms is used here and also handles caching, something
wp_get_post_terms does not.
* Clean up the abstract product class a bit, deprecate two functions we have renamed, make update & create work properly, and add some tests for it.
* Bump template version
* Handle PR feedback: Remove duplicate regular_price update, allow changing of post status for products, remove deprecation for get_title since we might still offer it as a function
* Made abstract function useful
* External Product CRUD
* _virtual meta should be 'no', not taxable, in product unit test helper
* Grouped product class
* Tests
* Move children to meta and update test
* Use get_upsell_ids
* Spacing in query
* Moving and refactoring methods
* Availability html
* Tidy/add todos
* Rename method
* Put back review functions (still todo)
* missing $this
* get_price_including_tax/excluding_tax functions
* wc_get_price_to_display
* Price handling
* [Product CRUD] Variable (#12146)
* [Product CRUD] Variable Products
* Handle PR feedback.
* [Product CRUD] Grouped Handling (#12151)
* Handle grouped product saving
* Update routine
* [Product CRUD] Product crud terms (#12149)
* Category and tag id handling
* Replace template functions
* Remove todo
* Handle default name in save function
* Product crud admin save routine (#12174)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Spacing
* Fix comment
* wc_implode_text_attributes helper function
* [Product CRUD] Product crud admin use getters (#12196)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Move settings into new files
* Refactor panels and use getters
* Use getters for variation panel
* Revert save variation changes for now
* Add todos
* Fix downloads
* REST API CRUD Updates
* Additional API updates/fixes. Added some todos
* Fix final failing tests and implementing setters/getters and attributes functionality.
* Fix comparison for is_on_sale and remove download_type from WC_Product.
* Add a wc_get_products wrapper.
* Remove the download type input from the product data metabox for downloadable products. (#12221)
* [Product CRUD] Variations - setters, getters and admin. (#12228)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* Feedback fixes
* Implement CRUD in the legacy REST API
* Handle PR feedback
* [Product CRUD] Getter setter proxy methods (#12236)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* get_prop implementation in abstract and data classes
* Implement set_prop
* Change handling
* Array key exists
* set_object_read
* Use get_the_terms() instead of wp_get_post_terms()
wp_get_post_terms() is a wrapper around wp_get_object_terms() which does not
use the object cache, and generates a database query every time it is used.
get_the_terms() however can use data from the object cache if present.
* Allow WP_Query to preload post data, and meta in wc_get_products()
Allow WP_Query to bulk query for post data and meta if more than
just IDs are requested from wc_get_products(). Reduces query count
significantly.
* [Product CRUD] Variable, variation, notices, and stock handling (#12277)
* No longer needed
* Remove old todos
* Use getters in admin list
* Related and upsells update for CRUD
* Fix notice in gallery
* Variable fixes and todos
* Context
* Price sync
* Revert variation attributes change
* Return parent data in view context
* Defer term counting
* wc_find_matching_product_variation
* Stock manage tweaks
* Stock fixes
* Correct id
* correct id
* Better sync
* Data logic setter fix
* feedback
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* Hardcode the get_type per product class
* Initial look through getters and setters and abstract data
* Missing var
* Fixed coding standards and improved the docblocks
* Get cached terms from wc_get_related_terms()
* Fixed wrong variable in wc_get_related_terms
* Use count() instead of sizeof()
* Add related product functions and deprecate those in class.
* No need to exclude ID
* Sanitize ids later
* Clean up the abstract product class a bit, deprecate two functions we have renamed, make update & create work properly, and add some tests for it.
* Remove unneeded comments
* wc_get_product_term_ids instead of related wording and use in other places.
get_the_terms is used here and also handles caching, something
wp_get_post_terms does not.
* Handle PR feedback: Remove duplicate regular_price update, allow changing of post status for products, remove deprecation for get_title since we might still offer it as a function
* External Product CRUD
* _virtual meta should be 'no', not taxable, in product unit test helper
* Bump template version
* Made abstract function useful
* Grouped product class
* Tests
* Move children to meta and update test
* Use get_upsell_ids
* Spacing in query
* Moving and refactoring methods
* Availability html
* Tidy/add todos
* Rename method
* Put back review functions (still todo)
* missing $this
* get_price_including_tax/excluding_tax functions
* wc_get_price_to_display
* Price handling
* [Product CRUD] Variable (#12146)
* [Product CRUD] Variable Products
* Handle PR feedback.
* [Product CRUD] Grouped Handling (#12151)
* Handle grouped product saving
* Update routine
* [Product CRUD] Product crud terms (#12149)
* Category and tag id handling
* Replace template functions
* Remove todo
* Handle default name in save function
* Product crud admin save routine (#12174)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Spacing
* Fix comment
* wc_implode_text_attributes helper function
* [Product CRUD] Product crud admin use getters (#12196)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Move settings into new files
* Refactor panels and use getters
* Use getters for variation panel
* Revert save variation changes for now
* Add todos
* Fix downloads
* REST API CRUD Updates
* Additional API updates/fixes. Added some todos
* Fix final failing tests and implementing setters/getters and attributes functionality.
* Fix comparison for is_on_sale and remove download_type from WC_Product.
* Add a wc_get_products wrapper.
* Remove the download type input from the product data metabox for downloadable products. (#12221)
* [Product CRUD] Variations - setters, getters and admin. (#12228)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* Feedback fixes
* Implement CRUD in the legacy REST API
* Handle PR feedback
* [Product CRUD] Getter setter proxy methods (#12236)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* get_prop implementation in abstract and data classes
* Implement set_prop
* Change handling
* Array key exists
* set_object_read
* Use get_the_terms() instead of wp_get_post_terms()
wp_get_post_terms() is a wrapper around wp_get_object_terms() which does not
use the object cache, and generates a database query every time it is used.
get_the_terms() however can use data from the object cache if present.
* [Product CRUD] Variable, variation, notices, and stock handling (#12277)
* No longer needed
* Remove old todos
* Use getters in admin list
* Related and upsells update for CRUD
* Fix notice in gallery
* Variable fixes and todos
* Context
* Price sync
* Revert variation attributes change
* Return parent data in view context
* Defer term counting
* wc_find_matching_product_variation
* Stock manage tweaks
* Stock fixes
* Correct id
* correct id
* Better sync
* Data logic setter fix
* feedback
* Prevent notices
* Handle image_id from parent
* Fix error
* Remove _wc_save_product_price
* Remove todo
* Fixed wrong variation URLs
* Fixed undefined $image_id in WC_Product_Variation::get_image_id()
* Allow wc_rest_prepare_date_response() handle timestamps
* Updated get methods on REST API for variations
* Use variations CRUD to save variations metadata
* [Product CRUD] Abstract todos (#12305)
* Get dimensions and weights, with soft deprecation
* Product attributes
* Ratings
* Fix read method
* Downloads
* Feedback
* Revert "[Product CRUD] Abstract todos (#12305)"
This reverts commit 9a6136fcf88fec16f97457b7c8a4388f7587bfa2.
* Remove deprecated get_variation_id()
* New default attributes method
* [Product CRUD] Product Datastore (#12317)
* Fix up tests in the product/* folder.
* Handle data store updates for grouped, variable, external, simple, and general data store updates for products.
* Variations & variable changes.
* Update -functions.php calls to use data store.
* Add an interface for the public product data store methods.
* Finished product factory tests
* Correctly delete in the api, fix up some comments, and implement an interface for the public variable methods.
* Fix up delete in all versions of the api
* Handle feedback
* Match protected decloration to parent
* Product crud abstract todos (#12316)
* Get dimensions and weights, with soft deprecation
* Product attributes
* Ratings
* Fix read method
* Downloads
* Feedback
* Fix up store
* Fixed method returning in write context
* Fix error in variation admin
* Check for parent value - fixes tax class
* Remove old/complete todos
* Allow set tax class as "parent"
* Removed duplicated sync
* Fixed wrong variation URLs
* Fixed undefined $image_id in WC_Product_Variation::get_image_id()
* Allow wc_rest_prepare_date_response() handle timestamps
* Updated get methods on REST API for variations
* Use variations CRUD to save variations metadata
* Remove deprecated get_variation_id()
* New default attributes method
* Fixed method returning in write context
* Allow set tax class as "parent"
* Removed duplicated sync
* Fixed coding standards
* TODO is not accurate.
* Should pass WC_Product instancies to WC_Comments methods (#12327)
* Use new method in abstract order class to prevent headers sent issue in tests
* Fixed variable description in REST API
* Updated how create initial product variation
* Fixed a few fatal errors and warnings in Products CRUD (#12329)
* Fixed a few fatal errors and warnings in Products CRUD
* Fixed sync functions
* Add variations CRUD to legacy API (#12331)
* Apply crud to variable products in legacy API v1
* New REST API do not need fallback for default attributes
* Apply variations CRUD to legacy API v2
* Legacy v2 - save default attributes
* Variations in legacy API v2 do not have descriptions
* Fixed legacy API v2 variations params
* Applied variations CRUD to legacy API v3
* Sync before save in legacy apis
* Punc
* Removed API todos
* Removed test
* Products endpoint tweaks (#12354)
* Var type already normalized on CRUD
* Let Product CRUD handle with validation, sanitization and conditional checks
* Set downloads using WC_Product_Download
* Stop try catch exceptions more than one time
* Handle WC_Data_Exception in legacy API
* Complete remove products when fails on creating
* On creating I mean!
* Already have a method to complete delete products
* Fixed standards using WP CodeSniffer
* get_the_terms() returns false when empty
* get_manage_stock returns boolean
@claudiosanches
* Merge conflict
* Variations API endpoint fixes
* Product CRUD improvements (#12359)
* args is not used any more - remove todo
* Added test for attributes
* wc_get_price_excluding_tax usage
* parent usage
* Fix rating counts
* Test fixes
* Cleanup after tests
* Make sure status transition code runs even during API calls, not just in admin.
* Default visibility
* Fix attribute setting in API
* Use get name instead of get title
* variation id usage
* Improved cross sell templates
* variation_data
* Grouped product sync
* Notices
* Sync is not needed in API
* Delete
* Rename interfaces
* Update counts in data store
2016-11-16 12:38:24 +00:00
/**
* Get the data store .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
WIP - Product CRUD (#12065)
* Created function to get the catalog visibility options
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* Hardcode the get_type per product class
* Initial look through getters and setters and abstract data
* Missing var
* Add related product functions and deprecate those in class.
* No need to exclude ID
* Fixed coding standards and improved the docblocks
* Get cached terms from wc_get_related_terms()
* Fixed wrong variable in wc_get_related_terms
* Use count() instead of sizeof()
* Sanitize ids later
* Remove unneeded comments
* wc_get_product_term_ids instead of related wording and use in other places.
get_the_terms is used here and also handles caching, something
wp_get_post_terms does not.
* Clean up the abstract product class a bit, deprecate two functions we have renamed, make update & create work properly, and add some tests for it.
* Bump template version
* Handle PR feedback: Remove duplicate regular_price update, allow changing of post status for products, remove deprecation for get_title since we might still offer it as a function
* Made abstract function useful
* External Product CRUD
* _virtual meta should be 'no', not taxable, in product unit test helper
* Grouped product class
* Tests
* Move children to meta and update test
* Use get_upsell_ids
* Spacing in query
* Moving and refactoring methods
* Availability html
* Tidy/add todos
* Rename method
* Put back review functions (still todo)
* missing $this
* get_price_including_tax/excluding_tax functions
* wc_get_price_to_display
* Price handling
* [Product CRUD] Variable (#12146)
* [Product CRUD] Variable Products
* Handle PR feedback.
* [Product CRUD] Grouped Handling (#12151)
* Handle grouped product saving
* Update routine
* [Product CRUD] Product crud terms (#12149)
* Category and tag id handling
* Replace template functions
* Remove todo
* Handle default name in save function
* Product crud admin save routine (#12174)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Spacing
* Fix comment
* wc_implode_text_attributes helper function
* [Product CRUD] Product crud admin use getters (#12196)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Move settings into new files
* Refactor panels and use getters
* Use getters for variation panel
* Revert save variation changes for now
* Add todos
* Fix downloads
* REST API CRUD Updates
* Additional API updates/fixes. Added some todos
* Fix final failing tests and implementing setters/getters and attributes functionality.
* Fix comparison for is_on_sale and remove download_type from WC_Product.
* Add a wc_get_products wrapper.
* Remove the download type input from the product data metabox for downloadable products. (#12221)
* [Product CRUD] Variations - setters, getters and admin. (#12228)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* Feedback fixes
* Implement CRUD in the legacy REST API
* Handle PR feedback
* [Product CRUD] Getter setter proxy methods (#12236)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* get_prop implementation in abstract and data classes
* Implement set_prop
* Change handling
* Array key exists
* set_object_read
* Use get_the_terms() instead of wp_get_post_terms()
wp_get_post_terms() is a wrapper around wp_get_object_terms() which does not
use the object cache, and generates a database query every time it is used.
get_the_terms() however can use data from the object cache if present.
* Allow WP_Query to preload post data, and meta in wc_get_products()
Allow WP_Query to bulk query for post data and meta if more than
just IDs are requested from wc_get_products(). Reduces query count
significantly.
* [Product CRUD] Variable, variation, notices, and stock handling (#12277)
* No longer needed
* Remove old todos
* Use getters in admin list
* Related and upsells update for CRUD
* Fix notice in gallery
* Variable fixes and todos
* Context
* Price sync
* Revert variation attributes change
* Return parent data in view context
* Defer term counting
* wc_find_matching_product_variation
* Stock manage tweaks
* Stock fixes
* Correct id
* correct id
* Better sync
* Data logic setter fix
* feedback
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* Hardcode the get_type per product class
* Initial look through getters and setters and abstract data
* Missing var
* Fixed coding standards and improved the docblocks
* Get cached terms from wc_get_related_terms()
* Fixed wrong variable in wc_get_related_terms
* Use count() instead of sizeof()
* Add related product functions and deprecate those in class.
* No need to exclude ID
* Sanitize ids later
* Clean up the abstract product class a bit, deprecate two functions we have renamed, make update & create work properly, and add some tests for it.
* Remove unneeded comments
* wc_get_product_term_ids instead of related wording and use in other places.
get_the_terms is used here and also handles caching, something
wp_get_post_terms does not.
* Handle PR feedback: Remove duplicate regular_price update, allow changing of post status for products, remove deprecation for get_title since we might still offer it as a function
* External Product CRUD
* _virtual meta should be 'no', not taxable, in product unit test helper
* Bump template version
* Made abstract function useful
* Grouped product class
* Tests
* Move children to meta and update test
* Use get_upsell_ids
* Spacing in query
* Moving and refactoring methods
* Availability html
* Tidy/add todos
* Rename method
* Put back review functions (still todo)
* missing $this
* get_price_including_tax/excluding_tax functions
* wc_get_price_to_display
* Price handling
* [Product CRUD] Variable (#12146)
* [Product CRUD] Variable Products
* Handle PR feedback.
* [Product CRUD] Grouped Handling (#12151)
* Handle grouped product saving
* Update routine
* [Product CRUD] Product crud terms (#12149)
* Category and tag id handling
* Replace template functions
* Remove todo
* Handle default name in save function
* Product crud admin save routine (#12174)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Spacing
* Fix comment
* wc_implode_text_attributes helper function
* [Product CRUD] Product crud admin use getters (#12196)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Move settings into new files
* Refactor panels and use getters
* Use getters for variation panel
* Revert save variation changes for now
* Add todos
* Fix downloads
* REST API CRUD Updates
* Additional API updates/fixes. Added some todos
* Fix final failing tests and implementing setters/getters and attributes functionality.
* Fix comparison for is_on_sale and remove download_type from WC_Product.
* Add a wc_get_products wrapper.
* Remove the download type input from the product data metabox for downloadable products. (#12221)
* [Product CRUD] Variations - setters, getters and admin. (#12228)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* Feedback fixes
* Implement CRUD in the legacy REST API
* Handle PR feedback
* [Product CRUD] Getter setter proxy methods (#12236)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* get_prop implementation in abstract and data classes
* Implement set_prop
* Change handling
* Array key exists
* set_object_read
* Use get_the_terms() instead of wp_get_post_terms()
wp_get_post_terms() is a wrapper around wp_get_object_terms() which does not
use the object cache, and generates a database query every time it is used.
get_the_terms() however can use data from the object cache if present.
* [Product CRUD] Variable, variation, notices, and stock handling (#12277)
* No longer needed
* Remove old todos
* Use getters in admin list
* Related and upsells update for CRUD
* Fix notice in gallery
* Variable fixes and todos
* Context
* Price sync
* Revert variation attributes change
* Return parent data in view context
* Defer term counting
* wc_find_matching_product_variation
* Stock manage tweaks
* Stock fixes
* Correct id
* correct id
* Better sync
* Data logic setter fix
* feedback
* Prevent notices
* Handle image_id from parent
* Fix error
* Remove _wc_save_product_price
* Remove todo
* Fixed wrong variation URLs
* Fixed undefined $image_id in WC_Product_Variation::get_image_id()
* Allow wc_rest_prepare_date_response() handle timestamps
* Updated get methods on REST API for variations
* Use variations CRUD to save variations metadata
* [Product CRUD] Abstract todos (#12305)
* Get dimensions and weights, with soft deprecation
* Product attributes
* Ratings
* Fix read method
* Downloads
* Feedback
* Revert "[Product CRUD] Abstract todos (#12305)"
This reverts commit 9a6136fcf88fec16f97457b7c8a4388f7587bfa2.
* Remove deprecated get_variation_id()
* New default attributes method
* [Product CRUD] Product Datastore (#12317)
* Fix up tests in the product/* folder.
* Handle data store updates for grouped, variable, external, simple, and general data store updates for products.
* Variations & variable changes.
* Update -functions.php calls to use data store.
* Add an interface for the public product data store methods.
* Finished product factory tests
* Correctly delete in the api, fix up some comments, and implement an interface for the public variable methods.
* Fix up delete in all versions of the api
* Handle feedback
* Match protected decloration to parent
* Product crud abstract todos (#12316)
* Get dimensions and weights, with soft deprecation
* Product attributes
* Ratings
* Fix read method
* Downloads
* Feedback
* Fix up store
* Fixed method returning in write context
* Fix error in variation admin
* Check for parent value - fixes tax class
* Remove old/complete todos
* Allow set tax class as "parent"
* Removed duplicated sync
* Fixed wrong variation URLs
* Fixed undefined $image_id in WC_Product_Variation::get_image_id()
* Allow wc_rest_prepare_date_response() handle timestamps
* Updated get methods on REST API for variations
* Use variations CRUD to save variations metadata
* Remove deprecated get_variation_id()
* New default attributes method
* Fixed method returning in write context
* Allow set tax class as "parent"
* Removed duplicated sync
* Fixed coding standards
* TODO is not accurate.
* Should pass WC_Product instancies to WC_Comments methods (#12327)
* Use new method in abstract order class to prevent headers sent issue in tests
* Fixed variable description in REST API
* Updated how create initial product variation
* Fixed a few fatal errors and warnings in Products CRUD (#12329)
* Fixed a few fatal errors and warnings in Products CRUD
* Fixed sync functions
* Add variations CRUD to legacy API (#12331)
* Apply crud to variable products in legacy API v1
* New REST API do not need fallback for default attributes
* Apply variations CRUD to legacy API v2
* Legacy v2 - save default attributes
* Variations in legacy API v2 do not have descriptions
* Fixed legacy API v2 variations params
* Applied variations CRUD to legacy API v3
* Sync before save in legacy apis
* Punc
* Removed API todos
* Removed test
* Products endpoint tweaks (#12354)
* Var type already normalized on CRUD
* Let Product CRUD handle with validation, sanitization and conditional checks
* Set downloads using WC_Product_Download
* Stop try catch exceptions more than one time
* Handle WC_Data_Exception in legacy API
* Complete remove products when fails on creating
* On creating I mean!
* Already have a method to complete delete products
* Fixed standards using WP CodeSniffer
* get_the_terms() returns false when empty
* get_manage_stock returns boolean
@claudiosanches
* Merge conflict
* Variations API endpoint fixes
* Product CRUD improvements (#12359)
* args is not used any more - remove todo
* Added test for attributes
* wc_get_price_excluding_tax usage
* parent usage
* Fix rating counts
* Test fixes
* Cleanup after tests
* Make sure status transition code runs even during API calls, not just in admin.
* Default visibility
* Fix attribute setting in API
* Use get name instead of get title
* variation id usage
* Improved cross sell templates
* variation_data
* Grouped product sync
* Notices
* Sync is not needed in API
* Delete
* Rename interfaces
* Update counts in data store
2016-11-16 12:38:24 +00:00
* @ return object
*/
public function get_data_store () {
return $this -> data_store ;
}
2016-03-11 19:50:44 +00:00
/**
* Returns the unique ID for this object .
2017-02-06 17:06:18 +00:00
*
* @ since 2.6 . 0
2016-03-11 19:50:44 +00:00
* @ return int
*/
2016-09-09 12:34:49 +00:00
public function get_id () {
return $this -> id ;
}
2016-03-11 19:50:44 +00:00
/**
2016-11-14 18:18:08 +00:00
* Delete an object , set the ID to 0 , and return result .
*
2017-02-06 17:06:18 +00:00
* @ since 2.6 . 0
2016-11-14 18:18:08 +00:00
* @ param bool $force_delete
* @ return bool result
2016-03-11 19:50:44 +00:00
*/
2016-11-08 09:39:47 +00:00
public function delete ( $force_delete = false ) {
if ( $this -> data_store ) {
2016-11-15 19:35:10 +00:00
$this -> data_store -> delete ( $this , array ( 'force_delete' => $force_delete ) );
2016-11-14 18:18:08 +00:00
$this -> set_id ( 0 );
return true ;
2016-11-08 09:39:47 +00:00
}
2016-11-14 18:18:08 +00:00
return false ;
2016-11-08 09:39:47 +00:00
}
2016-03-11 19:50:44 +00:00
/**
2017-03-28 17:58:51 +00:00
* Save should create or update based on object existence .
2016-11-08 10:16:16 +00:00
*
2017-02-06 17:06:18 +00:00
* @ since 2.6 . 0
2016-11-08 10:16:16 +00:00
* @ return int
2016-03-11 19:50:44 +00:00
*/
2016-11-08 09:39:47 +00:00
public function save () {
if ( $this -> data_store ) {
2016-12-22 17:41:23 +00:00
// Trigger action before saving to the DB. Allows you to adjust object props before save.
2016-12-19 17:09:52 +00:00
do_action ( 'woocommerce_before_' . $this -> object_type . '_object_save' , $this , $this -> data_store );
2016-11-08 09:39:47 +00:00
if ( $this -> get_id () ) {
$this -> data_store -> update ( $this );
} else {
$this -> data_store -> create ( $this );
}
}
2017-07-20 17:01:14 +00:00
return $this -> get_id ();
2016-11-08 09:39:47 +00:00
}
2016-03-11 19:50:44 +00:00
2016-03-17 15:22:29 +00:00
/**
* Change data to JSON format .
2017-02-06 17:06:18 +00:00
*
* @ since 2.6 . 0
2016-03-17 15:22:29 +00:00
* @ return string Data in JSON format .
*/
public function __toString () {
return json_encode ( $this -> get_data () );
}
/**
* Returns all data for this object .
2017-02-06 17:06:18 +00:00
*
* @ since 2.6 . 0
2016-03-17 15:22:29 +00:00
* @ return array
*/
public function get_data () {
2016-09-09 12:34:49 +00:00
return array_merge ( array ( 'id' => $this -> get_id () ), $this -> data , array ( 'meta_data' => $this -> get_meta_data () ) );
2016-03-17 15:22:29 +00:00
}
2016-11-08 09:39:47 +00:00
/**
* Returns array of expected data keys for this object .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 09:39:47 +00:00
* @ return array
*/
public function get_data_keys () {
return array_keys ( $this -> data );
}
/**
* Returns all " extra " data keys for an object ( for sub objects like product types ) .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 09:39:47 +00:00
* @ return array
*/
public function get_extra_data_keys () {
return array_keys ( $this -> extra_data );
}
2016-08-25 09:32:42 +00:00
/**
* Filter null meta values from array .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-10-02 12:12:33 +00:00
* @ param mixed $meta Meta value to check .
2016-08-25 09:32:42 +00:00
* @ return bool
*/
2016-08-25 09:45:50 +00:00
protected function filter_null_meta ( $meta ) {
2017-10-04 13:12:43 +00:00
return ! is_null ( $meta -> value );
2016-08-25 09:32:42 +00:00
}
2016-03-11 19:50:44 +00:00
/**
2016-03-17 16:38:56 +00:00
* Get All Meta Data .
2017-02-06 17:06:18 +00:00
*
2016-03-15 22:44:04 +00:00
* @ since 2.6 . 0
2017-10-04 13:12:43 +00:00
* @ return array of objects .
2016-03-11 19:50:44 +00:00
*/
public function get_meta_data () {
2016-12-14 11:23:17 +00:00
$this -> maybe_read_meta_data ();
2017-12-05 13:14:12 +00:00
return array_values ( array_filter ( $this -> meta_data , array ( $this , 'filter_null_meta' ) ) );
2016-03-11 19:50:44 +00:00
}
2017-06-06 17:10:24 +00:00
/**
2017-06-08 11:00:28 +00:00
* Check if the key is an internal one .
2017-06-06 17:10:24 +00:00
*
2017-06-07 14:20:09 +00:00
* @ since 3.2 . 0
2017-10-27 15:23:05 +00:00
* @ param string $key Key to check .
2017-06-08 11:00:28 +00:00
* @ return bool true if it ' s an internal key , false otherwise
2017-06-06 17:10:24 +00:00
*/
2017-06-08 11:00:28 +00:00
protected function is_internal_meta_key ( $key ) {
2017-10-27 15:23:05 +00:00
$internal_meta_key = ! empty ( $key ) && $this -> data_store && in_array ( $key , $this -> data_store -> get_internal_meta_keys () );
if ( ! $internal_meta_key ) {
return false ;
}
2017-10-24 01:22:31 +00:00
$has_setter_or_getter = is_callable ( array ( $this , 'set_' . $key ) ) || is_callable ( array ( $this , 'get_' . $key ) );
2017-06-08 11:00:28 +00:00
2017-10-27 15:23:05 +00:00
if ( ! $has_setter_or_getter ) {
return false ;
2017-06-06 17:10:24 +00:00
}
2017-11-21 17:50:30 +00:00
/* translators: %s: $key Key to check */
2017-10-27 15:23:05 +00:00
wc_doing_it_wrong ( __FUNCTION__ , sprintf ( __ ( 'Generic add/update/get meta methods should not be used for internal meta data, including "%s". Use getters and setters.' , 'woocommerce' ), $key ), '3.2.0' );
return true ;
2017-06-06 17:10:24 +00:00
}
2016-03-11 19:50:44 +00:00
/**
* Get Meta Data by Key .
2017-02-06 17:06:18 +00:00
*
2016-11-14 14:20:41 +00:00
* @ since 2.6 . 0
2016-03-11 19:50:44 +00:00
* @ param string $key
* @ param bool $single return first found meta with key , or all with $key
2016-11-14 14:20:41 +00:00
* @ param string $context What the value is for . Valid values are view and edit .
2016-03-11 19:50:44 +00:00
* @ return mixed
*/
2016-11-14 14:20:41 +00:00
public function get_meta ( $key = '' , $single = true , $context = 'view' ) {
2017-06-08 11:00:28 +00:00
if ( $this -> is_internal_meta_key ( $key ) ) {
2017-06-07 10:30:03 +00:00
$function = 'get_' . $key ;
if ( is_callable ( array ( $this , $function ) ) ) {
return $this -> { $function }();
}
}
2016-12-14 11:23:17 +00:00
$this -> maybe_read_meta_data ();
2017-04-14 20:58:00 +00:00
$meta_data = $this -> get_meta_data ();
$array_keys = array_keys ( wp_list_pluck ( $meta_data , 'key' ), $key );
2017-03-02 19:16:49 +00:00
$value = $single ? '' : array ();
2016-03-11 19:50:44 +00:00
2016-06-06 16:24:31 +00:00
if ( ! empty ( $array_keys ) ) {
2017-04-14 20:58:00 +00:00
// We don't use the $this->meta_data property directly here because we don't want meta with a null value (i.e. meta which has been deleted via $this->delete_meta_data())
2016-03-11 19:50:44 +00:00
if ( $single ) {
2017-04-14 20:58:00 +00:00
$value = $meta_data [ current ( $array_keys ) ] -> value ;
2016-03-11 19:50:44 +00:00
} else {
2017-04-14 20:58:00 +00:00
$value = array_intersect_key ( $meta_data , array_flip ( $array_keys ) );
2016-03-11 19:50:44 +00:00
}
2016-11-14 14:20:41 +00:00
if ( 'view' === $context ) {
$value = apply_filters ( $this -> get_hook_prefix () . $key , $value , $this );
}
2016-03-11 19:50:44 +00:00
}
return $value ;
}
2017-03-14 12:08:33 +00:00
/**
* See if meta data exists , since get_meta always returns a '' or array () .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-03-14 12:08:33 +00:00
* @ param string $key
* @ return boolean
*/
2017-03-14 16:49:13 +00:00
public function meta_exists ( $key = '' ) {
2017-03-14 12:08:33 +00:00
$this -> maybe_read_meta_data ();
$array_keys = wp_list_pluck ( $this -> get_meta_data (), 'key' );
return in_array ( $key , $array_keys );
}
2016-03-11 19:50:44 +00:00
/**
* Set all meta data from array .
2017-02-06 17:06:18 +00:00
*
2016-03-15 22:44:04 +00:00
* @ since 2.6 . 0
2016-03-11 19:50:44 +00:00
* @ param array $data Key / Value pairs
*/
public function set_meta_data ( $data ) {
if ( ! empty ( $data ) && is_array ( $data ) ) {
2016-12-14 11:23:17 +00:00
$this -> maybe_read_meta_data ();
2016-03-18 19:18:41 +00:00
foreach ( $data as $meta ) {
2016-03-11 19:50:44 +00:00
$meta = ( array ) $meta ;
2016-08-22 18:37:34 +00:00
if ( isset ( $meta [ 'key' ], $meta [ 'value' ], $meta [ 'id' ] ) ) {
2017-04-26 14:18:41 +00:00
$this -> meta_data [] = new WC_Meta_Data ( array (
2016-08-22 19:58:34 +00:00
'id' => $meta [ 'id' ],
2016-08-22 18:37:34 +00:00
'key' => $meta [ 'key' ],
'value' => $meta [ 'value' ],
2017-04-26 14:18:41 +00:00
) );
2016-03-11 19:50:44 +00:00
}
}
}
}
/**
* Add meta data .
2017-02-06 17:06:18 +00:00
*
2016-03-15 22:44:04 +00:00
* @ since 2.6 . 0
2016-06-07 10:06:41 +00:00
* @ param string $key Meta key
* @ param string $value Meta value
* @ param bool $unique Should this be a unique key ?
2016-03-11 19:50:44 +00:00
*/
public function add_meta_data ( $key , $value , $unique = false ) {
2017-06-08 11:00:28 +00:00
if ( $this -> is_internal_meta_key ( $key ) ) {
2017-06-07 10:30:03 +00:00
$function = 'set_' . $key ;
if ( is_callable ( array ( $this , $function ) ) ) {
return $this -> { $function }( $value );
}
}
2016-12-14 11:23:17 +00:00
$this -> maybe_read_meta_data ();
2016-03-11 19:50:44 +00:00
if ( $unique ) {
2016-08-25 09:45:50 +00:00
$this -> delete_meta_data ( $key );
2016-03-11 19:50:44 +00:00
}
2017-04-26 14:18:41 +00:00
$this -> meta_data [] = new WC_Meta_Data ( array (
2016-03-11 19:50:44 +00:00
'key' => $key ,
'value' => $value ,
2017-04-26 14:18:41 +00:00
) );
2016-03-11 19:50:44 +00:00
}
/**
* Update meta data by key or ID , if provided .
2017-02-06 17:06:18 +00:00
* @ since 2.6 . 0
2017-05-15 11:50:52 +00:00
*
2016-03-11 19:50:44 +00:00
* @ param string $key
* @ param string $value
* @ param int $meta_id
*/
2017-11-21 17:50:30 +00:00
public function update_meta_data ( $key , $value , $meta_id = 0 ) {
2017-06-08 11:00:28 +00:00
if ( $this -> is_internal_meta_key ( $key ) ) {
2017-06-07 10:30:03 +00:00
$function = 'set_' . $key ;
if ( is_callable ( array ( $this , $function ) ) ) {
return $this -> { $function }( $value );
}
}
2016-12-14 11:23:17 +00:00
$this -> maybe_read_meta_data ();
2017-08-08 14:28:31 +00:00
2017-06-07 10:31:42 +00:00
$array_key = $meta_id ? array_keys ( wp_list_pluck ( $this -> meta_data , 'id' ), $meta_id ) : '' ;
if ( $array_key ) {
2017-04-27 13:28:19 +00:00
$meta = $this -> meta_data [ current ( $array_key ) ];
$meta -> key = $key ;
$meta -> value = $value ;
2016-03-11 19:50:44 +00:00
} else {
$this -> add_meta_data ( $key , $value , true );
}
}
/**
* Delete meta data .
2017-02-06 17:06:18 +00:00
*
2016-03-15 22:44:04 +00:00
* @ since 2.6 . 0
2017-05-31 23:47:52 +00:00
* @ param string $key Meta key
2016-03-11 19:50:44 +00:00
*/
public function delete_meta_data ( $key ) {
2016-12-14 11:23:17 +00:00
$this -> maybe_read_meta_data ();
2017-06-07 10:31:42 +00:00
$array_keys = array_keys ( wp_list_pluck ( $this -> meta_data , 'key' ), $key );
if ( $array_keys ) {
2016-08-25 09:32:42 +00:00
foreach ( $array_keys as $array_key ) {
2016-09-09 12:34:49 +00:00
$this -> meta_data [ $array_key ] -> value = null ;
2016-08-25 09:32:42 +00:00
}
}
2016-03-11 19:50:44 +00:00
}
/**
2016-08-19 12:43:33 +00:00
* Delete meta data .
2017-02-06 17:06:18 +00:00
*
2016-08-19 12:43:33 +00:00
* @ since 2.6 . 0
* @ param int $mid Meta ID
*/
public function delete_meta_data_by_mid ( $mid ) {
2016-12-14 11:23:17 +00:00
$this -> maybe_read_meta_data ();
2017-06-07 10:31:42 +00:00
$array_keys = array_keys ( wp_list_pluck ( $this -> meta_data , 'id' ), $mid );
if ( $array_keys ) {
2016-08-25 09:32:42 +00:00
foreach ( $array_keys as $array_key ) {
2016-09-09 12:34:49 +00:00
$this -> meta_data [ $array_key ] -> value = null ;
2016-08-25 09:32:42 +00:00
}
}
2016-08-19 12:43:33 +00:00
}
2016-12-14 11:23:17 +00:00
/**
* Read meta data if null .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-12-14 11:23:17 +00:00
*/
protected function maybe_read_meta_data () {
if ( is_null ( $this -> meta_data ) ) {
$this -> read_meta_data ();
}
}
2016-08-19 12:43:33 +00:00
/**
2016-03-11 19:50:44 +00:00
* Read Meta Data from the database . Ignore any internal properties .
2016-12-08 10:56:45 +00:00
* Uses it ' s own caches because get_metadata does not provide meta_ids .
2016-11-17 11:16:07 +00:00
*
2016-03-15 22:44:04 +00:00
* @ since 2.6 . 0
2016-11-17 11:16:07 +00:00
* @ param bool $force_read True to force a new DB read ( and update cache ) .
2016-03-11 19:50:44 +00:00
*/
2016-11-17 11:16:07 +00:00
public function read_meta_data ( $force_read = false ) {
$this -> meta_data = array ();
2016-03-11 19:50:44 +00:00
$cache_loaded = false ;
if ( ! $this -> get_id () ) {
return ;
}
2016-11-21 23:48:49 +00:00
if ( ! $this -> data_store ) {
return ;
}
2016-09-09 12:34:49 +00:00
if ( ! empty ( $this -> cache_group ) ) {
2017-05-30 13:37:29 +00:00
// Prefix by group allows invalidation by group until https://core.trac.wordpress.org/ticket/4476 is implemented.
$cache_key = WC_Cache_Helper :: get_cache_prefix ( $this -> cache_group ) . WC_Cache_Helper :: get_cache_prefix ( 'object_' . $this -> get_id () ) . 'object_meta_' . $this -> get_id ();
2016-11-17 11:16:07 +00:00
}
2016-03-11 19:50:44 +00:00
2016-11-17 11:16:07 +00:00
if ( ! $force_read ) {
if ( ! empty ( $this -> cache_group ) ) {
2017-04-26 17:51:52 +00:00
$cached_meta = wp_cache_get ( $cache_key , $this -> cache_group );
$cache_loaded = ! empty ( $cached_meta );
2016-03-11 19:50:44 +00:00
}
}
2017-04-26 17:51:52 +00:00
$raw_meta_data = $cache_loaded ? $cached_meta : $this -> data_store -> read_meta ( $this );
if ( $raw_meta_data ) {
foreach ( $raw_meta_data as $meta ) {
2017-04-27 16:29:09 +00:00
$this -> meta_data [] = new WC_Meta_Data ( array (
2017-04-26 17:51:52 +00:00
'id' => ( int ) $meta -> meta_id ,
'key' => $meta -> meta_key ,
'value' => maybe_unserialize ( $meta -> meta_value ),
2017-04-27 16:29:09 +00:00
) );
2017-04-26 17:51:52 +00:00
}
2016-03-11 19:50:44 +00:00
2017-04-26 17:51:52 +00:00
if ( ! $cache_loaded && ! empty ( $this -> cache_group ) ) {
wp_cache_set ( $cache_key , $raw_meta_data , $this -> cache_group );
2016-03-11 19:50:44 +00:00
}
}
}
/**
* Update Meta Data in the database .
2017-02-06 17:06:18 +00:00
*
2016-03-15 22:44:04 +00:00
* @ since 2.6 . 0
2016-03-11 19:50:44 +00:00
*/
2016-11-09 12:21:18 +00:00
public function save_meta_data () {
2016-12-09 12:18:21 +00:00
if ( ! $this -> data_store || is_null ( $this -> meta_data ) ) {
2016-11-21 23:48:49 +00:00
return ;
}
2016-09-09 12:34:49 +00:00
foreach ( $this -> meta_data as $array_key => $meta ) {
2016-08-25 09:32:42 +00:00
if ( is_null ( $meta -> value ) ) {
if ( ! empty ( $meta -> id ) ) {
2016-11-21 23:48:49 +00:00
$this -> data_store -> delete_meta ( $this , $meta );
2017-02-11 15:45:13 +00:00
unset ( $this -> meta_data [ $array_key ] );
2016-08-25 09:32:42 +00:00
}
} elseif ( empty ( $meta -> id ) ) {
2017-06-01 15:46:05 +00:00
$meta -> id = $this -> data_store -> add_meta ( $this , $meta );
2017-04-26 14:18:41 +00:00
$meta -> apply_changes ();
2016-03-11 19:50:44 +00:00
} else {
2017-04-26 14:18:41 +00:00
if ( $meta -> get_changes () ) {
$this -> data_store -> update_meta ( $this , $meta );
$meta -> apply_changes ();
}
2016-03-11 19:50:44 +00:00
}
}
2016-09-09 12:34:49 +00:00
if ( ! empty ( $this -> cache_group ) ) {
2017-05-30 13:37:29 +00:00
$cache_key = WC_Cache_Helper :: get_cache_prefix ( $this -> cache_group ) . WC_Cache_Helper :: get_cache_prefix ( 'object_' . $this -> get_id () ) . 'object_meta_' . $this -> get_id ();
wp_cache_delete ( $cache_key , $this -> cache_group );
2016-03-11 19:50:44 +00:00
}
}
2016-09-09 12:34:49 +00:00
/**
* Set ID .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-09-09 12:34:49 +00:00
* @ param int $id
*/
public function set_id ( $id ) {
$this -> id = absint ( $id );
}
2016-08-24 11:34:19 +00:00
/**
* Set all props to default values .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-08-24 11:34:19 +00:00
*/
2016-11-08 09:39:47 +00:00
public function set_defaults () {
2016-11-08 10:16:16 +00:00
$this -> data = $this -> default_data ;
$this -> changes = array ();
$this -> set_object_read ( false );
2017-06-07 10:31:42 +00:00
}
2016-11-08 10:16:16 +00:00
/**
* Set object read property .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 10:16:16 +00:00
* @ param boolean $read
*/
public function set_object_read ( $read = true ) {
$this -> object_read = ( bool ) $read ;
2016-08-24 11:34:19 +00:00
}
2016-11-16 11:24:46 +00:00
/**
* Get object read property .
2017-02-06 17:06:18 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-16 11:24:46 +00:00
* @ return boolean
*/
public function get_object_read () {
return ( bool ) $this -> object_read ;
}
2016-08-25 12:05:27 +00:00
/**
* Set a collection of props in one go , collect any errors , and return the result .
2016-11-08 10:16:16 +00:00
* Only sets using public methods .
2016-11-17 16:02:09 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-05-15 11:50:52 +00:00
*
2017-02-06 17:06:18 +00:00
* @ param array $props Key value pairs to set . Key is the prop and should map to a setter function name .
2017-05-15 11:50:52 +00:00
* @ param string $context
*
* @ return bool | WP_Error
2016-08-25 12:05:27 +00:00
*/
WIP - Product CRUD (#12065)
* Created function to get the catalog visibility options
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* Hardcode the get_type per product class
* Initial look through getters and setters and abstract data
* Missing var
* Add related product functions and deprecate those in class.
* No need to exclude ID
* Fixed coding standards and improved the docblocks
* Get cached terms from wc_get_related_terms()
* Fixed wrong variable in wc_get_related_terms
* Use count() instead of sizeof()
* Sanitize ids later
* Remove unneeded comments
* wc_get_product_term_ids instead of related wording and use in other places.
get_the_terms is used here and also handles caching, something
wp_get_post_terms does not.
* Clean up the abstract product class a bit, deprecate two functions we have renamed, make update & create work properly, and add some tests for it.
* Bump template version
* Handle PR feedback: Remove duplicate regular_price update, allow changing of post status for products, remove deprecation for get_title since we might still offer it as a function
* Made abstract function useful
* External Product CRUD
* _virtual meta should be 'no', not taxable, in product unit test helper
* Grouped product class
* Tests
* Move children to meta and update test
* Use get_upsell_ids
* Spacing in query
* Moving and refactoring methods
* Availability html
* Tidy/add todos
* Rename method
* Put back review functions (still todo)
* missing $this
* get_price_including_tax/excluding_tax functions
* wc_get_price_to_display
* Price handling
* [Product CRUD] Variable (#12146)
* [Product CRUD] Variable Products
* Handle PR feedback.
* [Product CRUD] Grouped Handling (#12151)
* Handle grouped product saving
* Update routine
* [Product CRUD] Product crud terms (#12149)
* Category and tag id handling
* Replace template functions
* Remove todo
* Handle default name in save function
* Product crud admin save routine (#12174)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Spacing
* Fix comment
* wc_implode_text_attributes helper function
* [Product CRUD] Product crud admin use getters (#12196)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Move settings into new files
* Refactor panels and use getters
* Use getters for variation panel
* Revert save variation changes for now
* Add todos
* Fix downloads
* REST API CRUD Updates
* Additional API updates/fixes. Added some todos
* Fix final failing tests and implementing setters/getters and attributes functionality.
* Fix comparison for is_on_sale and remove download_type from WC_Product.
* Add a wc_get_products wrapper.
* Remove the download type input from the product data metabox for downloadable products. (#12221)
* [Product CRUD] Variations - setters, getters and admin. (#12228)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* Feedback fixes
* Implement CRUD in the legacy REST API
* Handle PR feedback
* [Product CRUD] Getter setter proxy methods (#12236)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* get_prop implementation in abstract and data classes
* Implement set_prop
* Change handling
* Array key exists
* set_object_read
* Use get_the_terms() instead of wp_get_post_terms()
wp_get_post_terms() is a wrapper around wp_get_object_terms() which does not
use the object cache, and generates a database query every time it is used.
get_the_terms() however can use data from the object cache if present.
* Allow WP_Query to preload post data, and meta in wc_get_products()
Allow WP_Query to bulk query for post data and meta if more than
just IDs are requested from wc_get_products(). Reduces query count
significantly.
* [Product CRUD] Variable, variation, notices, and stock handling (#12277)
* No longer needed
* Remove old todos
* Use getters in admin list
* Related and upsells update for CRUD
* Fix notice in gallery
* Variable fixes and todos
* Context
* Price sync
* Revert variation attributes change
* Return parent data in view context
* Defer term counting
* wc_find_matching_product_variation
* Stock manage tweaks
* Stock fixes
* Correct id
* correct id
* Better sync
* Data logic setter fix
* feedback
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* Hardcode the get_type per product class
* Initial look through getters and setters and abstract data
* Missing var
* Fixed coding standards and improved the docblocks
* Get cached terms from wc_get_related_terms()
* Fixed wrong variable in wc_get_related_terms
* Use count() instead of sizeof()
* Add related product functions and deprecate those in class.
* No need to exclude ID
* Sanitize ids later
* Clean up the abstract product class a bit, deprecate two functions we have renamed, make update & create work properly, and add some tests for it.
* Remove unneeded comments
* wc_get_product_term_ids instead of related wording and use in other places.
get_the_terms is used here and also handles caching, something
wp_get_post_terms does not.
* Handle PR feedback: Remove duplicate regular_price update, allow changing of post status for products, remove deprecation for get_title since we might still offer it as a function
* External Product CRUD
* _virtual meta should be 'no', not taxable, in product unit test helper
* Bump template version
* Made abstract function useful
* Grouped product class
* Tests
* Move children to meta and update test
* Use get_upsell_ids
* Spacing in query
* Moving and refactoring methods
* Availability html
* Tidy/add todos
* Rename method
* Put back review functions (still todo)
* missing $this
* get_price_including_tax/excluding_tax functions
* wc_get_price_to_display
* Price handling
* [Product CRUD] Variable (#12146)
* [Product CRUD] Variable Products
* Handle PR feedback.
* [Product CRUD] Grouped Handling (#12151)
* Handle grouped product saving
* Update routine
* [Product CRUD] Product crud terms (#12149)
* Category and tag id handling
* Replace template functions
* Remove todo
* Handle default name in save function
* Product crud admin save routine (#12174)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Spacing
* Fix comment
* wc_implode_text_attributes helper function
* [Product CRUD] Product crud admin use getters (#12196)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Move settings into new files
* Refactor panels and use getters
* Use getters for variation panel
* Revert save variation changes for now
* Add todos
* Fix downloads
* REST API CRUD Updates
* Additional API updates/fixes. Added some todos
* Fix final failing tests and implementing setters/getters and attributes functionality.
* Fix comparison for is_on_sale and remove download_type from WC_Product.
* Add a wc_get_products wrapper.
* Remove the download type input from the product data metabox for downloadable products. (#12221)
* [Product CRUD] Variations - setters, getters and admin. (#12228)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* Feedback fixes
* Implement CRUD in the legacy REST API
* Handle PR feedback
* [Product CRUD] Getter setter proxy methods (#12236)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* get_prop implementation in abstract and data classes
* Implement set_prop
* Change handling
* Array key exists
* set_object_read
* Use get_the_terms() instead of wp_get_post_terms()
wp_get_post_terms() is a wrapper around wp_get_object_terms() which does not
use the object cache, and generates a database query every time it is used.
get_the_terms() however can use data from the object cache if present.
* [Product CRUD] Variable, variation, notices, and stock handling (#12277)
* No longer needed
* Remove old todos
* Use getters in admin list
* Related and upsells update for CRUD
* Fix notice in gallery
* Variable fixes and todos
* Context
* Price sync
* Revert variation attributes change
* Return parent data in view context
* Defer term counting
* wc_find_matching_product_variation
* Stock manage tweaks
* Stock fixes
* Correct id
* correct id
* Better sync
* Data logic setter fix
* feedback
* Prevent notices
* Handle image_id from parent
* Fix error
* Remove _wc_save_product_price
* Remove todo
* Fixed wrong variation URLs
* Fixed undefined $image_id in WC_Product_Variation::get_image_id()
* Allow wc_rest_prepare_date_response() handle timestamps
* Updated get methods on REST API for variations
* Use variations CRUD to save variations metadata
* [Product CRUD] Abstract todos (#12305)
* Get dimensions and weights, with soft deprecation
* Product attributes
* Ratings
* Fix read method
* Downloads
* Feedback
* Revert "[Product CRUD] Abstract todos (#12305)"
This reverts commit 9a6136fcf88fec16f97457b7c8a4388f7587bfa2.
* Remove deprecated get_variation_id()
* New default attributes method
* [Product CRUD] Product Datastore (#12317)
* Fix up tests in the product/* folder.
* Handle data store updates for grouped, variable, external, simple, and general data store updates for products.
* Variations & variable changes.
* Update -functions.php calls to use data store.
* Add an interface for the public product data store methods.
* Finished product factory tests
* Correctly delete in the api, fix up some comments, and implement an interface for the public variable methods.
* Fix up delete in all versions of the api
* Handle feedback
* Match protected decloration to parent
* Product crud abstract todos (#12316)
* Get dimensions and weights, with soft deprecation
* Product attributes
* Ratings
* Fix read method
* Downloads
* Feedback
* Fix up store
* Fixed method returning in write context
* Fix error in variation admin
* Check for parent value - fixes tax class
* Remove old/complete todos
* Allow set tax class as "parent"
* Removed duplicated sync
* Fixed wrong variation URLs
* Fixed undefined $image_id in WC_Product_Variation::get_image_id()
* Allow wc_rest_prepare_date_response() handle timestamps
* Updated get methods on REST API for variations
* Use variations CRUD to save variations metadata
* Remove deprecated get_variation_id()
* New default attributes method
* Fixed method returning in write context
* Allow set tax class as "parent"
* Removed duplicated sync
* Fixed coding standards
* TODO is not accurate.
* Should pass WC_Product instancies to WC_Comments methods (#12327)
* Use new method in abstract order class to prevent headers sent issue in tests
* Fixed variable description in REST API
* Updated how create initial product variation
* Fixed a few fatal errors and warnings in Products CRUD (#12329)
* Fixed a few fatal errors and warnings in Products CRUD
* Fixed sync functions
* Add variations CRUD to legacy API (#12331)
* Apply crud to variable products in legacy API v1
* New REST API do not need fallback for default attributes
* Apply variations CRUD to legacy API v2
* Legacy v2 - save default attributes
* Variations in legacy API v2 do not have descriptions
* Fixed legacy API v2 variations params
* Applied variations CRUD to legacy API v3
* Sync before save in legacy apis
* Punc
* Removed API todos
* Removed test
* Products endpoint tweaks (#12354)
* Var type already normalized on CRUD
* Let Product CRUD handle with validation, sanitization and conditional checks
* Set downloads using WC_Product_Download
* Stop try catch exceptions more than one time
* Handle WC_Data_Exception in legacy API
* Complete remove products when fails on creating
* On creating I mean!
* Already have a method to complete delete products
* Fixed standards using WP CodeSniffer
* get_the_terms() returns false when empty
* get_manage_stock returns boolean
@claudiosanches
* Merge conflict
* Variations API endpoint fixes
* Product CRUD improvements (#12359)
* args is not used any more - remove todo
* Added test for attributes
* wc_get_price_excluding_tax usage
* parent usage
* Fix rating counts
* Test fixes
* Cleanup after tests
* Make sure status transition code runs even during API calls, not just in admin.
* Default visibility
* Fix attribute setting in API
* Use get name instead of get title
* variation id usage
* Improved cross sell templates
* variation_data
* Grouped product sync
* Notices
* Sync is not needed in API
* Delete
* Rename interfaces
* Update counts in data store
2016-11-16 12:38:24 +00:00
public function set_props ( $props , $context = 'set' ) {
2016-08-25 12:05:27 +00:00
$errors = new WP_Error ();
foreach ( $props as $prop => $value ) {
try {
2016-08-31 14:43:34 +00:00
if ( 'meta_data' === $prop ) {
continue ;
}
2016-08-25 12:05:27 +00:00
$setter = " set_ $prop " ;
if ( ! is_null ( $value ) && is_callable ( array ( $this , $setter ) ) ) {
2016-11-08 10:16:16 +00:00
$reflection = new ReflectionMethod ( $this , $setter );
if ( $reflection -> isPublic () ) {
$this -> { $setter }( $value );
}
2016-08-25 12:05:27 +00:00
}
} catch ( WC_Data_Exception $e ) {
$errors -> add ( $e -> getErrorCode (), $e -> getMessage () );
}
}
return sizeof ( $errors -> get_error_codes () ) ? $errors : true ;
}
2016-11-08 10:16:16 +00:00
/**
* Sets a prop for a setter method .
*
* This stores changes in a special array so we can track what needs saving
* the the DB later .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 10:16:16 +00:00
* @ param string $prop Name of prop to set .
* @ param mixed $value Value of the prop .
*/
protected function set_prop ( $prop , $value ) {
if ( array_key_exists ( $prop , $this -> data ) ) {
if ( true === $this -> object_read ) {
WIP - Product CRUD (#12065)
* Created function to get the catalog visibility options
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* Hardcode the get_type per product class
* Initial look through getters and setters and abstract data
* Missing var
* Add related product functions and deprecate those in class.
* No need to exclude ID
* Fixed coding standards and improved the docblocks
* Get cached terms from wc_get_related_terms()
* Fixed wrong variable in wc_get_related_terms
* Use count() instead of sizeof()
* Sanitize ids later
* Remove unneeded comments
* wc_get_product_term_ids instead of related wording and use in other places.
get_the_terms is used here and also handles caching, something
wp_get_post_terms does not.
* Clean up the abstract product class a bit, deprecate two functions we have renamed, make update & create work properly, and add some tests for it.
* Bump template version
* Handle PR feedback: Remove duplicate regular_price update, allow changing of post status for products, remove deprecation for get_title since we might still offer it as a function
* Made abstract function useful
* External Product CRUD
* _virtual meta should be 'no', not taxable, in product unit test helper
* Grouped product class
* Tests
* Move children to meta and update test
* Use get_upsell_ids
* Spacing in query
* Moving and refactoring methods
* Availability html
* Tidy/add todos
* Rename method
* Put back review functions (still todo)
* missing $this
* get_price_including_tax/excluding_tax functions
* wc_get_price_to_display
* Price handling
* [Product CRUD] Variable (#12146)
* [Product CRUD] Variable Products
* Handle PR feedback.
* [Product CRUD] Grouped Handling (#12151)
* Handle grouped product saving
* Update routine
* [Product CRUD] Product crud terms (#12149)
* Category and tag id handling
* Replace template functions
* Remove todo
* Handle default name in save function
* Product crud admin save routine (#12174)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Spacing
* Fix comment
* wc_implode_text_attributes helper function
* [Product CRUD] Product crud admin use getters (#12196)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Move settings into new files
* Refactor panels and use getters
* Use getters for variation panel
* Revert save variation changes for now
* Add todos
* Fix downloads
* REST API CRUD Updates
* Additional API updates/fixes. Added some todos
* Fix final failing tests and implementing setters/getters and attributes functionality.
* Fix comparison for is_on_sale and remove download_type from WC_Product.
* Add a wc_get_products wrapper.
* Remove the download type input from the product data metabox for downloadable products. (#12221)
* [Product CRUD] Variations - setters, getters and admin. (#12228)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* Feedback fixes
* Implement CRUD in the legacy REST API
* Handle PR feedback
* [Product CRUD] Getter setter proxy methods (#12236)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* get_prop implementation in abstract and data classes
* Implement set_prop
* Change handling
* Array key exists
* set_object_read
* Use get_the_terms() instead of wp_get_post_terms()
wp_get_post_terms() is a wrapper around wp_get_object_terms() which does not
use the object cache, and generates a database query every time it is used.
get_the_terms() however can use data from the object cache if present.
* Allow WP_Query to preload post data, and meta in wc_get_products()
Allow WP_Query to bulk query for post data and meta if more than
just IDs are requested from wc_get_products(). Reduces query count
significantly.
* [Product CRUD] Variable, variation, notices, and stock handling (#12277)
* No longer needed
* Remove old todos
* Use getters in admin list
* Related and upsells update for CRUD
* Fix notice in gallery
* Variable fixes and todos
* Context
* Price sync
* Revert variation attributes change
* Return parent data in view context
* Defer term counting
* wc_find_matching_product_variation
* Stock manage tweaks
* Stock fixes
* Correct id
* correct id
* Better sync
* Data logic setter fix
* feedback
* First methods for WP_Product crud
* Product set methods
* Fixed several erros while setting data
* Hardcode the get_type per product class
* Initial look through getters and setters and abstract data
* Missing var
* Fixed coding standards and improved the docblocks
* Get cached terms from wc_get_related_terms()
* Fixed wrong variable in wc_get_related_terms
* Use count() instead of sizeof()
* Add related product functions and deprecate those in class.
* No need to exclude ID
* Sanitize ids later
* Clean up the abstract product class a bit, deprecate two functions we have renamed, make update & create work properly, and add some tests for it.
* Remove unneeded comments
* wc_get_product_term_ids instead of related wording and use in other places.
get_the_terms is used here and also handles caching, something
wp_get_post_terms does not.
* Handle PR feedback: Remove duplicate regular_price update, allow changing of post status for products, remove deprecation for get_title since we might still offer it as a function
* External Product CRUD
* _virtual meta should be 'no', not taxable, in product unit test helper
* Bump template version
* Made abstract function useful
* Grouped product class
* Tests
* Move children to meta and update test
* Use get_upsell_ids
* Spacing in query
* Moving and refactoring methods
* Availability html
* Tidy/add todos
* Rename method
* Put back review functions (still todo)
* missing $this
* get_price_including_tax/excluding_tax functions
* wc_get_price_to_display
* Price handling
* [Product CRUD] Variable (#12146)
* [Product CRUD] Variable Products
* Handle PR feedback.
* [Product CRUD] Grouped Handling (#12151)
* Handle grouped product saving
* Update routine
* [Product CRUD] Product crud terms (#12149)
* Category and tag id handling
* Replace template functions
* Remove todo
* Handle default name in save function
* Product crud admin save routine (#12174)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Spacing
* Fix comment
* wc_implode_text_attributes helper function
* [Product CRUD] Product crud admin use getters (#12196)
* Initial props
* Work on admin saving
* Set/get attributes
* Atom was moaning about this before but no longer.
* Update get_shipping_class
* WC_Product_Attribute
* Use getter in admin panel
* Fix attribute saving
* Move settings into new files
* Refactor panels and use getters
* Use getters for variation panel
* Revert save variation changes for now
* Add todos
* Fix downloads
* REST API CRUD Updates
* Additional API updates/fixes. Added some todos
* Fix final failing tests and implementing setters/getters and attributes functionality.
* Fix comparison for is_on_sale and remove download_type from WC_Product.
* Add a wc_get_products wrapper.
* Remove the download type input from the product data metabox for downloadable products. (#12221)
* [Product CRUD] Variations - setters, getters and admin. (#12228)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* Feedback fixes
* Implement CRUD in the legacy REST API
* Handle PR feedback
* [Product CRUD] Getter setter proxy methods (#12236)
* Started on variation changes
* Stock functions
* Variation class
* Bulk change ->id to get_id() to fix variation form display
* Missing status
* Fix add to cart
* Start on stored data save
* save variation
* Save_variations
* Variation edit panel
* Save variations code works.
* Remove stored data code and fix save
* Improve legacy class
* wc_bool_to_string
* prepare_set_attributes
* Use wc_get_products
* More feedback fixes
* get_prop implementation in abstract and data classes
* Implement set_prop
* Change handling
* Array key exists
* set_object_read
* Use get_the_terms() instead of wp_get_post_terms()
wp_get_post_terms() is a wrapper around wp_get_object_terms() which does not
use the object cache, and generates a database query every time it is used.
get_the_terms() however can use data from the object cache if present.
* [Product CRUD] Variable, variation, notices, and stock handling (#12277)
* No longer needed
* Remove old todos
* Use getters in admin list
* Related and upsells update for CRUD
* Fix notice in gallery
* Variable fixes and todos
* Context
* Price sync
* Revert variation attributes change
* Return parent data in view context
* Defer term counting
* wc_find_matching_product_variation
* Stock manage tweaks
* Stock fixes
* Correct id
* correct id
* Better sync
* Data logic setter fix
* feedback
* Prevent notices
* Handle image_id from parent
* Fix error
* Remove _wc_save_product_price
* Remove todo
* Fixed wrong variation URLs
* Fixed undefined $image_id in WC_Product_Variation::get_image_id()
* Allow wc_rest_prepare_date_response() handle timestamps
* Updated get methods on REST API for variations
* Use variations CRUD to save variations metadata
* [Product CRUD] Abstract todos (#12305)
* Get dimensions and weights, with soft deprecation
* Product attributes
* Ratings
* Fix read method
* Downloads
* Feedback
* Revert "[Product CRUD] Abstract todos (#12305)"
This reverts commit 9a6136fcf88fec16f97457b7c8a4388f7587bfa2.
* Remove deprecated get_variation_id()
* New default attributes method
* [Product CRUD] Product Datastore (#12317)
* Fix up tests in the product/* folder.
* Handle data store updates for grouped, variable, external, simple, and general data store updates for products.
* Variations & variable changes.
* Update -functions.php calls to use data store.
* Add an interface for the public product data store methods.
* Finished product factory tests
* Correctly delete in the api, fix up some comments, and implement an interface for the public variable methods.
* Fix up delete in all versions of the api
* Handle feedback
* Match protected decloration to parent
* Product crud abstract todos (#12316)
* Get dimensions and weights, with soft deprecation
* Product attributes
* Ratings
* Fix read method
* Downloads
* Feedback
* Fix up store
* Fixed method returning in write context
* Fix error in variation admin
* Check for parent value - fixes tax class
* Remove old/complete todos
* Allow set tax class as "parent"
* Removed duplicated sync
* Fixed wrong variation URLs
* Fixed undefined $image_id in WC_Product_Variation::get_image_id()
* Allow wc_rest_prepare_date_response() handle timestamps
* Updated get methods on REST API for variations
* Use variations CRUD to save variations metadata
* Remove deprecated get_variation_id()
* New default attributes method
* Fixed method returning in write context
* Allow set tax class as "parent"
* Removed duplicated sync
* Fixed coding standards
* TODO is not accurate.
* Should pass WC_Product instancies to WC_Comments methods (#12327)
* Use new method in abstract order class to prevent headers sent issue in tests
* Fixed variable description in REST API
* Updated how create initial product variation
* Fixed a few fatal errors and warnings in Products CRUD (#12329)
* Fixed a few fatal errors and warnings in Products CRUD
* Fixed sync functions
* Add variations CRUD to legacy API (#12331)
* Apply crud to variable products in legacy API v1
* New REST API do not need fallback for default attributes
* Apply variations CRUD to legacy API v2
* Legacy v2 - save default attributes
* Variations in legacy API v2 do not have descriptions
* Fixed legacy API v2 variations params
* Applied variations CRUD to legacy API v3
* Sync before save in legacy apis
* Punc
* Removed API todos
* Removed test
* Products endpoint tweaks (#12354)
* Var type already normalized on CRUD
* Let Product CRUD handle with validation, sanitization and conditional checks
* Set downloads using WC_Product_Download
* Stop try catch exceptions more than one time
* Handle WC_Data_Exception in legacy API
* Complete remove products when fails on creating
* On creating I mean!
* Already have a method to complete delete products
* Fixed standards using WP CodeSniffer
* get_the_terms() returns false when empty
* get_manage_stock returns boolean
@claudiosanches
* Merge conflict
* Variations API endpoint fixes
* Product CRUD improvements (#12359)
* args is not used any more - remove todo
* Added test for attributes
* wc_get_price_excluding_tax usage
* parent usage
* Fix rating counts
* Test fixes
* Cleanup after tests
* Make sure status transition code runs even during API calls, not just in admin.
* Default visibility
* Fix attribute setting in API
* Use get name instead of get title
* variation id usage
* Improved cross sell templates
* variation_data
* Grouped product sync
* Notices
* Sync is not needed in API
* Delete
* Rename interfaces
* Update counts in data store
2016-11-16 12:38:24 +00:00
if ( $value !== $this -> data [ $prop ] || array_key_exists ( $prop , $this -> changes ) ) {
$this -> changes [ $prop ] = $value ;
}
2016-11-08 10:16:16 +00:00
} else {
$this -> data [ $prop ] = $value ;
}
}
}
/**
* Return data changes only .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 10:16:16 +00:00
* @ return array
*/
2016-11-09 12:21:18 +00:00
public function get_changes () {
2016-11-08 10:16:16 +00:00
return $this -> changes ;
}
/**
* Merge changes with data and clear .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 10:16:16 +00:00
*/
2016-11-14 14:20:41 +00:00
public function apply_changes () {
2017-03-13 22:14:20 +00:00
$this -> data = array_replace_recursive ( $this -> data , $this -> changes );
2016-11-08 10:16:16 +00:00
$this -> changes = array ();
}
/**
* Prefix for action and filter hooks on data .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 10:16:16 +00:00
* @ return string
*/
protected function get_hook_prefix () {
2017-01-24 19:02:06 +00:00
return 'woocommerce_' . $this -> object_type . '_get_' ;
2016-11-08 10:16:16 +00:00
}
/**
* Gets a prop for a getter method .
*
* Gets the value from either current pending changes , or the data itself .
* Context controls what happens to the value before it ' s returned .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2016-11-08 10:16:16 +00:00
* @ param string $prop Name of prop to get .
* @ param string $context What the value is for . Valid values are view and edit .
* @ return mixed
*/
2016-11-17 15:02:33 +00:00
protected function get_prop ( $prop , $context = 'view' ) {
2016-11-08 10:16:16 +00:00
$value = null ;
2017-02-09 18:13:44 +00:00
if ( array_key_exists ( $prop , $this -> data ) ) {
2017-03-13 22:14:20 +00:00
$value = array_key_exists ( $prop , $this -> changes ) ? $this -> changes [ $prop ] : $this -> data [ $prop ];
2016-11-08 10:16:16 +00:00
if ( 'view' === $context ) {
$value = apply_filters ( $this -> get_hook_prefix () . $prop , $value , $this );
}
}
2017-03-13 22:14:20 +00:00
2016-11-08 10:16:16 +00:00
return $value ;
}
2017-03-08 16:50:38 +00:00
/**
2017-07-17 10:10:52 +00:00
* Sets a date prop whilst handling formatting and datetime objects .
2017-03-08 16:50:38 +00:00
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-03-08 16:50:38 +00:00
* @ param string $prop Name of prop to set .
* @ param string | integer $value Value of the prop .
*/
protected function set_date_prop ( $prop , $value ) {
try {
if ( empty ( $value ) ) {
2017-03-23 00:11:15 +00:00
$this -> set_prop ( $prop , null );
return ;
}
if ( is_a ( $value , 'WC_DateTime' ) ) {
2017-03-10 16:43:05 +00:00
$datetime = $value ;
2017-03-08 16:50:38 +00:00
} elseif ( is_numeric ( $value ) ) {
2017-03-23 00:11:15 +00:00
// Timestamps are handled as UTC timestamps in all cases.
2017-03-08 16:50:38 +00:00
$datetime = new WC_DateTime ( " @ { $value } " , new DateTimeZone ( 'UTC' ) );
} else {
2017-03-23 00:11:15 +00:00
// Strings are defined in local WP timezone. Convert to UTC.
if ( 1 === preg_match ( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(Z|((-|\+)\d{2}:\d{2}))$/' , $value , $date_bits ) ) {
$offset = ! empty ( $date_bits [ 7 ] ) ? iso8601_timezone_to_offset ( $date_bits [ 7 ] ) : wc_timezone_offset ();
$timestamp = gmmktime ( $date_bits [ 4 ], $date_bits [ 5 ], $date_bits [ 6 ], $date_bits [ 2 ], $date_bits [ 3 ], $date_bits [ 1 ] ) - $offset ;
} else {
$timestamp = wc_string_to_timestamp ( get_gmt_from_date ( gmdate ( 'Y-m-d H:i:s' , wc_string_to_timestamp ( $value ) ) ) );
}
$datetime = new WC_DateTime ( " @ { $timestamp } " , new DateTimeZone ( 'UTC' ) );
}
// Set local timezone or offset.
if ( get_option ( 'timezone_string' ) ) {
2017-03-08 16:50:38 +00:00
$datetime -> setTimezone ( new DateTimeZone ( wc_timezone_string () ) );
2017-03-23 00:11:15 +00:00
} else {
$datetime -> set_utc_offset ( wc_timezone_offset () );
2017-03-08 16:50:38 +00:00
}
2017-03-23 00:11:15 +00:00
2017-03-08 16:50:38 +00:00
$this -> set_prop ( $prop , $datetime );
} catch ( Exception $e ) {}
}
2016-08-17 10:44:56 +00:00
/**
2016-08-24 13:37:19 +00:00
* When invalid data is found , throw an exception unless reading from the DB .
2017-01-23 19:29:16 +00:00
*
2016-08-24 09:46:29 +00:00
* @ throws WC_Data_Exception
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2017-01-23 19:29:16 +00:00
* @ param string $code Error code .
* @ param string $message Error message .
* @ param int $http_status_code HTTP status code .
* @ param array $data Extra error data .
2016-08-17 10:44:56 +00:00
*/
2017-01-23 19:29:16 +00:00
protected function error ( $code , $message , $http_status_code = 400 , $data = array () ) {
throw new WC_Data_Exception ( $code , $message , $http_status_code , $data );
2016-08-17 10:44:56 +00:00
}
2016-03-11 19:50:44 +00:00
}