/** * Save subscription custom fields from edit page * * @access public * @param int $post_id * @param object $post * @return void */ public function save_subscription_meta_box($post_id, $post) { // Check if required properties were passed in if (empty($post_id) || empty($post)) { return; } // Make sure user has permissions to edit this post if (!current_user_can('edit_post', $post_id)) { return; } // Make sure the correct post ID was passed from form if (empty($_POST['post_ID']) || $_POST['post_ID'] != $post_id) { return; } // Make sure it is not a draft save action if (defined('DOING_AUTOSAVE') || is_int(wp_is_post_autosave($post)) || is_int(wp_is_post_revision($post))) { return; } // Proceed only if post type is subscription if ($post->post_type != 'subscription') { return; } $subscription = $this->load_from_cache('subscriptions', $post_id); if (!$subscription) { return; } // Actions if (!empty($_POST['subscriptio_subscription_button']) && $_POST['subscriptio_subscription_button'] == 'actions' && !empty($_POST['subscriptio_subscription_actions'])) { switch ($_POST['subscriptio_subscription_actions']) { // Cancel case 'cancel': if ($subscription->can_be_cancelled()) { // Write transaction $transaction = new Subscriptio_Transaction(null, 'manual_cancellation'); $transaction->add_subscription_id($subscription->id); $transaction->add_product_id($subscription->product_id); $transaction->add_variation_id($subscription->variation_id); try { // Cancel subscription $subscription->cancel(); // Update transaction $transaction->update_result('success'); $transaction->update_note(__('Subscription cancelled manually by administrator.', 'subscriptio'), true); } catch (Exception $e) { $transaction->update_result('error'); $transaction->update_note($e->getMessage()); } } break; // Pause case 'pause': // Make sure that subscription can be paused if ($subscription->can_be_paused()) { // Write transaction $transaction = new Subscriptio_Transaction(null, 'subscription_pause'); $transaction->add_subscription_id($subscription->id); $transaction->add_product_id($subscription->product_id); $transaction->add_variation_id($subscription->variation_id); try { // Pause subscription $subscription->pause(); // Update transaction $transaction->update_result('success'); $transaction->update_note(__('Subscription paused by administrator.', 'subscriptio'), true); } catch (Exception $e) { $transaction->update_result('error'); $transaction->update_note($e->getMessage()); } } break; // Resume case 'resume': // Make sure that subscription can be resumed (was paused) if ($subscription->can_be_resumed()) { // Write transaction $transaction = new Subscriptio_Transaction(null, 'subscription_resume'); $transaction->add_subscription_id($subscription->id); $transaction->add_product_id($subscription->product_id); $transaction->add_variation_id($subscription->variation_id); try { // Resume subscription $subscription->resume(); // Update transaction $transaction->update_result('success'); $transaction->update_note(__('Subscription resumed by administrator.', 'subscriptio'), true); } catch (Exception $e) { $transaction->update_result('error'); $transaction->update_note($e->getMessage()); } } break; default: break; } } // Address update else if (!empty($_POST['subscriptio_subscription_button']) && $_POST['subscriptio_subscription_button'] == 'address') { $subscription->update_shipping_address($_POST); } }
/** * Cancel pending subscriptions when orders are cancelled * * @access public * @param int $order_id * @return void */ public function order_cancelled($order_id) { // Iterate over subscriptions and cancel if they are still pending foreach (self::get_subscriptions_from_order_id($order_id) as $subscription) { if ($subscription->status == 'pending') { // Write transaction $transaction = new Subscriptio_Transaction(null, 'order_cancellation'); $transaction->add_subscription_id($subscription->id); $transaction->add_order_id($order_id); $transaction->add_product_id($subscription->product_id); $transaction->add_variation_id($subscription->variation_id); try { // Cancel subscription $subscription->cancel(); // Update transaction $transaction->update_result('success'); $transaction->update_note(__('Pending subscription cancelled due to cancelled order.', 'subscriptio'), true); } catch (Exception $e) { $transaction->update_result('error'); $transaction->update_note($e->getMessage()); } } } }
/** * Update shipping address * * @access public * @param array $address * @param bool $is_frontend * @param bool $is_customer * @return bool */ public function update_shipping_address($address, $is_frontend = false, $is_customer = false) { $fields = array( 'shipping_first_name', 'shipping_last_name', 'shipping_company', 'shipping_address_1', 'shipping_address_2', 'shipping_city', 'shipping_state', 'shipping_postcode', 'shipping_country', ); $shipping_address = array(); foreach ($fields as $field) { if ($is_frontend) { $shipping_address['_' . $field] = isset($address[$field]) ? $address[$field] : ''; } else { $shipping_address['_' . $field] = isset($address['_' . $field]) ? $address['_' . $field] : ''; } } // Check if address has changed if (array_diff($this->shipping_address, $shipping_address) || array_diff($shipping_address, $this->shipping_address)) { // Write transaction $transaction = new Subscriptio_Transaction(null, 'address_changed'); $transaction->add_subscription_id($this->id); $transaction->add_product_id($this->product_id); $transaction->add_variation_id($this->variation_id); try { // Save fields $this->update_subscription_details(array('shipping_address' => $shipping_address)); // Update transaction $transaction->update_result('success'); if ($is_customer) { $transaction->update_note(__('Shipping address changed by customer.', 'subscriptio'), true); } else { $transaction->update_note(__('Shipping address changed by administrator.', 'subscriptio'), true); } return true; } catch (Exception $e) { $transaction->update_result('error'); $transaction->update_note($e->getMessage()); return false; } } return true; }