Completed
Push — issues/611 ( 661115...758b1c )
by Ravinder
21:11
created

includes/admin/give-metabox-functions.php (11 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

Code
1
<?php
2
/**
3
 * Give Meta Box Functions
4
 *
5
 * @package     Give
6
 * @subpackage  Functions
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
if ( ! defined( 'ABSPATH' ) ) {
12
	exit; // Exit if accessed directly
13
}
14
15
16
/**
17
 * Check if field callback exist or not.
18
 *
19
 * @since  1.8
20
 *
21
 * @param  $field
22
 *
23
 * @return bool|string
24
 */
25
function give_is_field_callback_exist( $field ) {
26
	return ( give_get_field_callback( $field ) ? true : false );
27
}
28
29
/**
30
 * Get field callback.
31
 *
32
 * @since  1.8
33
 *
34
 * @param  $field
35
 *
36
 * @return bool|string
37
 */
38
function give_get_field_callback( $field ) {
39
	$func_name_prefix = 'give';
40
	$func_name        = '';
41
42
	// Set callback function on basis of cmb2 field name.
43
	switch ( $field['type'] ) {
44
		case 'radio_inline':
45
			$func_name = "{$func_name_prefix}_radio";
46
			break;
47
48
		case 'text':
49
		case 'text-medium':
50
		case 'text_medium':
51
		case 'text-small' :
52
		case 'text_small' :
53
			$func_name = "{$func_name_prefix}_text_input";
54
			break;
55
56
		case 'textarea' :
57
			$func_name = "{$func_name_prefix}_textarea_input";
58
			break;
59
60
		case 'colorpicker' :
61
			$func_name = "{$func_name_prefix}_{$field['type']}";
62
			break;
63
64
		case 'levels_id':
65
			$func_name = "{$func_name_prefix}_hidden_input";
66
			break;
67
68
		case 'group' :
69
			$func_name = "_{$func_name_prefix}_metabox_form_data_repeater_fields";
70
			break;
71
72
		case 'give_default_radio_inline':
73
			$func_name = "{$func_name_prefix}_radio";
74
			break;
75
76
		default:
77
78
			if (
79
				array_key_exists( 'callback', $field )
80
				&& ! empty( $field['callback'] )
81
			) {
82
				$func_name = $field['callback'];
83
			} else {
84
				$func_name = "{$func_name_prefix}_{$field['type']}";
85
			}
86
	}
87
88
	/**
89
	 * Filter the metabox setting render function
90
	 *
91
	 * @since 1.8
92
	 */
93
	$func_name = apply_filters( 'give_get_field_callback', $func_name, $field );
94
95
	// Exit if not any function exist.
96
	// Check if render callback exist or not.
97
	if ( empty( $func_name ) ) {
98
		return false;
99
	} elseif ( is_string( $func_name ) && ! function_exists( "$func_name" ) ) {
100
		return false;
101
	} elseif ( is_array( $func_name ) && ! method_exists( $func_name[0], "$func_name[1]" ) ) {
102
		return false;
103
	}
104
105
	return $func_name;
106
}
107
108
/**
109
 * This function adds backward compatibility to render cmb2 type field type.
110
 *
111
 * @since  1.8
112
 *
113
 * @param  array $field Field argument array.
114
 *
115
 * @return bool
116
 */
117
function give_render_field( $field ) {
118
119
	// Check if render callback exist or not.
120
	if ( ! ( $func_name = give_get_field_callback( $field ) ) ) {
121
		return false;
122
	}
123
124
	// CMB2 compatibility: Push all classes to attributes's class key
125
	if ( empty( $field['class'] ) ) {
126
		$field['class'] = '';
127
	}
128
129
	if ( empty( $field['attributes']['class'] ) ) {
130
		$field['attributes']['class'] = '';
131
	}
132
133
	$field['attributes']['class'] = trim( "give-field {$field['attributes']['class']} give-{$field['type']} {$field['class']}" );
134
	unset( $field['class'] );
135
136
	// CMB2 compatibility: Set wrapper class if any.
137
	if ( ! empty( $field['row_classes'] ) ) {
138
		$field['wrapper_class'] = $field['row_classes'];
139
		unset( $field['row_classes'] );
140
	}
141
142
	// Set field params on basis of cmb2 field name.
143
	switch ( $field['type'] ) {
144
		case 'radio_inline':
145
			if ( empty( $field['wrapper_class'] ) ) {
146
				$field['wrapper_class'] = '';
147
			}
148
			$field['wrapper_class'] .= ' give-inline-radio-fields';
149
150
			break;
151
152
		case 'text':
153
		case 'text-medium':
154
		case 'text_medium':
155
		case 'text-small' :
156
		case 'text_small' :
157
			// CMB2 compatibility: Set field type to text.
158
			$field['type'] = isset( $field['attributes']['type'] ) ? $field['attributes']['type'] : 'text';
159
160
			// CMB2 compatibility: Set data type to price.
161
			if (
162
				empty( $field['data_type'] )
163
				&& ! empty( $field['attributes']['class'] )
164
				&& (
165
					false !== strpos( $field['attributes']['class'], 'money' )
166
					|| false !== strpos( $field['attributes']['class'], 'amount' )
167
				)
168
			) {
169
				$field['data_type'] = 'decimal';
170
			}
171
			break;
172
173
		case 'levels_id':
174
			$field['type'] = 'hidden';
175
			break;
176
177
		case 'colorpicker' :
178
			$field['type']  = 'text';
179
			$field['class'] = 'give-colorpicker';
180
			break;
181
182
		case 'give_default_radio_inline':
183
			$field['type']    = 'radio';
184
			$field['options'] = array(
185
				'default' => __( 'Default' ),
186
			);
187
			break;
188
	}
189
190
	// CMB2 compatibility: Add support to define field description by desc & description param.
191
	// We encourage you to use description param.
192
	$field['description'] = ( ! empty( $field['description'] )
193
		? $field['description']
194
		: ( ! empty( $field['desc'] ) ? $field['desc'] : '' ) );
195
196
	// Call render function.
197
	if ( is_array( $func_name ) ) {
198
		$func_name[0]->{$func_name[1]}( $field );
199
	} else {
200
		$func_name( $field );
201
	}
202
203
	return true;
204
}
205
206
/**
207
 * Output a text input box.
208
 *
209
 * @since  1.8
210
 *
211
 * @param  array $field         {
212
 *                              Optional. Array of text input field arguments.
213
 *
214
 * @type string  $id            Field ID. Default ''.
215
 * @type string  $style         CSS style for input field. Default ''.
216
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
217
 * @type string  $value         Value of input field. Default ''.
218
 * @type string  $name          Name of input field. Default ''.
219
 * @type string  $type          Type of input field. Default 'text'.
220
 * @type string  $before_field  Text/HTML to add before input field. Default ''.
221
 * @type string  $after_field   Text/HTML to add after input field. Default ''.
222
 * @type string  $data_type     Define data type for value of input to filter it properly. Default ''.
223
 * @type string  $description   Description of input field. Default ''.
224
 * @type array   $attributes    List of attributes of input field. Default array().
225
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
226
 *                                               => '****' )
227
 * }
228
 * @return void
229
 */
230
function give_text_input( $field ) {
231
	global $thepostid, $post;
232
233
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
234
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
235
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
236
	$field['value']         = give_get_field_value( $field, $thepostid );
237
	$field['type']          = isset( $field['type'] ) ? $field['type'] : 'text';
238
	$field['before_field']  = '';
239
	$field['after_field']   = '';
240
	$data_type              = empty( $field['data_type'] ) ? '' : $field['data_type'];
241
242
	switch ( $data_type ) {
243
		case 'price' :
244
			$field['value'] = ( ! empty( $field['value'] ) ? give_format_amount( $field['value'] ) : $field['value'] );
245
246
			$field['before_field'] = ! empty( $field['before_field'] ) ? $field['before_field'] : ( give_get_option( 'currency_position', 'before' ) == 'before' ? '<span class="give-money-symbol give-money-symbol-before">' . give_currency_symbol() . '</span>' : '' );
247
			$field['after_field']  = ! empty( $field['after_field'] ) ? $field['after_field'] : ( give_get_option( 'currency_position', 'before' ) == 'after' ? '<span class="give-money-symbol give-money-symbol-after">' . give_currency_symbol() . '</span>' : '' );
248
			break;
249
250
		case 'decimal' :
251
			$field['attributes']['class'] .= ' give_input_decimal';
252
			$field['value'] = ( ! empty( $field['value'] ) ? give_format_decimal( $field['value'] ) : $field['value'] );
253
			break;
254
255
		default :
256
			break;
257
	}
258
259
	?>
260
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
261
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
262
	<?php echo $field['before_field']; ?>
263
	<input
264
			type="<?php echo esc_attr( $field['type'] ); ?>"
265
			style="<?php echo esc_attr( $field['style'] ); ?>"
266
			name="<?php echo give_get_field_name( $field ); ?>"
267
			id="<?php echo esc_attr( $field['id'] ); ?>"
268
			value="<?php echo esc_attr( $field['value'] ); ?>"
269
		<?php echo give_get_custom_attributes( $field ); ?>
270
	/>
271
	<?php echo $field['after_field']; ?>
272
	<?php
273
	echo give_get_field_description( $field );
274
	echo '</p>';
275
}
276
277
/**
278
 * Output a hidden input box.
279
 *
280
 * @since  1.8
281
 *
282
 * @param  array $field      {
283
 *                           Optional. Array of hidden text input field arguments.
284
 *
285
 * @type string  $id         Field ID. Default ''.
286
 * @type string  $value      Value of input field. Default ''.
287
 * @type string  $name       Name of input field. Default ''.
288
 * @type string  $type       Type of input field. Default 'text'.
289
 * @type array   $attributes List of attributes of input field. Default array().
290
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
291
 *                                               => '****' )
292
 * }
293
 * @return void
294
 */
295
function give_hidden_input( $field ) {
296
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
297
298
	$thepostid      = empty( $thepostid ) ? $post->ID : $thepostid;
299
	$field['value'] = give_get_field_value( $field, $thepostid );
300
301
	// Custom attribute handling
302
	$custom_attributes = array();
303
304
	if ( ! empty( $field['attributes'] ) && is_array( $field['attributes'] ) ) {
305
306
		foreach ( $field['attributes'] as $attribute => $value ) {
307
			$custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"';
308
		}
309
	}
310
	?>
311
312
	<input
313
			type="hidden"
314
			name="<?php echo give_get_field_name( $field ); ?>"
315
			id="<?php echo esc_attr( $field['id'] ); ?>"
316
			value="<?php echo esc_attr( $field['value'] ); ?>"
317
		<?php echo give_get_custom_attributes( $field ); ?>
318
	/>
319
	<?php
320
}
321
322
/**
323
 * Output a textarea input box.
324
 *
325
 * @since  1.8
326
 * @since  1.8
327
 *
328
 * @param  array $field         {
329
 *                              Optional. Array of textarea input field arguments.
330
 *
331
 * @type string  $id            Field ID. Default ''.
332
 * @type string  $style         CSS style for input field. Default ''.
333
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
334
 * @type string  $value         Value of input field. Default ''.
335
 * @type string  $name          Name of input field. Default ''.
336
 * @type string  $description   Description of input field. Default ''.
337
 * @type array   $attributes    List of attributes of input field. Default array().
338
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
339
 *                                               => '****' )
340
 * }
341
 * @return void
342
 */
343
function give_textarea_input( $field ) {
344
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
345
346
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
347
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
348
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
349
	$field['value']         = give_get_field_value( $field, $thepostid );
350
351
	?>
352
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
353
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
354
	<textarea
355
			style="<?php echo esc_attr( $field['style'] ); ?>"
356
			name="<?php echo give_get_field_name( $field ); ?>"
357
			id="<?php echo esc_attr( $field['id'] ); ?>"
358
			rows="10"
359
			cols="20"
360
		<?php echo give_get_custom_attributes( $field ); ?>
361
	><?php echo esc_textarea( $field['value'] ); ?></textarea>
362
	<?php
363
	echo give_get_field_description( $field );
364
	echo '</p>';
365
}
366
367
/**
368
 * Output a wysiwyg.
369
 *
370
 * @since  1.8
371
 *
372
 * @param  array $field         {
373
 *                              Optional. Array of WordPress editor field arguments.
374
 *
375
 * @type string  $id            Field ID. Default ''.
376
 * @type string  $style         CSS style for input field. Default ''.
377
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
378
 * @type string  $value         Value of input field. Default ''.
379
 * @type string  $name          Name of input field. Default ''.
380
 * @type string  $description   Description of input field. Default ''.
381
 * @type array   $attributes    List of attributes of input field. Default array().
382
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
383
 *                                               => '****' )
384
 * }
385
 * @return void
386
 */
387
function give_wysiwyg( $field ) {
388
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
389
390
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
391
	$field['value']         = give_get_field_value( $field, $thepostid );
392
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
393
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
394
395
	$field['unique_field_id'] = give_get_field_name( $field );
396
	$editor_attributes        = array(
397
		'textarea_name' => isset( $field['repeatable_field_id'] ) ? $field['repeatable_field_id'] : $field['id'],
398
		'textarea_rows' => '10',
399
		'editor_css'    => esc_attr( $field['style'] ),
400
		'editor_class'  => $field['attributes']['class'],
401
	);
402
	$data_wp_editor           = ' data-wp-editor="' . base64_encode( json_encode( array(
403
			$field['value'],
404
			$field['unique_field_id'],
405
			$editor_attributes,
406
	) ) ) . '"';
407
	$data_wp_editor           = isset( $field['repeatable_field_id'] ) ? $data_wp_editor : '';
408
409
	echo '<div class="give-field-wrap ' . $field['unique_field_id'] . '_field ' . esc_attr( $field['wrapper_class'] ) . '"' . $data_wp_editor . '><label for="' . $field['unique_field_id'] . '">' . wp_kses_post( $field['name'] ) . '</label>';
410
411
	wp_editor(
412
		$field['value'],
413
		$field['unique_field_id'],
414
		$editor_attributes
415
	);
416
417
	echo give_get_field_description( $field );
418
	echo '</div>';
419
}
420
421
/**
422
 * Output a checkbox input box.
423
 *
424
 * @since  1.8
425
 *
426
 * @param  array $field         {
427
 *                              Optional. Array of checkbox field arguments.
428
 *
429
 * @type string  $id            Field ID. Default ''.
430
 * @type string  $style         CSS style for input field. Default ''.
431
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
432
 * @type string  $value         Value of input field. Default ''.
433
 * @type string  $cbvalue       Checkbox value. Default 'on'.
434
 * @type string  $name          Name of input field. Default ''.
435
 * @type string  $description   Description of input field. Default ''.
436
 * @type array   $attributes    List of attributes of input field. Default array().
437
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
438
 *                                               => '****' )
439
 * }
440
 * @return void
441
 */
442
function give_checkbox( $field ) {
443
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
444
445
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
446
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
447
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
448
	$field['value']         = give_get_field_value( $field, $thepostid );
449
	$field['cbvalue']       = isset( $field['cbvalue'] ) ? $field['cbvalue'] : 'on';
450
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
451
	?>
452
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
453
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
454
	<input
455
			type="checkbox"
456
			style="<?php echo esc_attr( $field['style'] ); ?>"
457
			name="<?php echo give_get_field_name( $field ); ?>"
458
			id="<?php echo esc_attr( $field['id'] ); ?>"
459
			value="<?php echo esc_attr( $field['cbvalue'] ); ?>"
460
		<?php echo checked( $field['value'], $field['cbvalue'], false ); ?>
461
		<?php echo give_get_custom_attributes( $field ); ?>
462
	/>
463
	<?php
464
	echo give_get_field_description( $field );
465
	echo '</p>';
466
}
467
468
/**
469
 * Output a select input box.
470
 *
471
 * @since  1.8
472
 *
473
 * @param  array $field         {
474
 *                              Optional. Array of select field arguments.
475
 *
476
 * @type string  $id            Field ID. Default ''.
477
 * @type string  $style         CSS style for input field. Default ''.
478
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
479
 * @type string  $value         Value of input field. Default ''.
480
 * @type string  $name          Name of input field. Default ''.
481
 * @type string  $description   Description of input field. Default ''.
482
 * @type array   $attributes    List of attributes of input field. Default array().
483
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
484
 *                                               => '****' )
485
 * @type array   $options       List of options. Default array().
486
 *                                               for example: 'options' => array( '' => 'None', 'yes' => 'Yes' )
487
 * }
488
 * @return void
489
 */
490
function give_select( $field ) {
491
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
492
493
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
494
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
495
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
496
	$field['value']         = give_get_field_value( $field, $thepostid );
497
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
498
	?>
499
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
500
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
501
	<select
502
	id="<?php echo esc_attr( $field['id'] ); ?>"
503
	name="<?php echo give_get_field_name( $field ); ?>"
504
	style="<?php echo esc_attr( $field['style'] ) ?>"
505
	<?php echo give_get_custom_attributes( $field ); ?>
506
	>
507
	<?php
508
	foreach ( $field['options'] as $key => $value ) {
509
		echo '<option value="' . esc_attr( $key ) . '" ' . selected( esc_attr( $field['value'] ), esc_attr( $key ), false ) . '>' . esc_html( $value ) . '</option>';
510
	}
511
	echo '</select>';
512
	echo give_get_field_description( $field );
513
	echo '</p>';
514
}
515
516
/**
517
 * Output a radio input box.
518
 *
519
 * @since  1.8
520
 *
521
 * @param  array $field         {
522
 *                              Optional. Array of radio field arguments.
523
 *
524
 * @type string  $id            Field ID. Default ''.
525
 * @type string  $style         CSS style for input field. Default ''.
526
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
527
 * @type string  $value         Value of input field. Default ''.
528
 * @type string  $name          Name of input field. Default ''.
529
 * @type string  $description   Description of input field. Default ''.
530
 * @type array   $attributes    List of attributes of input field. Default array().
531
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
532
 *                                               => '****' )
533
 * @type array   $options       List of options. Default array().
534
 *                                               for example: 'options' => array( 'enable' => 'Enable', 'disable' =>
535
 *                                               'Disable' )
536
 * }
537
 * @return void
538
 */
539
function give_radio( $field ) {
540
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
541
542
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
543
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
544
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
545
	$field['value']         = give_get_field_value( $field, $thepostid );
546
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
547
548
	echo '<fieldset class="give-field-wrap ' . esc_attr( $field['id'] ) . '_field ' . esc_attr( $field['wrapper_class'] ) . '"><span class="give-field-label">' . wp_kses_post( $field['name'] ) . '</span><legend class="screen-reader-text">' . wp_kses_post( $field['name'] ) . '</legend><ul class="give-radios">';
549
550
	foreach ( $field['options'] as $key => $value ) {
551
552
		echo '<li><label><input
553
				name="' . give_get_field_name( $field ) . '"
554
				value="' . esc_attr( $key ) . '"
555
				type="radio"
556
				style="' . esc_attr( $field['style'] ) . '"
557
				' . checked( esc_attr( $field['value'] ), esc_attr( $key ), false ) . ' '
558
		     . give_get_custom_attributes( $field ) . '
559
				/> ' . esc_html( $value ) . '</label>
560
		</li>';
561
	}
562
	echo '</ul>';
563
564
	echo give_get_field_description( $field );
565
	echo '</fieldset>';
566
}
567
568
/**
569
 * Output a colorpicker.
570
 *
571
 * @since  1.8
572
 *
573
 * @param  array $field         {
574
 *                              Optional. Array of colorpicker field arguments.
575
 *
576
 * @type string  $id            Field ID. Default ''.
577
 * @type string  $style         CSS style for input field. Default ''.
578
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
579
 * @type string  $value         Value of input field. Default ''.
580
 * @type string  $name          Name of input field. Default ''.
581
 * @type string  $description   Description of input field. Default ''.
582
 * @type array   $attributes    List of attributes of input field. Default array().
583
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
584
 *                                               => '****' )
585
 * }
586
 * @return void
587
 */
588
function give_colorpicker( $field ) {
589
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
590
591
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
592
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
593
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
594
	$field['value']         = give_get_field_value( $field, $thepostid );
595
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
596
	$field['type']          = 'text';
597
	?>
598
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
599
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
600
	<input
601
			type="<?php echo esc_attr( $field['type'] ); ?>"
602
			style="<?php echo esc_attr( $field['style'] ); ?>"
603
			name="<?php echo give_get_field_name( $field ); ?>"
604
			id="' . esc_attr( $field['id'] ) . '" value="<?php echo esc_attr( $field['value'] ); ?>"
605
		<?php echo give_get_custom_attributes( $field ); ?>
606
	/>
607
	<?php
608
	echo give_get_field_description( $field );
609
	echo '</p>';
610
}
611
612
613
/**
614
 * Output a media upload field.
615
 *
616
 * @since  1.8
617
 *
618
 * @param array $field
619
 */
620
function give_media( $field ) {
621
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
622
623
	$thepostid                    = empty( $thepostid ) ? $post->ID : $thepostid;
624
	$field['style']               = isset( $field['style'] ) ? $field['style'] : '';
625
	$field['wrapper_class']       = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
626
	$field['value']               = give_get_field_value( $field, $thepostid );
627
	$field['name']                = isset( $field['name'] ) ? $field['name'] : $field['id'];
628
	$field['type']                = 'text';
629
	$field['attributes']['class'] = "{$field['attributes']['class']} give-text-medium";
630
631
	// Allow developer to save attachment ID or attachment url as metadata.
632
	$field['fvalue'] = isset( $field['fvalue'] ) ? $field['fvalue'] : 'url';
633
	?>
634
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
635
		<label for="<?php echo give_get_field_name( $field ) ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
636
		<input
637
				name="<?php echo give_get_field_name( $field ); ?>"
638
				id="<?php echo esc_attr( $field['id'] ); ?>"
639
				type="text"
640
				value="<?php echo $field['value']; ?>"
641
				style="<?php echo esc_attr( $field['style'] ); ?>"
642
				data-fvalue="<?php echo $field['fvalue']; ?>"
643
			<?php echo give_get_custom_attributes( $field ); ?>
644
		/>&nbsp;&nbsp;&nbsp;&nbsp;<input class="give-media-upload button" type="button"
645
										 value="<?php echo esc_html__( 'Add or Upload File', 'give' ); ?>">
646
		<?php echo give_get_field_description( $field ); ?>
647
	</p>
648
	<?php
649
}
650
651
/**
652
 * Output a select field with payment options list.
653
 *
654
 * @since  1.8
655
 *
656
 * @param  array $field
657
 *
658
 * @return void
659
 */
660
function give_default_gateway( $field ) {
661
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
662
663
	// get all active payment gateways.
664
	$gateways         = give_get_enabled_payment_gateways( $thepostid );
665
	$field['options'] = array();
666
667
	// Set field option value.
668
	if ( ! empty( $gateways ) ) {
669
		foreach ( $gateways as $key => $option ) {
670
			$field['options'][ $key ] = $option['admin_label'];
671
		}
672
	}
673
674
	// Add a field to the Give Form admin single post view of this field
675
	if ( is_object( $post ) && 'give_forms' === $post->post_type ) {
676
		$field['options'] = array_merge( array( 'global' => esc_html__( 'Global Default', 'give' ) ), $field['options'] );
677
	}
678
679
	// Render select field.
680
	give_select( $field );
681
}
682
683
/**
684
 * Output the documentation link.
685
 *
686
 * @since  1.8
687
 *
688
 * @param  array $field      {
689
 *                           Optional. Array of customizable link attributes.
690
 *
691
 * @type string  $name       Name of input field. Default ''.
692
 * @type string  $type       Type of input field. Default 'text'.
693
 * @type string  $url        Value to be passed as a link. Default 'https://givewp.com/documentation'.
694
 * @type string  $title      Value to be passed as text of link. Default 'Documentation'.
695
 * @type array   $attributes List of attributes of input field. Default array().
696
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
697
 *                                               => '****' )
698
 * }
699
 * @return void
700
 */
701
702
function give_docs_link( $field ) {
703
	$field['url']   = isset( $field['url'] ) ? $field['url'] : 'https://givewp.com/documentation';
704
	$field['title'] = isset( $field['title'] ) ? $field['title'] : 'Documentation';
705
706
	echo '<p class="give-docs-link"><a href="' . esc_url( $field['url'] )
707
	     . '" target="_blank">'
708
	     . sprintf( esc_html__( 'Need Help? See docs on "%s"' ), $field['title'] )
709
	     . '<span class="dashicons dashicons-editor-help"></span></a></p>';
710
}
711
712
713
/**
714
 * Output preview buttons.
715
 *
716
 * @since 1.9
717
 * @param $field
718
 */
719
function give_email_preview_buttons( $field ){
720
	/* @var WP_Post $post */
721
	global $post;
722
723
	$field_id = str_replace( '_preview_buttons', '', $field['id'] );
724
725
	ob_start();
726
727
	echo '<p class="give-field-wrap ' . esc_attr( $field['id'] ) . '_field"><label for="' . give_get_field_name( $field ) . '">' . wp_kses_post( $field['name'] ) . '</label>';
728
729
	echo sprintf(
730
		'<a href="%1$s" class="button-secondary" target="_blank">%2$s</a>',
731
		wp_nonce_url(
732
			add_query_arg(
733
				array( 'give_action' => 'preview_email', 'email_type' => $field_id ),
734
				home_url()
735
			), 'give-preview-email'
736
		),
737
		$field['name']
738
	);
739
740
	echo sprintf(
741
		' <a href="%1$s" aria-label="%2$s" class="button-secondary">%3$s</a>',
742
		wp_nonce_url(
743
			add_query_arg(
744
				array( 'give_action'  => 'send_preview_email', 'email_type' => $field_id, 'give-message' => 'sent-test-email' )
745
			), 'give-send-preview-email' ),
746
		esc_attr__( 'Send Test Email.', 'give' ),
747
		esc_html__( 'Send Test Email', 'give' )
748
	);
749
750
	if ( ! empty( $field['description'] ) ) {
751
		echo '<span class="give-field-description">' . wp_kses_post( $field['desc'] ) . '</span>';
752
	}
753
754
	echo '</p>';
755
756
	echo ob_get_clean();
757
}
758
759
/**
760
 * Get setting field value.
761
 *
762
 * Note: Use only for single post, page or custom post type.
763
 *
764
 * @since  1.8
765
 *
766
 * @param  array $field
767
 * @param  int   $postid
768
 *
769
 * @return mixed
770
 */
771
function give_get_field_value( $field, $postid ) {
772
	if ( isset( $field['attributes']['value'] ) ) {
773
		return $field['attributes']['value'];
774
	}
775
776
	// Get value from db.
777
	$field_value = get_post_meta( $postid, $field['id'], true );
778
779
	/**
780
	 * Filter the field value before apply default value.
781
	 *
782
	 * @since 1.8
783
	 *
784
	 * @param mixed $field_value Field value.
785
	 */
786
	$field_value = apply_filters( "{$field['id']}_field_value", $field_value, $field, $postid );
787
788
	// Set default value if no any data saved to db.
789
	if ( ! $field_value && isset( $field['default'] ) ) {
790
		$field_value = $field['default'];
791
	}
792
793
	return $field_value;
794
}
795
796
797
/**
798
 * Get field description html.
799
 *
800
 * @since 1.8
801
 *
802
 * @param $field
803
 *
804
 * @return string
805
 */
806
function give_get_field_description( $field ) {
807
	$field_desc_html = '';
808
	if ( ! empty( $field['description'] ) ) {
809
		$field_desc_html = '<span class="give-field-description">' . wp_kses_post( $field['description'] ) . '</span>';
810
	}
811
812
	return $field_desc_html;
813
}
814
815
816
/**
817
 * Get field custom attributes as string.
818
 *
819
 * @since 1.8
820
 *
821
 * @param $field
822
 *
823
 * @return string
824
 */
825
function give_get_custom_attributes( $field ) {
826
	// Custom attribute handling
827
	$custom_attributes = array();
828
829
	if ( ! empty( $field['attributes'] ) && is_array( $field['attributes'] ) ) {
830
831
		foreach ( $field['attributes'] as $attribute => $value ) {
832
			$custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"';
833
		}
834
	}
835
836
	return implode( ' ', $custom_attributes );
837
}
838
839
/**
840
 * Get repeater field value.
841
 *
842
 * Note: Use only for single post, page or custom post type.
843
 *
844
 * @since  1.8
845
 *
846
 * @param array $field
847
 * @param array $field_group
848
 * @param array $fields
849
 *
850
 * @return string
851
 */
852
function give_get_repeater_field_value( $field, $field_group, $fields ) {
853
	$field_value = ( isset( $field_group[ $field['id'] ] ) ? $field_group[ $field['id'] ] : '' );
854
855
	/**
856
	 * Filter the specific repeater field value
857
	 *
858
	 * @since 1.8
859
	 *
860
	 * @param string $field_id
861
	 */
862
	$field_value = apply_filters( "give_get_repeater_field_{$field['id']}_value", $field_value, $field, $field_group, $fields );
863
864
	/**
865
	 * Filter the repeater field value
866
	 *
867
	 * @since 1.8
868
	 *
869
	 * @param string $field_id
870
	 */
871
	$field_value = apply_filters( 'give_get_repeater_field_value', $field_value, $field, $field_group, $fields );
872
873
	return $field_value;
874
}
875
876
/**
877
 * Get repeater field id.
878
 *
879
 * Note: Use only for single post, page or custom post type.
880
 *
881
 * @since  1.8
882
 *
883
 * @param array    $field
884
 * @param array    $fields
885
 * @param int|bool $default
886
 *
887
 * @return string
888
 */
889
function give_get_repeater_field_id( $field, $fields, $default = false ) {
890
	$row_placeholder = false !== $default ? $default : '{{row-count-placeholder}}';
891
892
	// Get field id.
893
	$field_id = "{$fields['id']}[{$row_placeholder}][{$field['id']}]";
894
895
	/**
896
	 * Filter the specific repeater field id
897
	 *
898
	 * @since 1.8
899
	 *
900
	 * @param string $field_id
901
	 */
902
	$field_id = apply_filters( "give_get_repeater_field_{$field['id']}_id", $field_id, $field, $fields, $default );
903
904
	/**
905
	 * Filter the repeater field id
906
	 *
907
	 * @since 1.8
908
	 *
909
	 * @param string $field_id
910
	 */
911
	$field_id = apply_filters( 'give_get_repeater_field_id', $field_id, $field, $fields, $default );
912
913
	return $field_id;
914
}
915
916
917
/**
918
 * Get field name.
919
 *
920
 * @since  1.8
921
 *
922
 * @param  array $field
923
 *
924
 * @return string
925
 */
926
function give_get_field_name( $field ) {
927
	$field_name = esc_attr( empty( $field['repeat'] ) ? $field['id'] : $field['repeatable_field_id'] );
928
929
	/**
930
	 * Filter the field name.
931
	 *
932
	 * @since 1.8
933
	 *
934
	 * @param string $field_name
935
	 */
936
	$field_name = apply_filters( 'give_get_field_name', $field_name, $field );
937
938
	return $field_name;
939
}
940
941
/**
942
 * Output repeater field or multi donation type form on donation from edit screen.
943
 * Note: internal use only.
944
 *
945
 * @TODO   : Add support for wysiwyg type field.
946
 *
947
 * @since  1.8
948
 *
949
 * @param  array $fields
950
 *
951
 * @return void
952
 */
953
function _give_metabox_form_data_repeater_fields( $fields ) {
954
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
955
956
	// Bailout.
957
	if ( ! isset( $fields['fields'] ) || empty( $fields['fields'] ) ) {
958
		return;
959
	}
960
961
	$group_numbering = isset( $fields['options']['group_numbering'] ) ? (int) $fields['options']['group_numbering'] : 0;
962
	$close_tabs      = isset( $fields['options']['close_tabs'] ) ? (int) $fields['options']['close_tabs'] : 0;
963
	?>
964
	<div class="give-repeatable-field-section" id="<?php echo "{$fields['id']}_field"; ?>"
965
		 data-group-numbering="<?php echo $group_numbering; ?>" data-close-tabs="<?php echo $close_tabs; ?>">
966
		<?php if ( ! empty( $fields['name'] ) ) : ?>
967
			<p class="give-repeater-field-name"><?php echo $fields['name']; ?></p>
968
		<?php endif; ?>
969
970
		<?php if ( ! empty( $fields['description'] ) ) : ?>
971
			<p class="give-repeater-field-description"><?php echo $fields['description']; ?></p>
972
		<?php endif; ?>
973
974
		<table class="give-repeatable-fields-section-wrapper" cellspacing="0">
975
			<?php
976
			$repeater_field_values = get_post_meta( $thepostid, $fields['id'], true );
977
			$header_title          = isset( $fields['options']['header_title'] )
978
				? $fields['options']['header_title']
979
				: esc_attr__( 'Group', 'give' );
980
981
			$add_default_donation_field = false;
982
983
			// Check if level is not created or we have to add default level.
984
			if ( is_array( $repeater_field_values ) && ( $fields_count = count( $repeater_field_values ) ) ) {
985
				$repeater_field_values = array_values( $repeater_field_values );
986
			} else {
987
				$fields_count               = 1;
988
				$add_default_donation_field = true;
989
			}
990
			?>
991
			<tbody class="container"<?php echo " data-rf-row-count=\"{$fields_count}\""; ?>>
992
			<!--Repeater field group template-->
993
			<tr class="give-template give-row">
994
				<td class="give-repeater-field-wrap give-column" colspan="2">
995
					<div class="give-row-head give-move">
996
						<button type="button" class="handlediv button-link"><span class="toggle-indicator"></span>
997
						</button>
998
						<span class="give-remove" title="<?php esc_html_e( 'Remove Group', 'give' ); ?>">-</span>
999
						<h2>
1000
							<span data-header-title="<?php echo $header_title; ?>"><?php echo $header_title; ?></span>
1001
						</h2>
1002
					</div>
1003
					<div class="give-row-body">
1004
						<?php foreach ( $fields['fields'] as $field ) : ?>
1005
							<?php if ( ! give_is_field_callback_exist( $field ) ) {
1006
								continue;
1007
} ?>
1008
							<?php
1009
							$field['repeat']              = true;
1010
							$field['repeatable_field_id'] = give_get_repeater_field_id( $field, $fields );
1011
							$field['id']                  = str_replace( array( '[', ']' ), array(
1012
								'_',
1013
								'',
1014
							), $field['repeatable_field_id'] );
1015
							?>
1016
							<?php give_render_field( $field ); ?>
1017
						<?php endforeach; ?>
1018
					</div>
1019
				</td>
1020
			</tr>
1021
1022
			<?php if ( ! empty( $repeater_field_values ) ) : ?>
1023
				<!--Stored repeater field group-->
1024
				<?php foreach ( $repeater_field_values as $index => $field_group ) : ?>
1025
					<tr class="give-row">
1026
						<td class="give-repeater-field-wrap give-column" colspan="2">
1027
							<div class="give-row-head give-move">
1028
								<button type="button" class="handlediv button-link">
1029
									<span class="toggle-indicator"></span></button>
1030
								<sapn class="give-remove" title="<?php esc_html_e( 'Remove Group', 'give' ); ?>">-
1031
								</sapn>
1032
								<h2>
1033
									<span data-header-title="<?php echo $header_title; ?>"><?php echo $header_title; ?></span>
1034
								</h2>
1035
							</div>
1036
							<div class="give-row-body">
1037
								<?php foreach ( $fields['fields'] as $field ) : ?>
1038
									<?php if ( ! give_is_field_callback_exist( $field ) ) {
1039
										continue;
1040
} ?>
1041
									<?php
1042
									$field['repeat']              = true;
1043
									$field['repeatable_field_id'] = give_get_repeater_field_id( $field, $fields, $index );
1044
									$field['attributes']['value'] = give_get_repeater_field_value( $field, $field_group, $fields );
1045
									$field['id']                  = str_replace( array( '[', ']' ), array(
1046
										'_',
1047
										'',
1048
									), $field['repeatable_field_id'] );
1049
									?>
1050
									<?php give_render_field( $field ); ?>
1051
								<?php endforeach; ?>
1052
							</div>
1053
						</td>
1054
					</tr>
1055
				<?php endforeach;
1056
; ?>
1057
1058
			<?php elseif ( $add_default_donation_field ) : ?>
1059
				<!--Default repeater field group-->
1060
				<tr class="give-row">
1061
					<td class="give-repeater-field-wrap give-column" colspan="2">
1062
						<div class="give-row-head give-move">
1063
							<button type="button" class="handlediv button-link">
1064
								<span class="toggle-indicator"></span></button>
1065
							<sapn class="give-remove" title="<?php esc_html_e( 'Remove Group', 'give' ); ?>">-
1066
							</sapn>
1067
							<h2>
1068
								<span data-header-title="<?php echo $header_title; ?>"><?php echo $header_title; ?></span>
1069
							</h2>
1070
						</div>
1071
						<div class="give-row-body">
1072
							<?php
1073
							foreach ( $fields['fields'] as $field ) :
1074
								if ( ! give_is_field_callback_exist( $field ) ) {
1075
									continue;
1076
								}
1077
1078
								$field['repeat']              = true;
1079
								$field['repeatable_field_id'] = give_get_repeater_field_id( $field, $fields, 0 );
1080
								$field['attributes']['value'] = apply_filters( "give_default_field_group_field_{$field['id']}_value", ( ! empty( $field['default'] ) ? $field['default'] : '' ), $field );
1081
								$field['id']                  = str_replace( array( '[', ']' ), array(
1082
									'_',
1083
									'',
1084
								), $field['repeatable_field_id'] );
1085
								give_render_field( $field );
1086
							endforeach;
1087
							?>
1088
						</div>
1089
					</td>
1090
				</tr>
1091
			<?php endif; ?>
1092
			</tbody>
1093
			<tfoot>
1094
			<tr>
1095
				<?php
1096
				$add_row_btn_title = isset( $fields['options']['add_button'] )
1097
					? $add_row_btn_title = $fields['options']['add_button']
1098
					: esc_html__( 'Add Row', 'give' );
1099
				?>
1100
				<td colspan="2" class="give-add-repeater-field-section-row-wrap">
1101
					<span class="button button-primary give-add-repeater-field-section-row"><?php echo $add_row_btn_title; ?></span>
1102
				</td>
1103
			</tr>
1104
			</tfoot>
1105
		</table>
1106
	</div>
1107
	<?php
1108
}
1109
1110
1111
/**
1112
 * Get current setting tab.
1113
 *
1114
 * @since  1.8
1115
 * @return string
1116
 */
1117
function give_get_current_setting_tab() {
1118
	// Get current setting page.
1119
	$current_setting_page = give_get_current_setting_page();
1120
1121
	/**
1122
	 * Filter the default tab for current setting page.
1123
	 *
1124
	 * @since 1.8
1125
	 *
1126
	 * @param string
1127
	 */
1128
	$default_current_tab = apply_filters( "give_default_setting_tab_{$current_setting_page}", 'general' );
1129
1130
	// Get current tab.
1131
	$current_tab = empty( $_GET['tab'] ) ? $default_current_tab : urldecode( $_GET['tab'] );
1132
1133
	// Output.
1134
	return $current_tab;
1135
}
1136
1137
1138
/**
1139
 * Get current setting section.
1140
 *
1141
 * @since  1.8
1142
 * @return string
1143
 */
1144
function give_get_current_setting_section() {
1145
	// Get current tab.
1146
	$current_tab = give_get_current_setting_tab();
1147
1148
	/**
1149
	 * Filter the default section for current setting page tab.
1150
	 *
1151
	 * @since 1.8
1152
	 *
1153
	 * @param string
1154
	 */
1155
	$default_current_section = apply_filters( "give_default_setting_tab_section_{$current_tab}", '' );
1156
1157
	// Get current section.
1158
	$current_section = empty( $_REQUEST['section'] ) ? $default_current_section : urldecode( $_REQUEST['section'] );
1159
1160
	// Output.
1161
	return $current_section;
1162
}
1163
1164
/**
1165
 * Get current setting page.
1166
 *
1167
 * @since  1.8
1168
 * @return string
1169
 */
1170
function give_get_current_setting_page() {
1171
	// Get current page.
1172
	$setting_page = ! empty( $_GET['page'] ) ? urldecode( $_GET['page'] ) : '';
1173
1174
	// Output.
1175
	return $setting_page;
1176
}
1177
1178
/**
1179
 * Set value for Form content --> Display content field setting.
1180
 *
1181
 * Backward compatibility:  set value by _give_content_option form meta field value if _give_display_content is not set
1182
 * yet.
1183
 *
1184
 * @since  1.8
1185
 *
1186
 * @param  mixed $field_value Field Value.
1187
 * @param  array $field       Field args.
1188
 * @param  int   $postid      Form/Post ID.
1189
 *
1190
 * @return string
1191
 */
1192
function _give_display_content_field_value( $field_value, $field, $postid ) {
1193
	$show_content = get_post_meta( $postid, '_give_content_option', true );
1194
1195
	if (
1196
		! get_post_meta( $postid, '_give_display_content', true )
1197
		&& $show_content
1198
		&& ( 'none' !== $show_content )
1199
	) {
1200
		$field_value = 'enabled';
1201
	}
1202
1203
	return $field_value;
1204
}
1205
1206
add_filter( '_give_display_content_field_value', '_give_display_content_field_value', 10, 3 );
1207
1208
1209
/**
1210
 * Set value for Form content --> Content placement field setting.
1211
 *
1212
 * Backward compatibility:  set value by _give_content_option form meta field value if _give_content_placement is not
1213
 * set yet.
1214
 *
1215
 * @since  1.8
1216
 *
1217
 * @param  mixed $field_value Field Value.
1218
 * @param  array $field       Field args.
1219
 * @param  int   $postid      Form/Post ID.
1220
 *
1221
 * @return string
1222
 */
1223
function _give_content_placement_field_value( $field_value, $field, $postid ) {
1224
	$show_content = get_post_meta( $postid, '_give_content_option', true );
1225
1226
	if (
1227
		! get_post_meta( $postid, '_give_content_placement', true )
1228
		&& ( 'none' !== $show_content )
1229
	) {
1230
		$field_value = $show_content;
1231
	}
1232
1233
	return $field_value;
1234
}
1235
1236
add_filter( '_give_content_placement_field_value', '_give_content_placement_field_value', 10, 3 );
1237
1238
1239
/**
1240
 * Set value for Terms and Conditions --> Terms and Conditions field setting.
1241
 *
1242
 * Backward compatibility:  set value by _give_terms_option form meta field value if it's value is none.
1243
 *
1244
 * @since  1.8
1245
 *
1246
 * @param  mixed $field_value Field Value.
1247
 * @param  array $field       Field args.
1248
 * @param  int   $postid      Form/Post ID.
1249
 *
1250
 * @return string
1251
 */
1252
function _give_terms_option_field_value( $field_value, $field, $postid ) {
1253
	$term_option = get_post_meta( $postid, '_give_terms_option', true );
1254
1255
	if ( in_array( $term_option, array( 'none', 'yes' ) ) ) {
1256
		$field_value = ( 'yes' === $term_option ? 'enabled' : 'disabled' );
1257
	}
1258
1259
	return $field_value;
1260
}
1261
1262
add_filter( '_give_terms_option_field_value', '_give_terms_option_field_value', 10, 3 );
1263
1264
1265
/**
1266
 * Set value for Form Display --> Offline Donation --> Billing Fields.
1267
 *
1268
 * Backward compatibility:  set value by _give_offline_donation_enable_billing_fields_single form meta field value if
1269
 * it's value is on.
1270
 *
1271
 * @since  1.8
1272
 *
1273
 * @param  mixed $field_value Field Value.
1274
 * @param  array $field       Field args.
1275
 * @param  int   $postid      Form/Post ID.
1276
 *
1277
 * @return string
1278
 */
1279
function _give_offline_donation_enable_billing_fields_single_field_value( $field_value, $field, $postid ) {
1280
	$offline_donation = get_post_meta( $postid, '_give_offline_donation_enable_billing_fields_single', true );
1281
1282
	if ( 'on' === $offline_donation ) {
1283
		$field_value = 'enabled';
1284
	}
1285
1286
	return $field_value;
1287
}
1288
1289
add_filter( '_give_offline_donation_enable_billing_fields_single_field_value', '_give_offline_donation_enable_billing_fields_single_field_value', 10, 3 );
1290
1291
1292
/**
1293
 * Set value for Donation Options --> Custom Amount.
1294
 *
1295
 * Backward compatibility:  set value by _give_custom_amount form meta field value if it's value is yes or no.
1296
 *
1297
 * @since  1.8
1298
 *
1299
 * @param  mixed $field_value Field Value.
1300
 * @param  array $field       Field args.
1301
 * @param  int   $postid      Form/Post ID.
1302
 *
1303
 * @return string
1304
 */
1305
function _give_custom_amount_field_value( $field_value, $field, $postid ) {
1306
	$custom_amount = get_post_meta( $postid, '_give_custom_amount', true );
1307
1308
	if ( in_array( $custom_amount, array( 'yes', 'no' ) ) ) {
1309
		$field_value = ( 'yes' === $custom_amount ? 'enabled' : 'disabled' );
1310
	}
1311
1312
	return $field_value;
1313
}
1314
1315
add_filter( '_give_custom_amount_field_value', '_give_custom_amount_field_value', 10, 3 );
1316
1317
1318
/**
1319
 * Set value for Donation Goal --> Donation Goal.
1320
 *
1321
 * Backward compatibility:  set value by _give_goal_option form meta field value if it's value is yes or no.
1322
 *
1323
 * @since  1.8
1324
 *
1325
 * @param  mixed $field_value Field Value.
1326
 * @param  array $field       Field args.
1327
 * @param  int   $postid      Form/Post ID.
1328
 *
1329
 * @return string
1330
 */
1331
function _give_goal_option_field_value( $field_value, $field, $postid ) {
1332
	$goal_option = get_post_meta( $postid, '_give_goal_option', true );
1333
1334
	if ( in_array( $goal_option, array( 'yes', 'no' ) ) ) {
1335
		$field_value = ( 'yes' === $goal_option ? 'enabled' : 'disabled' );
1336
	}
1337
1338
	return $field_value;
1339
}
1340
1341
add_filter( '_give_goal_option_field_value', '_give_goal_option_field_value', 10, 3 );
1342
1343
/**
1344
 * Set value for Donation Goal --> close Form.
1345
 *
1346
 * Backward compatibility:  set value by _give_close_form_when_goal_achieved form meta field value if it's value is yes
1347
 * or no.
1348
 *
1349
 * @since  1.8
1350
 *
1351
 * @param  mixed $field_value Field Value.
1352
 * @param  array $field       Field args.
1353
 * @param  int   $postid      Form/Post ID.
1354
 *
1355
 * @return string
1356
 */
1357
function _give_close_form_when_goal_achieved_value( $field_value, $field, $postid ) {
1358
	$close_form = get_post_meta( $postid, '_give_close_form_when_goal_achieved', true );
1359
1360
	if ( in_array( $close_form, array( 'yes', 'no' ) ) ) {
1361
		$field_value = ( 'yes' === $close_form ? 'enabled' : 'disabled' );
1362
	}
1363
1364
	return $field_value;
1365
}
1366
1367
add_filter( '_give_close_form_when_goal_achieved_field_value', '_give_close_form_when_goal_achieved_value', 10, 3 );
1368
1369
1370
/**
1371
 * Set value for Form display --> Guest Donation.
1372
 *
1373
 * Backward compatibility:  set value by _give_logged_in_only form meta field value if it's value is yes or no.
1374
 *
1375
 * @since  1.8
1376
 *
1377
 * @param  mixed $field_value Field Value.
1378
 * @param  array $field       Field args.
1379
 * @param  int   $postid      Form/Post ID.
1380
 *
1381
 * @return string
1382
 */
1383
function _give_logged_in_only_value( $field_value, $field, $postid ) {
1384
	$guest_donation = get_post_meta( $postid, '_give_logged_in_only', true );
1385
1386
	if ( in_array( $guest_donation, array( 'yes', 'no' ) ) ) {
1387
		$field_value = ( 'yes' === $guest_donation ? 'enabled' : 'disabled' );
1388
	}
1389
1390
	return $field_value;
1391
}
1392
1393
add_filter( '_give_logged_in_only_field_value', '_give_logged_in_only_value', 10, 3 );
1394
1395
/**
1396
 * Set value for Offline Donations --> Offline Donations.
1397
 *
1398
 * Backward compatibility:  set value by _give_customize_offline_donations form meta field value if it's value is yes
1399
 * or no.
1400
 *
1401
 * @since  1.8
1402
 *
1403
 * @param  mixed $field_value Field Value.
1404
 * @param  array $field       Field args.
1405
 * @param  int   $postid      Form/Post ID.
1406
 *
1407
 * @return string
1408
 */
1409
function _give_customize_offline_donations_value( $field_value, $field, $postid ) {
1410
	$customize_offline_text = get_post_meta( $postid, '_give_customize_offline_donations', true );
1411
1412
	if ( in_array( $customize_offline_text, array( 'yes', 'no' ) ) ) {
1413
		$field_value = ( 'yes' === $customize_offline_text ? 'enabled' : 'disabled' );
1414
	}
1415
1416
	return $field_value;
1417
}
1418
1419
add_filter( '_give_customize_offline_donations_field_value', '_give_customize_offline_donations_value', 10, 3 );
1420
1421
1422
/**
1423
 * Set repeater field id for multi donation form.
1424
 *
1425
 * @since 1.8
1426
 *
1427
 * @param int   $field_id
1428
 * @param array $field
1429
 * @param array $fields
1430
 * @param bool  $default
1431
 *
1432
 * @return mixed
1433
 */
1434
function _give_set_multi_level_repeater_field_id( $field_id, $field, $fields, $default ) {
1435
	$row_placeholder = false !== $default ? $default : '{{row-count-placeholder}}';
1436
	$field_id        = "{$fields['id']}[{$row_placeholder}][{$field['id']}][level_id]";
1437
1438
	return $field_id;
1439
}
1440
1441
add_filter( 'give_get_repeater_field__give_id_id', '_give_set_multi_level_repeater_field_id', 10, 4 );
1442
1443
/**
1444
 * Set repeater field value for multi donation form.
1445
 *
1446
 * @since 1.8
1447
 *
1448
 * @param string $field_value
1449
 * @param array  $field
1450
 * @param array  $field_group
1451
 * @param array  $fields
1452
 *
1453
 * @return mixed
1454
 */
1455
function _give_set_multi_level_repeater_field_value( $field_value, $field, $field_group, $fields ) {
1456
	$field_value = $field_group[ $field['id'] ]['level_id'];
1457
1458
	return $field_value;
1459
}
1460
1461
add_filter( 'give_get_repeater_field__give_id_value', '_give_set_multi_level_repeater_field_value', 10, 4 );
1462
1463
/**
1464
 * Set default value for _give_id field.
1465
 *
1466
 * @since 1.8
1467
 *
1468
 * @param $field
1469
 *
1470
 * @return string
0 ignored issues
show
Should the return type not be integer?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
1471
 */
1472
function _give_set_field_give_id_default_value( $field ) {
1473
	return 0;
1474
}
1475
1476
add_filter( 'give_default_field_group_field__give_id_value', '_give_set_field_give_id_default_value' );
1477
1478
/**
1479
 * Set default value for _give_default field.
1480
 *
1481
 * @since 1.8
1482
 *
1483
 * @param $field
1484
 *
1485
 * @return string
1486
 */
1487
function _give_set_field_give_default_default_value( $field ) {
1488
	return 'default';
1489
}
1490
1491
add_filter( 'give_default_field_group_field__give_default_value', '_give_set_field_give_default_default_value' );
1492
1493
/**
1494
 * Set repeater field editor id for field type wysiwyg.
1495
 *
1496
 * @since 1.8
1497
 *
1498
 * @param $field_name
1499
 * @param $field
1500
 *
1501
 * @return string
1502
 */
1503
function give_repeater_field_set_editor_id( $field_name, $field ) {
1504
	if ( isset( $field['repeatable_field_id'] ) && 'wysiwyg' == $field['type'] ) {
1505
		$field_name = '_give_repeater_' . uniqid() . '_wysiwyg';
1506
	}
1507
1508
	return $field_name;
1509
}
1510
1511
add_filter( 'give_get_field_name', 'give_repeater_field_set_editor_id', 10, 2 );
1512