From 7860a08f8031bbaf7c1536ed1a782fd1ed9969f1 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 7 Sep 2023 13:21:13 +0530 Subject: [PATCH 1/3] Add unit test for allowing metadata to be deleted by ID. --- .../Orders/OrdersTableDataStoreTests.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/OrdersTableDataStoreTests.php b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/OrdersTableDataStoreTests.php index da66db16c09..f7dd3721bf4 100644 --- a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/OrdersTableDataStoreTests.php +++ b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/OrdersTableDataStoreTests.php @@ -2804,4 +2804,26 @@ class OrdersTableDataStoreTests extends HposTestCase { $reset_state->call( $sut ); wp_cache_flush(); } + + /** + * @testDox Test that we can delete metadata just by sending the meta ID. + */ + public function test_allow_deleting_meta_with_id_only() { + $this->toggle_cot_authoritative( true ); + $this->enable_cot_sync(); + + $order = OrderHelper::create_order(); + $order->add_meta_data( 'test_key', 'test_value' ); + $order->save(); + + $meta_data = $this->sut->read_meta( $order ); + + foreach ( $meta_data as $meta ) { + $this->sut->delete_meta( $order, (object) array( 'id' => $meta->meta_id ) ); + } + + $r_order = wc_get_order( $order->get_id() ); + $this->assertEmpty( $r_order->get_meta_data() ); + $this->assertEquals( '', get_post_meta( $order->get_id(), 'test_key', true ) ); + } } From 955fc37a906f295cd9a558b21ccdbc22c076a1ae Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 7 Sep 2023 13:18:30 +0530 Subject: [PATCH 2/3] Support deleting metadata just by meta id. --- .../DataStores/Orders/OrdersTableDataStore.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index 487f401daa5..585921b5622 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -2791,10 +2791,19 @@ CREATE TABLE $meta_table ( * @return bool */ public function delete_meta( &$object, $meta ) { + if ( $this->should_backfill_post_record() && isset( $meta->id ) && ! isset( $meta->key ) ) { + // Let's get the actual meta key before its deleted for backfilling. We cannot delete just by ID because meta IDs are different in HPOS and posts tables. + $db_meta = $this->data_store_meta->get_metadata_by_id( $meta->id ); + if ( $db_meta ) { + $meta->key = $db_meta->meta_key; + $meta->value = $db_meta->meta_value; + } + } + $delete_meta = $this->data_store_meta->delete_meta( $object, $meta ); $this->after_meta_change( $object, $meta ); - if ( $object instanceof WC_Abstract_Order && $this->should_backfill_post_record() ) { + if ( $object instanceof WC_Abstract_Order && $this->should_backfill_post_record() && isset( $meta->key ) ) { self::$backfilling_order_ids[] = $object->get_id(); delete_post_meta( $object->get_id(), $meta->key, $meta->value ); self::$backfilling_order_ids = array_diff( self::$backfilling_order_ids, array( $object->get_id() ) ); From 0bb048f31f11e7269d5ab55d0b0d7827da0b5e4c Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 7 Sep 2023 13:22:17 +0530 Subject: [PATCH 3/3] Add changelog. --- plugins/woocommerce/changelog/fix-delete-meta-by-id | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-delete-meta-by-id diff --git a/plugins/woocommerce/changelog/fix-delete-meta-by-id b/plugins/woocommerce/changelog/fix-delete-meta-by-id new file mode 100644 index 00000000000..7321786bf3a --- /dev/null +++ b/plugins/woocommerce/changelog/fix-delete-meta-by-id @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +[HPOS] Support deleting metadata just by meta id.