diff --git a/includes/api/class-wc-rest-system-status-tools-controller.php b/includes/api/class-wc-rest-system-status-tools-controller.php index e8c56c8c1cf..a5a5df66112 100644 --- a/includes/api/class-wc-rest-system-status-tools-controller.php +++ b/includes/api/class-wc-rest-system-status-tools-controller.php @@ -121,6 +121,11 @@ class WC_REST_System_Status_Tools_Controller extends WC_REST_Controller { 'button' => __( 'Clear expired transients', 'woocommerce' ), 'desc' => __( 'This tool will clear ALL expired transients from WordPress.', 'woocommerce' ), ), + 'delete_orphaned_variations' => array( + 'name' => __( 'Orphaned Variations', 'woocommerce' ), + 'button' => __( 'Delete orphaned variations', 'woocommerce' ), + 'desc' => __( 'This tool will delete all variations which have no parent.', 'woocommerce' ), + ), 'recount_terms' => array( 'name' => __( 'Term counts', 'woocommerce' ), 'button' => __( 'Recount terms', 'woocommerce' ), @@ -199,7 +204,6 @@ class WC_REST_System_Status_Tools_Controller extends WC_REST_Controller { /** * Update (execute) a tool. - * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ @@ -375,6 +379,16 @@ class WC_REST_System_Status_Tools_Controller extends WC_REST_Controller { $message = sprintf( __( '%d Transients Rows Cleared', 'woocommerce' ), $rows + $rows2 ); break; + case 'delete_orphaned_variations' : + /** + * Delete orphans + */ + $result = absint( $wpdb->query( "DELETE products + FROM {$wpdb->posts} products + LEFT JOIN {$wpdb->posts} wp ON wp.ID = products.post_parent + WHERE wp.ID IS NULL AND products.post_type = 'product_variation';" ) ); + $message = sprintf( __( '%d Orphaned Variations Deleted', 'woocommerce' ), $result ); + break; case 'reset_roles' : // Remove then re-add caps and roles WC_Install::remove_roles();