PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / 4.16.19
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress v4.16.19
4.16.19 4.16.18 4.16.17 4.16.16 trunk 1.0 1.0.1 1.0.2 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5a 1.1.6 1.1.7 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4 1.4.1 1.4.2 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.8 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.1.9 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.2 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 3.0 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 3.1.19 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4.0.0 4.0.1 4.0.2 4.0.3 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.13.4 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.15.0 4.15.1 4.15.10 4.15.11 4.15.12 4.15.13 4.15.14 4.15.15 4.15.16 4.15.17 4.15.18 4.15.19 4.15.2 4.15.20 4.15.20.1 4.15.21 4.15.22 4.15.23 4.15.24 4.15.25 4.15.3 4.15.4 4.15.5 4.15.6 4.15.7 4.15.8 4.15.9 4.16.0 4.16.1 4.16.10 4.16.11 4.16.12 4.16.13 4.16.14 4.16.15 4.16.2 4.16.3 4.16.4 4.16.5 4.16.6 4.16.7 4.16.8 4.16.9 4.2.0 4.3.0 4.3.1 4.3.2 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.7.0 4.8.0 4.9.0
wp-user-avatar / src / Admin / SettingsPages / Membership / SubscriptionsPage / SettingsPage.php
wp-user-avatar / src / Admin / SettingsPages / Membership / SubscriptionsPage Last commit date
SettingsPage.php 1 year ago SubscriptionWPListTable.php 3 months ago index.php 3 years ago
SettingsPage.php
256 lines
1 <?php
2
3 namespace ProfilePress\Core\Admin\SettingsPages\Membership\SubscriptionsPage;
4
5 use ProfilePress\Core\Admin\SettingsPages\AbstractSettingsPage;
6 use ProfilePress\Core\Membership\Models\Subscription\SubscriptionFactory;
7 use ProfilePress\Core\Membership\Models\Subscription\SubscriptionStatus;
8 use ProfilePress\Custom_Settings_Page_Api;
9 use ProfilePressVendor\Carbon\CarbonImmutable;
10
11 class SettingsPage extends AbstractSettingsPage
12 {
13 public $error_bucket;
14
15 /** @var SubscriptionWPListTable */
16 private $subscriptionListTable;
17
18 function __construct()
19 {
20 add_action('ppress_register_menu_page', [$this, 'register_cpf_settings_page']);
21 add_action('ppress_admin_settings_page_subscriptions', [$this, 'settings_page_function']);
22
23 if (ppressGET_var('page') == PPRESS_MEMBERSHIP_SUBSCRIPTIONS_SETTINGS_SLUG) {
24 add_filter('set-screen-option', [__CLASS__, 'set_screen'], 10, 3);
25 add_filter('set_screen_option_rules_per_page', [__CLASS__, 'set_screen'], 10, 3);
26
27 add_action('admin_init', function () {
28 $this->save_subscription();
29 });
30 }
31 }
32
33 public function default_header_menu()
34 {
35 return 'subscriptions';
36 }
37
38 public function register_cpf_settings_page()
39 {
40 $hook = add_submenu_page(
41 PPRESS_DASHBOARD_SETTINGS_SLUG,
42 $this->admin_page_title() . ' - ProfilePress',
43 esc_html__('Subscriptions', 'wp-user-avatar'),
44 'manage_options',
45 PPRESS_MEMBERSHIP_SUBSCRIPTIONS_SETTINGS_SLUG,
46 array($this, 'admin_page_callback'));
47
48 add_action("load-$hook", array($this, 'add_options'));
49
50 do_action('ppress_membership_subscriptions_settings_page_register', $hook);
51 }
52
53 /**
54 * @return void|string
55 * @throws \Exception
56 */
57 public function save_subscription()
58 {
59 if ( ! isset($_POST['ppress_save_subscription'])) return;
60
61 ppress_verify_nonce();
62
63 if ( ! current_user_can('manage_options')) return;
64
65 $subscription = SubscriptionFactory::fromId(absint(ppressGET_var('id')));
66 $subscription_old_status = $subscription->status;
67
68 $subscription->created_date = ppress_local_datetime_to_utc(sanitize_text_field($_POST['sub_created_date']));
69 if ( ! $subscription->is_lifetime()) {
70 $expiration_date = CarbonImmutable::createFromFormat('Y-m-d', sanitize_text_field($_POST['sub_expiration_date']), wp_timezone())
71 ->toDateTimeString();
72
73 $subscription->expiration_date = $expiration_date;
74 }
75 $subscription->profile_id = sanitize_text_field($_POST['sub_profile_id']);
76 $subscription->customer_id = absint($_POST['sub_customer_user']);
77
78 if (in_array($_POST['sub_status'], array_keys(SubscriptionStatus::get_all()))) {
79 $subscription->status = sanitize_text_field($_POST['sub_status']);
80 }
81
82 if ( ! empty($_POST['sub_initial_amount'])) {
83 $subscription->initial_amount = ppress_sanitize_amount($_POST['sub_initial_amount']);
84 }
85
86 if ( ! empty($_POST['sub_initial_tax'])) {
87 $subscription->initial_tax = ppress_sanitize_amount($_POST['sub_initial_tax']);
88 }
89
90 if ( ! empty($_POST['sub_initial_tax_rate'])) {
91 $subscription->initial_tax_rate = sanitize_text_field($_POST['sub_initial_tax_rate']);
92 }
93
94 if ( ! empty($_POST['sub_recurring_amount'])) {
95 $subscription->recurring_amount = ppress_sanitize_amount($_POST['sub_recurring_amount']);
96 }
97
98 if ( ! empty($_POST['sub_recurring_tax'])) {
99 $subscription->recurring_tax = ppress_sanitize_amount($_POST['sub_recurring_tax']);
100 }
101
102 if ( ! empty($_POST['sub_recurring_tax_rate'])) {
103 $subscription->recurring_tax_rate = ppress_sanitize_amount($_POST['sub_recurring_tax_rate']);
104 }
105
106 $subscription_id = $subscription->save();
107
108 $cloned_subscription = clone $subscription;
109 // doing this so transition from old to new status via update_status() becomes accurate.
110 $cloned_subscription->status = $subscription_old_status;
111
112 switch ($subscription->status) {
113 case SubscriptionStatus::ACTIVE :
114 $cloned_subscription->activate_subscription();
115 break;
116 case SubscriptionStatus::TRIALLING :
117 $cloned_subscription->enable_subscription_trial();
118 break;
119 case SubscriptionStatus::EXPIRED :
120 $cloned_subscription->expire(true);
121 break;
122 case SubscriptionStatus::CANCELLED :
123 $cloned_subscription->cancel(true);
124 break;
125 case SubscriptionStatus::COMPLETED :
126 $cloned_subscription->complete();
127 break;
128 }
129
130 wp_safe_redirect(add_query_arg(['ppress_subscription_action' => 'edit', 'id' => $subscription_id, 'saved' => 'true'], PPRESS_MEMBERSHIP_SUBSCRIPTIONS_SETTINGS_PAGE));
131 exit;
132 }
133
134 public function admin_page_title()
135 {
136 $title = esc_html__('Subscriptions', 'wp-user-avatar');
137
138 if (ppressGET_var('ppress_subscription_action') == 'edit') {
139 $title = esc_html__('Edit Subscription', 'wp-user-avatar');
140 }
141
142 return $title;
143 }
144
145 public static function set_screen($status, $option, $value)
146 {
147 return $value;
148 }
149
150 public function add_options()
151 {
152 $args = [
153 'label' => esc_html__('Subscriptions', 'wp-user-avatar'),
154 'default' => 10,
155 'option' => 'subscriptions_per_page'
156 ];
157
158 add_screen_option('per_page', $args);
159
160 $this->subscriptionListTable = new SubscriptionWPListTable();
161 }
162
163 public function admin_notices()
164 {
165 if ( ! isset($_GET['saved']) && ! isset($this->error_bucket)) return;
166
167 $status = 'updated';
168 $message = '';
169
170 if ( ! empty($this->error_bucket)) {
171 $message = $this->error_bucket;
172 $status = 'error';
173 }
174
175 if (isset($_GET['saved'])) {
176 $message = esc_html__('Changes saved.', 'wp-user-avatar');
177 }
178
179 printf('<div id="message" class="%s notice is-dismissible"><p>%s</strong></p></div>', $status, $message);
180 }
181
182 public function settings_page_function()
183 {
184 add_filter('wp_cspa_main_content_area', [$this, 'admin_settings_page_callback'], 10, 2);
185 add_action('wp_cspa_before_closing_header', [$this, 'add_new_button']);
186 add_action('wp_cspa_form_tag', function ($option_name) {
187 if ($option_name == 'ppress_subscriptions') {
188 printf(' action="%s"', ppress_get_current_url_query_string());
189 }
190 });
191
192 add_action('wp_cspa_after_settings_tab', function ($option_name) {
193 if ($option_name == 'ppress_subscriptions' && ppressGET_var('ppress_subscription_action') == 'edit') {
194
195 echo '<div class="notice notice-info">';
196 echo '<p>';
197 echo sprintf(__('%1$sNote%2$s - Be careful modifying details here. For example, changing the gateway subscription ID can result in renewals not being processed. While changing the expiration date will not affect when renewal payments are processed because your payment processor determines when.', 'wp-user-avatar'), '<strong>', '</strong>');
198 echo '</p>';
199 echo '</div>';
200 }
201 });
202
203 $instance = Custom_Settings_Page_Api::instance();
204 if ( ! isset($_GET['ppress_subscription_action'])) {
205 $instance->form_method('get');
206 $instance->remove_nonce_field();
207 }
208 $instance->add_view_classes('ppview');
209 $instance->option_name('ppress_subscriptions');
210 $instance->page_header($this->admin_page_title());
211 $instance->build(true);
212 }
213
214 public function add_new_button()
215 {
216 if (ppressGET_var('ppress_subscription_action') == 'edit') {
217 $url = esc_url_raw(PPRESS_MEMBERSHIP_SUBSCRIPTIONS_SETTINGS_PAGE);
218 echo "<a class=\"add-new-h2\" href=\"$url\">" . esc_html__('Back to Subscriptions', 'wp-user-avatar') . '</a>';
219 }
220 }
221
222 public function admin_settings_page_callback()
223 {
224 if (in_array(ppressGET_var('ppress_subscription_action'), ['new', 'edit'])) {
225 $this->admin_notices();
226 require_once dirname(dirname(__FILE__)) . '/views/subscriptions/add-edit-subscription.php';
227
228 return;
229 }
230
231 $this->subscriptionListTable->prepare_items();
232
233 echo '<input type="hidden" name="page" value="' . PPRESS_MEMBERSHIP_SUBSCRIPTIONS_SETTINGS_SLUG . '" />';
234 echo '<input type="hidden" name="view" value="subscriptions" />';
235 if (isset($_GET['status'])) {
236 echo '<input type="hidden" name="status" value="' . esc_attr($_GET['status']) . '" />';
237 }
238 $this->subscriptionListTable->views();
239 $this->subscriptionListTable->filter_bar();
240 $this->subscriptionListTable->display();
241
242 do_action('ppress_subscription_wp_list_table_bottom');
243 }
244
245 public static function get_instance()
246 {
247 static $instance = null;
248
249 if (is_null($instance)) {
250 $instance = new self();
251 }
252
253 return $instance;
254 }
255 }
256