PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.2.1
GiveWP – Donation Plugin and Fundraising Platform v2.2.1
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / admin / settings / class-settings-cmb2-backward-compatibility.php
give / includes / admin / settings Last commit date
class-settings-addon.php 8 years ago class-settings-advanced.php 7 years ago class-settings-cmb2-backward-compatibility.php 8 years ago class-settings-display.php 7 years ago class-settings-email.php 7 years ago class-settings-gateways.php 8 years ago class-settings-general.php 7 years ago class-settings-license.php 8 years ago
class-settings-cmb2-backward-compatibility.php
680 lines
1 <?php
2 /**
3 * Give CMB2 settings backward compatibility.
4 *
5 * @package Give
6 * @subpackage Classes/Give_CMB2_Settings_Loader
7 * @copyright Copyright (c) 2016, WordImpress
8 * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
9 * @since 1.8
10 */
11
12 if ( ! class_exists( 'Give_CMB2_Settings_Loader' ) ) :
13
14 /**
15 * This class loads the cmb2 settings.
16 *
17 * @since 1.8
18 */
19 class Give_CMB2_Settings_Loader {
20
21 /**
22 * @since 1.8
23 * @var Give_Plugin_Settings $prev_settings Previous setting class object.
24 */
25 private $id;
26
27 /**
28 * @since 1.8
29 * @var Give_Plugin_Settings $prev_settings Previous setting class object.
30 */
31 private $prev_settings;
32
33 /**
34 * @since 1.8
35 * @var string $current_tab Current setting section.
36 */
37 protected $current_tab;
38
39 /**
40 * @since 1.8
41 * @var string $current_tab Current setting section.
42 */
43 private $current_section;
44
45
46 /**
47 * Give_CMB2_Settings_Loader constructor.
48 */
49 function __construct() {
50 // Get previous setting class object.
51 $this->prev_settings = new Give_Plugin_Settings();
52
53 // Get current tab.
54 $this->current_tab = give_get_current_setting_tab();
55 $this->current_section = empty( $_REQUEST['section'] ) ? ( current( array_keys( $this->get_sections() ) ) ) : sanitize_title( $_REQUEST['section'] );
56
57 // Tab ID.
58 $this->id = $this->current_tab;
59
60 // Add addon tabs.
61 add_filter( 'give-settings_tabs_array', array( $this, 'add_addon_settings_page' ), 999999 );
62
63 // Add save hook to addons.
64 add_action( 'give-settings_get_settings_pages', array( $this, 'setup_addon_save_hook' ), 999999 );
65
66 // Add backward compatibility filters plugin settings.
67 $setting_tabs = array( 'general', 'gateways', 'display', 'emails', 'addons', 'licenses' );
68
69 // Filter Payment Gateways settings.
70 if ( in_array( $this->current_tab, $setting_tabs ) ) {
71 add_filter( "give_get_settings_{$this->current_tab}", array(
72 $this,
73 'get_filtered_addon_settings',
74 ), 999999, 1 );
75 add_filter( "give_get_sections_{$this->current_tab}", array(
76 $this,
77 'get_filtered_addon_sections',
78 ), 999999, 1 );
79 }
80 }
81
82 /**
83 * Default setting tab.
84 *
85 * @since 1.8
86 *
87 * @param $setting_tab
88 *
89 * @return string
90 */
91 function set_default_setting_tab( $setting_tab ) {
92 $default_tab = '';
93
94 // Set default tab to first setting tab.
95 if ( $sections = array_keys( $this->get_sections() ) ) {
96 $default_tab = current( $sections );
97 }
98
99 return $default_tab;
100 }
101
102 /**
103 * Add addon setting pages.
104 *
105 * @since 1.8
106 *
107 * @param $pages
108 *
109 * @return mixed
110 */
111 function add_addon_settings_page( $pages ) {
112 // Previous setting page.
113 $previous_pages = $this->prev_settings->give_get_settings_tabs();
114
115 // API and System Info setting tab merge to Tools setting tab, so remove them from tabs.
116 unset( $previous_pages['api'] );
117 unset( $previous_pages['system_info'] );
118
119 // Tab is not register.
120 $pages_diff = array_keys( array_diff( $previous_pages, $pages ) );
121
122 // Merge old settings with new settings.
123 $pages = array_merge( $pages, $previous_pages );
124
125 if ( in_array( $this->current_tab, $pages_diff ) ) {
126 // Filter & actions.
127 add_filter( "give_default_setting_tab_section_{$this->current_tab}", array(
128 $this,
129 'set_default_setting_tab',
130 ), 10 );
131 add_action( "give-settings_sections_{$this->current_tab}_page", array( $this, 'output_sections' ) );
132 add_action( "give-settings_settings_{$this->current_tab}_page", array( $this, 'output' ), 10 );
133 add_action( "give-settings_save_{$this->current_tab}", array( $this, 'save' ) );
134 }
135
136 return $pages;
137 }
138
139
140 /**
141 * Setup save addon data hook.
142 *
143 * @since 1.8
144 *
145 * @param $pages
146 *
147 * @return mixed
148 */
149 function setup_addon_save_hook( $pages ) {
150 $page_ids = array();
151
152 foreach ( $pages as $page ) {
153 $page_ids = $page->add_settings_page( $page_ids );
154 }
155
156 // Previous setting page.
157 $previous_pages = $this->prev_settings->give_get_settings_tabs();
158
159 // API and System Info setting tab merge to Tools setting tab, so remove them from tabs.
160 unset( $previous_pages['api'] );
161 unset( $previous_pages['system_info'] );
162
163 // Tab is not register.
164 $pages_diff = array_keys( array_diff( $previous_pages, $page_ids ) );
165
166 // Merge old settings with new settings.
167 // $pages = array_merge( $page_ids, $previous_pages );
168
169 if ( in_array( $this->current_tab, $pages_diff ) ) {
170 // Filter & actions.
171 add_action( "give-settings_save_{$this->current_tab}", array( $this, 'save' ) );
172 }
173
174 return $pages;
175 }
176
177 /**
178 * Get section name from section title
179 *
180 * @since 1.8
181 *
182 * @param $field_name
183 *
184 * @return string
185 */
186 function get_section_name( $field_name ) {
187 // Bailout.
188 if ( empty( $field_name ) ) {
189 return $field_name;
190 }
191
192 $section_name = explode( ' ', $field_name );
193
194 // Output.
195 return strip_tags( implode( ' ', $section_name ) );
196 }
197
198
199 /**
200 * Do not translate string
201 *
202 * @since 1.0
203 * @access public
204 *
205 * @param $translation
206 * @param $text
207 *
208 * @return mixed
209 */
210 public function en_translation( $translation, $text ) {
211 return $text;
212 }
213
214
215 /**
216 * Get addon sections.
217 *
218 * @since 1.8
219 *
220 * @param array $sections Array of setting fields (Optional).
221 *
222 * @return mixed
223 */
224 function get_filtered_addon_sections( $sections = array() ) {
225 // New sections.
226 $new_sections = array();
227 $sections_ID = array_keys( $sections );
228 $setting_fields = $this->prev_settings->give_settings( $this->current_tab );
229
230 // We need untranslated settings for backward compatibility.
231 add_filter( 'gettext', array( $this, 'en_translation' ), 10, 2 );
232 $en_setting_fields = $this->prev_settings->give_settings( $this->current_tab );
233 remove_filter( 'gettext', array( $this, 'en_translation' ), 10 );
234
235 if ( ! empty( $setting_fields ) && ! empty( $setting_fields['fields'] ) ) {
236
237 foreach ( $setting_fields['fields'] as $index => $field ) {
238 // Collect new sections from addons.
239 if ( 'give_title' !== $field['type'] ) {
240 continue;
241 }
242
243 // Untranslated setting name.
244 $en_setting_field_name = isset( $en_setting_fields['fields'][ $index ]['name'] ) ? $en_setting_fields['fields'][ $index ]['name'] : '';
245
246 // Section name.
247 $field['name'] = isset( $field['name'] ) ? $field['name'] : '';
248 $section_name = $this->get_section_name( $field['name'] );
249
250 // Check if section name exit and section title array is not empty.
251 if ( ! empty( $sections ) && ! empty( $en_setting_field_name ) ) {
252
253 // Bailout: Do not load section if it is already exist.
254 if (
255 in_array( sanitize_title( $en_setting_field_name ), $sections_ID ) // Check section id.
256 || in_array( $section_name, $sections ) // Check section name.
257 ) {
258 continue;
259 }
260 }
261
262 // Collect new sections from addons.
263 $new_sections[ sanitize_title( $field['name'] ) ] = $section_name;
264 }
265 }
266
267 // Add new section.
268 if ( ! empty( $new_sections ) ) {
269 $sections = array_merge( $sections, $new_sections );
270 }
271
272 // Remove section tab conditionally.
273 switch ( give_get_current_setting_tab() ) {
274 case 'emails':
275 // unset( $sections['donation-receipt'] );
276 unset( $sections['new-donation-notification'] );
277 }
278
279 // Output.
280 return $sections;
281 }
282
283
284 /**
285 * Get setting fields.
286 *
287 * @since 1.8
288 *
289 * @param array $settings List of settings.
290 * @param array $setting_fields Main tab settings data.
291 *
292 * @return array
293 */
294 function get_filtered_addon_settings( $settings, $setting_fields = array() ) {
295 global $wp_filter;
296
297 $new_setting_fields = array();
298
299 if ( ! empty( $settings ) ) {
300 // Bailout: If setting array contain first element of type title then it means it is already created with new setting api (skip this section ).
301 if ( isset( $settings[0]['type'] ) && 'title' == $settings[0]['type'] ) {
302 $last_sectionend_pos = 0;
303 foreach ( $settings as $index => $setting ) {
304 // We need setting till last section end.
305 if ( 'sectionend' === $setting['type'] ) {
306 $last_sectionend_pos = ++ $index;
307 }
308 }
309
310 $settings = array_slice( $settings, 0, $last_sectionend_pos );
311
312 return $settings;
313 }
314
315 // Store title field id.
316 $prev_title_field_id = '';
317
318 // Create new setting fields.
319 foreach ( $settings as $index => $field ) {
320
321 // Bailout: Must need field type to process.
322 if ( ! isset( $field['type'] ) ) {
323 continue;
324 }
325
326 // Set wrapper class if any.
327 if ( ! empty( $field['row_classes'] ) ) {
328 $field['wrapper_class'] = $field['row_classes'];
329 unset( $field['row_classes'] );
330 }
331
332 $field['name'] = ! isset( $field['name'] ) ? '' : $field['name'];
333 $field['desc'] = ! isset( $field['desc'] ) ? '' : $field['desc'];
334
335 // Modify cmb2 setting fields.
336 switch ( $field['type'] ) {
337 case 'text' :
338 case 'file' :
339 $field['css'] = 'width:25em;';
340 break;
341
342 case 'text_small' :
343 $field['type'] = 'text';
344 break;
345
346 case 'text_email' :
347 $field['type'] = 'email';
348 $field['css'] = 'width:25em;';
349 break;
350
351 case 'radio_inline' :
352 $field['type'] = 'radio';
353 $field['class'] = 'give-radio-inline';
354 break;
355
356 case 'give_title' :
357 $field['type'] = 'title';
358
359 // Since we are showing sections, so there now ned to show horizontal rules.
360 if ( '<hr>' === $field['desc'] ) {
361 $field['desc'] = '';
362 }
363
364 break;
365 }
366
367 if ( 'title' === $field['type'] ) {
368
369 // If we do not have first element as title then these field will be skip from frontend
370 // because there are not belong to any section, so put all abandon fields under first section.
371 if ( $index && empty( $prev_title_field_id ) ) {
372 array_unshift(
373 $new_setting_fields,
374 array(
375 'title' => $field['name'],
376 'type' => $field['type'],
377 'desc' => $field['desc'],
378 'id' => $field['id'],
379 )
380 );
381
382 $prev_title_field_id = $field['id'];
383
384 continue;
385 } elseif ( $index ) {
386 // Section end.
387 $new_setting_fields[] = array(
388 'type' => 'sectionend',
389 'id' => $prev_title_field_id,
390 );
391 }
392
393 // Section start.
394 $new_setting_fields[] = array(
395 'title' => $field['name'],
396 'type' => $field['type'],
397 'desc' => $field['desc'],
398 'id' => $field['id'],
399 );
400
401 $prev_title_field_id = $field['id'];
402 } else {
403
404 // setting fields
405 $new_setting_fields[] = $field;
406 }// End if().
407 }// End foreach().
408
409 // Section end.
410 $new_setting_fields[] = array(
411 'type' => 'sectionend',
412 'id' => $prev_title_field_id,
413 );
414
415 // Check if setting page has title section or not.
416 // If setting page does not have title section then add title section to it and fix section end array id.
417 if ( 'title' !== $new_setting_fields[0]['type'] ) {
418 array_unshift(
419 $new_setting_fields,
420 array(
421 'title' => ( isset( $settings['give_title'] ) ? $settings['give_title'] : '' ),
422 'type' => 'title',
423 'desc' => ! empty( $setting_fields['desc'] ) ? $setting_fields['desc'] : '',
424 'id' => ( isset( $settings['id'] ) ? $settings['id'] : '' ),
425 )
426 );
427
428 // Update id in section end array if does not contain.
429 if ( empty( $new_setting_fields[ count( $new_setting_fields ) - 1 ]['id'] ) ) {
430 $new_setting_fields[ count( $new_setting_fields ) - 1 ]['id'] = ( isset( $settings['id'] ) ? $settings['id'] : '' );
431 }
432 }
433
434 // Return only section related settings.
435 if ( $sections = $this->get_filtered_addon_sections() ) {
436 $new_setting_fields = $this->get_section_settings( $new_setting_fields );
437 }
438
439 // Third party plugin backward compatibility.
440 $wp_filter_keys = array_keys( $wp_filter );
441 foreach ( $new_setting_fields as $index => $field ) {
442 if ( ! isset( $field['type'] ) || in_array( $field['type'], array( 'title', 'sectionend' ) ) ) {
443 continue;
444 }
445
446 $cmb2_filter_name = "cmb2_render_{$field['type']}";
447
448 if ( in_array( $cmb2_filter_name, $wp_filter_keys ) ) {
449
450 if ( 0 >= version_compare( 4.7, get_bloginfo( 'version' ) ) && ! empty( $wp_filter[ $cmb2_filter_name ]->callbacks ) ) {
451 $cmb2_filter_arr = current( $wp_filter[ $cmb2_filter_name ]->callbacks );
452 } else {
453 $cmb2_filter_arr = current( $wp_filter[ $cmb2_filter_name ] );
454 }
455
456 if ( ! empty( $cmb2_filter_arr ) ) {
457 // Note: function can be called either globally or with class object, it depends on how developer invoke it.
458 $new_setting_fields[ $index ]['func'] = current( $cmb2_filter_arr );
459 add_action( "give_admin_field_{$field['type']}", array(
460 $this,
461 'addon_setting_field',
462 ), 10, 2 );
463 }
464 }
465 }
466
467 return $new_setting_fields;
468 }// End if().
469
470 return $settings;
471 }
472
473
474 /**
475 * Get section related setting.
476 *
477 * @since 1.8
478 *
479 * @param $tab_settings
480 *
481 * @return array
482 */
483 function get_section_settings( $tab_settings ) {
484 $current_section = give_get_current_setting_section();
485
486 // Note: If we are opening default tab for addon setting then it is possible that we will get empty string as current section
487 // because default section filter added after save hook fire, so we will always get problem to save first section [default] or if there are only on section
488 // This is hack to fix this.
489 if ( empty( $current_section ) ) {
490 $current_section = $this->set_default_setting_tab( $current_section );
491 }
492
493 $section_start = false;
494 $section_end = false;
495 $section_only_setting_fields = array();
496
497 foreach ( $tab_settings as $field ) {
498 if ( 'title' == $field['type'] && $current_section == sanitize_title( $field['title'] ) ) {
499 $section_start = true;
500 }
501
502 if ( ! $section_start || $section_end ) {
503 continue;
504 }
505
506 if ( $section_start && ! $section_end ) {
507 if ( 'sectionend' == $field['type'] ) {
508 $section_end = true;
509 }
510 $section_only_setting_fields[] = $field;
511 }
512 }
513
514 // Remove title from setting, prevent it from render in setting tab.
515 $section_only_setting_fields[0]['title'] = '';
516
517 return apply_filters( "give_get_settings_{$this->current_tab}_{$current_section}", $section_only_setting_fields, $tab_settings );
518 }
519
520
521 /**
522 * CMB2 addon setting fields backward compatibility.
523 *
524 * @since 1.8
525 *
526 * @param array $field
527 * @param mixed $saved_value
528 *
529 * @return void
530 */
531 function addon_setting_field( $field, $saved_value ) {
532 // Create object for cmb2 function callback backward compatibility.
533 // Note: Do not call any cmb2 function on these objects
534 $field_obj = (object) array( 'args' => $field );
535 $field_type_obj = (object) array( 'field' => $field_obj );
536
537 switch ( $this->current_tab ) :
538 case 'licenses':
539 ?>
540 <div class="give-settings-wrap give-settings-wrap-<?php echo $this->current_tab; ?>">
541 <?php $field['func']['function']( $field_obj, $saved_value, '', '', $field_type_obj ); ?>
542 </div>
543 <?php break;
544
545 default :
546 $colspan = 'colspan="2"';
547 ?>
548 <tr valign="top">
549 <?php if ( ! empty( $field['name'] ) && ! in_array( $field['name'], array( '&nbsp;' ) ) ) : ?>
550 <th scope="row" class="titledesc">
551 <label for="<?php echo esc_attr( $field['name'] ); ?>"><?php echo $field['title']; ?></label>
552 </th>
553 <?php $colspan = ''; ?>
554 <?php endif; ?>
555 <td class="give-forminp" <?php echo $colspan; ?>>
556 <?php
557 if ( is_array( $field['func']['function'] ) ) {
558 $classname = $field['func']['function'][0];
559 $function_name = $field['func']['function'][1];
560 $classname->$function_name( $field_obj, $saved_value, '', '', $field_type_obj );
561 } else {
562 $function_name = $field['func']['function'];
563 $function_name( $field_obj, $saved_value, '', '', $field_type_obj );
564 }
565 ?>
566 </td>
567 </tr>
568 <?php
569 endswitch;
570 }
571
572 /**
573 * Get sections.
574 *
575 * @since 1.8
576 * @return array
577 */
578 public function get_sections() {
579 $sections = array();
580
581 if ( ( $setting_fields = $this->prev_settings->give_settings( $this->current_tab ) ) && ! empty( $setting_fields['fields'] ) ) {
582 foreach ( $setting_fields['fields'] as $field ) {
583 if ( 'give_title' == $field['type'] ) {
584 $sections[ sanitize_title( $field['name'] ) ] = $this->get_section_name( $field['name'] );
585 }
586 }
587 }
588
589 return $sections;
590 }
591
592
593 /**
594 * Get setting fields.
595 *
596 * @since 1.8
597 * @return array
598 */
599 function get_settings() {
600 global $wp_filter;
601
602 $new_setting_fields = array();
603
604 if ( $setting_fields = $this->prev_settings->give_settings( $this->current_tab ) ) {
605 if ( isset( $setting_fields['fields'] ) ) {
606
607 $tab_data = array(
608 'id' => $setting_fields['id'],
609 'give_title' => $setting_fields['give_title'],
610 'desc' => ( isset( $setting_fields['desc'] ) ? $setting_fields['desc'] : '' ),
611 );
612
613 $new_setting_fields = $this->get_filtered_addon_settings( $setting_fields['fields'], $tab_data );
614 }
615 }
616
617 return $new_setting_fields;
618 }
619
620 /**
621 * Output sections.
622 *
623 * @since 1.8
624 * @return void
625 */
626 public function output_sections() {
627 $sections = $this->get_sections();
628
629 // Show section settings only if setting section exist.
630 if ( $this->current_section && ! in_array( $this->current_section, array_keys( $sections ) ) ) {
631 echo '<div class="error"><p>' . __( 'Oops, this settings page does not exist.', 'give' ) . '</p></div>';
632 $GLOBALS['give_hide_save_button'] = true;
633
634 return;
635 }
636
637 // Bailout.
638 if ( empty( $sections ) ) {
639 return;
640 }
641
642 echo '<ul class="give-subsubsub">';
643
644 $array_keys = array_keys( $sections );
645
646 foreach ( $sections as $id => $label ) {
647 echo '<li><a href="' . admin_url( 'edit.php?post_type=give_forms&page=give-settings&tab=' . $this->current_tab . '&section=' . sanitize_title( $id ) ) . '" class="' . ( $this->current_section == $id ? 'current' : '' ) . '">' . strip_tags( $label ) . '</a> ' . ( end( $array_keys ) == $id ? '' : '|' ) . ' </li>';
648 }
649
650 echo '</ul><br class="clear" /><hr>';
651 }
652
653 /**
654 * Output the settings.
655 *
656 * @since 1.8
657 * @return void
658 */
659 public function output() {
660 $settings = $this->get_settings();
661
662 Give_Admin_Settings::output_fields( $settings, 'give_settings' );
663 }
664
665 /**
666 * Save settings.
667 *
668 * @since 1.8
669 * @return void
670 */
671 public function save() {
672 $settings = $this->get_settings();
673
674 Give_Admin_Settings::save_fields( $settings, 'give_settings' );
675 }
676 }
677 endif;
678
679 new Give_CMB2_Settings_Loader();
680