PluginProbe
Subscriptions for WooCommerce with Stripe Recurring Payments / 2.3.0
Subscriptions for WooCommerce with Stripe Recurring Payments v2.3.0
2.4.0 2.3.0 2.2.0 2.1.0 2.0.0 1.11.2 1.11.1 1.11.0 1.10.9 1.10.8 1.10.7 1.10.6 1.10.5 1.10.4 1.10.3 1.10.2 1.10.1 1.10.0 1.9.6 1.9.5 trunk 1.3.0 1.3.1 1.3.2 1.4.0 All 65 releases
subscription / includes / Admin / Settings.php

Settings.php in Subscriptions for WooCommerce with Stripe Recurring Payments 2.3.0, at includes/Admin/Settings.php

354 lines 11.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace SpringDevs\Subscription\Admin;
4
5 use SpringDevs\Subscription\Ajax;
6
7 /**
8 * Class Settings
9 *
10 * @package SpringDevs\Subscription\Admin
11 */
12 class Settings {
13 /**
14 * Settings fields.
15 *
16 * @var array
17 */
18 public $settings_fields = [];
19
20 /**
21 * Initialize the class.
22 */
23 public function __construct() {
24 // Load the settings helper.
25 SettingsHelper::get_instance();
26
27 add_action( 'admin_menu', array( $this, 'admin_menu' ) );
28 add_action( 'admin_init', array( $this, 'register_settings' ) );
29 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_wc_admin_styles' ) );
30 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_installer_script' ) );
31 }
32
33 /**
34 * Register submenu on `Subscriptions` menu.
35 *
36 * @return void
37 */
38 public function admin_menu() {
39 // Initialize & process settings fields.
40 $this->initiate_settings_fields();
41
42 // Add submenu page.
43 $parent_slug = 'wp-subscription';
44 add_submenu_page(
45 $parent_slug,
46 __( 'Settings', 'subscription' ),
47 __( 'Settings', 'subscription' ),
48 'manage_options',
49 'wp-subscription-settings',
50 [ $this, 'settings_content' ]
51 );
52 }
53
54 /**
55 * Initialize settings fields.
56 */
57 public function initiate_settings_fields() {
58 global $wp_roles;
59 $roles = [];
60 foreach ( ( $wp_roles->roles ?? [] ) as $role_key => $role ) {
61 $roles[ $role_key ] = $role['name'];
62 }
63
64 // Setting fields.
65 $settings_fields = [
66 [
67 'type' => 'heading',
68 'group' => 'renewals',
69 'priority' => 0,
70 'field_data' => [
71 'title' => __( 'Renewals', 'subscription' ),
72 ],
73 ],
74 [
75 'type' => 'select',
76 'group' => 'renewals',
77 'priority' => 1,
78 'field_data' => [
79 'id' => 'wp_subscription_renewal_process',
80 'title' => __( 'Renewal Process', 'subscription' ),
81 'description' => __( 'How renewal process will be done after Subscription Expired.', 'subscription' ),
82 'options' => [
83 'auto' => __( 'Automatic', 'subscription' ),
84 'manual' => __( 'Manual', 'subscription' ),
85 ],
86 'selected' => esc_attr( subscrpt_get_renewal_process() ),
87 ],
88 ],
89 [
90 'type' => 'input',
91 'group' => 'renewals',
92 'priority' => 2,
93 'field_data' => [
94 'id' => 'wp_subscription_manual_renew_cart_notice',
95 'title' => __( 'Renewal Cart Notice', 'subscription' ),
96 'description' => __( 'Display Notice when Renewal Subscription product add to cart. Only available for Manual Renewal Process.', 'subscription' ),
97 'value' => esc_attr( subscrpt_get_manual_renew_cart_notice() ),
98 ],
99 ],
100 [
101 'type' => 'toggle',
102 'group' => 'renewals',
103 'priority' => 3,
104 'field_data' => [
105 'id' => 'wp_subscription_stripe_auto_renew',
106 'title' => __( 'Stripe Auto Renewal', 'subscription' ),
107 'label' => __( 'Accept Stripe Auto Renewals', 'subscription' ),
108 'description' => class_exists( 'WC_Stripe' )
109 ? sprintf(
110 /* translators: 1: opening plugin link tag, 2: closing link tag, 3: opening settings link tag */
111 __( '&#10003; %1$sWooCommerce Stripe Payment Gateway%2$s is active. %3$sConfigure%2$s', 'subscription' ),
112 '<a href="https://wordpress.org/plugins/woocommerce-gateway-stripe/" target="_blank">',
113 '</a>',
114 '<a href="' . esc_url( admin_url( 'admin.php?page=wc-settings&tab=checkout&section=stripe' ) ) . '">'
115 )
116 : sprintf(
117 /* translators: HTML tags */
118 __( '%1$s WooCommerce Stripe Payment Gateway %2$s plugin is required!', 'subscription' ),
119 '<a href="https://wordpress.org/plugins/woocommerce-gateway-stripe/" target="_blank">',
120 '</a>'
121 ) . $this->get_stripe_plugin_action(),
122 'value' => '1',
123 'checked' => '1' === get_option( 'wp_subscription_stripe_auto_renew', '1' ),
124 ],
125 ],
126 [
127 'type' => 'toggle',
128 'group' => 'renewals',
129 'priority' => 4,
130 'field_data' => [
131 'id' => 'wp_subscription_auto_renewal_toggle',
132 'title' => __( 'Auto Renewal Toggle', 'subscription' ),
133 'label' => __( 'Display the auto renewal toggle', 'subscription' ),
134 'description' => __( 'Allow customers to turn on and off automatic renewals from their Subscription details page', 'subscription' ),
135 'value' => '1',
136 'checked' => '1' === get_option( 'wp_subscription_auto_renewal_toggle', '1' ),
137 ],
138 ],
139 [
140 'type' => 'select',
141 'group' => 'role_based_settings',
142 'priority' => 2,
143 'field_data' => [
144 'id' => 'wp_subscription_active_role',
145 'title' => __( 'Subscriber Default Role', 'subscription' ),
146 'description' => __( 'When a subscription is activated, either manually or after a successful purchase, new users will be assigned this role.', 'subscription' ),
147 'options' => $roles,
148 'selected' => esc_attr( get_option( 'wp_subscription_active_role', 'subscriber' ) ),
149 ],
150 ],
151 [
152 'type' => 'select',
153 'group' => 'role_based_settings',
154 'priority' => 3,
155 'field_data' => [
156 'id' => 'wp_subscription_unactive_role',
157 'title' => __( 'Subscriber Inactive Role', 'subscription' ),
158 'description' => __( "If a subscriber's subscription is manually cancelled or expires, they will be assigned this role.", 'subscription' ),
159 'options' => $roles,
160 'selected' => esc_attr( get_option( 'wp_subscription_unactive_role', 'customer' ) ),
161 ],
162 ],
163 ];
164
165 // Allow other modules to add/modify settings fields.
166 $settings_fields = apply_filters( 'subscrpt_settings_fields', $settings_fields );
167
168 // Process settings fields (group & sort).
169 $settings_fields = apply_filters( 'process_subscrpt_settings_fields', $settings_fields );
170
171 // Set the settings fields.
172 $this->settings_fields = $settings_fields;
173 }
174
175 /**
176 * Install / Activate link for the Stripe gateway plugin.
177 *
178 * Rendered inside a field description, which goes through `wp_kses_post()`,
179 * so the link carries data attributes rather than an inline handler;
180 * `integration_settings.js` picks it up.
181 *
182 * @return string Link HTML, or an empty string when the user cannot act on it.
183 */
184 private function get_stripe_plugin_action() {
185 $slug = 'woocommerce-gateway-stripe';
186 $installed = '' !== Ajax::get_installed_plugin_file( $slug );
187
188 if ( $installed && current_user_can( 'activate_plugins' ) ) {
189 $label = __( 'Activate', 'subscription' );
190 $busy_label = __( 'Activating…', 'subscription' );
191 } elseif ( ! $installed && current_user_can( 'install_plugins' ) ) {
192 $label = __( 'Install & Activate', 'subscription' );
193 $busy_label = __( 'Installing…', 'subscription' );
194 } else {
195 return '';
196 }
197
198 return sprintf(
199 ' <a href="#" data-subscrpt-install-plugin="%1$s" data-busy-label="%2$s">%3$s</a>',
200 esc_attr( $slug ),
201 esc_attr( $busy_label ),
202 esc_html( $label )
203 );
204 }
205
206 /**
207 * Enqueue the plugin installer on the settings page.
208 *
209 * @param string $hook The current admin page hook.
210 */
211 public function enqueue_installer_script( $hook ) {
212 if ( false === strpos( $hook, 'wp-subscription-settings' ) ) {
213 return;
214 }
215
216 wp_enqueue_script( 'subscrpt-integrations', SUBSCRPT_ASSETS . '/js/integration_settings.js', [], SUBSCRPT_VERSION, true );
217
218 wp_localize_script(
219 'subscrpt-integrations',
220 'subscrptIntegrations',
221 array(
222 'nonce' => wp_create_nonce( 'subscrpt_integration_install_nonce' ),
223 'ajaxUrl' => admin_url( 'admin-ajax.php' ),
224 )
225 );
226 }
227
228 /**
229 * Register settings options.
230 **/
231 public function register_settings() {
232 register_setting(
233 'wp_subscription_settings',
234 'wp_subscription_renewal_process',
235 array(
236 'type' => 'string',
237 'sanitize_callback' => 'sanitize_text_field',
238 )
239 );
240 register_setting(
241 'wp_subscription_settings',
242 'wp_subscription_manual_renew_cart_notice',
243 array(
244 'type' => 'string',
245 'sanitize_callback' => 'sanitize_textarea_field',
246 )
247 );
248 register_setting(
249 'wp_subscription_settings',
250 'wp_subscription_active_role',
251 array(
252 'type' => 'string',
253 'sanitize_callback' => 'sanitize_text_field',
254 )
255 );
256 register_setting(
257 'wp_subscription_settings',
258 'wp_subscription_unactive_role',
259 array(
260 'type' => 'string',
261 'sanitize_callback' => 'sanitize_text_field',
262 )
263 );
264 register_setting(
265 'wp_subscription_settings',
266 'wp_subscription_stripe_auto_renew',
267 array(
268 'type' => 'string',
269 'sanitize_callback' => 'sanitize_text_field',
270 )
271 );
272 register_setting(
273 'wp_subscription_settings',
274 'wp_subscription_auto_renewal_toggle',
275 array(
276 'type' => 'string',
277 'sanitize_callback' => 'sanitize_text_field',
278 )
279 );
280
281 do_action( 'subscrpt_register_settings', 'subscrpt_settings' );
282 }
283
284 /**
285 * Settings HTML.
286 */
287 public function settings_content() {
288 $settings_fields = $this->settings_fields;
289 $category_groups = SettingsHelper::category_groups( $settings_fields );
290 $active_cat = $this->get_active_category( $category_groups );
291
292 // Header.
293 $menu = new Menu();
294 $menu->render_admin_header( __( 'Settings', 'subscription' ) );
295
296 include 'views/settings.php';
297
298 // Footer.
299 $menu->render_admin_footer();
300 }
301
302 /**
303 * Which settings section the page opens on.
304 *
305 * Read from `?cat=`, and it has to be a query argument rather than a
306 * fragment: the form posts to `options.php`, which redirects back to
307 * `_wp_http_referer`, and a fragment never reaches the server. Keeping the
308 * section in the query string is what returns you to the panel you saved
309 * from.
310 *
311 * Validated against the sections that actually hold groups, so an unknown
312 * or hostile value — or one naming a section only Pro fills — opens the
313 * first real section rather than an empty panel.
314 *
315 * @param array<string,string[]> $category_groups Section key => group keys.
316 * @return string Section key, or an empty string when there are no groups.
317 */
318 private function get_active_category( array $category_groups ) {
319 $cats = array_keys( $category_groups );
320
321 if ( empty( $cats ) ) {
322 return '';
323 }
324
325 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only section selection, validated against the list above.
326 $requested = isset( $_GET['cat'] ) ? sanitize_key( wp_unslash( $_GET['cat'] ) ) : '';
327
328 // `all` stacks every section on one page; a known section opens just that
329 // one. With nothing requested (or something invalid), open the first
330 // section rather than the stacked "All Settings" view.
331 if ( 'all' === $requested || in_array( $requested, $cats, true ) ) {
332 return $requested;
333 }
334
335 return $cats[0];
336 }
337
338 /**
339 * Enqueue WooCommerce admin styles for settings page.
340 *
341 * @param string $hook The current admin page hook.
342 */
343 public function enqueue_wc_admin_styles( $hook ) {
344 // Only load on our settings page
345 if ( isset( $_GET['post_type'] ) && strpos( sanitize_text_field( wp_unslash( $_GET['post_type'] ) ), 'subscrpt_order' ) !== false ) {
346 // WooCommerce admin styles
347 wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), SUBSCRPT_VERSION );
348 // Optional: WooCommerce enhanced select2
349 wp_enqueue_style( 'woocommerce_admin_select2', WC()->plugin_url() . '/assets/css/select2.css', array(), SUBSCRPT_VERSION );
350 wp_enqueue_script( 'select2' );
351 }
352 }
353 }
354