* Repairs a glitch in WordPress's save function. You cannot save a null value on update, see * https://github.com/woothemes/woocommerce/issues/7861 for more info on this. * * @param integer $post_id The ID of the subscription */ public static function repair_permission_data($post_id) { if (absint($post_id) !== $post_id) { return; } if ('shop_subscription' !== get_post_type($post_id)) { return; } global $wpdb; $wpdb->query($wpdb->prepare("\n\t\t\tUPDATE {$wpdb->prefix}woocommerce_downloadable_product_permissions\n\t\t\tSET access_expires = null\n\t\t\tWHERE order_id = %d\n\t\t\tAND access_expires = %s\n\t\t", $post_id, '0000-00-00 00:00:00')); } /** * Remove download permissions attached to a subscription when it is permenantly deleted. * * @since 2.0 */ public static function delete_subscription_permissions($post_id) { global $wpdb; if ('shop_subscription' == get_post_type($post_id)) { $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE order_id = %d", $post_id)); } } } WCS_Download_Handler::init();
/** * Revoke download permissions granted on the old switch item. * * @since 2.0.9 * @param WC_Subscription $subscription * @param array $new_item * @param array $old_item */ public static function remove_download_permissions_after_switch($subscription, $new_item, $old_item) { if (!is_object($subscription)) { $subscription = wcs_get_subscription($subscription); } $product_id = wcs_get_canonical_product_id($old_item); WCS_Download_Handler::revoke_downloadable_file_permission($product_id, $subscription->id, $subscription->customer_user); }
/** * Process the remove or re-add a line item from a subscription request. * * @since 2.0 */ public static function maybe_remove_or_add_item_to_subscription() { if (isset($_GET['subscription_id']) && (isset($_GET['remove_item']) || isset($_GET['undo_remove_item'])) && isset($_GET['_wpnonce'])) { $subscription = wcs_is_subscription($_GET['subscription_id']) ? wcs_get_subscription($_GET['subscription_id']) : false; $undo_request = isset($_GET['undo_remove_item']) ? true : false; $item_id = $undo_request ? $_GET['undo_remove_item'] : $_GET['remove_item']; if (false === $subscription) { wc_add_notice(sprintf(_x('Subscription #%d does not exist.', 'hash before subscription ID', 'woocommerce-subscriptions'), $_GET['subscription_id']), 'error'); wp_safe_redirect(wc_get_page_permalink('myaccount')); exit; } if (self::validate_remove_items_request($subscription, $item_id, $undo_request)) { if ($undo_request) { // handle undo request $removed_item = WC()->session->get('removed_subscription_items', array()); if (!empty($removed_item[$item_id]) && $subscription->id == $removed_item[$item_id]) { // restore the item wc_update_order_item($item_id, array('order_item_type' => 'line_item')); unset($removed_item[$item_id]); WC()->session->set('removed_subscription_items', $removed_item); // restore download permissions for this item $line_items = $subscription->get_items(); $line_item = $line_items[$item_id]; $_product = $subscription->get_product_from_item($line_item); $product_id = wcs_get_canonical_product_id($line_item); if ($_product && $_product->exists() && $_product->is_downloadable()) { $downloads = $_product->get_files(); foreach (array_keys($downloads) as $download_id) { wc_downloadable_file_permission($download_id, $product_id, $subscription, $line_item['qty']); } } // translators: 1$: product name, 2$: product id $subscription->add_order_note(sprintf(_x('Customer added "%1$s" (Product ID: #%2$d) via the My Account page.', 'used in order note', 'woocommerce-subscriptions'), wcs_get_line_item_name($line_item), $product_id)); } else { wc_add_notice(__('Your request to undo your previous action was unsuccessful.', 'woocommerce-subscriptions')); } } else { // handle remove item requests WC()->session->set('removed_subscription_items', array($item_id => $subscription->id)); // remove download access for the item $line_items = $subscription->get_items(); $line_item = $line_items[$item_id]; $product_id = wcs_get_canonical_product_id($line_item); WCS_Download_Handler::revoke_downloadable_file_permission($product_id, $subscription->id, $subscription->get_user_id()); // remove the line item from subscription but preserve its data in the DB wc_update_order_item($item_id, array('order_item_type' => 'line_item_removed')); // translators: 1$: product name, 2$: product id $subscription->add_order_note(sprintf(_x('Customer removed "%1$s" (Product ID: #%2$d) via the My Account page.', 'used in order note', 'woocommerce-subscriptions'), wcs_get_line_item_name($line_item), $product_id)); // translators: placeholders are 1$: item name, and, 2$: opening and, 3$: closing link tags wc_add_notice(sprintf(__('You have successfully removed "%1$s" from your subscription. %2$sUndo?%3$s', 'woocommerce-subscriptions'), $line_item['name'], '<a href="' . esc_url(self::get_undo_remove_url($subscription->id, $item_id, $subscription->get_view_order_url())) . '" >', '</a>')); } } $subscription->calculate_totals(); wp_safe_redirect($subscription->get_view_order_url()); exit; } }