status === $data['status'] ) && ( empty( $data['quantity'] ) || $previous_order_item->quantity === $data['quantity'] ) && ( ! isset( $data['total'] ) || $previous_order_item->total == $data['total'] ) && ( ! isset( $data['subtotal'] ) || $previous_order_item->subtotal == $data['subtotal'] ) && ( ! isset( $data['discount'] ) || $previous_order_item->discount == $data['discount'] ) && ( ! isset( $data['tax'] ) || $previous_order_item->tax == $data['tax'] ) && ( ! isset( $data['rate'] ) || $previous_order_item->rate == $data['rate'] ) && ( empty( $data['product_id'] ) || $previous_order_item->product_id == $data['product_id'] ) ) { return; } // Recalculate the previous product values if the product ID has changed. if ( ! empty( $data['product_id'] ) && $previous_order_item->product_id != $data['product_id'] ) { edd_maybe_schedule_download_recalculation( $previous_order_item->product_id ); } } $order_item = edd_get_order_item( $order_item_id ); if ( empty( $order_item->product_id ) ) { return; } edd_maybe_schedule_download_recalculation( $order_item->product_id ); } add_action( 'edd_order_adjustment_added', 'edd_recalculate_order_adjustment_download', 10, 2 ); add_action( 'edd_order_adjustment_updated', 'edd_recalculate_order_adjustment_download', 10, 3 ); /** * Attempts to reschedule download recalculations when an order adjustment is added or updated. * * @since 3.1 * @param int $order_adjustment_id The order adjustment ID. * @param array $data The array of data for the new/updated order adjustment. * @param bool|EDD\Orders\Order_Adjustment $previous_order_adjustment The previous order adjustment object. * @return void */ function edd_recalculate_order_adjustment_download( $order_adjustment_id, $data = array(), $previous_order_adjustment = false ) { if ( get_option( '_edd_v30_doing_order_migration', false ) ) { return; } if ( $previous_order_adjustment instanceof EDD\Orders\Order_Adjustment ) { $columns_affecting_stats = array( 'total', 'subtotal', 'object_id', 'object_type' ); // If the data being updated isn't one of these columns then we don't need to recalculate. if ( empty( array_intersect( array_keys( $data ), $columns_affecting_stats ) ) ) { return; } // If the data exists but matches, we don't need to recalculate. if ( ( ! isset( $data['total'] ) || $previous_order_adjustment->total == $data['total'] ) && ( ! isset( $data['subtotal'] ) || $previous_order_adjustment->subtotal == $data['subtotal'] ) && ( empty( $data['object_id'] ) || $previous_order_adjustment->object_id == $data['object_id'] ) && ( empty( $data['object_type'] ) || $previous_order_adjustment->object_type == $data['object_type'] ) ) { return; } } $order_adjustment = edd_get_order_adjustment( $order_adjustment_id ); if ( empty( $order_adjustment->object_type ) || 'order_item' !== $order_adjustment->object_type ) { return; } $order_item = edd_get_order_item( $order_adjustment->object_id ); if ( ! empty( $order_item->product_id ) ) { edd_maybe_schedule_download_recalculation( $order_item->product_id ); } }