/** * Check if current frontend user owns subscription and return it * * @access public * @param int $subscription_id * @return object|bool */ public static function get_subscription($subscription_id) { $user_id = get_current_user_id(); $subscription = Subscriptio_Subscription::get_by_id($subscription_id); if (!$user_id || !$subscription || $subscription->user_id != $user_id) { echo '<div class="woocommerce-error">' . __('Invalid subscription.', 'subscriptio') . ' <a href="' . get_permalink(wc_get_page_id('myaccount')).'" class="wc-forward">'. __('My Account', 'subscriptio') .'</a>' . '</div>'; return false; } return $subscription; }
/** * Save membership IDs * * @access public * @param array $ids * @return void */ public function save_membership_ids($order_item_id, $ids) { // Load subscription by Order Item ID $query = new WP_Query(array( 'post_type' => 'subscription', 'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash'), 'posts_per_page' => -1, 'fields' => 'ids', 'meta_query' => array( array( 'key' => 'order_item_id', 'value' => $order_item_id, 'compare' => '=', ), ), )); // Iterate over found subscriptions foreach ($query->posts as $subscription_id) { $subscription = Subscriptio_Subscription::get_by_id($subscription_id); // Subscription looks ok? if (is_object($subscription) && isset($subscription->status) && empty($subscription->membership_ids)) { if (is_array($ids) && !empty($ids)) { foreach ($ids as $id) { $subscription->update_subscription_details(array('membership_ids' => $id)); } } } } }
<?php echo $user_phone; ?> </p> <?php endif; ?> <?php if (is_array($subscription->shipping_address) && !empty($subscription->shipping_address)): ?> <p class="subscriptio_admin_address_paragaph"> <strong><?php _e('Shipping Address:', 'subscriptio'); ?> <?php if (!$subscription->is_inactive()): ?> <a id="subscriptio_admin_edit_address" href="#"><?php _e('[edit]', 'subscriptio'); ?></a> <?php endif; ?> </strong> <span class="subscriptio_admin_address"><?php echo wp_kses(Subscriptio::get_formatted_shipping_address($subscription->shipping_address), array('br' => array())); ?></span> </p> <?php if (!$subscription->is_inactive()): ?> <div class="subscriptio_admin_address_fields"> <?php foreach (Subscriptio_Subscription::get_admin_shipping_fields() as $key => $field): ?> <?php if ($field['type'] == 'select'): ?> <?php woocommerce_wp_select(array('id' => $key, 'value' => $subscription->shipping_address[$key], 'label' => $field['title'], 'options' => $field['values'])); ?> <?php else: ?> <?php woocommerce_wp_text_input(array('id' => $key, 'value' => $subscription->shipping_address[$key], 'label' => $field['title'])); ?> <?php endif; ?> <?php endforeach; ?> <div class="subscriptio_admin_address_save"> <button type="submit" class="button subscriptio_save_address" name="subscriptio_subscription_button" value="address" title="<?php _e('Save Address', 'subscriptio'); ?>"><?php _e('Save Address', 'subscriptio'); ?></button> <button class="button" id="subscriptio_cancel_address_edit" title="<?php _e('Cancel', 'subscriptio'); ?>"><?php _e('Cancel', 'subscriptio'); ?></button> </div> </div> <?php endif; ?> <?php endif; ?> </div>
<th class="subscriptio_list_status"><?php _e('Status', 'subscriptio'); ?></th> <th class="subscriptio_list_product"><?php _e('Product', 'subscriptio'); ?></th> <th class="subscriptio_list_recurring"><?php _e('Recurring', 'subscriptio'); ?></th> <th class="subscriptio_list_actions"> </th> </tr> </thead> <tbody> <?php foreach ($subscriptions as $subscription): ?> <tr class="subscriptio_subscription_list_subscription"> <td class="subscriptio_list_id"><?php echo '<a href="' . $subscription->get_frontend_link('view-subscription') . '">' . $subscription->get_subscription_number() . '</a>'; ?></td> <td class="subscriptio_list_status"><?php echo $subscription->get_formatted_status(true); ?></td> <td class="subscriptio_list_product"> <?php foreach (Subscriptio_Subscription::get_subscription_items($subscription->id) as $item): ?> <?php if (!$item['deleted']): ?> <?php Subscriptio::print_frontend_link_to_post($item['product_id'], $item['name'], '', ($item['quantity'] > 1 ? 'x ' . $item['quantity'] : '')); ?> <?php else: ?> <?php echo $item['name']; ?> <?php endif; ?> <?php endforeach; ?> </td> <td class="subscriptio_list_recurring"><?php echo $subscription->get_formatted_recurring_amount(); ?></td> <td class="subscriptio_list_actions"> <?php foreach ($subscription->get_frontend_actions() as $action_key => $action): ?> <a href="<?php echo $action['url']; ?>" class="button subscriptio_button_<?php echo sanitize_html_class($action_key); ?>"><?php echo $action['title']; ?></a> <?php endforeach; ?> </td> </tr>
/** * Scheduled reminder event handler * * @access public * @param int $subscription_id * @return void */ public static function scheduled_reminder($subscription_id) { // Start transaction $transaction = new Subscriptio_Transaction(null, 'payment_reminder'); // Get subscription $subscription = Subscriptio_Subscription::get_valid_subscription($subscription_id, $transaction); if ($subscription) { // Send reminder try { Subscriptio_Mailer::send('payment_reminder', $subscription); $transaction->update_result('success'); $transaction->update_note(__('Payment reminder sent.', 'subscriptio'), true); } catch (Exception $e) { $transaction->update_result('error'); $transaction->update_note($e->getMessage(), true); } } }
/** * Get related Subscriptions from Order ID * * @access public * @param int $order_id * @return array */ public static function get_subscriptions_from_order_id($order_id) { $subscriptions = array(); // Search for related subscription post ids $subscription_post_ids = get_posts(array( 'posts_per_page' => -1, 'post_type' => 'subscription', 'meta_query' => array( array( 'key' => 'all_order_ids', 'value' => $order_id, 'compare' => '=', ), ), 'fields' => 'ids', )); // Iterate over ids and create objects foreach ($subscription_post_ids as $id) { if ($subscription = Subscriptio_Subscription::get_by_id($id)) { $subscriptions[$id] = $subscription; } } return $subscriptions; }
/** * Maybe change WooCommerce My Orders query * * @access public * @param array $params * @return array */ public function woocommerce_my_orders_query($params) { if (defined('SUBSCRIPTIO_PRINTING_RELATED_ORDERS')) { $subscription = Subscriptio_Subscription::get_by_id(SUBSCRIPTIO_PRINTING_RELATED_ORDERS); if ($subscription) { $params['post__in'] = $subscription->all_order_ids; } } return $params; }
/** * Check if variation or grouped product prices are all equal and return cheapest price * * @access public * @param object $product * @return array */ public static function get_cheapest_child_price($product) { $ids = array(); // Grouped product? if ($product->product_type == 'grouped') { $children = get_children(array( 'post_parent' => $product->id, 'post_type' => 'product', )); foreach ($children as $child) { $ids[] = $child->ID; } } // Variable product else { $variations = $product->get_available_variations(); foreach ($variations as $variation) { $ids[] = $variation['variation_id']; } } if (empty($ids)) { return array(0, true); } $selected_id = null; $cheapest = null; $equal = true; foreach ($ids as $id) { // We skip non-subscription variations as there is no easy way to compare recurring payments with one-off payments if (!self::is_subscription($id)) { $equal = false; continue; } $child_product = new WC_Product($id); $child_meta = Subscriptio::unwrap_post_meta(get_post_meta($id)); $child_days = Subscriptio_Subscription::get_period_length_in('day', $child_meta['_subscriptio_price_time_unit'], $child_meta['_subscriptio_price_time_value']); $price_per_day = $child_days == 0 ? 0 : $child_product->get_price() / $child_days; if ($cheapest === null) { $selected_id = $id; $cheapest = $price_per_day; } else if ($price_per_day < $cheapest) { $selected_id = $id; $cheapest = $price_per_day; $equal = false; } } return array($selected_id, $equal); }