Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/tutor/ecommerce/Settings.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 + /**
3 + * Settings class for configuring ecommerce settings
4 + *
5 + * @package Tutor\Ecommerce
6 + * @author Themeum
7 + * @link https://themeum.com
8 + * @since 3.0.0
9 + */
10 +
11 + namespace Tutor\Ecommerce;
12 +
13 + use Tutor\Helpers\HttpHelper;
14 + use TUTOR\Input;
15 + use Tutor\PaymentGateways\Configs\PaypalConfig;
16 + use Tutor\Traits\JsonResponse;
17 +
18 + /**
19 + * Configure ecommerce settings
20 + */
21 + class Settings {
22 +
23 + use JsonResponse;
24 +
25 + /**
26 + * Register hooks
27 + */
28 + public function __construct() {
29 + add_filter( 'tutor/options/extend/attr', __CLASS__ . '::add_ecommerce_settings' );
30 + add_action( 'add_manual_payment_btn', __CLASS__ . '::add_manual_payment_btn' );
31 + add_action( 'wp_ajax_tutor_add_manual_payment_method', __CLASS__ . '::ajax_add_manual_payment_method' );
32 + add_action( 'wp_ajax_tutor_delete_manual_payment_method', __CLASS__ . '::ajax_delete_manual_payment_method' );
33 +
34 + add_action( 'wp_ajax_tutor_payment_settings', array( $this, 'ajax_get_tutor_payment_settings' ) );
35 + add_action( 'wp_ajax_tutor_payment_gateways', array( $this, 'ajax_tutor_payment_gateways' ) );
36 + }
37 +
38 +
39 + /**
40 + * Check if buy now setting is enabled.
41 + *
42 + * @since 3.4.0
43 + *
44 + * @return boolean
45 + */
46 + public static function is_buy_now_enabled() {
47 + return (bool) tutor_utils()->get_option( OptionKeys::BUY_NOW, false );
48 + }
49 +
50 + /**
51 + * Check coupon usage enabled in site checkout.
52 + *
53 + * @since 3.0.0
54 + *
55 + * @return boolean
56 + */
57 + public static function is_coupon_usage_enabled() {
58 + return (bool) tutor_utils()->get_option( OptionKeys::IS_COUPON_APPLICABLE, false );
59 + }
60 +
61 + /**
62 + * Add ecommerce settings
63 + *
64 + * @param array $fields Tutor setting fields.
65 + *
66 + * @return array
67 + */
68 + public static function add_ecommerce_settings( $fields ) {
69 + $pages = tutor_utils()->get_pages();
70 +
71 + $pages_fields = array(
72 + array(
73 + 'key' => CartController::PAGE_ID_OPTION_NAME,
74 + 'type' => 'select',
75 + 'label' => __( 'Cart Page', 'tutor' ),
76 + 'default' => '0',
77 + 'options' => $pages,
78 + 'desc' => __( 'Select the page you wish to set as the cart page.', 'tutor' ),
79 + 'searchable' => true,
80 + ),
81 + array(
82 + 'key' => CheckoutController::PAGE_ID_OPTION_NAME,
83 + 'type' => 'select',
84 + 'label' => __( 'Checkout Page', 'tutor' ),
85 + 'default' => '0',
86 + 'options' => $pages,
87 + 'desc' => __( 'Select the page to be used as the checkout page.', 'tutor' ),
88 + 'searchable' => true,
89 + ),
90 + );
91 +
92 + $basic_settings_blocks = array(
93 + 'ecommerce_block_currency' => array(
94 + 'label' => __( 'Currency', 'tutor' ),
95 + 'slug' => 'ecommerce_currency',
96 + 'block_type' => 'uniform',
97 + 'fields' => array(
98 + array(
99 + 'key' => OptionKeys::CURRENCY_CODE,
100 + 'type' => 'select',
101 + 'label' => __( 'Currency', 'tutor' ),
102 + 'select_options' => false,
103 + 'options' => self::get_currency_options(),
104 + 'default' => 'USD',
105 + 'desc' => __( 'Choose the currency for transactions.', 'tutor' ),
106 + 'searchable' => true,
107 + ),
108 + array(
109 + 'key' => OptionKeys::CURRENCY_POSITION,
110 + 'type' => 'select',
111 + 'label' => __( 'Currency Position', 'tutor' ),
112 + 'select_options' => false,
113 + 'options' => self::get_currency_position_options(),
114 + 'default' => 'left',
115 + 'desc' => __( 'Set the position of the currency symbol.', 'tutor' ),
116 + ),
117 + array(
118 + 'key' => OptionKeys::THOUSAND_SEPARATOR,
119 + 'type' => 'text',
120 + 'label' => __( 'Thousand Separator', 'tutor' ),
121 + 'field_classes' => 'tutor-w-90',
122 + 'default' => ',',
123 + 'desc' => __( 'Specify the thousand separator.', 'tutor' ),
124 + ),
125 + array(
126 + 'key' => OptionKeys::DECIMAL_SEPARATOR,
127 + 'type' => 'text',
128 + 'label' => __( 'Decimal Separator', 'tutor' ),
129 + 'field_classes' => 'tutor-w-90',
130 + 'default' => '.',
131 + 'desc' => __( 'Specify the decimal separator.', 'tutor' ),
132 + ),
133 + array(
134 + 'key' => OptionKeys::NUMBER_OF_DECIMALS,
135 + 'type' => 'number',
136 + 'label' => __( 'Number of Decimals', 'tutor' ),
137 + 'default' => '2',
138 + 'desc' => __( 'Set the number of decimal places.', 'tutor' ),
139 + ),
140 + ),
141 + ),
142 + );
143 +
144 + foreach ( $pages_fields as $page_field ) {
145 + $fields['monetization']['blocks']['block_options']['fields'][] = $page_field;
146 + }
147 +
148 + $prepared_blocks = array();
149 + foreach ( $fields['monetization']['blocks'] as $key => $block ) {
150 + $prepared_blocks[ $key ] = $block;
151 + if ( 'block_options' === $key ) {
152 + foreach ( $basic_settings_blocks as $key => $block ) {
153 + $prepared_blocks[ $key ] = $block;
154 + }
155 + }
156 + }
157 +
158 + $fields['monetization']['blocks'] = $prepared_blocks;
159 +
160 + $arr = apply_filters( 'tutor_before_ecommerce_payment_settings', array() );
161 +
162 + /**
163 + * Ecommerce payment settings will be generated from react app.
164 + */
165 + $arr['ecommerce_payment'] = array(
166 + 'label' => __( 'Payment Methods', 'tutor' ),
167 + 'slug' => 'ecommerce_payment',
168 + 'desc' => __( 'Advanced Settings', 'tutor' ),
169 + 'template' => 'basic',
170 + 'icon' => 'tutor-icon-credit-card',
171 + 'blocks' => array(
172 + array(
173 + 'label' => '',
174 + 'slug' => 'options',
175 + 'block_type' => 'uniform',
176 + 'class' => 'tutor-d-none',
177 + 'fields' => array(
178 + array(
179 + 'key' => 'payment_settings',
180 + 'type' => 'text',
181 + 'label' => __( 'Payment Settings', 'tutor' ),
182 + 'desc' => '',
183 + ),
184 + ),
185 + ),
186 + ),
187 + );
188 +
189 + /**
190 + * Tax settings will be generated from react app.
191 + */
192 + $arr['ecommerce_tax'] = array(
193 + 'label' => __( 'Taxes', 'tutor' ),
194 + 'slug' => 'ecommerce_tax',
195 + 'desc' => __( 'Advanced Settings', 'tutor' ),
196 + 'template' => 'basic',
197 + 'icon' => 'tutor-icon-receipt-percent',
198 + 'blocks' => array(
199 + array(
200 + 'label' => '',
201 + 'slug' => 'options',
202 + 'block_type' => 'uniform',
203 + 'class' => 'tutor-d-none',
204 + 'fields' => array(
205 + array(
206 + 'key' => 'ecommerce_tax',
207 + 'type' => 'text',
208 + 'label' => __( 'Tax Settings', 'tutor' ),
209 + 'desc' => '',
210 + ),
211 + ),
212 + ),
213 + ),
214 + );
215 +
216 + $arr['ecommerce_checkout'] = array(
217 + 'label' => __( 'Checkout', 'tutor' ),
218 + 'slug' => 'ecommerce_checkout',
219 + 'template' => 'basic',
220 + 'icon' => 'tutor-icon-change',
221 + 'blocks' => array(
222 + array(
223 + 'label' => __( 'Checkout Configuration', 'tutor' ),
224 + 'desc' => __( 'Customize your checkout process to suit your preferences.', 'tutor' ),
225 + 'slug' => 'checkout_configuration',
226 + 'block_type' => 'uniform',
227 + 'fields' => array(
228 + array(
229 + 'key' => OptionKeys::IS_COUPON_APPLICABLE,
230 + 'type' => 'toggle_switch',
231 + 'label' => __( 'Enable Coupon Code', 'tutor' ),
232 + 'default' => 'on',
233 + 'desc' => __( 'Allow users to apply the coupon code during checkout.', 'tutor' ),
234 + ),
235 + array(
236 + 'key' => OptionKeys::BUY_NOW,
237 + 'type' => 'toggle_switch',
238 + 'label' => __( 'Enable "Buy Now" Button', 'tutor' ),
239 + 'default' => 'off',
240 + 'desc' => __( 'Allow users to purchase courses directly without adding them to the cart.', 'tutor' ),
241 + ),
242 + ),
243 + ),
244 + ),
245 + );
246 +
247 + $arr = apply_filters( 'tutor_after_ecommerce_settings', $arr );
248 + $fields['monetization']['submenu'] = $arr;
249 +
250 + return $fields;
251 + }
252 +
253 + /**
254 + * Get default automate payment gateways
255 + *
256 + * @since 3.0.0
257 + *
258 + * @return array
259 + */
260 + public static function get_default_automate_payment_gateways() {
261 + $gateways = array(
262 + 'paypal' => array(
263 + 'label' => 'PayPal',
264 + 'is_active' => self::is_active( 'paypal' ),
265 + 'icon' => esc_url_raw( tutor()->url . 'assets/images/paypal.svg' ),
266 + 'support_subscription' => true,
267 + ),
268 + );
269 +
270 + return apply_filters( 'tutor_default_automate_payment_gateways', $gateways );
271 + }
272 +
273 + /**
274 + * Check if a payment gateways is active
275 + *
276 + * @since 3.0.0
277 + *
278 + * @param string $gateway Gateway key.
279 + *
280 + * @return boolean
281 + */
282 + public static function is_active( string $gateway ) : bool {
283 + $payments = tutor_utils()->get_option( OptionKeys::PAYMENT_SETTINGS );
284 + $payments = json_decode( stripslashes( $payments ) );
285 +
286 + if ( $payments ) {
287 + foreach ( $payments->payment_methods as $method ) {
288 + if ( $method->name === $gateway ) {
289 + return (bool) $method->is_active;
290 + }
291 + }
292 + }
293 +
294 + return false;
295 + }
296 +
297 + /**
298 + * Get currency options where key is symbol
299 + * and code is value
300 + *
301 + * @since 3.0.0
302 + *
303 + * @return array
304 + */
305 + public static function get_currency_options() {
306 + $currencies = get_tutor_currencies();
307 +
308 + $options = array();
309 +
310 + foreach ( $currencies as $currency ) {
311 + $options[ $currency['code'] ] = $currency['code'] . ' (' . $currency['symbol'] . ')';
312 + }
313 + return $options;
314 + }
315 +
316 + /**
317 + * Currency position options
318 + *
319 + * @since 3.0.0
320 + *
321 + * @return array
322 + */
323 + public static function get_currency_position_options() {
324 + return array(
325 + 'left' => __( 'Left', 'tutor' ),
326 + 'right' => __( 'Right', 'tutor' ),
327 + );
328 + }
329 +
330 + /**
331 + * Get currency options where key is symbol
332 + * and code is value
333 + *
334 + * It will return $ as default
335 + *
336 + * @since 3.0.0
337 + *
338 + * @param mixed $code Currency code.
339 + *
340 + * @return string
341 + */
342 + public static function get_currency_symbol_by_code( $code ) {
343 + $currencies = get_tutor_currencies();
344 + $search = array_search( $code, array_column( $currencies, 'code' ) );
345 +
346 + if ( false !== $search ) {
347 + return $currencies[ $search ]['symbol'];
348 + } else {
349 + return '$';
350 + }
351 + }
352 +
353 + /**
354 + * Get payment settings
355 + *
356 + * @since 3.0.0
357 + *
358 + * @return object
359 + */
360 + public static function get_payment_settings() {
361 + $settings = tutor_utils()->get_option( OptionKeys::PAYMENT_SETTINGS );
362 + $settings = json_decode( $settings, true );
363 +
364 + return $settings;
365 + }
366 +
367 + /**
368 + * Get specific payment gateway settings.
369 + *
370 + * @since 3.0.0
371 + *
372 + * @param string $gateway_name gateway name.
373 + *
374 + * @return array
375 + */
376 + public static function get_payment_gateway_settings( $gateway_name ) {
377 + $settings = self::get_payment_settings();
378 +
379 + if ( empty( $gateway_name ) || ! isset( $settings['payment_methods'] ) || ! is_array( $settings['payment_methods'] ) ) {
380 + return array();
381 + }
382 +
383 + $data = array_values(
384 + array_filter(
385 + $settings['payment_methods'],
386 + function ( $method ) use ( $gateway_name ) {
387 + return $method['name'] === $gateway_name;
388 + }
389 + )
390 + );
391 +
392 + return isset( $data[0] ) ? $data[0] : array();
393 + }
394 +
395 + /**
396 + * Ajax handler to get payment settings
397 + *
398 + * @since 3.0.0
399 + *
400 + * @return void send wp_json
401 + */
402 + public function ajax_get_tutor_payment_settings() {
403 + tutor_utils()->checking_nonce();
404 + tutor_utils()->check_current_user_capability();
405 +
406 + $settings = self::get_payment_settings();
407 + $this->json_response( __( 'Success', 'tutor' ), $settings );
408 + }
409 +
410 + /**
411 + * Get tutor pro payment gateways
412 + *
413 + * @since 3.0.0
414 + *
415 + * @return void send wp_json response
416 + */
417 + public function ajax_tutor_payment_gateways() {
418 + tutor_utils()->checking_nonce();
419 + tutor_utils()->check_current_user_capability();
420 +
421 + try {
422 + $payment_gateways = array();
423 +
424 + $default_gateway = array(
425 + 'name' => 'paypal',
426 + 'label' => 'PayPal',
427 + 'is_installed' => true,
428 + 'is_plugin_active' => true,
429 + 'is_active' => false,
430 + 'icon' => tutor()->url . 'assets/images/paypal.svg',
431 + 'support_subscription' => true,
432 + 'fields' => self::get_paypal_config_fields(),
433 + );
434 +
435 + $payment_gateways[] = $default_gateway;
436 +
437 + $this->json_response( __( 'Success', 'tutor' ), apply_filters( 'tutor_payment_gateways', $payment_gateways ) );
438 + } catch ( \Throwable $th ) {
439 + $this->json_response( $th->getMessage(), null, HttpHelper::STATUS_BAD_REQUEST );
440 + }
441 + }
442 +
443 + /**
444 + * Get paypal config keys
445 + *
446 + * @since 3.0.0
447 + *
448 + * @return array
449 + */
450 + public static function get_paypal_config_keys() {
451 + return array(
452 + 'environment' => 'select',
453 + 'merchant_email' => 'text',
454 + 'client_id' => 'secret_key',
455 + 'secret_id' => 'secret_key',
456 + 'webhook_id' => 'secret_key',
457 + 'webhook_url' => 'webhook_url',
458 + );
459 + }
460 +
461 + /**
462 + * Get config fields
463 + *
464 + * @since 3.0.0.0
465 + *
466 + * @return array
467 + */
468 + public static function get_paypal_config_fields() {
469 + $config_keys = self::get_paypal_config_keys();
470 + $config_fields = array();
471 +
472 + foreach ( $config_keys as $key => $type ) {
473 + if ( 'environment' === $key ) {
474 + $config_fields[] = array(
475 + 'name' => $key,
476 + 'label' => __( ucfirst( str_replace( '_', ' ', $key ) ), 'tutor' ),//phpcs:ignore
477 + 'type' => $type,
478 + 'options' => array(
479 + 'test' => __( 'Test', 'tutor' ),
480 + 'live' => __( 'Live', 'tutor' ),
481 + ),
482 + 'value' => 'test',
483 + );
484 + } else {
485 + $config_fields[] = array(
486 + 'name' => $key,
487 + 'type' => $type,
488 + 'label' => __( ucfirst( str_replace( '_', ' ', $key ) ), 'tutor-' ),//phpcs:ignore
489 + 'value' => '',
490 + );
491 + }
492 + }
493 +
494 + return $config_fields;
495 + }
496 + }
497 +