2016-05-11 11:44:12 +00:00
< ? php
/**
* WooCommerce Updates
*
* Functions for updating data , used by the background updater .
*
2020-08-05 16:36:24 +00:00
* @ package WooCommerce\Functions
2018-01-31 17:09:21 +00:00
* @ version 3.3 . 0
2016-05-11 11:44:12 +00:00
*/
2018-03-08 21:31:01 +00:00
defined ( 'ABSPATH' ) || exit ;
2016-05-11 11:44:12 +00:00
2017-10-05 11:48:26 +00:00
/**
* Update file paths for 2.0
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_200_file_paths () {
global $wpdb ;
2017-10-05 11:48:26 +00:00
// Upgrade old style files paths to support multiple file paths.
2017-02-13 12:58:42 +00:00
$existing_file_paths = $wpdb -> get_results ( " SELECT meta_value, meta_id, post_id FROM { $wpdb -> postmeta } WHERE meta_key = '_file_path' AND meta_value != ''; " );
2016-05-11 11:44:12 +00:00
if ( $existing_file_paths ) {
2016-08-27 04:23:02 +00:00
foreach ( $existing_file_paths as $existing_file_path ) {
2016-05-11 11:44:12 +00:00
$old_file_path = trim ( $existing_file_path -> meta_value );
if ( ! empty ( $old_file_path ) ) {
2020-04-29 15:16:30 +00:00
// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize
2016-05-11 11:44:12 +00:00
$file_paths = serialize ( array ( md5 ( $old_file_path ) => $old_file_path ) );
$wpdb -> query ( $wpdb -> prepare ( " UPDATE { $wpdb -> postmeta } SET meta_key = '_file_paths', meta_value = %s WHERE meta_id = %d " , $file_paths , $existing_file_path -> meta_id ) );
$wpdb -> query ( $wpdb -> prepare ( " UPDATE { $wpdb -> prefix } woocommerce_downloadable_product_permissions SET download_id = %s WHERE product_id = %d " , md5 ( $old_file_path ), $existing_file_path -> post_id ) );
}
}
}
}
2017-10-05 11:48:26 +00:00
/**
* Update permalinks for 2.0
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_200_permalinks () {
2017-10-05 11:48:26 +00:00
// Setup default permalinks if shop page is defined.
2017-11-23 12:41:31 +00:00
$permalinks = get_option ( 'woocommerce_permalinks' );
$shop_page_id = wc_get_page_id ( 'shop' );
2016-05-11 11:44:12 +00:00
if ( empty ( $permalinks ) && $shop_page_id > 0 ) {
2017-11-23 12:41:31 +00:00
$base_slug = $shop_page_id > 0 && get_post ( $shop_page_id ) ? get_page_uri ( $shop_page_id ) : 'shop' ;
2016-05-11 11:44:12 +00:00
2020-04-29 15:16:30 +00:00
$category_base = 'yes' === get_option ( 'woocommerce_prepend_shop_page_to_urls' ) ? trailingslashit ( $base_slug ) : '' ;
2017-11-23 12:41:31 +00:00
$category_slug = get_option ( 'woocommerce_product_category_slug' ) ? get_option ( 'woocommerce_product_category_slug' ) : _x ( 'product-category' , 'slug' , 'woocommerce' );
$tag_slug = get_option ( 'woocommerce_product_tag_slug' ) ? get_option ( 'woocommerce_product_tag_slug' ) : _x ( 'product-tag' , 'slug' , 'woocommerce' );
2016-05-11 11:44:12 +00:00
2020-04-29 15:16:30 +00:00
if ( 'yes' === get_option ( 'woocommerce_prepend_shop_page_to_products' ) ) {
2016-05-11 11:44:12 +00:00
$product_base = trailingslashit ( $base_slug );
} else {
2017-11-23 14:17:21 +00:00
$product_slug = get_option ( 'woocommerce_product_slug' );
if ( false !== $product_slug && ! empty ( $product_slug ) ) {
2016-05-11 11:44:12 +00:00
$product_base = trailingslashit ( $product_slug );
} else {
2016-09-02 01:51:31 +00:00
$product_base = trailingslashit ( _x ( 'product' , 'slug' , 'woocommerce' ) );
2016-05-11 11:44:12 +00:00
}
}
2020-04-29 15:16:30 +00:00
if ( 'yes' === get_option ( 'woocommerce_prepend_category_to_products' ) ) {
2016-09-02 01:51:31 +00:00
$product_base .= trailingslashit ( '%product_cat%' );
2017-03-07 20:24:24 +00:00
}
2016-05-11 11:44:12 +00:00
$permalinks = array (
2017-11-23 12:41:31 +00:00
'product_base' => untrailingslashit ( $product_base ),
'category_base' => untrailingslashit ( $category_base . $category_slug ),
'attribute_base' => untrailingslashit ( $category_base ),
'tag_base' => untrailingslashit ( $category_base . $tag_slug ),
2016-05-11 11:44:12 +00:00
);
update_option ( 'woocommerce_permalinks' , $permalinks );
}
}
2017-10-05 11:48:26 +00:00
/**
* Update sub - category display options for 2.0
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_200_subcat_display () {
2017-10-05 11:48:26 +00:00
// Update subcat display settings.
2020-04-29 15:16:30 +00:00
if ( 'yes' === get_option ( 'woocommerce_shop_show_subcategories' ) ) {
if ( 'yes' === get_option ( 'woocommerce_hide_products_when_showing_subcategories' ) ) {
2016-05-11 11:44:12 +00:00
update_option ( 'woocommerce_shop_page_display' , 'subcategories' );
} else {
update_option ( 'woocommerce_shop_page_display' , 'both' );
}
}
2020-04-29 15:16:30 +00:00
if ( 'yes' === get_option ( 'woocommerce_show_subcategories' ) ) {
if ( 'yes' === get_option ( 'woocommerce_hide_products_when_showing_subcategories' ) ) {
2016-05-11 11:44:12 +00:00
update_option ( 'woocommerce_category_archive_display' , 'subcategories' );
} else {
update_option ( 'woocommerce_category_archive_display' , 'both' );
}
}
}
2017-10-05 11:48:26 +00:00
/**
* Update tax rates for 2.0
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_200_taxrates () {
global $wpdb ;
2017-10-05 11:48:26 +00:00
// Update tax rates.
2017-11-23 12:41:31 +00:00
$loop = 0 ;
2016-05-11 11:44:12 +00:00
$tax_rates = get_option ( 'woocommerce_tax_rates' );
2017-03-07 20:24:24 +00:00
if ( $tax_rates ) {
2016-05-11 11:44:12 +00:00
foreach ( $tax_rates as $tax_rate ) {
foreach ( $tax_rate [ 'countries' ] as $country => $states ) {
$states = array_reverse ( $states );
foreach ( $states as $state ) {
2020-04-29 15:16:30 +00:00
if ( '*' === $state ) {
2016-05-11 11:44:12 +00:00
$state = '' ;
2016-09-07 22:32:24 +00:00
}
2016-05-11 11:44:12 +00:00
$wpdb -> insert (
2017-10-05 11:48:26 +00:00
$wpdb -> prefix . 'woocommerce_tax_rates' ,
2016-05-11 11:44:12 +00:00
array (
'tax_rate_country' => $country ,
'tax_rate_state' => $state ,
'tax_rate' => $tax_rate [ 'rate' ],
'tax_rate_name' => $tax_rate [ 'label' ],
'tax_rate_priority' => 1 ,
2016-09-07 22:32:24 +00:00
'tax_rate_compound' => ( 'yes' === $tax_rate [ 'compound' ] ) ? 1 : 0 ,
'tax_rate_shipping' => ( 'yes' === $tax_rate [ 'shipping' ] ) ? 1 : 0 ,
2016-05-11 11:44:12 +00:00
'tax_rate_order' => $loop ,
2016-08-27 01:46:45 +00:00
'tax_rate_class' => $tax_rate [ 'class' ],
2016-05-11 11:44:12 +00:00
)
);
$loop ++ ;
}
}
}
2017-03-07 20:24:24 +00:00
}
2016-05-11 11:44:12 +00:00
$local_tax_rates = get_option ( 'woocommerce_local_tax_rates' );
2017-03-07 20:24:24 +00:00
if ( $local_tax_rates ) {
2016-05-11 11:44:12 +00:00
foreach ( $local_tax_rates as $tax_rate ) {
2016-09-07 22:32:24 +00:00
$location_type = ( 'postcode' === $tax_rate [ 'location_type' ] ) ? 'postcode' : 'city' ;
2016-05-11 11:44:12 +00:00
2020-04-29 15:16:30 +00:00
if ( '*' === $tax_rate [ 'state' ] ) {
2016-05-11 11:44:12 +00:00
$tax_rate [ 'state' ] = '' ;
2016-09-07 22:32:24 +00:00
}
2016-05-11 11:44:12 +00:00
$wpdb -> insert (
2017-10-05 11:48:26 +00:00
$wpdb -> prefix . 'woocommerce_tax_rates' ,
2016-05-11 11:44:12 +00:00
array (
'tax_rate_country' => $tax_rate [ 'country' ],
'tax_rate_state' => $tax_rate [ 'state' ],
'tax_rate' => $tax_rate [ 'rate' ],
'tax_rate_name' => $tax_rate [ 'label' ],
'tax_rate_priority' => 2 ,
2016-09-07 22:32:24 +00:00
'tax_rate_compound' => ( 'yes' === $tax_rate [ 'compound' ] ) ? 1 : 0 ,
'tax_rate_shipping' => ( 'yes' === $tax_rate [ 'shipping' ] ) ? 1 : 0 ,
2016-05-11 11:44:12 +00:00
'tax_rate_order' => $loop ,
2016-08-27 01:46:45 +00:00
'tax_rate_class' => $tax_rate [ 'class' ],
2016-05-11 11:44:12 +00:00
)
);
$tax_rate_id = $wpdb -> insert_id ;
if ( $tax_rate [ 'locations' ] ) {
foreach ( $tax_rate [ 'locations' ] as $location ) {
$wpdb -> insert (
2017-10-05 11:48:26 +00:00
$wpdb -> prefix . 'woocommerce_tax_rate_locations' ,
2016-05-11 11:44:12 +00:00
array (
'location_code' => $location ,
'tax_rate_id' => $tax_rate_id ,
'location_type' => $location_type ,
)
);
}
}
$loop ++ ;
}
2017-03-07 20:24:24 +00:00
}
2016-05-11 11:44:12 +00:00
update_option ( 'woocommerce_tax_rates_backup' , $tax_rates );
update_option ( 'woocommerce_local_tax_rates_backup' , $local_tax_rates );
delete_option ( 'woocommerce_tax_rates' );
delete_option ( 'woocommerce_local_tax_rates' );
}
2017-10-05 11:48:26 +00:00
/**
2017-11-23 14:17:54 +00:00
* Update order item line items for 2.0
2017-10-05 11:48:26 +00:00
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_200_line_items () {
global $wpdb ;
2017-10-05 11:48:26 +00:00
// Now its time for the massive update to line items - move them to the new DB tables.
// Reverse with UPDATE `wpwc_postmeta` SET meta_key = '_order_items' WHERE meta_key = '_order_items_old'.
2017-11-23 12:41:31 +00:00
$order_item_rows = $wpdb -> get_results (
" SELECT meta_value, post_id FROM { $wpdb -> postmeta } WHERE meta_key = '_order_items' "
);
2016-05-11 11:44:12 +00:00
foreach ( $order_item_rows as $order_item_row ) {
$order_items = ( array ) maybe_unserialize ( $order_item_row -> meta_value );
foreach ( $order_items as $order_item ) {
if ( ! isset ( $order_item [ 'line_total' ] ) && isset ( $order_item [ 'taxrate' ] ) && isset ( $order_item [ 'cost' ] ) ) {
2017-11-23 12:41:31 +00:00
$order_item [ 'line_tax' ] = number_format ( ( $order_item [ 'cost' ] * $order_item [ 'qty' ] ) * ( $order_item [ 'taxrate' ] / 100 ), 2 , '.' , '' );
$order_item [ 'line_total' ] = $order_item [ 'cost' ] * $order_item [ 'qty' ];
$order_item [ 'line_subtotal_tax' ] = $order_item [ 'line_tax' ];
$order_item [ 'line_subtotal' ] = $order_item [ 'line_total' ];
2016-05-11 11:44:12 +00:00
}
2017-11-23 12:41:31 +00:00
$order_item [ 'line_tax' ] = isset ( $order_item [ 'line_tax' ] ) ? $order_item [ 'line_tax' ] : 0 ;
$order_item [ 'line_total' ] = isset ( $order_item [ 'line_total' ] ) ? $order_item [ 'line_total' ] : 0 ;
$order_item [ 'line_subtotal_tax' ] = isset ( $order_item [ 'line_subtotal_tax' ] ) ? $order_item [ 'line_subtotal_tax' ] : 0 ;
$order_item [ 'line_subtotal' ] = isset ( $order_item [ 'line_subtotal' ] ) ? $order_item [ 'line_subtotal' ] : 0 ;
2016-05-11 11:44:12 +00:00
2017-11-23 12:41:31 +00:00
$item_id = wc_add_order_item (
$order_item_row -> post_id ,
array (
'order_item_name' => $order_item [ 'name' ],
'order_item_type' => 'line_item' ,
)
);
2017-10-05 11:48:26 +00:00
2020-04-29 15:16:30 +00:00
// Add line item meta.
2017-10-05 11:48:26 +00:00
if ( $item_id ) {
wc_add_order_item_meta ( $item_id , '_qty' , absint ( $order_item [ 'qty' ] ) );
wc_add_order_item_meta ( $item_id , '_tax_class' , $order_item [ 'tax_class' ] );
wc_add_order_item_meta ( $item_id , '_product_id' , $order_item [ 'id' ] );
wc_add_order_item_meta ( $item_id , '_variation_id' , $order_item [ 'variation_id' ] );
wc_add_order_item_meta ( $item_id , '_line_subtotal' , wc_format_decimal ( $order_item [ 'line_subtotal' ] ) );
wc_add_order_item_meta ( $item_id , '_line_subtotal_tax' , wc_format_decimal ( $order_item [ 'line_subtotal_tax' ] ) );
wc_add_order_item_meta ( $item_id , '_line_total' , wc_format_decimal ( $order_item [ 'line_total' ] ) );
wc_add_order_item_meta ( $item_id , '_line_tax' , wc_format_decimal ( $order_item [ 'line_tax' ] ) );
$meta_rows = array ();
// Insert meta.
2016-05-11 11:44:12 +00:00
if ( ! empty ( $order_item [ 'item_meta' ] ) ) {
foreach ( $order_item [ 'item_meta' ] as $key => $meta ) {
2017-10-05 11:48:26 +00:00
// Backwards compatibility.
2016-05-11 11:44:12 +00:00
if ( is_array ( $meta ) && isset ( $meta [ 'meta_name' ] ) ) {
$meta_rows [] = '(' . $item_id . ',"' . esc_sql ( $meta [ 'meta_name' ] ) . '","' . esc_sql ( $meta [ 'meta_value' ] ) . '")' ;
} else {
$meta_rows [] = '(' . $item_id . ',"' . esc_sql ( $key ) . '","' . esc_sql ( $meta ) . '")' ;
}
}
}
2017-10-05 11:48:26 +00:00
// Insert meta rows at once.
if ( count ( $meta_rows ) > 0 ) {
2017-11-23 12:41:31 +00:00
$wpdb -> query (
$wpdb -> prepare (
" INSERT INTO { $wpdb -> prefix } woocommerce_order_itemmeta ( order_item_id, meta_key, meta_value )
2017-11-23 14:17:21 +00:00
VALUES " . implode( ',', $meta_rows ) . ';', // @codingStandardsIgnoreLine
2017-11-23 12:41:31 +00:00
$order_item_row -> post_id
)
);
2016-05-11 11:44:12 +00:00
}
2017-10-05 11:48:26 +00:00
// Delete from DB (rename).
2017-11-23 12:41:31 +00:00
$wpdb -> query (
$wpdb -> prepare (
" UPDATE { $wpdb -> postmeta }
SET meta_key = '_order_items_old'
WHERE meta_key = '_order_items'
AND post_id = % d " ,
$order_item_row -> post_id
)
);
2017-10-05 11:48:26 +00:00
}
2016-05-11 11:44:12 +00:00
unset ( $meta_rows , $item_id , $order_item );
}
}
2017-10-05 11:48:26 +00:00
// Do the same kind of update for order_taxes - move to lines.
// Reverse with UPDATE `wpwc_postmeta` SET meta_key = '_order_taxes' WHERE meta_key = '_order_taxes_old'.
2017-11-23 12:41:31 +00:00
$order_tax_rows = $wpdb -> get_results (
" SELECT meta_value, post_id FROM { $wpdb -> postmeta }
WHERE meta_key = '_order_taxes' "
);
2016-05-11 11:44:12 +00:00
foreach ( $order_tax_rows as $order_tax_row ) {
$order_taxes = ( array ) maybe_unserialize ( $order_tax_row -> meta_value );
2016-06-06 18:39:23 +00:00
if ( ! empty ( $order_taxes ) ) {
2016-08-27 04:23:02 +00:00
foreach ( $order_taxes as $order_tax ) {
2016-05-11 11:44:12 +00:00
2017-03-07 20:24:24 +00:00
if ( ! isset ( $order_tax [ 'label' ] ) || ! isset ( $order_tax [ 'cart_tax' ] ) || ! isset ( $order_tax [ 'shipping_tax' ] ) ) {
2016-05-11 11:44:12 +00:00
continue ;
2017-03-07 20:24:24 +00:00
}
2016-05-11 11:44:12 +00:00
2017-11-23 12:41:31 +00:00
$item_id = wc_add_order_item (
2018-11-23 14:57:51 +00:00
$order_tax_row -> post_id ,
array (
2017-11-23 12:41:31 +00:00
'order_item_name' => $order_tax [ 'label' ],
'order_item_type' => 'tax' ,
)
);
2017-10-05 11:48:26 +00:00
2020-04-29 15:16:30 +00:00
// Add line item meta.
2017-10-05 11:48:26 +00:00
if ( $item_id ) {
wc_add_order_item_meta ( $item_id , 'compound' , absint ( isset ( $order_tax [ 'compound' ] ) ? $order_tax [ 'compound' ] : 0 ) );
wc_add_order_item_meta ( $item_id , 'tax_amount' , wc_clean ( $order_tax [ 'cart_tax' ] ) );
wc_add_order_item_meta ( $item_id , 'shipping_tax_amount' , wc_clean ( $order_tax [ 'shipping_tax' ] ) );
2016-05-11 11:44:12 +00:00
}
2017-10-05 11:48:26 +00:00
// Delete from DB (rename).
2017-11-23 12:41:31 +00:00
$wpdb -> query (
$wpdb -> prepare (
" UPDATE { $wpdb -> postmeta }
SET meta_key = '_order_taxes_old'
WHERE meta_key = '_order_taxes'
AND post_id = % d " ,
$order_tax_row -> post_id
)
);
2016-05-11 11:44:12 +00:00
unset ( $tax_amount );
}
}
}
}
2017-10-05 11:48:26 +00:00
/**
* Update image settings for 2.0
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_200_images () {
// Grab the pre 2.0 Image options and use to populate the new image options settings,
2017-10-05 11:48:26 +00:00
// cleaning up afterwards like nice people do.
2016-05-11 11:44:12 +00:00
foreach ( array ( 'catalog' , 'single' , 'thumbnail' ) as $value ) {
2017-11-23 12:41:31 +00:00
$old_settings = array_filter (
array (
'width' => get_option ( 'woocommerce_' . $value . '_image_width' ),
'height' => get_option ( 'woocommerce_' . $value . '_image_height' ),
'crop' => get_option ( 'woocommerce_' . $value . '_image_crop' ),
)
);
2016-05-11 11:44:12 +00:00
2016-09-02 01:51:31 +00:00
if ( ! empty ( $old_settings ) && update_option ( 'shop_' . $value . '_image_size' , $old_settings ) ) {
2016-05-11 11:44:12 +00:00
delete_option ( 'woocommerce_' . $value . '_image_width' );
delete_option ( 'woocommerce_' . $value . '_image_height' );
delete_option ( 'woocommerce_' . $value . '_image_crop' );
}
}
}
2017-10-05 11:48:26 +00:00
/**
* Update DB version for 2.0
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_200_db_version () {
WC_Install :: update_db_version ( '2.0.0' );
}
2017-10-05 11:48:26 +00:00
/**
* Update Brazilian States for 2.0 . 9
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_209_brazillian_state () {
global $wpdb ;
2020-04-29 15:16:30 +00:00
// phpcs:disable WordPress.DB.SlowDBQuery
2017-10-05 11:48:26 +00:00
// Update brazillian state codes.
2016-05-11 11:44:12 +00:00
$wpdb -> update (
$wpdb -> postmeta ,
array (
2016-08-27 01:46:45 +00:00
'meta_value' => 'BA' ,
2016-05-11 11:44:12 +00:00
),
array (
'meta_key' => '_billing_state' ,
2016-08-27 01:46:45 +00:00
'meta_value' => 'BH' ,
2016-05-11 11:44:12 +00:00
)
);
$wpdb -> update (
$wpdb -> postmeta ,
array (
2016-08-27 01:46:45 +00:00
'meta_value' => 'BA' ,
2016-05-11 11:44:12 +00:00
),
array (
'meta_key' => '_shipping_state' ,
2016-08-27 01:46:45 +00:00
'meta_value' => 'BH' ,
2016-05-11 11:44:12 +00:00
)
);
$wpdb -> update (
$wpdb -> usermeta ,
array (
2016-08-27 01:46:45 +00:00
'meta_value' => 'BA' ,
2016-05-11 11:44:12 +00:00
),
array (
'meta_key' => 'billing_state' ,
2016-08-27 01:46:45 +00:00
'meta_value' => 'BH' ,
2016-05-11 11:44:12 +00:00
)
);
$wpdb -> update (
$wpdb -> usermeta ,
array (
2016-08-27 01:46:45 +00:00
'meta_value' => 'BA' ,
2016-05-11 11:44:12 +00:00
),
array (
'meta_key' => 'shipping_state' ,
2016-08-27 01:46:45 +00:00
'meta_value' => 'BH' ,
2016-05-11 11:44:12 +00:00
)
);
2020-04-29 15:16:30 +00:00
// phpcs:enable WordPress.DB.SlowDBQuery
2016-05-11 11:44:12 +00:00
}
2017-10-05 11:48:26 +00:00
/**
* Update DB version for 2.0 . 9
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_209_db_version () {
WC_Install :: update_db_version ( '2.0.9' );
}
2017-10-05 11:48:26 +00:00
/**
* Remove pages for 2.1
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_210_remove_pages () {
2017-10-05 11:48:26 +00:00
// Pages no longer used.
2016-09-02 01:51:31 +00:00
wp_trash_post ( get_option ( 'woocommerce_pay_page_id' ) );
wp_trash_post ( get_option ( 'woocommerce_thanks_page_id' ) );
wp_trash_post ( get_option ( 'woocommerce_view_order_page_id' ) );
wp_trash_post ( get_option ( 'woocommerce_change_password_page_id' ) );
wp_trash_post ( get_option ( 'woocommerce_edit_address_page_id' ) );
wp_trash_post ( get_option ( 'woocommerce_lost_password_page_id' ) );
2016-05-11 11:44:12 +00:00
}
2017-10-05 11:48:26 +00:00
/**
* Update file paths to support multiple files for 2.1
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_210_file_paths () {
global $wpdb ;
2017-10-05 11:48:26 +00:00
// Upgrade file paths to support multiple file paths + names etc.
2017-02-13 12:58:42 +00:00
$existing_file_paths = $wpdb -> get_results ( " SELECT meta_value, meta_id FROM { $wpdb -> postmeta } WHERE meta_key = '_file_paths' AND meta_value != ''; " );
2016-05-11 11:44:12 +00:00
if ( $existing_file_paths ) {
2016-08-27 04:23:02 +00:00
foreach ( $existing_file_paths as $existing_file_path ) {
2016-05-11 11:44:12 +00:00
$needs_update = false ;
$new_value = array ();
$value = maybe_unserialize ( trim ( $existing_file_path -> meta_value ) );
if ( $value ) {
foreach ( $value as $key => $file ) {
if ( ! is_array ( $file ) ) {
$needs_update = true ;
$new_value [ $key ] = array (
'file' => $file ,
2016-08-27 01:46:45 +00:00
'name' => wc_get_filename_from_url ( $file ),
2016-05-11 11:44:12 +00:00
);
} else {
$new_value [ $key ] = $file ;
}
}
if ( $needs_update ) {
2020-04-29 15:16:30 +00:00
// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize
2016-05-11 11:44:12 +00:00
$new_value = serialize ( $new_value );
$wpdb -> query ( $wpdb -> prepare ( " UPDATE { $wpdb -> postmeta } SET meta_key = %s, meta_value = %s WHERE meta_id = %d " , '_downloadable_files' , $new_value , $existing_file_path -> meta_id ) );
}
}
}
}
}
2017-10-05 11:48:26 +00:00
/**
* Update DB version for 2.1
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_210_db_version () {
WC_Install :: update_db_version ( '2.1.0' );
}
2017-10-05 11:48:26 +00:00
/**
* Update shipping options for 2.2
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_220_shipping () {
$woocommerce_ship_to_destination = 'shipping' ;
if ( get_option ( 'woocommerce_ship_to_billing_address_only' ) === 'yes' ) {
$woocommerce_ship_to_destination = 'billing_only' ;
} elseif ( get_option ( 'woocommerce_ship_to_billing' ) === 'yes' ) {
$woocommerce_ship_to_destination = 'billing' ;
}
add_option ( 'woocommerce_ship_to_destination' , $woocommerce_ship_to_destination , '' , 'no' );
}
2017-10-05 11:48:26 +00:00
/**
* Update order statuses for 2.2
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_220_order_status () {
global $wpdb ;
2017-11-23 12:41:31 +00:00
$wpdb -> query (
" UPDATE { $wpdb -> posts } as posts
2016-06-15 18:20:48 +00:00
LEFT JOIN { $wpdb -> term_relationships } AS rel ON posts . ID = rel . object_id
2016-05-11 11:44:12 +00:00
LEFT JOIN { $wpdb -> term_taxonomy } AS tax USING ( term_taxonomy_id )
LEFT JOIN { $wpdb -> terms } AS term USING ( term_id )
SET posts . post_status = 'wc-pending'
WHERE posts . post_type = 'shop_order'
AND posts . post_status = 'publish'
AND tax . taxonomy = 'shop_order_status'
2017-11-23 12:41:31 +00:00
AND term . slug LIKE 'pending%' ; "
2016-05-11 11:44:12 +00:00
);
2017-11-23 12:41:31 +00:00
$wpdb -> query (
" UPDATE { $wpdb -> posts } as posts
2016-06-15 18:20:48 +00:00
LEFT JOIN { $wpdb -> term_relationships } AS rel ON posts . ID = rel . object_id
2016-05-11 11:44:12 +00:00
LEFT JOIN { $wpdb -> term_taxonomy } AS tax USING ( term_taxonomy_id )
LEFT JOIN { $wpdb -> terms } AS term USING ( term_id )
SET posts . post_status = 'wc-processing'
WHERE posts . post_type = 'shop_order'
AND posts . post_status = 'publish'
AND tax . taxonomy = 'shop_order_status'
2017-11-23 12:41:31 +00:00
AND term . slug LIKE 'processing%' ; "
2016-05-11 11:44:12 +00:00
);
2017-11-23 12:41:31 +00:00
$wpdb -> query (
" UPDATE { $wpdb -> posts } as posts
2016-06-15 18:20:48 +00:00
LEFT JOIN { $wpdb -> term_relationships } AS rel ON posts . ID = rel . object_id
2016-05-11 11:44:12 +00:00
LEFT JOIN { $wpdb -> term_taxonomy } AS tax USING ( term_taxonomy_id )
LEFT JOIN { $wpdb -> terms } AS term USING ( term_id )
SET posts . post_status = 'wc-on-hold'
WHERE posts . post_type = 'shop_order'
AND posts . post_status = 'publish'
AND tax . taxonomy = 'shop_order_status'
2017-11-23 12:41:31 +00:00
AND term . slug LIKE 'on-hold%' ; "
2016-05-11 11:44:12 +00:00
);
2017-11-23 12:41:31 +00:00
$wpdb -> query (
" UPDATE { $wpdb -> posts } as posts
2016-06-15 18:20:48 +00:00
LEFT JOIN { $wpdb -> term_relationships } AS rel ON posts . ID = rel . object_id
2016-05-11 11:44:12 +00:00
LEFT JOIN { $wpdb -> term_taxonomy } AS tax USING ( term_taxonomy_id )
LEFT JOIN { $wpdb -> terms } AS term USING ( term_id )
SET posts . post_status = 'wc-completed'
WHERE posts . post_type = 'shop_order'
AND posts . post_status = 'publish'
AND tax . taxonomy = 'shop_order_status'
2017-11-23 12:41:31 +00:00
AND term . slug LIKE 'completed%' ; "
2016-05-11 11:44:12 +00:00
);
2017-11-23 12:41:31 +00:00
$wpdb -> query (
" UPDATE { $wpdb -> posts } as posts
2016-06-15 18:20:48 +00:00
LEFT JOIN { $wpdb -> term_relationships } AS rel ON posts . ID = rel . object_id
2016-05-11 11:44:12 +00:00
LEFT JOIN { $wpdb -> term_taxonomy } AS tax USING ( term_taxonomy_id )
LEFT JOIN { $wpdb -> terms } AS term USING ( term_id )
SET posts . post_status = 'wc-cancelled'
WHERE posts . post_type = 'shop_order'
AND posts . post_status = 'publish'
AND tax . taxonomy = 'shop_order_status'
2017-11-23 12:41:31 +00:00
AND term . slug LIKE 'cancelled%' ; "
2016-05-11 11:44:12 +00:00
);
2017-11-23 12:41:31 +00:00
$wpdb -> query (
" UPDATE { $wpdb -> posts } as posts
2016-06-15 18:20:48 +00:00
LEFT JOIN { $wpdb -> term_relationships } AS rel ON posts . ID = rel . object_id
2016-05-11 11:44:12 +00:00
LEFT JOIN { $wpdb -> term_taxonomy } AS tax USING ( term_taxonomy_id )
LEFT JOIN { $wpdb -> terms } AS term USING ( term_id )
SET posts . post_status = 'wc-refunded'
WHERE posts . post_type = 'shop_order'
AND posts . post_status = 'publish'
AND tax . taxonomy = 'shop_order_status'
2017-11-23 12:41:31 +00:00
AND term . slug LIKE 'refunded%' ; "
2016-05-11 11:44:12 +00:00
);
2017-11-23 12:41:31 +00:00
$wpdb -> query (
" UPDATE { $wpdb -> posts } as posts
2016-06-15 18:20:48 +00:00
LEFT JOIN { $wpdb -> term_relationships } AS rel ON posts . ID = rel . object_id
2016-05-11 11:44:12 +00:00
LEFT JOIN { $wpdb -> term_taxonomy } AS tax USING ( term_taxonomy_id )
LEFT JOIN { $wpdb -> terms } AS term USING ( term_id )
SET posts . post_status = 'wc-failed'
WHERE posts . post_type = 'shop_order'
AND posts . post_status = 'publish'
AND tax . taxonomy = 'shop_order_status'
2017-11-23 12:41:31 +00:00
AND term . slug LIKE 'failed%' ; "
2016-05-11 11:44:12 +00:00
);
}
2017-10-05 11:48:26 +00:00
/**
* Update variations for 2.2
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_220_variations () {
global $wpdb ;
2017-10-05 11:48:26 +00:00
// Update variations which manage stock.
2017-11-23 12:41:31 +00:00
$update_variations = $wpdb -> get_results (
" SELECT DISTINCT posts.ID AS variation_id, posts.post_parent AS variation_parent FROM { $wpdb -> posts } as posts
2016-05-11 11:44:12 +00:00
LEFT OUTER JOIN { $wpdb -> postmeta } AS postmeta ON posts . ID = postmeta . post_id AND postmeta . meta_key = '_stock'
LEFT OUTER JOIN { $wpdb -> postmeta } as postmeta2 ON posts . ID = postmeta2 . post_id AND postmeta2 . meta_key = '_manage_stock'
WHERE posts . post_type = 'product_variation'
AND postmeta . meta_value IS NOT NULL
AND postmeta . meta_value != ''
2017-11-23 12:41:31 +00:00
AND postmeta2 . meta_value IS NULL "
);
2016-05-11 11:44:12 +00:00
foreach ( $update_variations as $variation ) {
$parent_backorders = get_post_meta ( $variation -> variation_parent , '_backorders' , true );
add_post_meta ( $variation -> variation_id , '_manage_stock' , 'yes' , true );
add_post_meta ( $variation -> variation_id , '_backorders' , $parent_backorders ? $parent_backorders : 'no' , true );
}
}
2017-10-05 11:48:26 +00:00
/**
* Update attributes for 2.2
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_220_attributes () {
global $wpdb ;
2017-10-05 11:48:26 +00:00
// Update taxonomy names with correct sanitized names.
$attribute_taxonomies = $wpdb -> get_results ( 'SELECT attribute_name, attribute_id FROM ' . $wpdb -> prefix . 'woocommerce_attribute_taxonomies' );
2016-05-11 11:44:12 +00:00
foreach ( $attribute_taxonomies as $attribute_taxonomy ) {
$sanitized_attribute_name = wc_sanitize_taxonomy_name ( $attribute_taxonomy -> attribute_name );
if ( $sanitized_attribute_name !== $attribute_taxonomy -> attribute_name ) {
if ( ! $wpdb -> get_var ( $wpdb -> prepare ( " SELECT 1=1 FROM { $wpdb -> prefix } woocommerce_attribute_taxonomies WHERE attribute_name = %s; " , $sanitized_attribute_name ) ) ) {
2017-10-05 11:48:26 +00:00
// Update attribute.
2016-05-11 11:44:12 +00:00
$wpdb -> update (
" { $wpdb -> prefix } woocommerce_attribute_taxonomies " ,
array (
2016-08-27 01:46:45 +00:00
'attribute_name' => $sanitized_attribute_name ,
2016-05-11 11:44:12 +00:00
),
array (
2016-08-27 01:46:45 +00:00
'attribute_id' => $attribute_taxonomy -> attribute_id ,
2016-05-11 11:44:12 +00:00
)
);
2017-10-05 11:48:26 +00:00
// Update terms.
2016-05-11 11:44:12 +00:00
$wpdb -> update (
$wpdb -> term_taxonomy ,
array ( 'taxonomy' => wc_attribute_taxonomy_name ( $sanitized_attribute_name ) ),
array ( 'taxonomy' => 'pa_' . $attribute_taxonomy -> attribute_name )
);
}
}
}
2019-03-05 16:16:46 +00:00
delete_transient ( 'wc_attribute_taxonomies' );
2019-11-28 13:03:57 +00:00
WC_Cache_Helper :: invalidate_cache_group ( 'woocommerce-attributes' );
2016-05-11 11:44:12 +00:00
}
2017-10-05 11:48:26 +00:00
/**
* Update DB version for 2.2
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_220_db_version () {
WC_Install :: update_db_version ( '2.2.0' );
}
2017-10-05 11:48:26 +00:00
/**
* Update options for 2.3
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_230_options () {
// _money_spent and _order_count may be out of sync - clear them
delete_metadata ( 'user' , 0 , '_money_spent' , '' , true );
delete_metadata ( 'user' , 0 , '_order_count' , '' , true );
2020-08-17 08:57:09 +00:00
delete_metadata ( 'user' , 0 , '_last_order' , '' , true );
2016-05-11 11:44:12 +00:00
2017-10-05 11:48:26 +00:00
// To prevent taxes being hidden when using a default 'no address' in a store with tax inc prices, set the woocommerce_default_customer_address to use the store base address by default.
2016-05-11 11:44:12 +00:00
if ( '' === get_option ( 'woocommerce_default_customer_address' , false ) && wc_prices_include_tax () ) {
update_option ( 'woocommerce_default_customer_address' , 'base' );
}
}
2017-10-05 11:48:26 +00:00
/**
* Update DB version for 2.3
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_230_db_version () {
WC_Install :: update_db_version ( '2.3.0' );
}
2017-10-05 11:48:26 +00:00
/**
* Update calc discount options for 2.4
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_240_options () {
/**
* Coupon discount calculations .
* Maintain the old coupon logic for upgrades .
*/
update_option ( 'woocommerce_calc_discounts_sequentially' , 'yes' );
}
2017-10-05 11:48:26 +00:00
/**
* Update shipping methods for 2.4
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_240_shipping_methods () {
/**
* Flat Rate Shipping .
* Update legacy options to new math based options .
*/
$shipping_methods = array (
'woocommerce_flat_rates' => new WC_Shipping_Legacy_Flat_Rate (),
2016-08-27 01:46:45 +00:00
'woocommerce_international_delivery_flat_rates' => new WC_Shipping_Legacy_International_Delivery (),
2016-05-11 11:44:12 +00:00
);
foreach ( $shipping_methods as $flat_rate_option_key => $shipping_method ) {
2017-10-05 11:48:26 +00:00
// Stop this running more than once if routine is repeated.
2016-05-11 11:44:12 +00:00
if ( version_compare ( $shipping_method -> get_option ( 'version' , 0 ), '2.4.0' , '<' ) ) {
2018-10-02 15:03:17 +00:00
$shipping_classes = WC () -> shipping () -> get_shipping_classes ();
$has_classes = count ( $shipping_classes ) > 0 ;
2019-02-12 13:27:30 +00:00
$cost_key = $has_classes ? 'no_class_cost' : 'cost' ;
2018-11-23 14:57:51 +00:00
$min_fee = $shipping_method -> get_option ( 'minimum_fee' );
$math_cost_strings = array (
2017-11-23 12:41:31 +00:00
'cost' => array (),
'no_class_cost' => array (),
);
2017-11-23 14:17:21 +00:00
2016-05-11 11:44:12 +00:00
$math_cost_strings [ $cost_key ][] = $shipping_method -> get_option ( 'cost' );
2018-11-23 14:57:51 +00:00
$fee = $shipping_method -> get_option ( 'fee' );
2016-05-11 11:44:12 +00:00
2017-11-23 14:17:21 +00:00
if ( $fee ) {
2016-05-11 11:44:12 +00:00
$math_cost_strings [ $cost_key ][] = strstr ( $fee , '%' ) ? '[fee percent="' . str_replace ( '%' , '' , $fee ) . '" min="' . esc_attr ( $min_fee ) . '"]' : $fee ;
}
2018-10-02 15:03:17 +00:00
foreach ( $shipping_classes as $shipping_class ) {
2016-05-11 11:44:12 +00:00
$rate_key = 'class_cost_' . $shipping_class -> slug ;
2016-08-27 03:23:21 +00:00
$math_cost_strings [ $rate_key ] = $math_cost_strings [ 'no_class_cost' ];
2016-05-11 11:44:12 +00:00
}
2017-11-23 14:17:21 +00:00
$flat_rates = array_filter ( ( array ) get_option ( $flat_rate_option_key , array () ) );
if ( $flat_rates ) {
2016-05-11 11:44:12 +00:00
foreach ( $flat_rates as $shipping_class => $rate ) {
$rate_key = 'class_cost_' . $shipping_class ;
if ( $rate [ 'cost' ] || $rate [ 'fee' ] ) {
$math_cost_strings [ $rate_key ][] = $rate [ 'cost' ];
$math_cost_strings [ $rate_key ][] = strstr ( $rate [ 'fee' ], '%' ) ? '[fee percent="' . str_replace ( '%' , '' , $rate [ 'fee' ] ) . '" min="' . esc_attr ( $min_fee ) . '"]' : $rate [ 'fee' ];
}
}
}
if ( 'item' === $shipping_method -> type ) {
foreach ( $math_cost_strings as $key => $math_cost_string ) {
$math_cost_strings [ $key ] = array_filter ( array_map ( 'trim' , $math_cost_strings [ $key ] ) );
if ( ! empty ( $math_cost_strings [ $key ] ) ) {
2017-10-05 11:48:26 +00:00
$last_key = max ( 0 , count ( $math_cost_strings [ $key ] ) - 1 );
2016-05-11 11:44:12 +00:00
$math_cost_strings [ $key ][ 0 ] = '( ' . $math_cost_strings [ $key ][ 0 ];
$math_cost_strings [ $key ][ $last_key ] .= ' ) * [qty]' ;
}
}
}
2016-08-27 03:23:21 +00:00
$math_cost_strings [ 'cost' ][] = $shipping_method -> get_option ( 'cost_per_order' );
2016-05-11 11:44:12 +00:00
2017-10-05 11:48:26 +00:00
// Save settings.
2016-05-11 11:44:12 +00:00
foreach ( $math_cost_strings as $option_id => $math_cost_string ) {
$shipping_method -> settings [ $option_id ] = implode ( ' + ' , array_filter ( $math_cost_string ) );
}
$shipping_method -> settings [ 'version' ] = '2.4.0' ;
$shipping_method -> settings [ 'type' ] = 'item' === $shipping_method -> settings [ 'type' ] ? 'class' : $shipping_method -> settings [ 'type' ];
update_option ( $shipping_method -> plugin_id . $shipping_method -> id . '_settings' , $shipping_method -> settings );
}
}
}
2017-10-05 11:48:26 +00:00
/**
* Update API keys for 2.4
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_240_api_keys () {
global $wpdb ;
/**
* Update the old user API keys to the new Apps keys .
*/
$api_users = $wpdb -> get_results ( " SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'woocommerce_api_consumer_key' " );
$apps_keys = array ();
2017-10-05 11:48:26 +00:00
// Get user data.
2016-05-11 11:44:12 +00:00
foreach ( $api_users as $_user ) {
2017-11-23 12:41:31 +00:00
$user = get_userdata ( $_user -> user_id );
2016-05-11 11:44:12 +00:00
$apps_keys [] = array (
'user_id' => $user -> ID ,
'permissions' => $user -> woocommerce_api_key_permissions ,
'consumer_key' => wc_api_hash ( $user -> woocommerce_api_consumer_key ),
'consumer_secret' => $user -> woocommerce_api_consumer_secret ,
2016-08-27 01:46:45 +00:00
'truncated_key' => substr ( $user -> woocommerce_api_consumer_secret , - 7 ),
2016-05-11 11:44:12 +00:00
);
}
if ( ! empty ( $apps_keys ) ) {
2017-10-05 11:48:26 +00:00
// Create new apps.
2016-05-11 11:44:12 +00:00
foreach ( $apps_keys as $app ) {
$wpdb -> insert (
$wpdb -> prefix . 'woocommerce_api_keys' ,
$app ,
array (
'%d' ,
'%s' ,
'%s' ,
'%s' ,
2016-08-27 02:08:49 +00:00
'%s' ,
2016-05-11 11:44:12 +00:00
)
);
}
2017-10-05 11:48:26 +00:00
// Delete old user keys from usermeta.
2016-05-11 11:44:12 +00:00
foreach ( $api_users as $_user ) {
$user_id = intval ( $_user -> user_id );
delete_user_meta ( $user_id , 'woocommerce_api_consumer_key' );
delete_user_meta ( $user_id , 'woocommerce_api_consumer_secret' );
delete_user_meta ( $user_id , 'woocommerce_api_key_permissions' );
}
}
}
2017-10-05 11:48:26 +00:00
/**
* Update webhooks for 2.4
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_240_webhooks () {
2020-04-29 15:16:30 +00:00
// phpcs:disable WordPress.DB.SlowDBQuery
2016-05-11 11:44:12 +00:00
/**
* Webhooks .
* Make sure order . update webhooks get the woocommerce_order_edit_status hook .
*/
2017-11-23 12:41:31 +00:00
$order_update_webhooks = get_posts (
array (
'posts_per_page' => - 1 ,
'post_type' => 'shop_webhook' ,
'meta_key' => '_topic' ,
'meta_value' => 'order.updated' ,
)
);
2016-05-11 11:44:12 +00:00
foreach ( $order_update_webhooks as $order_update_webhook ) {
$webhook = new WC_Webhook ( $order_update_webhook -> ID );
$webhook -> set_topic ( 'order.updated' );
}
2020-04-29 15:16:30 +00:00
// phpcs:enable WordPress.DB.SlowDBQuery
2016-05-11 11:44:12 +00:00
}
2017-10-05 11:48:26 +00:00
/**
* Update refunds for 2.4
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_240_refunds () {
global $wpdb ;
/**
* Refunds for full refunded orders .
* Update fully refunded orders to ensure they have a refund line item so reports add up .
*/
2017-11-23 12:41:31 +00:00
$refunded_orders = get_posts (
array (
'posts_per_page' => - 1 ,
'post_type' => 'shop_order' ,
'post_status' => array ( 'wc-refunded' ),
)
);
2016-05-11 11:44:12 +00:00
2017-10-05 11:48:26 +00:00
// Ensure emails are disabled during this update routine.
2016-05-11 11:44:12 +00:00
remove_all_actions ( 'woocommerce_order_status_refunded_notification' );
remove_all_actions ( 'woocommerce_order_partially_refunded_notification' );
remove_action ( 'woocommerce_order_status_refunded' , array ( 'WC_Emails' , 'send_transactional_email' ) );
remove_action ( 'woocommerce_order_partially_refunded' , array ( 'WC_Emails' , 'send_transactional_email' ) );
foreach ( $refunded_orders as $refunded_order ) {
$order_total = get_post_meta ( $refunded_order -> ID , '_order_total' , true );
2017-11-23 12:41:31 +00:00
$refunded_total = $wpdb -> get_var (
$wpdb -> prepare (
" SELECT SUM( postmeta.meta_value )
FROM $wpdb -> postmeta AS postmeta
INNER JOIN $wpdb -> posts AS posts ON ( posts . post_type = 'shop_order_refund' AND posts . post_parent = % d )
WHERE postmeta . meta_key = '_refund_amount'
AND postmeta . post_id = posts . ID " ,
$refunded_order -> ID
)
);
2016-05-11 11:44:12 +00:00
if ( $order_total > $refunded_total ) {
2017-11-23 12:41:31 +00:00
wc_create_refund (
array (
'amount' => $order_total - $refunded_total ,
'reason' => __ ( 'Order fully refunded' , 'woocommerce' ),
'order_id' => $refunded_order -> ID ,
'line_items' => array (),
'date' => $refunded_order -> post_modified ,
)
);
2016-05-11 11:44:12 +00:00
}
}
wc_delete_shop_order_transients ();
}
2017-10-05 11:48:26 +00:00
/**
* Update DB version for 2.4
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_240_db_version () {
WC_Install :: update_db_version ( '2.4.0' );
}
2017-10-05 11:48:26 +00:00
/**
* Update variations for 2.4 . 1
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_241_variations () {
global $wpdb ;
2017-10-05 11:48:26 +00:00
// Select variations that don't have any _stock_status implemented on WooCommerce 2.2.
2017-11-23 12:41:31 +00:00
$update_variations = $wpdb -> get_results (
" SELECT DISTINCT posts.ID AS variation_id, posts.post_parent AS variation_parent
2016-05-11 11:44:12 +00:00
FROM { $wpdb -> posts } as posts
LEFT OUTER JOIN { $wpdb -> postmeta } AS postmeta ON posts . ID = postmeta . post_id AND postmeta . meta_key = '_stock_status'
WHERE posts . post_type = 'product_variation'
2017-11-23 12:41:31 +00:00
AND postmeta . meta_value IS NULL "
);
2016-05-11 11:44:12 +00:00
foreach ( $update_variations as $variation ) {
2017-10-05 11:48:26 +00:00
// Get the parent _stock_status.
2016-05-11 11:44:12 +00:00
$parent_stock_status = get_post_meta ( $variation -> variation_parent , '_stock_status' , true );
2017-10-05 11:48:26 +00:00
// Set the _stock_status.
2016-05-11 11:44:12 +00:00
add_post_meta ( $variation -> variation_id , '_stock_status' , $parent_stock_status ? $parent_stock_status : 'instock' , true );
2017-10-05 11:48:26 +00:00
// Delete old product children array.
2016-05-11 11:44:12 +00:00
delete_transient ( 'wc_product_children_' . $variation -> variation_parent );
}
2017-10-05 11:48:26 +00:00
// Invalidate old transients such as wc_var_price.
2016-05-11 11:44:12 +00:00
WC_Cache_Helper :: get_transient_version ( 'product' , true );
}
2017-10-05 11:48:26 +00:00
/**
* Update DB version for 2.4 . 1
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_241_db_version () {
WC_Install :: update_db_version ( '2.4.1' );
}
2017-10-05 11:48:26 +00:00
/**
* Update currency settings for 2.5
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_250_currency () {
global $wpdb ;
// Fix currency settings for LAK currency.
$current_currency = get_option ( 'woocommerce_currency' );
if ( 'KIP' === $current_currency ) {
update_option ( 'woocommerce_currency' , 'LAK' );
}
2020-04-29 15:16:30 +00:00
// phpcs:disable WordPress.DB.SlowDBQuery
2016-05-11 11:44:12 +00:00
// Update LAK currency code.
$wpdb -> update (
$wpdb -> postmeta ,
array (
2016-08-27 01:46:45 +00:00
'meta_value' => 'LAK' ,
2016-05-11 11:44:12 +00:00
),
array (
'meta_key' => '_order_currency' ,
2016-08-27 01:46:45 +00:00
'meta_value' => 'KIP' ,
2016-05-11 11:44:12 +00:00
)
);
2019-06-20 10:47:23 +00:00
2020-04-29 15:16:30 +00:00
// phpcs:enable WordPress.DB.SlowDBQuery
2016-05-11 11:44:12 +00:00
}
2017-10-05 11:48:26 +00:00
/**
* Update DB version for 2.5
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_250_db_version () {
WC_Install :: update_db_version ( '2.5.0' );
}
2017-10-05 11:48:26 +00:00
/**
* Update ship to countries options for 2.6
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_260_options () {
2017-10-05 11:48:26 +00:00
// woocommerce_calc_shipping option has been removed in 2.6.
2016-05-11 11:44:12 +00:00
if ( 'no' === get_option ( 'woocommerce_calc_shipping' ) ) {
update_option ( 'woocommerce_ship_to_countries' , 'disabled' );
}
WC_Admin_Notices :: add_notice ( 'legacy_shipping' );
}
2017-10-05 11:48:26 +00:00
/**
* Update term meta for 2.6
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_260_termmeta () {
global $wpdb ;
/**
2017-10-05 11:48:26 +00:00
* Migrate term meta to WordPress tables .
2016-05-11 11:44:12 +00:00
*/
if ( get_option ( 'db_version' ) >= 34370 && $wpdb -> get_var ( " SHOW TABLES LIKE ' { $wpdb -> prefix } woocommerce_termmeta'; " ) ) {
if ( $wpdb -> query ( " INSERT INTO { $wpdb -> termmeta } ( term_id, meta_key, meta_value ) SELECT woocommerce_term_id, meta_key, meta_value FROM { $wpdb -> prefix } woocommerce_termmeta; " ) ) {
$wpdb -> query ( " DROP TABLE IF EXISTS { $wpdb -> prefix } woocommerce_termmeta " );
2016-06-16 22:31:19 +00:00
wp_cache_flush ();
2016-05-11 11:44:12 +00:00
}
}
}
2017-10-05 11:48:26 +00:00
/**
* Update zones for 2.6
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_260_zones () {
global $wpdb ;
/**
* Old ( table rate ) shipping zones to new core shipping zones migration .
* zone_enabled and zone_type are no longer used , but it ' s safe to leave them be .
*/
if ( $wpdb -> get_var ( " SHOW COLUMNS FROM ` { $wpdb -> prefix } woocommerce_shipping_zones` LIKE 'zone_enabled'; " ) ) {
$wpdb -> query ( " ALTER TABLE { $wpdb -> prefix } woocommerce_shipping_zones CHANGE `zone_type` `zone_type` VARCHAR(40) NOT NULL DEFAULT ''; " );
$wpdb -> query ( " ALTER TABLE { $wpdb -> prefix } woocommerce_shipping_zones CHANGE `zone_enabled` `zone_enabled` INT(1) NOT NULL DEFAULT 1; " );
}
}
2017-10-05 11:48:26 +00:00
/**
* Update zone methods for 2.6
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_260_zone_methods () {
global $wpdb ;
/**
* Shipping zones in WC 2.6 . 0 use a table named woocommerce_shipping_zone_methods .
* Migrate the old data out of woocommerce_shipping_zone_shipping_methods into the new table and port over any known options ( used by table rates and flat rate boxes ) .
*/
if ( $wpdb -> get_var ( " SHOW TABLES LIKE ' { $wpdb -> prefix } woocommerce_shipping_zone_shipping_methods'; " ) ) {
2017-02-13 12:58:42 +00:00
$old_methods = $wpdb -> get_results ( " SELECT zone_id, shipping_method_type, shipping_method_order, shipping_method_id FROM { $wpdb -> prefix } woocommerce_shipping_zone_shipping_methods; " );
2016-07-19 15:16:26 +00:00
2016-05-11 11:44:12 +00:00
if ( $old_methods ) {
$max_new_id = $wpdb -> get_var ( " SELECT MAX(instance_id) FROM { $wpdb -> prefix } woocommerce_shipping_zone_methods " );
$max_old_id = $wpdb -> get_var ( " SELECT MAX(shipping_method_id) FROM { $wpdb -> prefix } woocommerce_shipping_zone_shipping_methods " );
2017-10-05 11:48:26 +00:00
// Avoid ID conflicts.
2016-05-11 11:44:12 +00:00
$wpdb -> query ( $wpdb -> prepare ( " ALTER TABLE { $wpdb -> prefix } woocommerce_shipping_zone_methods AUTO_INCREMENT = %d; " , max ( $max_new_id , $max_old_id ) + 1 ) );
2017-10-05 11:48:26 +00:00
// Store changes.
2016-05-11 11:44:12 +00:00
$changes = array ();
2017-10-05 11:48:26 +00:00
// Move data.
2016-05-11 11:44:12 +00:00
foreach ( $old_methods as $old_method ) {
2017-11-23 12:41:31 +00:00
$wpdb -> insert (
2018-11-23 14:57:51 +00:00
$wpdb -> prefix . 'woocommerce_shipping_zone_methods' ,
array (
2017-11-23 12:41:31 +00:00
'zone_id' => $old_method -> zone_id ,
'method_id' => $old_method -> shipping_method_type ,
'method_order' => $old_method -> shipping_method_order ,
)
);
2016-05-11 11:44:12 +00:00
$new_instance_id = $wpdb -> insert_id ;
2017-10-05 11:48:26 +00:00
// Move main settings.
2016-05-11 11:44:12 +00:00
$older_settings_key = 'woocommerce_' . $old_method -> shipping_method_type . '-' . $old_method -> shipping_method_id . '_settings' ;
$old_settings_key = 'woocommerce_' . $old_method -> shipping_method_type . '_' . $old_method -> shipping_method_id . '_settings' ;
add_option ( 'woocommerce_' . $old_method -> shipping_method_type . '_' . $new_instance_id . '_settings' , get_option ( $old_settings_key , get_option ( $older_settings_key ) ) );
// Handling for table rate and flat rate box shipping.
if ( 'table_rate' === $old_method -> shipping_method_type ) {
2017-10-05 11:48:26 +00:00
// Move priority settings.
2016-05-11 11:44:12 +00:00
add_option ( 'woocommerce_table_rate_default_priority_' . $new_instance_id , get_option ( 'woocommerce_table_rate_default_priority_' . $old_method -> shipping_method_id ) );
add_option ( 'woocommerce_table_rate_priorities_' . $new_instance_id , get_option ( 'woocommerce_table_rate_priorities_' . $old_method -> shipping_method_id ) );
2017-10-05 11:48:26 +00:00
// Move rates.
2016-05-11 11:44:12 +00:00
$wpdb -> update (
$wpdb -> prefix . 'woocommerce_shipping_table_rates' ,
array (
2016-08-27 01:46:45 +00:00
'shipping_method_id' => $new_instance_id ,
2016-05-11 11:44:12 +00:00
),
array (
2016-08-27 01:46:45 +00:00
'shipping_method_id' => $old_method -> shipping_method_id ,
2016-05-11 11:44:12 +00:00
)
);
} elseif ( 'flat_rate_boxes' === $old_method -> shipping_method_type ) {
$wpdb -> update (
$wpdb -> prefix . 'woocommerce_shipping_flat_rate_boxes' ,
array (
2016-08-27 01:46:45 +00:00
'shipping_method_id' => $new_instance_id ,
2016-05-11 11:44:12 +00:00
),
array (
2016-08-27 01:46:45 +00:00
'shipping_method_id' => $old_method -> shipping_method_id ,
2016-05-11 11:44:12 +00:00
)
);
}
$changes [ $old_method -> shipping_method_id ] = $new_instance_id ;
}
// $changes contains keys (old method ids) and values (new instance ids) if extra processing is needed in plugins.
// Store this to an option so extensions can pick it up later, then fire an action.
update_option ( 'woocommerce_updated_instance_ids' , $changes );
do_action ( 'woocommerce_updated_instance_ids' , $changes );
}
}
2016-07-19 15:16:26 +00:00
// Change ranges used to ...
$wpdb -> query ( " UPDATE { $wpdb -> prefix } woocommerce_shipping_zone_locations SET location_code = REPLACE( location_code, '-', '...' ); " );
2016-05-11 11:44:12 +00:00
}
2017-10-05 11:48:26 +00:00
/**
* Update refunds for 2.6
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_260_refunds () {
global $wpdb ;
/**
2017-10-05 11:48:26 +00:00
* Refund item qty should be negative .
2016-05-11 11:44:12 +00:00
*/
2017-11-23 12:41:31 +00:00
$wpdb -> query (
" UPDATE { $wpdb -> prefix } woocommerce_order_itemmeta as item_meta
LEFT JOIN { $wpdb -> prefix } woocommerce_order_items as items ON item_meta . order_item_id = items . order_item_id
LEFT JOIN { $wpdb -> posts } as posts ON items . order_id = posts . ID
SET item_meta . meta_value = item_meta . meta_value * - 1
WHERE item_meta . meta_value > 0 AND item_meta . meta_key = '_qty' AND posts . post_type = 'shop_order_refund' "
);
2016-05-11 11:44:12 +00:00
}
2017-10-05 11:48:26 +00:00
/**
* Update DB version for 2.6
*
* @ return void
*/
2016-05-11 11:44:12 +00:00
function wc_update_260_db_version () {
WC_Install :: update_db_version ( '2.6.0' );
}
2016-08-03 20:32:02 +00:00
2017-10-05 11:48:26 +00:00
/**
* Update webhooks for 3.0
*
* @ return void
*/
2017-03-15 16:55:07 +00:00
function wc_update_300_webhooks () {
2020-04-29 15:16:30 +00:00
// phpcs:disable WordPress.DB.SlowDBQuery
2016-08-03 20:32:02 +00:00
/**
* Make sure product . update webhooks get the woocommerce_product_quick_edit_save
* and woocommerce_product_bulk_edit_save hooks .
*/
2017-11-23 12:41:31 +00:00
$product_update_webhooks = get_posts (
array (
'posts_per_page' => - 1 ,
'post_type' => 'shop_webhook' ,
'meta_key' => '_topic' ,
'meta_value' => 'product.updated' ,
)
);
2016-08-03 20:32:02 +00:00
foreach ( $product_update_webhooks as $product_update_webhook ) {
$webhook = new WC_Webhook ( $product_update_webhook -> ID );
$webhook -> set_topic ( 'product.updated' );
}
2020-04-29 15:16:30 +00:00
// phpcs:enable WordPress.DB.SlowDBQuery
2016-08-03 20:32:02 +00:00
}
2016-08-09 08:00:51 +00:00
/**
* Add an index to the field comment_type to improve the response time of the query
* used by WC_Comments :: wp_count_comments () to get the number of comments by type .
*/
2017-03-15 16:55:07 +00:00
function wc_update_300_comment_type_index () {
2016-08-09 08:00:51 +00:00
global $wpdb ;
2017-02-16 16:45:50 +00:00
$index_exists = $wpdb -> get_row ( " SHOW INDEX FROM { $wpdb -> comments } WHERE column_name = 'comment_type' and key_name = 'woo_idx_comment_type' " );
if ( is_null ( $index_exists ) ) {
// Add an index to the field comment_type to improve the response time of the query
// used by WC_Comments::wp_count_comments() to get the number of comments by type.
$wpdb -> query ( " ALTER TABLE { $wpdb -> comments } ADD INDEX woo_idx_comment_type (comment_type) " );
}
2016-08-09 08:00:51 +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
2017-10-05 11:48:26 +00:00
/**
* Update grouped products for 3.0
*
* @ return void
*/
2017-03-15 16:55:07 +00:00
function wc_update_300_grouped_products () {
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
global $wpdb ;
$parents = $wpdb -> get_col ( " SELECT DISTINCT( post_parent ) FROM { $wpdb -> posts } WHERE post_parent > 0 AND post_type = 'product'; " );
foreach ( $parents as $parent_id ) {
$parent = wc_get_product ( $parent_id );
if ( $parent && $parent -> is_type ( 'grouped' ) ) {
2017-11-23 12:41:31 +00:00
$children_ids = get_posts (
array (
'post_parent' => $parent_id ,
'posts_per_page' => - 1 ,
'post_type' => 'product' ,
'fields' => 'ids' ,
)
);
2017-04-19 09:35:39 +00:00
update_post_meta ( $parent_id , '_children' , $children_ids );
// Update children to remove the parent.
$wpdb -> update (
$wpdb -> posts ,
array (
'post_parent' => 0 ,
),
array (
'post_parent' => $parent_id ,
)
);
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
}
}
}
2017-10-05 11:48:26 +00:00
/**
* Update shipping tax classes for 3.0
*
* @ return void
*/
2017-03-15 16:55:07 +00:00
function wc_update_300_settings () {
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
$woocommerce_shipping_tax_class = get_option ( 'woocommerce_shipping_tax_class' );
if ( '' === $woocommerce_shipping_tax_class ) {
update_option ( 'woocommerce_shipping_tax_class' , 'inherit' );
} elseif ( 'standard' === $woocommerce_shipping_tax_class ) {
update_option ( 'woocommerce_shipping_tax_class' , '' );
}
}
2016-12-08 10:56:45 +00:00
/**
* Convert meta values into term for product visibility .
*/
2017-03-15 16:55:07 +00:00
function wc_update_300_product_visibility () {
2016-12-08 10:56:45 +00:00
global $wpdb ;
2017-03-27 10:55:36 +00:00
WC_Install :: create_terms ();
2017-11-23 14:17:21 +00:00
$featured_term = get_term_by ( 'name' , 'featured' , 'product_visibility' );
if ( $featured_term ) {
2017-03-31 11:42:07 +00:00
$wpdb -> query ( $wpdb -> prepare ( " INSERT IGNORE INTO { $wpdb -> term_relationships } SELECT post_id, %d, 0 FROM { $wpdb -> postmeta } WHERE meta_key = '_featured' AND meta_value = 'yes'; " , $featured_term -> term_taxonomy_id ) );
2016-12-08 10:56:45 +00:00
}
2017-11-23 14:17:21 +00:00
$exclude_search_term = get_term_by ( 'name' , 'exclude-from-search' , 'product_visibility' );
if ( $exclude_search_term ) {
2017-03-31 11:42:07 +00:00
$wpdb -> query ( $wpdb -> prepare ( " INSERT IGNORE INTO { $wpdb -> term_relationships } SELECT post_id, %d, 0 FROM { $wpdb -> postmeta } WHERE meta_key = '_visibility' AND meta_value IN ('hidden', 'catalog'); " , $exclude_search_term -> term_taxonomy_id ) );
2016-12-08 10:56:45 +00:00
}
2017-11-23 14:17:21 +00:00
$exclude_catalog_term = get_term_by ( 'name' , 'exclude-from-catalog' , 'product_visibility' );
if ( $exclude_catalog_term ) {
2017-03-31 11:42:07 +00:00
$wpdb -> query ( $wpdb -> prepare ( " INSERT IGNORE INTO { $wpdb -> term_relationships } SELECT post_id, %d, 0 FROM { $wpdb -> postmeta } WHERE meta_key = '_visibility' AND meta_value IN ('hidden', 'search'); " , $exclude_catalog_term -> term_taxonomy_id ) );
2016-12-08 10:56:45 +00:00
}
2017-11-23 14:17:21 +00:00
$outofstock_term = get_term_by ( 'name' , 'outofstock' , 'product_visibility' );
if ( $outofstock_term ) {
2017-03-31 11:42:07 +00:00
$wpdb -> query ( $wpdb -> prepare ( " INSERT IGNORE INTO { $wpdb -> term_relationships } SELECT post_id, %d, 0 FROM { $wpdb -> postmeta } WHERE meta_key = '_stock_status' AND meta_value = 'outofstock'; " , $outofstock_term -> term_taxonomy_id ) );
2016-12-08 10:56:45 +00:00
}
2016-12-09 15:43:25 +00:00
2017-11-23 14:17:21 +00:00
$rating_term = get_term_by ( 'name' , 'rated-1' , 'product_visibility' );
if ( $rating_term ) {
2017-03-31 11:42:07 +00:00
$wpdb -> query ( $wpdb -> prepare ( " INSERT IGNORE INTO { $wpdb -> term_relationships } SELECT post_id, %d, 0 FROM { $wpdb -> postmeta } WHERE meta_key = '_wc_average_rating' AND ROUND( meta_value ) = 1; " , $rating_term -> term_taxonomy_id ) );
2016-12-09 15:43:25 +00:00
}
2017-11-23 14:17:21 +00:00
$rating_term = get_term_by ( 'name' , 'rated-2' , 'product_visibility' );
if ( $rating_term ) {
2017-03-31 11:42:07 +00:00
$wpdb -> query ( $wpdb -> prepare ( " INSERT IGNORE INTO { $wpdb -> term_relationships } SELECT post_id, %d, 0 FROM { $wpdb -> postmeta } WHERE meta_key = '_wc_average_rating' AND ROUND( meta_value ) = 2; " , $rating_term -> term_taxonomy_id ) );
2016-12-09 15:43:25 +00:00
}
2017-11-23 14:17:21 +00:00
$rating_term = get_term_by ( 'name' , 'rated-3' , 'product_visibility' );
if ( $rating_term ) {
2017-03-31 11:42:07 +00:00
$wpdb -> query ( $wpdb -> prepare ( " INSERT IGNORE INTO { $wpdb -> term_relationships } SELECT post_id, %d, 0 FROM { $wpdb -> postmeta } WHERE meta_key = '_wc_average_rating' AND ROUND( meta_value ) = 3; " , $rating_term -> term_taxonomy_id ) );
2016-12-09 15:43:25 +00:00
}
2017-11-23 14:17:21 +00:00
$rating_term = get_term_by ( 'name' , 'rated-4' , 'product_visibility' );
if ( $rating_term ) {
2017-03-31 11:42:07 +00:00
$wpdb -> query ( $wpdb -> prepare ( " INSERT IGNORE INTO { $wpdb -> term_relationships } SELECT post_id, %d, 0 FROM { $wpdb -> postmeta } WHERE meta_key = '_wc_average_rating' AND ROUND( meta_value ) = 4; " , $rating_term -> term_taxonomy_id ) );
2016-12-09 15:43:25 +00:00
}
2017-11-23 14:17:21 +00:00
$rating_term = get_term_by ( 'name' , 'rated-5' , 'product_visibility' );
if ( $rating_term ) {
2017-03-31 11:42:07 +00:00
$wpdb -> query ( $wpdb -> prepare ( " INSERT IGNORE INTO { $wpdb -> term_relationships } SELECT post_id, %d, 0 FROM { $wpdb -> postmeta } WHERE meta_key = '_wc_average_rating' AND ROUND( meta_value ) = 5; " , $rating_term -> term_taxonomy_id ) );
2016-12-09 15:43:25 +00:00
}
2016-12-08 10:56:45 +00:00
}
2016-12-13 13:38:20 +00:00
/**
* Update DB Version .
*/
2017-03-15 16:55:07 +00:00
function wc_update_300_db_version () {
WC_Install :: update_db_version ( '3.0.0' );
2016-12-13 13:38:20 +00:00
}
2017-06-01 18:26:35 +00:00
/**
* Add an index to the downloadable product permissions table to improve performance of update_user_by_order_id .
*/
function wc_update_310_downloadable_products () {
global $wpdb ;
$index_exists = $wpdb -> get_row ( " SHOW INDEX FROM { $wpdb -> prefix } woocommerce_downloadable_product_permissions WHERE column_name = 'order_id' and key_name = 'order_id' " );
if ( is_null ( $index_exists ) ) {
$wpdb -> query ( " ALTER TABLE { $wpdb -> prefix } woocommerce_downloadable_product_permissions ADD INDEX order_id (order_id) " );
}
}
2017-06-08 11:18:07 +00:00
/**
* Find old order notes and ensure they have the correct type for exclusion .
*/
function wc_update_310_old_comments () {
global $wpdb ;
$wpdb -> query ( " UPDATE $wpdb->comments comments LEFT JOIN $wpdb->posts as posts ON comments.comment_post_ID = posts.ID SET comment_type = 'order_note' WHERE posts.post_type = 'shop_order' AND comment_type = ''; " );
}
2017-06-01 18:26:35 +00:00
/**
* Update DB Version .
*/
function wc_update_310_db_version () {
WC_Install :: update_db_version ( '3.1.0' );
}
2017-06-28 11:57:37 +00:00
2017-08-15 16:01:28 +00:00
/**
* Update shop_manager capabilities .
*/
function wc_update_312_shop_manager_capabilities () {
$role = get_role ( 'shop_manager' );
$role -> remove_cap ( 'unfiltered_html' );
}
/**
* Update DB Version .
*/
function wc_update_312_db_version () {
WC_Install :: update_db_version ( '3.1.2' );
}
2017-06-28 11:57:37 +00:00
/**
* Update state codes for Mexico .
*/
function wc_update_320_mexican_states () {
global $wpdb ;
$mx_states = array (
'Distrito Federal' => 'CMX' ,
'Jalisco' => 'JAL' ,
'Nuevo Leon' => 'NLE' ,
'Aguascalientes' => 'AGS' ,
'Baja California' => 'BCN' ,
'Baja California Sur' => 'BCS' ,
'Campeche' => 'CAM' ,
'Chiapas' => 'CHP' ,
'Chihuahua' => 'CHH' ,
'Coahuila' => 'COA' ,
'Colima' => 'COL' ,
'Durango' => 'DGO' ,
'Guanajuato' => 'GTO' ,
'Guerrero' => 'GRO' ,
'Hidalgo' => 'HGO' ,
'Estado de Mexico' => 'MEX' ,
'Michoacan' => 'MIC' ,
'Morelos' => 'MOR' ,
'Nayarit' => 'NAY' ,
'Oaxaca' => 'OAX' ,
'Puebla' => 'PUE' ,
'Queretaro' => 'QRO' ,
'Quintana Roo' => 'ROO' ,
'San Luis Potosi' => 'SLP' ,
'Sinaloa' => 'SIN' ,
'Sonora' => 'SON' ,
'Tabasco' => 'TAB' ,
'Tamaulipas' => 'TMP' ,
'Tlaxcala' => 'TLA' ,
'Veracruz' => 'VER' ,
'Yucatan' => 'YUC' ,
'Zacatecas' => 'ZAC' ,
);
foreach ( $mx_states as $old => $new ) {
2017-10-05 11:49:10 +00:00
$wpdb -> query (
$wpdb -> prepare (
2017-11-23 12:41:31 +00:00
" UPDATE $wpdb->postmeta
SET meta_value = % s
WHERE meta_key IN ( '_billing_state' , '_shipping_state' )
AND meta_value = % s " ,
2018-11-23 14:57:51 +00:00
$new ,
$old
2017-06-28 11:57:37 +00:00
)
);
$wpdb -> update (
" { $wpdb -> prefix } woocommerce_shipping_zone_locations " ,
array (
'location_code' => 'MX:' . $new ,
),
array (
'location_code' => 'MX:' . $old ,
)
);
$wpdb -> update (
" { $wpdb -> prefix } woocommerce_tax_rates " ,
array (
'tax_rate_state' => strtoupper ( $new ),
),
array (
'tax_rate_state' => strtoupper ( $old ),
)
);
}
}
/**
* Update DB Version .
*/
function wc_update_320_db_version () {
WC_Install :: update_db_version ( '3.2.0' );
}
2017-11-07 19:16:44 +00:00
/**
* Update image settings to use new aspect ratios and widths .
*/
function wc_update_330_image_options () {
$old_thumbnail_size = get_option ( 'shop_catalog_image_size' , array () );
$old_single_size = get_option ( 'shop_single_image_size' , array () );
if ( ! empty ( $old_thumbnail_size [ 'width' ] ) ) {
2018-01-25 12:34:28 +00:00
$width = absint ( $old_thumbnail_size [ 'width' ] );
$height = absint ( $old_thumbnail_size [ 'height' ] );
$hard_crop = ! empty ( $old_thumbnail_size [ 'crop' ] );
if ( ! $width ) {
$width = 300 ;
}
if ( ! $height ) {
$height = $width ;
}
2017-11-07 19:16:44 +00:00
2018-01-25 12:34:28 +00:00
update_option ( 'woocommerce_thumbnail_image_width' , $width );
// Calculate cropping mode from old image options.
if ( ! $hard_crop ) {
update_option ( 'woocommerce_thumbnail_cropping' , 'uncropped' );
} elseif ( $width === $height ) {
update_option ( 'woocommerce_thumbnail_cropping' , '1:1' );
} else {
$ratio = $width / $height ;
$fraction = wc_decimal_to_fraction ( $ratio );
2017-11-07 19:16:44 +00:00
2018-01-25 12:34:28 +00:00
if ( $fraction ) {
update_option ( 'woocommerce_thumbnail_cropping' , 'custom' );
update_option ( 'woocommerce_thumbnail_cropping_custom_width' , $fraction [ 0 ] );
update_option ( 'woocommerce_thumbnail_cropping_custom_height' , $fraction [ 1 ] );
}
}
2017-11-07 19:16:44 +00:00
}
2018-01-25 12:34:28 +00:00
// Single is uncropped.
2017-11-07 19:16:44 +00:00
if ( ! empty ( $old_single_size [ 'width' ] ) ) {
update_option ( 'woocommerce_single_image_width' , absint ( $old_single_size [ 'width' ] ) );
}
}
2017-11-16 15:44:01 +00:00
/**
* Migrate webhooks from post type to CRUD .
*/
function wc_update_330_webhooks () {
register_post_type ( 'shop_webhook' );
// Map statuses from post_type to Webhooks CRUD.
$statuses = array (
'publish' => 'active' ,
'draft' => 'paused' ,
'pending' => 'disabled' ,
);
2018-11-23 14:57:51 +00:00
$posts = get_posts (
array (
'posts_per_page' => - 1 ,
'post_type' => 'shop_webhook' ,
'post_status' => 'any' ,
)
);
2017-11-16 15:44:01 +00:00
foreach ( $posts as $post ) {
$webhook = new WC_Webhook ();
$webhook -> set_name ( $post -> post_title );
$webhook -> set_status ( isset ( $statuses [ $post -> post_status ] ) ? $statuses [ $post -> post_status ] : 'disabled' );
$webhook -> set_delivery_url ( get_post_meta ( $post -> ID , '_delivery_url' , true ) );
$webhook -> set_secret ( get_post_meta ( $post -> ID , '_secret' , true ) );
$webhook -> set_topic ( get_post_meta ( $post -> ID , '_topic' , true ) );
$webhook -> set_api_version ( get_post_meta ( $post -> ID , '_api_version' , true ) );
2018-01-31 17:09:21 +00:00
$webhook -> set_user_id ( $post -> post_author );
2017-11-16 15:44:01 +00:00
$webhook -> set_pending_delivery ( false );
$webhook -> save ();
wp_delete_post ( $post -> ID , true );
}
unregister_post_type ( 'shop_webhook' );
2017-12-07 20:21:52 +00:00
}
2017-11-28 17:09:10 +00:00
2017-11-23 15:44:17 +00:00
/**
* Assign default cat to all products with no cats .
*/
function wc_update_330_set_default_product_cat () {
global $wpdb ;
$default_category = get_option ( 'default_product_cat' , 0 );
if ( $default_category ) {
2019-03-01 10:28:30 +00:00
$wpdb -> query (
2018-11-23 14:57:51 +00:00
$wpdb -> prepare (
" INSERT INTO { $wpdb -> term_relationships } (object_id, term_taxonomy_id)
SELECT DISTINCT posts . ID , % s FROM { $wpdb -> posts } posts
LEFT JOIN
(
SELECT object_id FROM { $wpdb -> term_relationships } term_relationships
LEFT JOIN { $wpdb -> term_taxonomy } term_taxonomy ON term_relationships . term_taxonomy_id = term_taxonomy . term_taxonomy_id
WHERE term_taxonomy . taxonomy = 'product_cat'
) AS tax_query
ON posts . ID = tax_query . object_id
WHERE posts . post_type = 'product'
AND tax_query . object_id IS NULL " ,
$default_category
)
);
2017-11-23 15:44:17 +00:00
wp_cache_flush ();
delete_transient ( 'wc_term_counts' );
wp_update_term_count_now ( array ( $default_category ), 'product_cat' );
}
}
2017-11-20 22:21:08 +00:00
/**
* Update product stock status to use the new onbackorder status .
*/
function wc_update_330_product_stock_status () {
global $wpdb ;
if ( 'yes' !== get_option ( 'woocommerce_manage_stock' ) ) {
return ;
}
$min_stock_amount = ( int ) get_option ( 'woocommerce_notify_no_stock_amount' , 0 );
// Get all products that have stock management enabled, stock less than or equal to min stock amount, and backorders enabled.
2018-11-23 14:57:51 +00:00
$post_ids = $wpdb -> get_col (
$wpdb -> prepare (
" SELECT t1.post_id FROM $wpdb->postmeta t1
INNER JOIN $wpdb -> postmeta t2
ON t1 . post_id = t2 . post_id
AND t1 . meta_key = '_manage_stock' AND t1 . meta_value = 'yes'
AND t2 . meta_key = '_stock' AND t2 . meta_value <= % d
INNER JOIN $wpdb -> postmeta t3
ON t2 . post_id = t3 . post_id
AND t3 . meta_key = '_backorders' AND ( t3 . meta_value = 'yes' OR t3 . meta_value = 'notify' ) " ,
$min_stock_amount
)
2020-04-29 15:16:30 +00:00
);
2017-11-20 22:21:08 +00:00
2017-11-21 22:08:17 +00:00
if ( empty ( $post_ids ) ) {
return ;
}
$post_ids = array_map ( 'absint' , $post_ids );
2020-04-29 15:16:30 +00:00
// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
2017-11-20 22:21:08 +00:00
// Set the status to onbackorder for those products.
2018-11-23 14:57:51 +00:00
$wpdb -> query (
" UPDATE $wpdb->postmeta
2017-11-20 22:21:08 +00:00
SET meta_value = 'onbackorder'
2018-11-23 14:57:51 +00:00
WHERE meta_key = '_stock_status' AND post_id IN ( " . implode( ',', $post_ids ) . ' )'
2020-04-29 15:16:30 +00:00
);
// phpcs:enable WordPress.DB.PreparedSQL.NotPrepared
2017-11-20 22:21:08 +00:00
}
2017-11-07 19:16:44 +00:00
/**
2017-12-05 17:23:29 +00:00
* Clear addons page transients
2017-11-07 19:16:44 +00:00
*/
2017-12-05 17:23:29 +00:00
function wc_update_330_clear_transients () {
delete_transient ( 'wc_addons_sections' );
delete_transient ( 'wc_addons_featured' );
2017-11-07 19:16:44 +00:00
}
2018-01-23 02:51:01 +00:00
/**
* Set PayPal ' s sandbox credentials .
*/
function wc_update_330_set_paypal_sandbox_credentials () {
$paypal_settings = get_option ( 'woocommerce_paypal_settings' );
if ( isset ( $paypal_settings [ 'testmode' ] ) && 'yes' === $paypal_settings [ 'testmode' ] ) {
foreach ( array ( 'api_username' , 'api_password' , 'api_signature' ) as $credential ) {
if ( ! empty ( $paypal_settings [ $credential ] ) ) {
$paypal_settings [ 'sandbox_' . $credential ] = $paypal_settings [ $credential ];
}
}
update_option ( 'woocommerce_paypal_settings' , $paypal_settings );
}
}
2018-01-31 12:33:30 +00:00
/**
* Update DB Version .
*/
function wc_update_330_db_version () {
WC_Install :: update_db_version ( '3.3.0' );
}
2018-04-09 21:15:09 +00:00
/**
2018-04-17 15:13:44 +00:00
* Update state codes for Ireland and BD .
2018-04-09 21:15:09 +00:00
*/
2018-04-17 15:13:44 +00:00
function wc_update_340_states () {
$country_states = array (
'IE' => array (
'CK' => 'CO' ,
'DN' => 'D' ,
'GY' => 'G' ,
'TY' => 'TA' ,
),
'BD' => array (
'BAG' => 'BD-05' ,
'BAN' => 'BD-01' ,
'BAR' => 'BD-02' ,
'BARI' => 'BD-06' ,
'BHO' => 'BD-07' ,
'BOG' => 'BD-03' ,
'BRA' => 'BD-04' ,
'CHA' => 'BD-09' ,
'CHI' => 'BD-10' ,
'CHU' => 'BD-12' ,
'COX' => 'BD-11' ,
2018-04-17 15:18:14 +00:00
'COM' => 'BD-08' ,
2018-04-17 15:13:44 +00:00
'DHA' => 'BD-13' ,
'DIN' => 'BD-14' ,
'FAR' => 'BD-15' ,
'FEN' => 'BD-16' ,
'GAI' => 'BD-19' ,
'GAZI' => 'BD-18' ,
'GOP' => 'BD-17' ,
'HAB' => 'BD-20' ,
'JAM' => 'BD-21' ,
2018-04-17 15:18:14 +00:00
'JES' => 'BD-22' ,
2018-04-17 15:13:44 +00:00
'JHA' => 'BD-25' ,
'JHE' => 'BD-23' ,
'JOY' => 'BD-24' ,
'KHA' => 'BD-29' ,
'KHU' => 'BD-27' ,
'KIS' => 'BD-26' ,
'KUR' => 'BD-28' ,
'KUS' => 'BD-30' ,
'LAK' => 'BD-31' ,
'LAL' => 'BD-32' ,
'MAD' => 'BD-36' ,
'MAG' => 'BD-37' ,
'MAN' => 'BD-33' ,
'MEH' => 'BD-39' ,
'MOU' => 'BD-38' ,
'MUN' => 'BD-35' ,
'MYM' => 'BD-34' ,
'NAO' => 'BD-48' ,
'NAR' => 'BD-43' ,
'NARG' => 'BD-40' ,
'NARD' => 'BD-42' ,
'NAT' => 'BD-44' ,
'NAW' => 'BD-45' ,
'NET' => 'BD-41' ,
'NIL' => 'BD-46' ,
'NOA' => 'BD-47' ,
'PAB' => 'BD-49' ,
'PAN' => 'BD-52' ,
'PAT' => 'BD-51' ,
'PIR' => 'BD-50' ,
'RAJB' => 'BD-53' ,
'RAJ' => 'BD-54' ,
'RAN' => 'BD-56' ,
'RANP' => 'BD-55' ,
'SAT' => 'BD-58' ,
'SHA' => 'BD-57' ,
'SIR' => 'BD-59' ,
'SUN' => 'BD-61' ,
'SYL' => 'BD-60' ,
'TAN' => 'BD-63' ,
'THA' => 'BD-64' ,
),
2018-04-09 21:15:09 +00:00
);
2018-05-25 13:18:19 +00:00
update_option ( 'woocommerce_update_340_states' , $country_states );
}
/**
* Update next state in the queue .
*
2018-05-25 15:36:07 +00:00
* @ return bool True to run again , false if completed .
2018-05-25 13:18:19 +00:00
*/
function wc_update_340_state () {
global $wpdb ;
$country_states = array_filter ( ( array ) get_option ( 'woocommerce_update_340_states' , array () ) );
if ( empty ( $country_states ) ) {
return false ;
}
2018-04-17 15:13:44 +00:00
foreach ( $country_states as $country => $states ) {
foreach ( $states as $old => $new ) {
$wpdb -> query (
$wpdb -> prepare (
" UPDATE $wpdb->postmeta
SET meta_value = % s
WHERE meta_key IN ( '_billing_state' , '_shipping_state' )
AND meta_value = % s " ,
2018-11-23 14:57:51 +00:00
$new ,
$old
2018-04-17 15:13:44 +00:00
)
);
$wpdb -> update (
" { $wpdb -> prefix } woocommerce_shipping_zone_locations " ,
array (
'location_code' => $country . ':' . $new ,
),
array (
'location_code' => $country . ':' . $old ,
)
);
$wpdb -> update (
" { $wpdb -> prefix } woocommerce_tax_rates " ,
array (
'tax_rate_state' => strtoupper ( $new ),
),
array (
'tax_rate_state' => strtoupper ( $old ),
)
);
2018-05-25 13:18:19 +00:00
unset ( $country_states [ $country ][ $old ] );
if ( empty ( $country_states [ $country ] ) ) {
unset ( $country_states [ $country ] );
}
break 2 ;
2018-04-17 15:13:44 +00:00
}
2018-04-09 21:15:09 +00:00
}
2018-05-25 13:18:19 +00:00
if ( ! empty ( $country_states ) ) {
return update_option ( 'woocommerce_update_340_states' , $country_states );
}
delete_option ( 'woocommerce_update_340_states' );
return false ;
2018-04-09 21:15:09 +00:00
}
2018-05-01 13:13:38 +00:00
/**
* Set last active prop for users .
*/
function wc_update_340_last_active () {
global $wpdb ;
// @codingStandardsIgnoreStart.
$wpdb -> query (
$wpdb -> prepare ( "
INSERT INTO { $wpdb -> usermeta } ( user_id , meta_key , meta_value )
SELECT DISTINCT users . ID , 'wc_last_active' , % s
FROM { $wpdb -> users } as users
LEFT OUTER JOIN { $wpdb -> usermeta } AS usermeta ON users . ID = usermeta . user_id AND usermeta . meta_key = 'wc_last_active'
WHERE usermeta . meta_value IS NULL
" ,
( string ) strtotime ( date ( 'Y-m-d' , current_time ( 'timestamp' , true ) ) )
)
);
// @codingStandardsIgnoreEnd.
}
2018-04-16 18:04:57 +00:00
/**
* Update DB Version .
*/
function wc_update_340_db_version () {
WC_Install :: update_db_version ( '3.4.0' );
}
2018-06-18 14:47:47 +00:00
/**
* Remove duplicate foreign keys
*
* @ return void
*/
function wc_update_343_cleanup_foreign_keys () {
global $wpdb ;
2018-11-23 14:57:51 +00:00
$results = $wpdb -> get_results (
" SELECT CONSTRAINT_NAME
2018-06-18 14:47:47 +00:00
FROM information_schema . TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '{$wpdb->dbname}'
AND CONSTRAINT_NAME LIKE '%wc_download_log_ib%'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
2018-11-23 14:57:51 +00:00
AND TABLE_NAME = '{$wpdb->prefix}wc_download_log' "
);
2018-06-18 14:47:47 +00:00
if ( $results ) {
foreach ( $results as $fk ) {
2020-01-13 19:18:14 +00:00
$wpdb -> query ( " ALTER TABLE { $wpdb -> prefix } wc_download_log DROP FOREIGN KEY { $fk -> CONSTRAINT_NAME } " ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
2018-06-18 14:47:47 +00:00
}
}
}
/**
* Update DB version .
*
* @ return void
*/
function wc_update_343_db_version () {
WC_Install :: update_db_version ( '3.4.3' );
}
2018-06-18 18:17:19 +00:00
2018-07-10 08:30:11 +00:00
/**
* Recreate user roles so existing users will get the new capabilities .
*
* @ return void
*/
function wc_update_344_recreate_roles () {
WC_Install :: remove_roles ();
WC_Install :: create_roles ();
}
/**
* Update DB version .
*
* @ return void
*/
function wc_update_344_db_version () {
WC_Install :: update_db_version ( '3.4.4' );
}
2018-09-20 16:28:39 +00:00
/**
* Set the comment type to 'review' for product reviews that don ' t have a comment type .
*/
function wc_update_350_reviews_comment_type () {
global $wpdb ;
$wpdb -> query (
" UPDATE { $wpdb -> prefix } comments JOIN { $wpdb -> prefix } posts ON { $wpdb -> prefix } posts.ID = { $wpdb -> prefix } comments.comment_post_ID AND ( { $wpdb -> prefix } posts.post_type = 'product' OR { $wpdb -> prefix } posts.post_type = 'product_variation' ) SET { $wpdb -> prefix } comments.comment_type = 'review' WHERE { $wpdb -> prefix } comments.comment_type = '' "
);
}
2018-06-11 13:54:02 +00:00
/**
* Update DB Version .
*/
function wc_update_350_db_version () {
WC_Install :: update_db_version ( '3.5.0' );
}
2018-11-16 06:18:25 +00:00
/**
* Drop the fk_wc_download_log_permission_id FK as we use a new one with the table and blog prefix for MS compatability .
*
* @ return void
*/
function wc_update_352_drop_download_log_fk () {
global $wpdb ;
2018-12-04 18:04:24 +00:00
$results = $wpdb -> get_results (
" SELECT CONSTRAINT_NAME
2018-11-16 06:18:25 +00:00
FROM information_schema . TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '{$wpdb->dbname}'
AND CONSTRAINT_NAME = 'fk_wc_download_log_permission_id'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
2018-12-04 18:04:24 +00:00
AND TABLE_NAME = '{$wpdb->prefix}wc_download_log' "
);
2018-11-16 06:18:25 +00:00
// We only need to drop the old key as WC_Install::create_tables() takes care of creating the new FK.
if ( $results ) {
$wpdb -> query ( " ALTER TABLE { $wpdb -> prefix } wc_download_log DROP FOREIGN KEY fk_wc_download_log_permission_id " ); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
}
}
2019-01-21 16:02:28 +00:00
/**
* Remove edit_user capabilities from shop managers and use " translated " capabilities instead .
* See wc_shop_manager_has_capability function .
*/
function wc_update_354_modify_shop_manager_caps () {
global $wp_roles ;
if ( ! class_exists ( 'WP_Roles' ) ) {
return ;
}
if ( ! isset ( $wp_roles ) ) {
$wp_roles = new WP_Roles (); // @codingStandardsIgnoreLine
}
$wp_roles -> remove_cap ( 'shop_manager' , 'edit_users' );
}
/**
* Update DB Version .
*/
function wc_update_354_db_version () {
WC_Install :: update_db_version ( '3.5.4' );
}
2019-02-12 13:27:30 +00:00
/**
* Update product lookup tables in bulk .
*/
function wc_update_360_product_lookup_tables () {
wc_update_product_lookup_tables ();
}
2019-01-25 13:56:15 +00:00
/**
* Renames ordering meta to be consistent across taxonomies .
*/
function wc_update_360_term_meta () {
global $wpdb ;
$wpdb -> query ( " UPDATE { $wpdb -> termmeta } SET meta_key = 'order' WHERE meta_key LIKE 'order_pa_%'; " );
}
2019-02-28 13:36:55 +00:00
/**
* Add new user_order_remaining_expires to speed up user download permission fetching .
*
* @ return void
*/
function wc_update_360_downloadable_product_permissions_index () {
global $wpdb ;
$index_exists = $wpdb -> get_row ( " SHOW INDEX FROM { $wpdb -> prefix } woocommerce_downloadable_product_permissions WHERE key_name = 'user_order_remaining_expires' " );
if ( is_null ( $index_exists ) ) {
$wpdb -> query ( " ALTER TABLE { $wpdb -> prefix } woocommerce_downloadable_product_permissions ADD INDEX user_order_remaining_expires (user_id,order_id,downloads_remaining,access_expires) " );
}
}
2019-02-12 13:27:30 +00:00
/**
* Update DB Version .
*/
function wc_update_360_db_version () {
WC_Install :: update_db_version ( '3.6.0' );
}
2019-03-20 15:27:43 +00:00
/**
* Put tax classes into a DB table .
*
* @ return void
*/
function wc_update_370_tax_rate_classes () {
global $wpdb ;
$classes = array_map ( 'trim' , explode ( " \n " , get_option ( 'woocommerce_tax_classes' ) ) );
if ( $classes ) {
foreach ( $classes as $class ) {
if ( empty ( $class ) ) {
continue ;
}
WC_Tax :: create_tax_class ( $class );
}
}
2019-07-22 12:16:17 +00:00
delete_option ( 'woocommerce_tax_classes' );
2019-03-20 15:27:43 +00:00
}
2019-06-25 09:47:16 +00:00
/**
* Update currency settings for 3.7 . 0
*
* @ return void
*/
function wc_update_370_mro_std_currency () {
global $wpdb ;
2019-07-08 21:12:23 +00:00
// Fix currency settings for MRU and STN currency.
2019-06-25 09:47:16 +00:00
$current_currency = get_option ( 'woocommerce_currency' );
if ( 'MRO' === $current_currency ) {
update_option ( 'woocommerce_currency' , 'MRU' );
}
if ( 'STD' === $current_currency ) {
update_option ( 'woocommerce_currency' , 'STN' );
}
// Update MRU currency code.
$wpdb -> update (
$wpdb -> postmeta ,
array (
2019-07-08 21:12:23 +00:00
'meta_value' => 'MRU' , // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
2019-06-25 09:47:16 +00:00
),
array (
2019-07-08 21:12:23 +00:00
' meta_key ' => ' _order_currency ' , // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
'meta_value' => 'MRO' , // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
2019-06-25 09:47:16 +00:00
)
);
// Update STN currency code.
$wpdb -> update (
$wpdb -> postmeta ,
array (
2019-07-08 21:12:23 +00:00
'meta_value' => 'STN' , // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
2019-06-25 09:47:16 +00:00
),
array (
2019-07-08 21:12:23 +00:00
'meta_key' => '_order_currency' , // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
'meta_value' => 'STD' , // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
2019-06-25 09:47:16 +00:00
)
);
2019-07-08 21:12:23 +00:00
}
2019-06-25 09:47:16 +00:00
2019-03-20 15:27:43 +00:00
/**
* Update DB Version .
*/
function wc_update_370_db_version () {
WC_Install :: update_db_version ( '3.7.0' );
}
2019-12-18 07:28:27 +00:00
2020-02-04 14:06:26 +00:00
/**
2020-01-15 18:24:13 +00:00
* We 've moved the MaxMind database to a new location, as per the TOS' requirement that the database not
* be publicly accessible .
2020-01-13 19:18:14 +00:00
*/
2020-01-15 18:24:13 +00:00
function wc_update_390_move_maxmind_database () {
// Make sure to use all of the correct filters to pull the local database path.
$old_path = apply_filters ( 'woocommerce_geolocation_local_database_path' , WP_CONTENT_DIR . '/uploads/GeoLite2-Country.mmdb' , 2 );
// Generate a prefix for the old file and store it in the integration as it would expect it.
$prefix = wp_generate_password ( 32 , false );
update_option ( 'woocommerce_maxmind_geolocation_settings' , array ( 'database_prefix' => $prefix ) );
// Generate the new path in the same way that the integration will.
$uploads_dir = wp_upload_dir ();
$new_path = trailingslashit ( $uploads_dir [ 'basedir' ] ) . 'woocommerce_uploads/' . $prefix . '-GeoLite2-Country.mmdb' ;
$new_path = apply_filters ( 'woocommerce_geolocation_local_database_path' , $new_path , 2 );
2020-02-16 21:47:03 +00:00
$new_path = apply_filters ( 'woocommerce_maxmind_geolocation_database_path' , $new_path );
2020-01-15 18:24:13 +00:00
2020-04-29 15:16:30 +00:00
// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
@ rename ( $old_path , $new_path );
2020-01-13 19:18:14 +00:00
}
2020-01-14 01:00:39 +00:00
/**
* So that we can best meet MaxMind ' s TOS , the geolocation database update cron should run once per 15 days .
*/
function wc_update_390_change_geolocation_database_update_cron () {
wp_clear_scheduled_hook ( 'woocommerce_geoip_updater' );
2020-01-15 18:25:51 +00:00
wp_schedule_event ( time () + ( DAY_IN_SECONDS * 15 ), 'fifteendays' , 'woocommerce_geoip_updater' );
2020-01-14 01:00:39 +00:00
}
2020-01-14 21:39:47 +00:00
/**
* Update DB version .
*/
function wc_update_390_db_version () {
WC_Install :: update_db_version ( '3.9.0' );
}
2020-01-20 14:21:42 +00:00
2019-12-18 07:28:27 +00:00
/**
* Increase column size
*/
2020-02-04 13:53:22 +00:00
function wc_update_400_increase_size_of_column () {
2019-12-18 07:28:27 +00:00
global $wpdb ;
$wpdb -> query ( " ALTER TABLE { $wpdb -> prefix } wc_product_meta_lookup MODIFY COLUMN `min_price` decimal(19,4) NULL default NULL " );
2020-02-03 14:20:37 +00:00
$wpdb -> query ( " ALTER TABLE { $wpdb -> prefix } wc_product_meta_lookup MODIFY COLUMN `max_price` decimal(19,4) NULL default NULL " );
2019-12-18 07:28:27 +00:00
}
2020-02-19 12:49:11 +00:00
/**
* Reset ActionScheduler migration status . Needs AS >= 3.0 shipped with WC >= 4.0 .
*/
2020-03-10 12:27:30 +00:00
function wc_update_400_reset_action_scheduler_migration_status () {
2020-02-21 11:05:37 +00:00
if (
class_exists ( 'ActionScheduler_DataController' ) &&
method_exists ( 'ActionScheduler_DataController' , 'mark_migration_incomplete' )
) {
\ActionScheduler_DataController :: mark_migration_incomplete ();
}
2020-02-19 12:49:11 +00:00
}
2019-12-18 07:28:27 +00:00
/**
2020-01-20 14:21:42 +00:00
* Update DB version .
2019-12-18 07:28:27 +00:00
*/
2020-02-03 22:36:52 +00:00
function wc_update_400_db_version () {
WC_Install :: update_db_version ( '4.0.0' );
2019-12-18 07:28:27 +00:00
}
2020-07-27 19:50:23 +00:00
2020-04-29 15:35:56 +00:00
/**
* Register attributes as terms for variable products , in increments of 100 products .
*
2020-09-22 14:31:38 +00:00
* This migration was added to support a new mechanism to improve the filtering of
* variable products by attribute ( https :// github . com / woocommerce / woocommerce / pull / 26260 ),
* however that mechanism was later reverted ( https :// github . com / woocommerce / woocommerce / pull / 27625 )
* due to numerous issues found . Thus the migration is no longer needed .
*
* @ return bool true if the migration needs to be run again .
2020-04-29 15:35:56 +00:00
*/
2020-07-09 14:47:14 +00:00
function wc_update_440_insert_attribute_terms_for_variable_products () {
2020-09-22 14:31:38 +00:00
return false ;
2020-04-29 15:35:56 +00:00
}
/**
* Update DB version .
*/
2020-07-09 14:47:14 +00:00
function wc_update_440_db_version () {
WC_Install :: update_db_version ( '4.4.0' );
2020-04-29 15:35:56 +00:00
}
2020-07-28 16:07:17 +00:00
2020-07-27 19:50:23 +00:00
/**
* Update DB version to 4.5 . 0.
*/
function wc_update_450_db_version () {
WC_Install :: update_db_version ( '4.5.0' );
}
/**
* Sanitize all coupons code .
2020-07-30 02:07:00 +00:00
*
* @ return bool True to run again , false if completed .
2020-07-27 19:50:23 +00:00
*/
function wc_update_450_sanitize_coupons_code () {
global $wpdb ;
2020-07-30 19:17:23 +00:00
$coupon_id = 0 ;
2020-08-03 14:27:38 +00:00
$last_coupon_id = get_option ( 'woocommerce_update_450_last_coupon_id' , '0' );
2020-07-30 19:17:23 +00:00
2020-07-30 19:23:39 +00:00
$coupons = $wpdb -> get_results (
$wpdb -> prepare (
" SELECT ID, post_title FROM $wpdb->posts WHERE ID > %d AND post_type = 'shop_coupon' LIMIT 10 " ,
2020-07-30 19:36:54 +00:00
$last_coupon_id
2020-07-30 19:23:39 +00:00
),
ARRAY_A
);
2020-07-27 19:50:23 +00:00
2020-07-30 02:07:00 +00:00
if ( empty ( $coupons ) ) {
2020-08-03 14:27:38 +00:00
delete_option ( 'woocommerce_update_450_last_coupon_id' );
2020-07-30 02:07:00 +00:00
return false ;
}
2020-07-27 19:50:23 +00:00
2020-07-30 19:17:23 +00:00
foreach ( $coupons as $key => $data ) {
$coupon_id = intval ( $data [ 'ID' ] );
$code = trim ( wp_filter_kses ( $data [ 'post_title' ] ) );
2020-07-30 02:07:00 +00:00
2020-08-03 14:28:27 +00:00
if ( ! empty ( $code ) && $data [ 'post_title' ] !== $code ) {
2020-07-30 19:23:39 +00:00
$wpdb -> update (
$wpdb -> posts ,
array (
'post_title' => $code ,
),
array (
'ID' => $coupon_id ,
),
array (
'%s' ,
),
array (
'%d' ,
2020-07-30 02:07:00 +00:00
)
);
2020-07-30 02:14:50 +00:00
// Clean cache.
2020-07-30 19:17:23 +00:00
clean_post_cache ( $coupon_id );
2020-07-30 02:14:50 +00:00
wp_cache_delete ( WC_Cache_Helper :: get_cache_prefix ( 'coupons' ) . 'coupon_id_from_code_' . $data [ 'post_title' ], 'coupons' );
2020-07-27 19:50:23 +00:00
}
}
2020-07-30 02:07:00 +00:00
2020-07-30 19:17:23 +00:00
// Start the run again.
2020-07-30 19:36:54 +00:00
if ( $coupon_id ) {
2020-08-03 14:27:38 +00:00
return update_option ( 'woocommerce_update_450_last_coupon_id' , $coupon_id );
2020-07-30 02:07:00 +00:00
}
2020-08-03 14:27:38 +00:00
delete_option ( 'woocommerce_update_450_last_coupon_id' );
2020-07-30 02:07:00 +00:00
return false ;
2020-07-27 19:50:23 +00:00
}