diff --git a/includes/data-stores/abstract-wc-order-data-store-cpt.php b/includes/data-stores/abstract-wc-order-data-store-cpt.php index ec610e68426..79f8839e44d 100644 --- a/includes/data-stores/abstract-wc-order-data-store-cpt.php +++ b/includes/data-stores/abstract-wc-order-data-store-cpt.php @@ -58,9 +58,6 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme $order->set_date_created( current_time( 'timestamp', true ) ); $order->set_currency( $order->get_currency() ? $order->get_currency() : get_woocommerce_currency() ); - $raw_status = $order->get_status( 'edit' ) ? $order->get_status( 'edit' ) : apply_filters( 'woocommerce_default_order_status', 'pending' ); - $status = wc_is_order_status( 'wc-' . $raw_status ) ? 'wc-' . $raw_status : $raw_status; - $id = wp_insert_post( apply_filters( 'woocommerce_new_order_data', @@ -68,7 +65,7 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme 'post_date' => gmdate( 'Y-m-d H:i:s', $order->get_date_created( 'edit' )->getOffsetTimestamp() ), 'post_date_gmt' => gmdate( 'Y-m-d H:i:s', $order->get_date_created( 'edit' )->getTimestamp() ), 'post_type' => $order->get_type( 'edit' ), - 'post_status' => $status, + 'post_status' => $this->get_post_status( $order ), 'ping_status' => 'closed', 'post_author' => 1, 'post_title' => $this->get_post_title(), @@ -144,12 +141,10 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme // Only update the post when the post data changes. if ( array_intersect( array( 'date_created', 'date_modified', 'status', 'parent_id', 'post_excerpt' ), array_keys( $changes ) ) ) { - $raw_status = $order->get_status( 'edit' ) ? $order->get_status( 'edit' ) : apply_filters( 'woocommerce_default_order_status', 'pending' ); - $status = wc_is_order_status( 'wc-' . $raw_status ) ? 'wc-' . $raw_status : $raw_status; $post_data = array( 'post_date' => gmdate( 'Y-m-d H:i:s', $order->get_date_created( 'edit' )->getOffsetTimestamp() ), 'post_date_gmt' => gmdate( 'Y-m-d H:i:s', $order->get_date_created( 'edit' )->getTimestamp() ), - 'post_status' => $status, + 'post_status' => $this->get_post_status( $order ), 'post_parent' => $order->get_parent_id(), 'post_excerpt' => $this->get_post_excerpt( $order ), 'post_modified' => isset( $changes['date_modified'] ) ? gmdate( 'Y-m-d H:i:s', $order->get_date_modified( 'edit' )->getOffsetTimestamp() ) : current_time( 'mysql' ), @@ -215,6 +210,36 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme |-------------------------------------------------------------------------- */ + /** + * Get the status to save to the post object. + * + * Plugins extending the order classes can override this to change the stored status/add prefixes etc. + * + * @since 3.6.0 + * @param WC_order $order Order object. + * @return string + */ + protected function get_post_status( $order ) { + $order_status = $order->get_status( 'edit' ); + + if ( ! $order_status ) { + $order_status = apply_filters( 'woocommerce_default_order_status', 'pending' ); + } + + $post_status = $order_status; + $valid_statuses = get_post_stati(); + + // Add a wc- prefix to the status, but exclude some core statuses which should not be prefixed. + // @todo In the future this should only happen based on `wc_is_order_status`, but in order to + // preserve back-compatibility this happens to all statuses except a select few. A doing_it_wrong + // Notice will be needed here, followed by future removal. + if ( ! in_array( $post_status, array( 'auto-draft', 'draft', 'trash' ), true ) && in_array( 'wc-' . $post_status, $valid_statuses, true ) ) { + $post_status = 'wc-' . $post_status; + } + + return $post_status; + } + /** * Excerpt for post. *