From 4b7643cd6f53d0ce36e6d87bd8523fa14c2b0dc9 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Fri, 9 Jun 2023 13:35:24 -0700 Subject: [PATCH 1/5] Describe how untrashing should work in relation to orders. --- .../class-wc-order-data-store-cpt-test.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/plugins/woocommerce/tests/php/includes/data-stores/class-wc-order-data-store-cpt-test.php b/plugins/woocommerce/tests/php/includes/data-stores/class-wc-order-data-store-cpt-test.php index 4fb6bd7132c..1db49993c71 100644 --- a/plugins/woocommerce/tests/php/includes/data-stores/class-wc-order-data-store-cpt-test.php +++ b/plugins/woocommerce/tests/php/includes/data-stores/class-wc-order-data-store-cpt-test.php @@ -275,4 +275,22 @@ class WC_Order_Data_Store_CPT_Test extends WC_Unit_Test_Case { } } + /** + * Test the untrashing an order works as expected when done in an agnostic way (ie, not depending directly on + * functions such as `wp_untrash_post()`. + * + * @return void + */ + public function test_untrash(): void { + $order = WC_Helper_Order::create_order(); + $order_id = $order->get_id(); + $original_status = $order->get_status(); + + $order->delete(); + $this->assertEquals( 'trash', $order->get_status(), 'The order was successfully trashed.' ); + + $order = wc_get_order( $order_id ); + $this->assertTrue( $order->untrash(), 'The order was restored from the trash.' ); + $this->assertEquals( $original_status, $order->get_status(), 'The original order status is restored following untrash.' ); + } } From d30754b1cfae9b120145dc566c1100ad909a27ab Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Fri, 9 Jun 2023 13:36:19 -0700 Subject: [PATCH 2/5] Changelog entry. --- plugins/woocommerce/changelog/add-order-model-trash-untrash | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-order-model-trash-untrash diff --git a/plugins/woocommerce/changelog/add-order-model-trash-untrash b/plugins/woocommerce/changelog/add-order-model-trash-untrash new file mode 100644 index 00000000000..0955b34092f --- /dev/null +++ b/plugins/woocommerce/changelog/add-order-model-trash-untrash @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +Provide a data-store agnostic way of untrashing orders. From 7f8747f478c8e305d1c6e211b9066cb9f8282ece Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Fri, 9 Jun 2023 13:36:31 -0700 Subject: [PATCH 3/5] Add methods to allow x-datastore untrashing. --- plugins/woocommerce/includes/class-wc-order.php | 11 +++++++++++ .../class-wc-order-data-store-cpt.php | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/plugins/woocommerce/includes/class-wc-order.php b/plugins/woocommerce/includes/class-wc-order.php index f29711ae372..127c9c98d50 100644 --- a/plugins/woocommerce/includes/class-wc-order.php +++ b/plugins/woocommerce/includes/class-wc-order.php @@ -2286,4 +2286,15 @@ class WC_Order extends WC_Abstract_Order { public function is_created_via( $modus ) { return apply_filters( 'woocommerce_order_is_created_via', $modus === $this->get_created_via(), $this, $modus ); } + + /** + * Attempts to restore the specified order back to its original status (after having been trashed). + * + * @param WC_Order $order The order to be untrashed. + * + * @return bool If the operation was successful. + */ + public function untrash(): bool { + return $this->data_store->untrash_order( $this ); + } } diff --git a/plugins/woocommerce/includes/data-stores/class-wc-order-data-store-cpt.php b/plugins/woocommerce/includes/data-stores/class-wc-order-data-store-cpt.php index ab18e688128..17dc35b2df2 100644 --- a/plugins/woocommerce/includes/data-stores/class-wc-order-data-store-cpt.php +++ b/plugins/woocommerce/includes/data-stores/class-wc-order-data-store-cpt.php @@ -1181,4 +1181,20 @@ class WC_Order_Data_Store_CPT extends Abstract_WC_Order_Data_Store_CPT implement ); WC_Order::prime_raw_meta_data_cache( $raw_meta_data_collection, 'orders' ); } + + /** + * Attempts to restore the specified order back to its original status (after having been trashed). + * + * @param WC_Order $order The order to be untrashed. + * + * @return bool If the operation was successful. + */ + public function untrash_order( WC_Order $order ): bool { + if ( ! wp_untrash_post( $order->get_id() ) ) { + return false; + } + + $order->set_status( get_post_field( 'post_status', $order->get_id() ) ); + return (bool) $order->save(); + } } From 530a7f08d0bdae07a039d803a8130cfd1bdd1346 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Fri, 9 Jun 2023 13:52:21 -0700 Subject: [PATCH 4/5] Always return a bool, in case the data store lacks the `untrash_order` method. --- plugins/woocommerce/includes/class-wc-order.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/includes/class-wc-order.php b/plugins/woocommerce/includes/class-wc-order.php index 127c9c98d50..2f8261bed02 100644 --- a/plugins/woocommerce/includes/class-wc-order.php +++ b/plugins/woocommerce/includes/class-wc-order.php @@ -2295,6 +2295,6 @@ class WC_Order extends WC_Abstract_Order { * @return bool If the operation was successful. */ public function untrash(): bool { - return $this->data_store->untrash_order( $this ); + return (bool) $this->data_store->untrash_order( $this ); } } From 252d3bc32e223d8ce6f9a5bd815c2e665e898209 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Fri, 9 Jun 2023 14:07:41 -0700 Subject: [PATCH 5/5] Remove extraneous `@param` tag. --- plugins/woocommerce/includes/class-wc-order.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/woocommerce/includes/class-wc-order.php b/plugins/woocommerce/includes/class-wc-order.php index 2f8261bed02..6a1874bcee9 100644 --- a/plugins/woocommerce/includes/class-wc-order.php +++ b/plugins/woocommerce/includes/class-wc-order.php @@ -2290,8 +2290,6 @@ class WC_Order extends WC_Abstract_Order { /** * Attempts to restore the specified order back to its original status (after having been trashed). * - * @param WC_Order $order The order to be untrashed. - * * @return bool If the operation was successful. */ public function untrash(): bool {