Create orders as 'auto-draft' by default in admin (#37643)
This commit is contained in:
commit
066e269da3
|
@ -0,0 +1,4 @@
|
|||
Significance: patch
|
||||
Type: add
|
||||
|
||||
Create orders as 'auto-draft' by default in admin.
|
|
@ -638,7 +638,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
|
|||
}
|
||||
|
||||
// If the old status is set but unknown (e.g. draft) assume its pending for action usage.
|
||||
if ( $old_status && ! in_array( 'wc-' . $old_status, $this->get_valid_statuses(), true ) && ! in_array( $old_status, $status_exceptions, true ) ) {
|
||||
if ( $old_status && ( 'auto-draft' === $old_status || ( ! in_array( 'wc-' . $old_status, $this->get_valid_statuses(), true ) && ! in_array( $old_status, $status_exceptions, true ) ) ) ) {
|
||||
$old_status = 'pending';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -471,7 +471,7 @@ class ListTable extends WP_List_Table {
|
|||
$view_counts[ $slug ] = $total_in_status;
|
||||
}
|
||||
|
||||
if ( ( get_post_status_object( $slug ) )->show_in_admin_all_list ) {
|
||||
if ( ( get_post_status_object( $slug ) )->show_in_admin_all_list && 'auto-draft' !== $slug ) {
|
||||
$all_count += $total_in_status;
|
||||
}
|
||||
}
|
||||
|
@ -552,6 +552,7 @@ class ListTable extends WP_List_Table {
|
|||
array(
|
||||
'trash' => ( get_post_status_object( 'trash' ) )->label,
|
||||
'draft' => ( get_post_status_object( 'draft' ) )->label,
|
||||
'auto-draft' => ( get_post_status_object( 'auto-draft' ) )->label,
|
||||
)
|
||||
),
|
||||
array_flip( get_post_stati( array( 'show_in_admin_status_list' => true ) ) )
|
||||
|
@ -916,7 +917,7 @@ class ListTable extends WP_List_Table {
|
|||
}
|
||||
|
||||
// Gracefully handle legacy statuses.
|
||||
if ( in_array( $order->get_status(), array( 'trash', 'draft' ), true ) ) {
|
||||
if ( in_array( $order->get_status(), array( 'trash', 'draft', 'auto-draft' ), true ) ) {
|
||||
$status_name = ( get_post_status_object( $order->get_status() ) )->label;
|
||||
} else {
|
||||
$status_name = wc_get_order_status_name( $order->get_status() );
|
||||
|
|
|
@ -286,9 +286,14 @@ class PageController {
|
|||
|
||||
$this->order = new $order_class_name();
|
||||
$this->order->set_object_read( false );
|
||||
$this->order->set_status( 'pending' );
|
||||
$this->order->set_status( 'auto-draft' );
|
||||
$this->order->save();
|
||||
|
||||
// Schedule auto-draft cleanup. We re-use the WP event here on purpose.
|
||||
if ( ! wp_next_scheduled( 'wp_scheduled_auto_draft_delete' ) ) {
|
||||
wp_schedule_event( time(), 'daily', 'wp_scheduled_auto_draft_delete' );
|
||||
}
|
||||
|
||||
$theorder = $this->order;
|
||||
}
|
||||
|
||||
|
|
|
@ -79,6 +79,8 @@ class DataSynchronizer implements BatchProcessorInterface {
|
|||
self::add_action( 'deleted_post', array( $this, 'handle_deleted_post' ), 10, 2 );
|
||||
self::add_action( 'woocommerce_new_order', array( $this, 'handle_updated_order' ), 100 );
|
||||
self::add_action( 'woocommerce_update_order', array( $this, 'handle_updated_order' ), 100 );
|
||||
self::add_action( 'wp_scheduled_auto_draft_delete', array( $this, 'delete_auto_draft_orders' ), 9 );
|
||||
|
||||
self::add_filter( 'woocommerce_feature_description_tip', array( $this, 'handle_feature_description_tip' ), 10, 3 );
|
||||
}
|
||||
|
||||
|
@ -467,6 +469,45 @@ ORDER BY orders.id ASC
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles deletion of auto-draft orders in sync with WP's own auto-draft deletion.
|
||||
*
|
||||
* @since 7.7.0
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function delete_auto_draft_orders() {
|
||||
if ( ! $this->custom_orders_table_is_authoritative() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Fetch auto-draft orders older than 1 week.
|
||||
$to_delete = wc_get_orders(
|
||||
array(
|
||||
'date_query' => array(
|
||||
array(
|
||||
'column' => 'date_created',
|
||||
'before' => '-1 week',
|
||||
),
|
||||
),
|
||||
'orderby' => 'date',
|
||||
'order' => 'ASC',
|
||||
'status' => 'auto-draft',
|
||||
)
|
||||
);
|
||||
|
||||
foreach ( $to_delete as $order ) {
|
||||
$order->delete( true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Fires after schedueld deletion of auto-draft orders has been completed.
|
||||
*
|
||||
* @since 7.7.0
|
||||
*/
|
||||
do_action( 'woocommerce_scheduled_auto_draft_delete' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the 'woocommerce_feature_description_tip' filter.
|
||||
*
|
||||
|
|
|
@ -28,6 +28,7 @@ class DataSynchronizerTests extends WC_Unit_Test_Case {
|
|||
remove_filter( 'query', array( $this, '_drop_temporary_tables' ) );
|
||||
OrderHelper::delete_order_custom_tables(); // We need this since non-temporary tables won't drop automatically.
|
||||
OrderHelper::create_order_custom_table_if_not_exist();
|
||||
OrderHelper::toggle_cot( false );
|
||||
$this->sut = wc_get_container()->get( DataSynchronizer::class );
|
||||
$features_controller = wc_get_container()->get( Featurescontroller::class );
|
||||
$features_controller->change_feature_enable( 'custom_order_tables', true );
|
||||
|
@ -311,4 +312,43 @@ class DataSynchronizerTests extends WC_Unit_Test_Case {
|
|||
$this->assertEquals( $order2->get_id(), $orders_to_migrate[0] );
|
||||
$this->assertEquals( $max_id + 1, $orders_to_migrate[1] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that auto-draft orders older than 1 week are automatically deleted when WP does the same for posts.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_auto_draft_deletion(): void {
|
||||
OrderHelper::toggle_cot( true );
|
||||
|
||||
$order1 = new \WC_Order();
|
||||
$order1->set_status( 'auto-draft' );
|
||||
$order1->set_date_created( strtotime( '-10 days' ) );
|
||||
$order1->save();
|
||||
|
||||
$order2 = new \WC_Order();
|
||||
$order2->set_status( 'auto-draft' );
|
||||
$order2->save();
|
||||
|
||||
$order3 = new \WC_Order();
|
||||
$order3->set_status( 'processing' );
|
||||
$order3->save();
|
||||
|
||||
// Run WP's auto-draft delete.
|
||||
do_action( 'wp_scheduled_auto_draft_delete' ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.HookCommentWrongStyle
|
||||
|
||||
$orders = wc_get_orders(
|
||||
array(
|
||||
'status' => 'all',
|
||||
'limit' => -1,
|
||||
'return' => 'ids',
|
||||
)
|
||||
);
|
||||
|
||||
// Confirm that only $order1 is deleted when the action runs but the other orders remain intact.
|
||||
$this->assertContains( $order2->get_id(), $orders );
|
||||
$this->assertContains( $order3->get_id(), $orders );
|
||||
$this->assertNotContains( $order1->get_id(), $orders );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue