/** * A general purpose function for grabbing an array of subscriptions in form of post_id => WC_Subscription * * The $args parameter is based on the parameter of the same name used by the core WordPress @see get_posts() function. * It can be used to choose which subscriptions should be returned by the function, how many subscriptions should be returned * and in what order those subscriptions should be returned. * * @param array $args A set of name value pairs to determine the return value. * 'subscriptions_per_page' The number of subscriptions to return. Set to -1 for unlimited. Default 10. * 'offset' An optional number of subscription to displace or pass over. Default 0. * 'orderby' The field which the subscriptions should be ordered by. Can be 'start_date', 'trial_end_date', 'end_date', 'status' or 'order_id'. Defaults to 'start_date'. * 'order' The order of the values returned. Can be 'ASC' or 'DESC'. Defaults to 'DESC' * 'customer_id' The user ID of a customer on the site. * 'product_id' The post ID of a WC_Product_Subscription, WC_Product_Variable_Subscription or WC_Product_Subscription_Variation object * 'order_id' The post ID of a shop_order post/WC_Order object which was used to create the subscription * 'subscription_status' Any valid subscription status. Can be 'any', 'active', 'cancelled', 'suspended', 'expired', 'pending' or 'trash'. Defaults to 'any'. * @return array Subscription details in post_id => WC_Subscription form. * @since 2.0 */ function wcs_get_subscriptions($args) { global $wpdb; $args = wp_parse_args($args, array('subscriptions_per_page' => 10, 'paged' => 1, 'offset' => 0, 'orderby' => 'start_date', 'order' => 'DESC', 'customer_id' => 0, 'product_id' => 0, 'variation_id' => 0, 'order_id' => 0, 'subscription_status' => 'any', 'meta_query_relation' => 'AND')); // if order_id is not a shop_order if (0 !== $args['order_id'] && 'shop_order' !== get_post_type($args['order_id'])) { return array(); } // Make sure status starts with 'wc-' if (!in_array($args['subscription_status'], array('any', 'trash'))) { $args['subscription_status'] = wcs_sanitize_subscription_status_key($args['subscription_status']); } // Prepare the args for WP_Query $query_args = array('post_type' => 'shop_subscription', 'post_status' => $args['subscription_status'], 'posts_per_page' => $args['subscriptions_per_page'], 'paged' => $args['paged'], 'offset' => $args['offset'], 'order' => $args['order'], 'fields' => 'ids', 'meta_query' => array()); // Maybe only get subscriptions created by a certain order if (0 != $args['order_id'] && is_numeric($args['order_id'])) { $query_args['post_parent'] = $args['order_id']; } // Map subscription specific orderby values to internal/WordPress keys switch ($args['orderby']) { case 'status': $query_args['orderby'] = 'post_status'; break; case 'start_date': $query_args['orderby'] = 'date'; break; case 'trial_end_date': case 'end_date': // We need to orderby post meta value: http://www.paulund.co.uk/order-meta-query $query_args = array_merge($query_args, array('orderby' => 'meta_value', 'meta_key' => wcs_get_date_meta_key($args['orderby']), 'meta_type' => 'DATETIME')); $query_args['meta_query'][] = array('key' => wcs_get_date_meta_key($args['orderby']), 'value' => 'EXISTS', 'type' => 'DATETIME'); break; default: $query_args['orderby'] = $args['orderby']; break; } // Maybe filter to a specific user if (0 != $args['customer_id'] && is_numeric($args['customer_id'])) { $query_args['meta_query'][] = array('key' => '_customer_user', 'value' => $args['customer_id'], 'type' => 'numeric', 'compare' => is_array($args['customer_id']) ? 'IN' : '='); } // We need to restrict subscriptions to those which contain a certain product/variation if (0 != $args['product_id'] && is_numeric($args['product_id']) || 0 != $args['variation_id'] && is_numeric($args['variation_id'])) { $query_args['post__in'] = wcs_get_subscriptions_for_product(array($args['product_id'], $args['variation_id'])); } if (!empty($query_args['meta_query'])) { $query_args['meta_query']['relation'] = $args['meta_query_relation']; } $query_args = apply_filters('woocommerce_get_subscriptions_query_args', $query_args, $args); $subscription_post_ids = get_posts($query_args); $subscriptions = array(); foreach ($subscription_post_ids as $post_id) { $subscriptions[$post_id] = wcs_get_subscription($post_id); } return apply_filters('woocommerce_got_subscriptions', $subscriptions, $args); }
/** * Remove a date from a subscription. * * @param string $date_type 'trial_end', 'next_payment' or 'end'. The 'start' and 'last_payment' date types will throw an exception. */ public function delete_date($date_type) { // Accept dates with a '_date' suffix, like 'next_payment_date' or 'start_date' $date_type = str_replace('_date', '', $date_type); // Make sure some dates are before next payment date if (in_array($date_type, array('start', 'last_payment'))) { switch ($date_type) { case 'start': $message = __('The start date of a subscription can not be deleted, only updated.', 'woocommerce-subscriptions'); break; case 'last_payment': $message = __('The last payment date of a subscription can not be deleted. You must delete the order.', 'woocommerce-subscriptions'); break; } throw new Exception($message); } $this->schedule->{$date_type} = 0; update_post_meta($this->id, wcs_get_date_meta_key($date_type), $this->schedule->{$date_type}); do_action('woocommerce_subscription_date_deleted', $this, $date_type); }