Automattic / woocommerce-subscriptions-core

Subscriptions core package for WooCommerce
Other
87 stars 33 forks source link

Presence of `_shipping_address` meta key creates critical error for subscription renewals #416

Closed Jinksi closed 1 year ago

Jinksi commented 1 year ago

This was initially reported in https://github.com/woocommerce/woocommerce-subscriptions/issues/4493

Describe the bug

If the _shipping_address meta key is stored on a subscription renewals fail with a critical error. It is not clear why this meta key should exist, this should be shipping_address_index.

To reproduce

  1. Create a new subscription and ensure that the shipping information is blank by marking the subscription product as virtual.
  2. In the database you should see _shipping_address_index change that to _shipping_address
  3. Try to process a renewal and you'll see the following critical error:
2023-03-09T17:37:13+00:00 CRITICAL Uncaught TypeError: WC_Order::set_shipping_address(): Argument #1 ($address) must be of type array, string given, called in /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-data-copier.php on line 205 and defined in /srv/htdocs/wp-content/plugins/woocommerce/includes/class-wc-order.php:1110
Stack trace:
#0 /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-data-copier.php(205): WC_Order->set_shipping_address('         ')
#1 /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-data-copier.php(162): WC_Subscriptions_Data_Copier->set_data('_shipping_addre...', '         ')
#2 /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-data-copier.php(80): WC_Subscriptions_Data_Copier->copy_data()
#3 /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php(153): WC_Subscriptions_Data_Copier::copy(Object(WC_Subscription), Object(WC_Order), 'renewal_order')
#4 /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php(186): wcs_copy_order_meta(Object(WC_Subscription), Object(WC_Order), 'renewal_order')
#5 /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/wcs-renewal-functions.php(29): wcs_create_order_from_subscription(Object(WC_Subscription), 'renewal_order')
#6 /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php(138): wcs_create_renewal_order(Object(WC_Subscription))
#7 /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php(111): WC_Subscriptions_Manager::process_renewal(2057, 'active', 'Subscription re...')
#8 /wordpress/core/6.1.1/wp-includes/class-wp-hook.php(308): WC_Subscriptions_Manager::prepare_renewal(2057)
#9 /wordpress/core/6.1.1/wp-includes/class-wp-hook.php(332): WP_Hook->apply_filters(NULL, Array)
#10 /wordpress/core/6.1.1/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
#11 /srv/htdocs/wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-meta-boxes.php(244): do_action('woocommerce_sch...', 2057)
#12 /wordpress/core/6.1.1/wp-includes/class-wp-hook.php(308): WCS_Admin_Meta_Boxes::process_renewal_action_request(Object(WC_Subscription))
#13 /wordpress/core/6.1.1/wp-includes/class-wp-hook.php(332): WP_Hook->apply_filters('', Array)
#14 /wordpress/core/6.1.1/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
#15 /srv/htdocs/wp-content/plugins/woocommerce/includes/admin/meta-boxes/class-wc-meta-box-order-actions.php(173): do_action('woocommerce_ord...', Object(WC_Subscription))
#16 /wordpress/core/6.1.1/wp-includes/class-wp-hook.php(308): WC_Meta_Box_Order_Actions::save(2057, Object(WP_Post))
#17 /wordpress/core/6.1.1/wp-includes/class-wp-hook.php(332): WP_Hook->apply_filters(NULL, Array)
#18 /wordpress/core/6.1.1/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
#19 /srv/htdocs/wp-content/plugins/woocommerce/includes/admin/class-wc-admin-meta-boxes.php(258): do_action('woocommerce_pro...', 2057, Object(WP_Post))
#20 /wordpress/core/6.1.1/wp-includes/class-wp-hook.php(310): WC_Admin_Meta_Boxes->save_meta_boxes(2057, Object(WP_Post))
#21 /wordpress/core/6.1.1/wp-includes/class-wp-hook.php(332): WP_Hook->apply_filters('', Array)
#22 /wordpress/core/6.1.1/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
#23 /wordpress/core/6.1.1/wp-includes/post.php(4717): do_action('save_post', 2057, Object(WP_Post), true)
#24 /wordpress/core/6.1.1/wp-includes/post.php(4819): wp_insert_post(Array, false, true)
#25 /wordpress/core/6.1.1/wp-admin/includes/post.php(426): wp_update_post(Array)
#26 /wordpress/core/6.1.1/wp-admin/post.php(227): edit_post()
#27 {main}
  thrown in /srv/htdocs/wp-content/plugins/woocommerce/includes/class-wc-order.php on line 1110

Expected behavior

The _shipping_address meta key works with WooCommerce version 7.0.0 so it's expected that this would continue to work with later versions of the plugin or something else would be done to handle this scenario.

Additional details

https://github.com/woocommerce/woocommerce-subscriptions/issues/4493

Site is running on PHP7.4.3 (not PHP8)