2013-11-12 12:01:05 +00:00
< ? php
/**
2018-03-21 23:44:35 +00:00
* Post Data
2013-11-12 12:01:05 +00:00
*
* Standardises certain post data on save .
*
2020-08-05 16:36:24 +00:00
* @ package WooCommerce\Classes\Data
2018-03-21 23:44:35 +00:00
* @ version 2.2 . 0
*/
2021-06-07 14:54:08 +00:00
use Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore as ProductAttributesLookupDataStore ;
2018-03-21 23:44:35 +00:00
defined ( 'ABSPATH' ) || exit ;
/**
* Post data class .
2013-11-12 12:01:05 +00:00
*/
class WC_Post_Data {
2016-01-06 15:24:47 +00:00
/**
* Editing term .
*
* @ var object
*/
2014-05-28 13:52:50 +00:00
private static $editing_term = null ;
2013-11-12 20:25:23 +00:00
2013-11-12 12:01:05 +00:00
/**
2015-11-03 13:31:20 +00:00
* Hook in methods .
2013-11-12 12:01:05 +00:00
*/
2014-05-28 13:52:50 +00:00
public static function init () {
2016-11-25 12:48:54 +00:00
add_filter ( 'post_type_link' , array ( __CLASS__ , 'variation_post_link' ), 10 , 2 );
2017-04-06 11:25:34 +00:00
add_action ( 'shutdown' , array ( __CLASS__ , 'do_deferred_product_sync' ), 10 );
2017-11-23 16:00:34 +00:00
add_action ( 'set_object_terms' , array ( __CLASS__ , 'force_default_term' ), 10 , 5 );
2019-02-12 12:15:33 +00:00
add_action ( 'set_object_terms' , array ( __CLASS__ , 'delete_product_query_transients' ) );
2019-09-24 05:44:43 +00:00
add_action ( 'deleted_term_relationships' , array ( __CLASS__ , 'delete_product_query_transients' ) );
2014-06-19 11:25:07 +00:00
add_action ( 'woocommerce_product_set_stock_status' , array ( __CLASS__ , 'delete_product_query_transients' ) );
add_action ( 'woocommerce_product_set_visibility' , array ( __CLASS__ , 'delete_product_query_transients' ) );
2017-01-11 11:48:22 +00:00
add_action ( 'woocommerce_product_type_changed' , array ( __CLASS__ , 'product_type_changed' ), 10 , 3 );
2014-06-19 11:25:07 +00:00
2014-05-28 13:52:50 +00:00
add_action ( 'edit_term' , array ( __CLASS__ , 'edit_term' ), 10 , 3 );
add_action ( 'edited_term' , array ( __CLASS__ , 'edited_term' ), 10 , 3 );
add_filter ( 'update_order_item_metadata' , array ( __CLASS__ , 'update_order_item_metadata' ), 10 , 5 );
add_filter ( 'update_post_metadata' , array ( __CLASS__ , 'update_post_metadata' ), 10 , 5 );
2014-06-04 10:16:19 +00:00
add_filter ( 'wp_insert_post_data' , array ( __CLASS__ , 'wp_insert_post_data' ) );
2017-10-02 11:36:58 +00:00
add_filter ( 'oembed_response_data' , array ( __CLASS__ , 'filter_oembed_response_data' ), 10 , 2 );
2020-12-30 13:25:40 +00:00
add_filter ( 'wp_untrash_post_status' , array ( __CLASS__ , 'wp_untrash_post_status' ), 10 , 3 );
2016-11-16 12:17:00 +00:00
2018-03-21 23:44:35 +00:00
// Status transitions.
2019-02-12 12:15:33 +00:00
add_action ( 'transition_post_status' , array ( __CLASS__ , 'transition_post_status' ), 10 , 3 );
2016-11-16 12:17:00 +00:00
add_action ( 'delete_post' , array ( __CLASS__ , 'delete_post' ) );
add_action ( 'wp_trash_post' , array ( __CLASS__ , 'trash_post' ) );
2016-11-18 11:14:09 +00:00
add_action ( 'untrashed_post' , array ( __CLASS__ , 'untrash_post' ) );
2017-06-26 17:32:36 +00:00
add_action ( 'before_delete_post' , array ( __CLASS__ , 'before_delete_order' ) );
2016-11-18 19:29:37 +00:00
2017-05-30 13:37:16 +00:00
// Meta cache flushing.
add_action ( 'updated_post_meta' , array ( __CLASS__ , 'flush_object_meta_cache' ), 10 , 4 );
add_action ( 'updated_order_item_meta' , array ( __CLASS__ , 'flush_object_meta_cache' ), 10 , 4 );
2016-11-09 12:26:46 +00:00
}
2016-11-25 12:48:54 +00:00
/**
* Link to parent products when getting permalink for variation .
*
2018-03-21 23:44:35 +00:00
* @ param string $permalink Permalink .
* @ param WP_Post $post Post data .
2017-05-15 11:50:52 +00:00
*
2016-11-25 12:48:54 +00:00
* @ return string
*/
public static function variation_post_link ( $permalink , $post ) {
2018-03-21 23:44:35 +00:00
if ( isset ( $post -> ID , $post -> post_type ) && 'product_variation' === $post -> post_type ) {
$variation = wc_get_product ( $post -> ID );
if ( $variation && $variation -> get_parent_id () ) {
return $variation -> get_permalink ();
}
2016-11-25 12:48:54 +00:00
}
return $permalink ;
}
2017-04-06 11:25:34 +00:00
/**
* Sync products queued to sync .
*/
public static function do_deferred_product_sync () {
global $wc_deferred_product_sync ;
if ( ! empty ( $wc_deferred_product_sync ) ) {
$wc_deferred_product_sync = wp_parse_id_list ( $wc_deferred_product_sync );
array_walk ( $wc_deferred_product_sync , array ( __CLASS__ , 'deferred_product_sync' ) );
}
}
2016-11-09 12:26:46 +00:00
/**
* Sync a product .
2018-03-21 23:44:35 +00:00
*
* @ param int $product_id Product ID .
2016-11-09 12:26:46 +00:00
*/
public static function deferred_product_sync ( $product_id ) {
$product = wc_get_product ( $product_id );
if ( is_callable ( array ( $product , 'sync' ) ) ) {
$product -> sync ( $product );
}
2013-11-12 12:01:05 +00:00
}
2014-06-19 11:25:07 +00:00
/**
2015-11-03 13:31:20 +00:00
* When a post status changes .
2017-05-15 11:50:52 +00:00
*
2018-03-21 23:44:35 +00:00
* @ param string $new_status New status .
* @ param string $old_status Old status .
* @ param WP_Post $post Post data .
2014-06-19 11:25:07 +00:00
*/
2014-06-19 15:32:52 +00:00
public static function transition_post_status ( $new_status , $old_status , $post ) {
2018-03-21 23:44:35 +00:00
if ( ( 'publish' === $new_status || 'publish' === $old_status ) && in_array ( $post -> post_type , array ( 'product' , 'product_variation' ), true ) ) {
2014-06-19 11:25:07 +00:00
self :: delete_product_query_transients ();
}
}
/**
* Delete product view transients when needed e . g . when post status changes , or visibility / stock status is modified .
*/
public static function delete_product_query_transients () {
2014-07-03 11:59:54 +00:00
WC_Cache_Helper :: get_transient_version ( 'product_query' , true );
2014-06-19 11:25:07 +00:00
}
2017-01-11 11:48:22 +00:00
/**
* Handle type changes .
*
2017-03-15 16:36:53 +00:00
* @ since 3.0 . 0
2020-12-18 11:34:27 +00:00
*
2018-03-21 23:44:35 +00:00
* @ param WC_Product $product Product data .
* @ param string $from Origin type .
* @ param string $to New type .
2017-01-11 11:48:22 +00:00
*/
public static function product_type_changed ( $product , $from , $to ) {
2020-12-18 11:34:27 +00:00
/**
* Filter to prevent variations from being deleted while switching from a variable product type to a variable product type .
*
2021-01-18 16:44:15 +00:00
* @ since 5.0 . 0
2020-12-18 11:34:27 +00:00
*
* @ param bool A boolean value of true will delete the variations .
* @ param WC_Product $product Product data .
* @ return string $from Origin type .
* @ param string $to New type .
*/
2020-09-10 19:59:17 +00:00
if ( apply_filters ( 'woocommerce_delete_variations_on_product_type_change' , 'variable' === $from && 'variable' !== $to , $product , $from , $to ) ) {
2017-01-11 11:48:22 +00:00
// If the product is no longer variable, we should ensure all variations are removed.
$data_store = WC_Data_Store :: load ( 'product-variable' );
2019-04-24 10:16:41 +00:00
$data_store -> delete_variations ( $product -> get_id (), true );
2017-01-11 11:48:22 +00:00
}
}
2013-11-12 20:25:23 +00:00
/**
2015-11-03 13:31:20 +00:00
* When editing a term , check for product attributes .
2018-03-21 23:44:35 +00:00
*
* @ param int $term_id Term ID .
* @ param int $tt_id Term taxonomy ID .
* @ param string $taxonomy Taxonomy slug .
2013-11-12 20:25:23 +00:00
*/
2014-05-28 13:52:50 +00:00
public static function edit_term ( $term_id , $tt_id , $taxonomy ) {
2013-11-12 20:25:23 +00:00
if ( strpos ( $taxonomy , 'pa_' ) === 0 ) {
2014-05-28 13:52:50 +00:00
self :: $editing_term = get_term_by ( 'id' , $term_id , $taxonomy );
2013-11-12 20:25:23 +00:00
} else {
2014-05-28 13:52:50 +00:00
self :: $editing_term = null ;
2013-11-12 20:25:23 +00:00
}
}
/**
2015-11-03 13:31:20 +00:00
* When a term is edited , check for product attributes and update variations .
2018-03-21 23:44:35 +00:00
*
* @ param int $term_id Term ID .
* @ param int $tt_id Term taxonomy ID .
* @ param string $taxonomy Taxonomy slug .
2013-11-12 20:25:23 +00:00
*/
2014-05-28 13:52:50 +00:00
public static function edited_term ( $term_id , $tt_id , $taxonomy ) {
if ( ! is_null ( self :: $editing_term ) && strpos ( $taxonomy , 'pa_' ) === 0 ) {
2013-11-12 20:25:23 +00:00
$edited_term = get_term_by ( 'id' , $term_id , $taxonomy );
2014-05-28 13:52:50 +00:00
if ( $edited_term -> slug !== self :: $editing_term -> slug ) {
2013-11-12 20:25:23 +00:00
global $wpdb ;
2014-05-28 13:52:50 +00:00
$wpdb -> query ( $wpdb -> prepare ( " UPDATE { $wpdb -> postmeta } SET meta_value = %s WHERE meta_key = %s AND meta_value = %s; " , $edited_term -> slug , 'attribute_' . sanitize_title ( $taxonomy ), self :: $editing_term -> slug ) );
2019-01-09 19:10:24 +00:00
$wpdb -> query (
$wpdb -> prepare (
" UPDATE { $wpdb -> postmeta } SET meta_value = REPLACE( meta_value, %s, %s ) WHERE meta_key = '_default_attributes' " ,
serialize ( self :: $editing_term -> taxonomy ) . serialize ( self :: $editing_term -> slug ),
serialize ( $edited_term -> taxonomy ) . serialize ( $edited_term -> slug )
)
);
2013-11-12 20:25:23 +00:00
}
} else {
2014-05-28 13:52:50 +00:00
self :: $editing_term = null ;
2013-11-12 20:25:23 +00:00
}
}
2013-11-12 17:43:30 +00:00
/**
2015-11-03 13:31:20 +00:00
* Ensure floats are correctly converted to strings based on PHP locale .
2014-09-20 18:54:33 +00:00
*
2018-03-21 23:44:35 +00:00
* @ param null $check Whether to allow updating metadata for the given type .
* @ param int $object_id Object ID .
* @ param string $meta_key Meta key .
* @ param mixed $meta_value Meta value . Must be serializable if non - scalar .
* @ param mixed $prev_value If specified , only update existing metadata entries with the specified value . Otherwise , update all entries .
2013-11-12 17:43:30 +00:00
* @ return null | bool
*/
2014-05-28 13:52:50 +00:00
public static function update_order_item_metadata ( $check , $object_id , $meta_key , $meta_value , $prev_value ) {
2013-11-12 17:43:30 +00:00
if ( ! empty ( $meta_value ) && is_float ( $meta_value ) ) {
2018-03-21 23:44:35 +00:00
// Convert float to string.
2013-11-12 17:43:30 +00:00
$meta_value = wc_float_to_string ( $meta_value );
2018-03-21 23:44:35 +00:00
// Update meta value with new string.
2013-11-12 17:43:30 +00:00
update_metadata ( 'order_item' , $object_id , $meta_key , $meta_value , $prev_value );
return true ;
}
return $check ;
}
2013-11-12 12:01:05 +00:00
/**
2015-11-03 13:31:20 +00:00
* Ensure floats are correctly converted to strings based on PHP locale .
2014-09-20 18:54:33 +00:00
*
2018-03-21 23:44:35 +00:00
* @ param null $check Whether to allow updating metadata for the given type .
* @ param int $object_id Object ID .
* @ param string $meta_key Meta key .
* @ param mixed $meta_value Meta value . Must be serializable if non - scalar .
* @ param mixed $prev_value If specified , only update existing metadata entries with the specified value . Otherwise , update all entries .
2013-11-12 12:01:05 +00:00
* @ return null | bool
*/
2014-05-28 13:52:50 +00:00
public static function update_post_metadata ( $check , $object_id , $meta_key , $meta_value , $prev_value ) {
2016-12-08 17:57:07 +00:00
// Delete product cache if someone uses meta directly.
2018-03-21 23:44:35 +00:00
if ( in_array ( get_post_type ( $object_id ), array ( 'product' , 'product_variation' ), true ) ) {
2016-12-08 17:57:07 +00:00
wp_cache_delete ( 'product-' . $object_id , 'products' );
}
2018-09-12 14:31:46 +00:00
if ( ! empty ( $meta_value ) && is_float ( $meta_value ) && ! registered_meta_key_exists ( 'post' , $meta_key ) && in_array ( get_post_type ( $object_id ), array_merge ( wc_get_order_types (), array ( 'shop_coupon' , 'product' , 'product_variation' ) ), true ) ) {
2013-11-12 12:01:05 +00:00
2018-03-21 23:44:35 +00:00
// Convert float to string.
2013-11-12 17:43:30 +00:00
$meta_value = wc_float_to_string ( $meta_value );
2013-11-12 12:01:05 +00:00
2018-03-21 23:44:35 +00:00
// Update meta value with new string.
2013-11-12 12:01:05 +00:00
update_metadata ( 'post' , $object_id , $meta_key , $meta_value , $prev_value );
return true ;
}
return $check ;
}
2014-06-04 10:16:19 +00:00
/**
* Forces the order posts to have a title in a certain format ( containing the date ) .
* Forces certain product data based on the product ' s type , e . g . grouped products cannot have a parent .
*
2018-03-21 23:44:35 +00:00
* @ param array $data An array of slashed post data .
2014-06-04 10:16:19 +00:00
* @ return array
*/
public static function wp_insert_post_data ( $data ) {
if ( 'shop_order' === $data [ 'post_type' ] && isset ( $data [ 'post_date' ] ) ) {
$order_title = 'Order' ;
if ( $data [ 'post_date' ] ) {
2016-08-27 06:07:42 +00:00
$order_title .= ' – ' . date_i18n ( 'F j, Y @ h:i A' , strtotime ( $data [ 'post_date' ] ) );
2014-06-04 10:16:19 +00:00
}
$data [ 'post_title' ] = $order_title ;
2018-03-21 23:44:35 +00:00
} elseif ( 'product' === $data [ 'post_type' ] && isset ( $_POST [ 'product-type' ] ) ) { // WPCS: input var ok, CSRF ok.
$product_type = wc_clean ( wp_unslash ( $_POST [ 'product-type' ] ) ); // WPCS: input var ok, CSRF ok.
2014-06-04 10:16:19 +00:00
switch ( $product_type ) {
2018-03-21 23:44:35 +00:00
case 'grouped' :
case 'variable' :
2014-06-04 10:16:19 +00:00
$data [ 'post_parent' ] = 0 ;
2018-03-21 23:44:35 +00:00
break ;
2014-06-04 10:16:19 +00:00
}
2017-03-15 18:12:49 +00:00
} elseif ( 'product' === $data [ 'post_type' ] && 'auto-draft' === $data [ 'post_status' ] ) {
$data [ 'post_title' ] = 'AUTO-DRAFT' ;
2020-07-27 19:42:00 +00:00
} elseif ( 'shop_coupon' === $data [ 'post_type' ] ) {
// Coupons should never allow unfiltered HTML.
$data [ 'post_title' ] = wp_filter_kses ( $data [ 'post_title' ] );
2014-06-04 10:16:19 +00:00
}
2017-03-15 18:12:49 +00:00
2014-06-04 10:16:19 +00:00
return $data ;
2014-09-20 18:54:33 +00:00
}
2016-11-16 12:17:00 +00:00
2017-10-02 11:36:58 +00:00
/**
* Change embed data for certain post types .
*
* @ since 3.2 . 0
* @ param array $data The response data .
* @ param WP_Post $post The post object .
* @ return array
*/
public static function filter_oembed_response_data ( $data , $post ) {
2018-03-21 23:44:35 +00:00
if ( in_array ( $post -> post_type , array ( 'shop_order' , 'shop_coupon' ), true ) ) {
2017-10-02 11:36:58 +00:00
return array ();
}
return $data ;
}
2016-11-16 12:17:00 +00:00
/**
* Removes variations etc belonging to a deleted post , and clears transients .
*
2018-03-21 23:44:35 +00:00
* @ param mixed $id ID of post being deleted .
2016-11-16 12:17:00 +00:00
*/
public static function delete_post ( $id ) {
2017-01-11 15:41:19 +00:00
if ( ! current_user_can ( 'delete_posts' ) || ! $id ) {
2016-11-16 12:17:00 +00:00
return ;
}
2017-01-11 15:41:19 +00:00
$post_type = get_post_type ( $id );
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
switch ( $post_type ) {
2018-03-21 23:44:35 +00:00
case 'product' :
2017-01-11 15:41:19 +00:00
$data_store = WC_Data_Store :: load ( 'product-variable' );
$data_store -> delete_variations ( $id , true );
2019-03-07 15:08:22 +00:00
$data_store -> delete_from_lookup_table ( $id , 'wc_product_meta_lookup' );
2021-06-07 14:54:08 +00:00
wc_get_container () -> get ( ProductAttributesLookupDataStore :: class ) -> on_product_deleted ( $id );
2016-11-16 12:17:00 +00:00
2021-06-07 14:54:08 +00:00
$parent_id = wp_get_post_parent_id ( $id );
2018-03-21 23:44:35 +00:00
if ( $parent_id ) {
2017-01-11 15:41:19 +00:00
wc_delete_product_transients ( $parent_id );
}
2021-06-07 14:54:08 +00:00
2016-11-16 12:17:00 +00:00
break ;
2018-03-21 23:44:35 +00:00
case 'product_variation' :
2019-03-07 15:08:22 +00:00
$data_store = WC_Data_Store :: load ( 'product' );
$data_store -> delete_from_lookup_table ( $id , 'wc_product_meta_lookup' );
2017-01-11 15:41:19 +00:00
wc_delete_product_transients ( wp_get_post_parent_id ( $id ) );
2021-06-07 14:54:08 +00:00
wc_get_container () -> get ( ProductAttributesLookupDataStore :: class ) -> on_product_deleted ( $id );
2016-11-16 12:17:00 +00:00
break ;
2018-03-21 23:44:35 +00:00
case 'shop_order' :
2017-01-11 15:41:19 +00:00
global $wpdb ;
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
$refunds = $wpdb -> get_results ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order_refund' AND post_parent = %d " , $id ) );
if ( ! is_null ( $refunds ) ) {
foreach ( $refunds as $refund ) {
wp_delete_post ( $refund -> ID , true );
2016-11-16 12:17:00 +00:00
}
2017-01-11 15:41:19 +00:00
}
2016-11-16 12:17:00 +00:00
break ;
}
}
/**
2018-03-21 23:44:35 +00:00
* Trash post .
2016-11-16 12:17:00 +00:00
*
2018-03-21 23:44:35 +00:00
* @ param mixed $id Post ID .
2016-11-16 12:17:00 +00:00
*/
public static function trash_post ( $id ) {
2017-01-11 15:41:19 +00:00
if ( ! $id ) {
return ;
}
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
$post_type = get_post_type ( $id );
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
// If this is an order, trash any refunds too.
2018-03-21 23:44:35 +00:00
if ( in_array ( $post_type , wc_get_order_types ( 'order-count' ), true ) ) {
2017-01-11 15:41:19 +00:00
global $wpdb ;
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
$refunds = $wpdb -> get_results ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order_refund' AND post_parent = %d " , $id ) );
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
foreach ( $refunds as $refund ) {
$wpdb -> update ( $wpdb -> posts , array ( 'post_status' => 'trash' ), array ( 'ID' => $refund -> ID ) );
2016-11-16 12:17:00 +00:00
}
2017-01-11 15:41:19 +00:00
wc_delete_shop_order_transients ( $id );
2018-03-21 23:44:35 +00:00
// If this is a product, trash children variations.
2017-01-11 15:41:19 +00:00
} elseif ( 'product' === $post_type ) {
$data_store = WC_Data_Store :: load ( 'product-variable' );
$data_store -> delete_variations ( $id , false );
2021-06-07 14:54:08 +00:00
wc_get_container () -> get ( ProductAttributesLookupDataStore :: class ) -> on_product_deleted ( $id );
} elseif ( 'product_variation' === $post_type ) {
wc_get_container () -> get ( ProductAttributesLookupDataStore :: class ) -> on_product_deleted ( $id );
2016-11-16 12:17:00 +00:00
}
}
/**
2018-03-21 23:44:35 +00:00
* Untrash post .
2016-11-16 12:17:00 +00:00
*
2018-03-21 23:44:35 +00:00
* @ param mixed $id Post ID .
2016-11-16 12:17:00 +00:00
*/
public static function untrash_post ( $id ) {
2017-01-11 15:41:19 +00:00
if ( ! $id ) {
return ;
}
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
$post_type = get_post_type ( $id );
2016-11-16 12:17:00 +00:00
2018-03-21 23:44:35 +00:00
if ( in_array ( $post_type , wc_get_order_types ( 'order-count' ), true ) ) {
2017-01-11 15:41:19 +00:00
global $wpdb ;
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
$refunds = $wpdb -> get_results ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order_refund' AND post_parent = %d " , $id ) );
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
foreach ( $refunds as $refund ) {
$wpdb -> update ( $wpdb -> posts , array ( 'post_status' => 'wc-completed' ), array ( 'ID' => $refund -> ID ) );
}
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
wc_delete_shop_order_transients ( $id );
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
} elseif ( 'product' === $post_type ) {
$data_store = WC_Data_Store :: load ( 'product-variable' );
$data_store -> untrash_variations ( $id );
2016-11-16 12:17:00 +00:00
2017-01-11 15:41:19 +00:00
wc_product_force_unique_sku ( $id );
2021-06-08 15:53:45 +00:00
wc_get_container () -> get ( ProductAttributesLookupDataStore :: class ) -> on_product_changed ( $id );
} elseif ( 'product_variation' === $post_type ) {
wc_get_container () -> get ( ProductAttributesLookupDataStore :: class ) -> on_product_changed ( $id );
2016-11-16 12:17:00 +00:00
}
}
2017-06-26 17:32:36 +00:00
/**
* Before deleting an order , do some cleanup .
*
* @ since 3.2 . 0
2018-03-21 23:44:35 +00:00
* @ param int $order_id Order ID .
2017-06-26 17:32:36 +00:00
*/
public static function before_delete_order ( $order_id ) {
2018-03-21 23:44:35 +00:00
if ( in_array ( get_post_type ( $order_id ), wc_get_order_types (), true ) ) {
2017-06-26 17:32:36 +00:00
// Clean up user.
2018-03-21 23:44:35 +00:00
$order = wc_get_order ( $order_id );
2017-08-07 09:38:10 +00:00
// Check for `get_customer_id`, since this may be e.g. a refund order (which doesn't implement it).
$customer_id = is_callable ( array ( $order , 'get_customer_id' ) ) ? $order -> get_customer_id () : 0 ;
2017-06-26 17:32:36 +00:00
if ( $customer_id > 0 && 'shop_order' === $order -> get_type () ) {
$customer = new WC_Customer ( $customer_id );
$order_count = $customer -> get_order_count ();
$order_count -- ;
if ( 0 === $order_count ) {
$customer -> set_is_paying_customer ( false );
$customer -> save ();
}
2020-08-17 08:57:09 +00:00
// Delete order count and last order meta.
2017-06-26 17:32:36 +00:00
delete_user_meta ( $customer_id , '_order_count' );
2020-08-17 08:57:09 +00:00
delete_user_meta ( $customer_id , '_last_order' );
2017-06-26 17:32:36 +00:00
}
// Clean up items.
self :: delete_order_items ( $order_id );
self :: delete_order_downloadable_permissions ( $order_id );
}
}
2016-11-16 12:17:00 +00:00
/**
* Remove item meta on permanent deletion .
2017-05-15 11:50:52 +00:00
*
2018-03-21 23:44:35 +00:00
* @ param int $postid Post ID .
2016-11-16 12:17:00 +00:00
*/
public static function delete_order_items ( $postid ) {
global $wpdb ;
2018-03-21 23:44:35 +00:00
if ( in_array ( get_post_type ( $postid ), wc_get_order_types (), true ) ) {
2016-11-16 12:17:00 +00:00
do_action ( 'woocommerce_delete_order_items' , $postid );
2018-03-21 23:44:35 +00:00
$wpdb -> query (
"
2016-11-16 12:17:00 +00:00
DELETE { $wpdb -> prefix } woocommerce_order_items , { $wpdb -> prefix } woocommerce_order_itemmeta
FROM { $wpdb -> prefix } woocommerce_order_items
JOIN { $wpdb -> prefix } woocommerce_order_itemmeta ON { $wpdb -> prefix } woocommerce_order_items . order_item_id = { $wpdb -> prefix } woocommerce_order_itemmeta . order_item_id
WHERE { $wpdb -> prefix } woocommerce_order_items . order_id = '{$postid}' ;
2018-03-21 23:44:35 +00:00
"
); // WPCS: unprepared SQL ok.
2016-11-16 12:17:00 +00:00
do_action ( 'woocommerce_deleted_order_items' , $postid );
}
}
/**
* Remove downloadable permissions on permanent order deletion .
2017-05-15 11:50:52 +00:00
*
2018-03-21 23:44:35 +00:00
* @ param int $postid Post ID .
2016-11-16 12:17:00 +00:00
*/
public static function delete_order_downloadable_permissions ( $postid ) {
2018-03-21 23:44:35 +00:00
if ( in_array ( get_post_type ( $postid ), wc_get_order_types (), true ) ) {
2016-11-16 12:17:00 +00:00
do_action ( 'woocommerce_delete_order_downloadable_permissions' , $postid );
2016-11-18 17:13:02 +00:00
$data_store = WC_Data_Store :: load ( 'customer-download' );
$data_store -> delete_by_order_id ( $postid );
2016-11-16 12:17:00 +00:00
do_action ( 'woocommerce_deleted_order_downloadable_permissions' , $postid );
}
}
2016-11-18 19:29:37 +00:00
2017-05-30 13:37:16 +00:00
/**
* Flush meta cache for CRUD objects on direct update .
2018-03-21 23:44:35 +00:00
*
* @ param int $meta_id Meta ID .
* @ param int $object_id Object ID .
* @ param string $meta_key Meta key .
* @ param string $meta_value Meta value .
2017-05-30 13:37:16 +00:00
*/
public static function flush_object_meta_cache ( $meta_id , $object_id , $meta_key , $meta_value ) {
2019-11-28 13:03:57 +00:00
WC_Cache_Helper :: invalidate_cache_group ( 'object_' . $object_id );
2017-05-30 13:37:16 +00:00
}
2017-11-23 16:00:34 +00:00
/**
* Ensure default category gets set .
*
* @ since 3.3 . 0
* @ param int $object_id Product ID .
2018-03-21 23:44:35 +00:00
* @ param array $terms Terms array .
* @ param array $tt_ids Term ids array .
* @ param string $taxonomy Taxonomy name .
* @ param bool $append Are we appending or setting terms .
2017-11-23 16:00:34 +00:00
*/
public static function force_default_term ( $object_id , $terms , $tt_ids , $taxonomy , $append ) {
if ( ! $append && 'product_cat' === $taxonomy && empty ( $tt_ids ) && 'product' === get_post_type ( $object_id ) ) {
$default_term = absint ( get_option ( 'default_product_cat' , 0 ) );
$tt_ids = array_map ( 'absint' , $tt_ids );
if ( $default_term && ! in_array ( $default_term , $tt_ids , true ) ) {
wp_set_post_terms ( $object_id , array ( $default_term ), 'product_cat' , true );
}
}
}
2019-02-12 12:15:33 +00:00
2020-12-30 13:25:40 +00:00
/**
2021-01-09 14:49:29 +00:00
* Ensure statuses are correctly reassigned when restoring orders and products .
2020-12-30 13:25:40 +00:00
*
* @ param string $new_status The new status of the post being restored .
* @ param int $post_id The ID of the post being restored .
* @ param string $previous_status The status of the post at the point where it was trashed .
* @ return string
*/
2021-01-13 21:22:30 +00:00
public static function wp_untrash_post_status ( $new_status , $post_id , $previous_status ) {
2021-01-09 15:11:25 +00:00
$post_types = array ( 'shop_order' , 'shop_coupon' , 'product' , 'product_variation' );
2021-01-09 14:49:29 +00:00
if ( in_array ( get_post_type ( $post_id ), $post_types , true ) ) {
2020-12-30 13:25:40 +00:00
$new_status = $previous_status ;
}
return $new_status ;
}
2019-02-12 12:15:33 +00:00
/**
* When setting stock level , ensure the stock status is kept in sync .
*
* @ param int $meta_id Meta ID .
* @ param int $object_id Object ID .
* @ param string $meta_key Meta key .
* @ param mixed $meta_value Meta value .
* @ deprecated 3.3
*/
public static function sync_product_stock_status ( $meta_id , $object_id , $meta_key , $meta_value ) {}
/**
* Update changed downloads .
*
* @ deprecated 3.3 . 0 No action is necessary on changes to download paths since download_id is no longer based on file hash .
* @ param int $product_id Product ID .
* @ param int $variation_id Variation ID . Optional product variation identifier .
* @ param array $downloads Newly set files .
*/
public static function process_product_file_download_paths ( $product_id , $variation_id , $downloads ) {
wc_deprecated_function ( __FUNCTION__ , '3.3' );
}
/**
* Delete transients when terms are set .
*
* @ deprecated 3.6
* @ param int $object_id Object ID .
* @ param mixed $terms An array of object terms .
* @ param array $tt_ids An array of term taxonomy IDs .
* @ param string $taxonomy Taxonomy slug .
* @ param mixed $append Whether to append new terms to the old terms .
* @ param array $old_tt_ids Old array of term taxonomy IDs .
*/
public static function set_object_terms ( $object_id , $terms , $tt_ids , $taxonomy , $append , $old_tt_ids ) {
if ( in_array ( get_post_type ( $object_id ), array ( 'product' , 'product_variation' ), true ) ) {
self :: delete_product_query_transients ();
}
}
2013-11-12 12:01:05 +00:00
}
2014-09-20 18:54:33 +00:00
WC_Post_Data :: init ();