Passed
Push — master ( 3127f7...8c7816 )
by Brian
05:09
created

wpinv_tax_rules_callback()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 8
nc 1
nop 0
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Contains settings related functions
4
 *
5
 * @package Invoicing
6
 * @since   1.0.0
7
 */
8
9
defined( 'ABSPATH' ) || exit;
10
11
/**
12
 * Retrieves all default settings.
13
 *
14
 * @return array
15
 */
16
function wpinv_get_settings() {
17
    $defaults = array();
18
19
    foreach ( array_values( wpinv_get_registered_settings() ) as $tab_settings ) {
20
21
        foreach ( array_values( $tab_settings ) as $section_settings ) {
22
23
            foreach ( $section_settings as $key => $setting ) {
24
                if ( isset( $setting['std'] ) ) {
25
                    $defaults[ $key ] = $setting['std'];
26
                }
27
            }
28
}
29
}
30
31
    return $defaults;
32
33
}
34
35
/**
36
 * Retrieves all settings.
37
 *
38
 * @return array
39
 */
40
function wpinv_get_options() {
41
    global $wpinv_options;
42
43
    // Try fetching the saved options.
44
    if ( empty( $wpinv_options ) ) {
45
        $wpinv_options = get_option( 'wpinv_settings' );
46
    }
47
48
    // If that fails, don't fetch the default settings to prevent a loop.
49
    if ( ! is_array( $wpinv_options ) ) {
50
        $wpinv_options = array();
51
    }
52
53
    return $wpinv_options;
54
}
55
56
/**
57
 * Retrieves a single setting.
58
 *
59
 * @param string $key the setting key.
60
 * @param mixed $default The default value to use if the setting has not been set.
61
 * @return mixed
62
 */
63
function wpinv_get_option( $key = '', $default = false ) {
64
65
    $options = wpinv_get_options();
66
    $value   = isset( $options[ $key ] ) ? $options[ $key ] : $default;
67
    $value   = apply_filters( 'wpinv_get_option', $value, $key, $default );
68
69
    return apply_filters( 'wpinv_get_option_' . $key, $value, $key, $default );
70
}
71
72
/**
73
 * Updates all settings.
74
 *
75
 * @param array $options the new options.
76
 * @return bool
77
 */
78
function wpinv_update_options( $options ) {
79
    global $wpinv_options;
80
81
    // update the option.
82
    if ( is_array( $options ) && update_option( 'wpinv_settings', $options ) ) {
83
        $wpinv_options = $options;
84
        return true;
85
    }
86
87
    return false;
88
}
89
90
/**
91
 * Updates a single setting.
92
 *
93
 * @param string $key the setting key.
94
 * @param mixed $value The setting value.
95
 * @return bool
96
 */
97
function wpinv_update_option( $key = '', $value = false ) {
98
99
    // If no key, exit.
100
    if ( empty( $key ) ) {
101
        return false;
102
    }
103
104
    // Maybe delete the option instead.
105
    if ( is_null( $value ) ) {
106
        return wpinv_delete_option( $key );
107
    }
108
109
    // Prepare the new options.
110
    $options         = wpinv_get_options();
111
    $options[ $key ] = apply_filters( 'wpinv_update_option', $value, $key );
112
113
    // Save the new options.
114
    return wpinv_update_options( $options );
115
116
}
117
118
/**
119
 * Deletes a single setting.
120
 *
121
 * @param string $key the setting key.
122
 * @return bool
123
 */
124
function wpinv_delete_option( $key = '' ) {
125
126
    // If no key, exit
127
    if ( empty( $key ) ) {
128
        return false;
129
    }
130
131
    $options = wpinv_get_options();
132
133
    if ( isset( $options[ $key ] ) ) {
134
        unset( $options[ $key ] );
135
        return wpinv_update_options( $options );
136
    }
137
138
    return true;
139
140
}
141
142
/**
143
 * Register settings after admin inits.
144
 *
145
 */
146
function wpinv_register_settings() {
147
148
    // Loop through all tabs.
149
    foreach ( wpinv_get_registered_settings() as $tab => $sections ) {
150
151
        // In each tab, loop through sections.
152
        foreach ( $sections as $section => $settings ) {
153
154
            // Check for backwards compatibility
155
            $section_tabs = wpinv_get_settings_tab_sections( $tab );
156
            if ( ! is_array( $section_tabs ) || ! array_key_exists( $section, $section_tabs ) ) {
157
                $section = 'main';
158
                $settings = $sections;
159
            }
160
161
            // Register the setting section.
162
            add_settings_section(
163
                'wpinv_settings_' . $tab . '_' . $section,
164
                __return_null(),
0 ignored issues
show
Bug introduced by
Are you sure the usage of __return_null() is correct as it seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
165
                '__return_false',
166
                'wpinv_settings_' . $tab . '_' . $section
167
            );
168
169
            foreach ( $settings as $option ) {
170
                if ( ! empty( $option['id'] ) ) {
171
                    wpinv_register_settings_option( $tab, $section, $option );
172
                }
173
            }
174
}
175
    }
176
177
    // Creates our settings in the options table.
178
    register_setting( 'wpinv_settings', 'wpinv_settings', 'wpinv_settings_sanitize' );
0 ignored issues
show
Bug introduced by
'wpinv_settings_sanitize' of type string is incompatible with the type array expected by parameter $args of register_setting(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

178
    register_setting( 'wpinv_settings', 'wpinv_settings', /** @scrutinizer ignore-type */ 'wpinv_settings_sanitize' );
Loading history...
179
}
180
add_action( 'admin_init', 'wpinv_register_settings' );
181
182
/**
183
 * Register a single settings option.
184
 *
185
 * @param string $tab
186
 * @param string $section
187
 * @param string $option
188
 *
189
 */
190
function wpinv_register_settings_option( $tab, $section, $option ) {
191
192
    $name       = isset( $option['name'] ) ? $option['name'] : '';
193
    $cb         = "wpinv_{$option['type']}_callback";
194
    $section    = "wpinv_settings_{$tab}_$section";
195
	$is_wizzard = is_admin() && isset( $_GET['page'] ) && 'gp-setup' == $_GET['page'];
196
197
	if ( isset( $option['desc'] ) && ( ! $is_wizzard && ! empty( $option['help-tip'] ) ) ) {
198
		$tip   = wpinv_clean( $option['desc'] );
199
		$name .= "<span class='dashicons dashicons-editor-help wpi-help-tip' title='$tip'></span>";
200
		unset( $option['desc'] );
201
	}
202
203
    // Loop through all tabs.
204
    add_settings_field(
205
        'wpinv_settings[' . $option['id'] . ']',
206
        $name,
207
        function_exists( $cb ) ? $cb : 'wpinv_missing_callback',
208
        $section,
209
        $section,
210
        array(
211
            'section'         => $section,
212
            'id'              => isset( $option['id'] ) ? $option['id'] : uniqid( 'wpinv-' ),
213
            'desc'            => isset( $option['desc'] ) ? $option['desc'] : '',
214
            'name'            => $name,
215
            'size'            => isset( $option['size'] ) ? $option['size'] : null,
216
            'options'         => isset( $option['options'] ) ? $option['options'] : '',
217
            'selected'        => isset( $option['selected'] ) ? $option['selected'] : null,
218
            'std'             => isset( $option['std'] ) ? $option['std'] : '',
219
            'min'             => isset( $option['min'] ) ? $option['min'] : 0,
220
            'max'             => isset( $option['max'] ) ? $option['max'] : 999999,
221
            'step'            => isset( $option['step'] ) ? $option['step'] : 1,
222
            'placeholder'     => isset( $option['placeholder'] ) ? $option['placeholder'] : null,
223
            'allow_blank'     => isset( $option['allow_blank'] ) ? $option['allow_blank'] : true,
224
            'readonly'        => isset( $option['readonly'] ) ? $option['readonly'] : false,
225
            'faux'            => isset( $option['faux'] ) ? $option['faux'] : false,
226
            'onchange'        => isset( $option['onchange'] ) ? $option['onchange'] : '',
227
            'custom'          => isset( $option['custom'] ) ? $option['custom'] : '',
228
			'default_content' => isset( $option['default_content'] ) ? $option['default_content'] : '',
229
			'class'           => isset( $option['class'] ) ? $option['class'] : '',
230
			'style'           => isset( $option['style'] ) ? $option['style'] : '',
231
            'cols'            => isset( $option['cols'] ) && (int) $option['cols'] > 0 ? (int) $option['cols'] : 50,
232
            'rows'            => isset( $option['rows'] ) && (int) $option['rows'] > 0 ? (int) $option['rows'] : 5,
233
        )
234
    );
235
236
}
237
238
/**
239
 * Returns an array of all registered settings.
240
 *
241
 * @return array
242
 */
243
function wpinv_get_registered_settings() {
244
	return array_filter( apply_filters( 'wpinv_registered_settings', wpinv_get_data( 'admin-settings' ) ) );
245
}
246
247
/**
248
 * Returns an array of all integration settings.
249
 *
250
 * @return array
251
 */
252
function getpaid_get_integration_settings() {
253
    return apply_filters( 'getpaid_integration_settings', array() );
254
}
255
256
/**
257
 * Sanitizes settings before they are saved.
258
 *
259
 * @return array
260
 */
261
function wpinv_settings_sanitize( $input = array() ) {
262
263
	$wpinv_options = wpinv_get_options();
264
	$raw_referrer  = wp_get_raw_referer();
265
266
    if ( empty( $raw_referrer ) ) {
267
		return array_merge( $wpinv_options, $input );
268
    }
269
270
    wp_parse_str( $raw_referrer, $referrer );
271
272
	if ( in_array( 'gp-setup', $referrer ) ) {
273
		return array_merge( $wpinv_options, $input );
274
	}
275
276
    $settings = wpinv_get_registered_settings();
277
    $tab      = isset( $referrer['tab'] ) ? $referrer['tab'] : 'general';
278
    $section  = isset( $referrer['section'] ) ? $referrer['section'] : 'main';
279
280
    $input = $input ? $input : array();
281
    $input = apply_filters( 'wpinv_settings_tab_' . $tab . '_sanitize', $input );
282
    $input = apply_filters( 'wpinv_settings_' . $tab . '-' . $section . '_sanitize', $input );
283
284
    // Loop through each setting being saved and pass it through a sanitization filter
285
    foreach ( $input as $key => $value ) {
286
287
        // Get the setting type (checkbox, select, etc)
288
        $type = isset( $settings[ $tab ][ $section ][ $key ]['type'] ) ? $settings[ $tab ][ $section ][ $key ]['type'] : false;
289
290
        if ( $type ) {
291
            // Field type specific filter
292
            $input[ $key ] = apply_filters( "wpinv_settings_sanitize_$type", $value, $key );
293
        }
294
295
        // General filter
296
		$input[ $key ] = apply_filters( 'wpinv_settings_sanitize', $input[ $key ], $key );
297
298
		// Key specific filter.
299
		$input[ $key ] = apply_filters( "wpinv_settings_sanitize_$key", $input[ $key ] );
300
    }
301
302
    // Loop through the whitelist and unset any that are empty for the tab being saved
303
    $main_settings    = isset( $settings[ $tab ] ) ? $settings[ $tab ] : array(); // Check for extensions that aren't using new sections
304
    $section_settings = ! empty( $settings[ $tab ][ $section ] ) ? $settings[ $tab ][ $section ] : array();
305
306
    $found_settings   = array_merge( $main_settings, $section_settings );
307
308
    if ( ! empty( $found_settings ) ) {
309
        foreach ( $found_settings as $key => $value ) {
310
311
            // settings used to have numeric keys, now they have keys that match the option ID. This ensures both methods work
312
            if ( is_numeric( $key ) ) {
313
                $key = $value['id'];
314
            }
315
316
            if ( ! isset( $input[ $key ] ) && isset( $wpinv_options[ $key ] ) ) {
317
                unset( $wpinv_options[ $key ] );
318
            }
319
        }
320
    }
321
322
    // Merge our new settings with the existing
323
    $output = array_merge( $wpinv_options, $input );
324
325
    add_settings_error( 'wpinv-notices', '', __( 'Settings updated.', 'invoicing' ), 'updated' );
326
327
    return $output;
328
}
329
add_filter( 'wpinv_settings_sanitize_text', 'trim', 10, 1 );
330
add_filter( 'wpinv_settings_sanitize_tax_rate', 'wpinv_sanitize_amount' );
331
332
function wpinv_settings_sanitize_tax_rates( $input ) {
333
    if ( ! wpinv_current_user_can_manage_invoicing() ) {
334
        return $input;
335
    }
336
337
    $new_rates = ! empty( $_POST['tax_rates'] ) ? wp_kses_post_deep( array_values( $_POST['tax_rates'] ) ) : array();
338
    $tax_rates = array();
339
340
    foreach ( $new_rates as $rate ) {
341
342
		$rate['rate']    = wpinv_sanitize_amount( $rate['rate'] );
343
		$rate['name']    = sanitize_text_field( $rate['name'] );
344
		$rate['state']   = sanitize_text_field( $rate['state'] );
345
		$rate['country'] = sanitize_text_field( $rate['country'] );
346
		$rate['global']  = empty( $rate['state'] );
347
		$tax_rates[]     = $rate;
348
349
	}
350
351
    update_option( 'wpinv_tax_rates', $tax_rates );
352
353
    return $input;
354
}
355
add_filter( 'wpinv_settings_taxes-rates_sanitize', 'wpinv_settings_sanitize_tax_rates' );
356
357
function wpinv_settings_sanitize_tax_rules( $input ) {
358
    if ( ! wpinv_current_user_can_manage_invoicing() ) {
359
        return $input;
360
    }
361
362
	if ( empty( $_POST['wpinv_tax_rules_nonce'] ) || ! wp_verify_nonce( $_POST['wpinv_tax_rules_nonce'], 'wpinv_tax_rules' ) ) {
363
		return $input;
364
	}
365
366
    $new_rules = ! empty( $_POST['tax_rules'] ) ? wp_kses_post_deep( array_values( $_POST['tax_rules'] ) ) : array();
367
    $tax_rules = array();
368
369
    foreach ( $new_rules as $rule ) {
370
371
		$rule['key']      = sanitize_title_with_dashes( $rule['key'] );
372
		$rule['label']    = sanitize_text_field( $rule['label'] );
373
		$rule['tax_base'] = sanitize_text_field( $rule['tax_base'] );
374
		$tax_rules[]      = $rule;
375
376
	}
377
378
    update_option( 'wpinv_tax_rules', $tax_rules );
379
380
    return $input;
381
}
382
add_filter( 'wpinv_settings_taxes-rules_sanitize', 'wpinv_settings_sanitize_tax_rules' );
383
384
function wpinv_get_settings_tabs() {
385
    $tabs             = array();
386
    $tabs['general']  = __( 'General', 'invoicing' );
387
    $tabs['gateways'] = __( 'Payment Gateways', 'invoicing' );
388
    $tabs['taxes']    = __( 'Taxes', 'invoicing' );
389
	$tabs['emails']   = __( 'Emails', 'invoicing' );
390
391
	if ( count( getpaid_get_integration_settings() ) > 0 ) {
392
		$tabs['integrations'] = __( 'Integrations', 'invoicing' );
393
	}
394
395
    $tabs['privacy']  = __( 'Privacy', 'invoicing' );
396
    $tabs['misc']     = __( 'Misc', 'invoicing' );
397
    $tabs['tools']    = __( 'Tools', 'invoicing' );
398
399
    return apply_filters( 'wpinv_settings_tabs', $tabs );
400
}
401
402
function wpinv_get_settings_tab_sections( $tab = false ) {
403
    $tabs     = false;
404
    $sections = wpinv_get_registered_settings_sections();
405
406
    if ( $tab && ! empty( $sections[ $tab ] ) ) {
407
        $tabs = $sections[ $tab ];
408
    }
409
410
    return $tabs;
411
}
412
413
function wpinv_get_registered_settings_sections() {
414
    static $sections = false;
415
416
    if ( false !== $sections ) {
417
        return $sections;
418
    }
419
420
    $sections = array(
421
        'general'      => apply_filters(
422
            'wpinv_settings_sections_general',
423
            array(
424
				'main'             => __( 'General Settings', 'invoicing' ),
425
				'page_section'     => __( 'Page Settings', 'invoicing' ),
426
				'currency_section' => __( 'Currency Settings', 'invoicing' ),
427
				'labels'           => __( 'Label Texts', 'invoicing' ),
428
            )
429
        ),
430
        'gateways'     => apply_filters(
431
            'wpinv_settings_sections_gateways',
432
            array(
433
				'main' => __( 'Gateway Settings', 'invoicing' ),
434
            )
435
        ),
436
        'taxes'        => apply_filters(
437
            'wpinv_settings_sections_taxes',
438
            array(
439
				'main'  => __( 'Tax Settings', 'invoicing' ),
440
				'rules' => __( 'Tax Rules', 'invoicing' ),
441
				'rates' => __( 'Tax Rates', 'invoicing' ),
442
				'vat'   => __( 'EU VAT Settings', 'invoicing' ),
443
            )
444
        ),
445
        'emails'       => apply_filters(
446
            'wpinv_settings_sections_emails',
447
            array(
448
				'main' => __( 'Email Settings', 'invoicing' ),
449
            )
450
        ),
451
452
		'integrations' => wp_list_pluck( getpaid_get_integration_settings(), 'label', 'id' ),
453
454
        'privacy'      => apply_filters(
455
            'wpinv_settings_sections_privacy',
456
            array(
457
				'main' => __( 'Privacy policy', 'invoicing' ),
458
            )
459
        ),
460
        'misc'         => apply_filters(
461
            'wpinv_settings_sections_misc',
462
            array(
463
				'main'       => __( 'Miscellaneous', 'invoicing' ),
464
				'custom-css' => __( 'Custom CSS', 'invoicing' ),
465
            )
466
        ),
467
        'tools'        => apply_filters(
468
            'wpinv_settings_sections_tools',
469
            array(
470
				'main' => __( 'Diagnostic Tools', 'invoicing' ),
471
            )
472
        ),
473
    );
474
475
    $sections = apply_filters( 'wpinv_settings_sections', $sections );
476
477
    return $sections;
478
}
479
480
function wpinv_get_pages( $with_slug = false, $default_label = null ) {
481
	$pages_options = array();
482
483
	if ( $default_label !== null && $default_label !== false ) {
484
		$pages_options = array( '' => $default_label ); // Blank option
485
	}
486
487
	$pages = get_pages();
488
	if ( $pages ) {
489
		foreach ( $pages as $page ) {
490
			$title = $with_slug ? $page->post_title . ' (' . $page->post_name . ')' : $page->post_title;
491
            $pages_options[ $page->ID ] = $title;
492
		}
493
	}
494
495
	return $pages_options;
496
}
497
498
function wpinv_header_callback( $args ) {
499
	if ( ! empty( $args['desc'] ) ) {
500
        echo wp_kses_post( $args['desc'] );
501
    }
502
}
503
504
function wpinv_hidden_callback( $args ) {
505
506
	$std     = isset( $args['std'] ) ? $args['std'] : '';
507
	$value   = wpinv_get_option( $args['id'], $std );
508
509
	if ( isset( $args['set_value'] ) ) {
510
		$value = $args['set_value'];
511
	}
512
513
	if ( isset( $args['faux'] ) && true === $args['faux'] ) {
514
		$args['readonly'] = true;
515
		$name  = '';
516
	} else {
517
		$name = 'wpinv_settings[' . esc_attr( $args['id'] ) . ']';
518
	}
519
520
	echo '<input type="hidden" id="wpinv_settings[' . esc_attr( $args['id'] ) . ']" name="' . esc_attr( $name ) . '" value="' . esc_attr( stripslashes( $value ) ) . '" />';
521
522
}
523
524
/**
525
 * Displays a checkbox settings callback.
526
 */
527
function wpinv_checkbox_callback( $args ) {
528
529
	$std = isset( $args['std'] ) ? $args['std'] : '';
530
	$std = wpinv_get_option( $args['id'], $std );
531
	$id  = esc_attr( $args['id'] );
532
533
	getpaid_hidden_field( "wpinv_settings[$id]", '0' );
534
	?>
535
		<fieldset>
536
			<label>
537
				<input id="wpinv-settings-<?php echo esc_attr( $id ); ?>" name="wpinv_settings[<?php echo esc_attr( $id ); ?>]" <?php checked( empty( $std ), false ); ?> value="1" type="checkbox" />
538
				<?php echo wp_kses_post( $args['desc'] ); ?>
539
			</label>
540
		</fieldset>
541
	<?php
542
}
543
544
function wpinv_multicheck_callback( $args ) {
545
546
	$sanitize_id = wpinv_sanitize_key( $args['id'] );
547
	$class = ! empty( $args['class'] ) ? ' ' . esc_attr( $args['class'] ) : '';
548
549
	if ( ! empty( $args['options'] ) ) {
550
551
		$std     = isset( $args['std'] ) ? $args['std'] : array();
552
		$value   = wpinv_get_option( $args['id'], $std );
553
554
		echo '<div class="wpi-mcheck-rows wpi-mcheck-' . esc_attr( $sanitize_id . $class ) . '">';
555
        foreach ( $args['options'] as $key => $option ) :
556
			$sanitize_key = esc_attr( wpinv_sanitize_key( $key ) );
557
			if ( in_array( $sanitize_key, $value ) ) {
558
				$enabled = $sanitize_key;
559
			} else {
560
				$enabled = null;
561
			}
562
			echo '<div class="wpi-mcheck-row"><input name="wpinv_settings[' . esc_attr( $sanitize_id ) . '][' . esc_attr( $sanitize_key ) . ']" id="wpinv_settings[' . esc_attr( $sanitize_id ) . '][' . esc_attr( $sanitize_key ) . ']" type="checkbox" value="' . esc_attr( $sanitize_key ) . '" ' . checked( $sanitize_key, $enabled, false ) . '/>&nbsp;';
563
			echo '<label for="wpinv_settings[' . esc_attr( $sanitize_id ) . '][' . esc_attr( $sanitize_key ) . ']">' . wp_kses_post( $option ) . '</label></div>';
564
		endforeach;
565
		echo '</div>';
566
		echo '<p class="description">' . wp_kses_post( $args['desc'] ) . '</p>';
567
	}
568
}
569
570
function wpinv_payment_icons_callback( $args ) {
571
572
    $sanitize_id = wpinv_sanitize_key( $args['id'] );
573
	$value   = wpinv_get_option( $args['id'], false );
574
575
	if ( ! empty( $args['options'] ) ) {
576
		foreach ( $args['options'] as $key => $option ) {
577
            $sanitize_key = wpinv_sanitize_key( $key );
578
579
			if ( empty( $value ) ) {
580
				$enabled = $option;
581
			} else {
582
				$enabled = null;
583
			}
584
585
			echo '<label for="wpinv_settings[' . esc_attr( $sanitize_id ) . '][' . esc_attr( $sanitize_key ) . ']" style="margin-right:10px;line-height:16px;height:16px;display:inline-block;">';
586
587
				echo '<input name="wpinv_settings[' . esc_attr( $sanitize_id ) . '][' . esc_attr( $sanitize_key ) . ']" id="wpinv_settings[' . esc_attr( $sanitize_id ) . '][' . esc_attr( $sanitize_key ) . ']" type="checkbox" value="' . esc_attr( $option ) . '" ' . checked( $option, $enabled, false ) . '/>&nbsp;';
588
589
				if ( wpinv_string_is_image_url( $key ) ) {
590
				echo '<img class="payment-icon" src="' . esc_url( $key ) . '" style="width:32px;height:24px;position:relative;top:6px;margin-right:5px;"/>';
591
				} else {
592
				$card = strtolower( str_replace( ' ', '', $option ) );
593
594
				if ( has_filter( 'wpinv_accepted_payment_' . $card . '_image' ) ) {
595
					$image = apply_filters( 'wpinv_accepted_payment_' . $card . '_image', '' );
596
					} else {
597
					$image       = wpinv_locate_template( 'images' . DIRECTORY_SEPARATOR . 'icons' . DIRECTORY_SEPARATOR . $card . '.gif', false );
0 ignored issues
show
Bug introduced by
false of type false is incompatible with the type string expected by parameter $template_path of wpinv_locate_template(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

597
					$image       = wpinv_locate_template( 'images' . DIRECTORY_SEPARATOR . 'icons' . DIRECTORY_SEPARATOR . $card . '.gif', /** @scrutinizer ignore-type */ false );
Loading history...
598
					$content_dir = WP_CONTENT_DIR;
599
600
					if ( function_exists( 'wp_normalize_path' ) ) {
601
						// Replaces backslashes with forward slashes for Windows systems
602
						$image = wp_normalize_path( $image );
603
						$content_dir = wp_normalize_path( $content_dir );
604
						}
605
606
					$image = str_replace( $content_dir, content_url(), $image );
607
					}
608
609
				echo '<img class="payment-icon" src="' . esc_url( $image ) . '" style="width:32px;height:24px;position:relative;top:6px;margin-right:5px;"/>';
610
				}
611
			echo wp_kses_post( $option ) . '</label>';
612
		}
613
		echo '<p class="description" style="margin-top:16px;">' . wp_kses_post( $args['desc'] ) . '</p>';
614
	}
615
}
616
617
/**
618
 * Displays a radio settings field.
619
 */
620
function wpinv_radio_callback( $args ) {
621
622
	$std = isset( $args['std'] ) ? $args['std'] : '';
623
	$std = wpinv_get_option( $args['id'], $std );
624
	?>
625
		<fieldset>
626
			<ul id="wpinv-settings-<?php echo esc_attr( $args['id'] ); ?>" style="margin-top: 0;">
627
				<?php foreach ( $args['options'] as $key => $option ) : ?>
628
					<li>
629
						<label>
630
							<input name="wpinv_settings[<?php echo esc_attr( $args['id'] ); ?>]" <?php checked( $std, $key ); ?> value="<?php echo esc_attr( $key ); ?>" type="radio">
631
							<?php echo wp_kses_post( $option ); ?>
632
						</label>
633
					</li>
634
				<?php endforeach; ?>
635
			</ul>
636
		</fieldset>
637
	<?php
638
	getpaid_settings_description_callback( $args );
639
}
640
641
/**
642
 * Displays a description if available.
643
 */
644
function getpaid_settings_description_callback( $args ) {
645
646
	if ( ! empty( $args['desc'] ) ) {
647
		$description = $args['desc'];
648
		echo wp_kses_post( "<p class='description'>$description</p>" );
649
	}
650
651
}
652
653
/**
654
 * Displays a list of available gateways.
655
 */
656
function wpinv_gateways_callback() {
657
658
	?>
659
		</td>
660
	</tr>
661
	<tr class="bsui">
662
    	<td colspan="2" class="p-0">
663
			<?php include plugin_dir_path( __FILE__ ) . 'views/html-gateways-edit.php'; ?>
664
665
	<?php
666
}
667
668
function wpinv_gateway_select_callback( $args ) {
669
670
    $sanitize_id = wpinv_sanitize_key( $args['id'] );
671
    $class = ! empty( $args['class'] ) ? ' ' . esc_attr( $args['class'] ) : '';
672
	$std     = isset( $args['std'] ) ? $args['std'] : '';
673
	$value   = wpinv_get_option( $args['id'], $std );
674
675
	echo '<select name="wpinv_settings[' . esc_attr( $sanitize_id ) . ']"" id="wpinv_settings[' . esc_attr( $sanitize_id ) . ']" class="' . esc_attr( $class ) . '" >';
676
677
	foreach ( $args['options'] as $key => $option ) :
678
679
		echo '<option value="' . esc_attr( $key ) . '" ';
680
681
		if ( isset( $args['selected'] ) && $args['selected'] !== null && $args['selected'] !== false ) {
682
            selected( $key, $args['selected'] );
683
        } else {
684
            selected( $key, $value );
685
        }
686
687
		echo '>' . esc_html( $option['admin_label'] ) . '</option>';
688
	endforeach;
689
690
	echo '</select>';
691
	echo '<label for="wpinv_settings[' . esc_attr( $sanitize_id ) . ']"> ' . wp_kses_post( $args['desc'] ) . '</label>';
692
}
693
694
/**
695
 * Generates attributes.
696
 *
697
 * @param array $args
698
 * @return string
699
 */
700
function wpinv_settings_attrs_helper( $args ) {
701
702
	$value = isset( $args['std'] ) ? $args['std'] : '';
703
	$id    = esc_attr( $args['id'] );
704
	$value = is_scalar( $value ) ? $value : '';
705
706
	$attrs = array(
707
		'name'     => ! empty( $args['faux'] ) ? false : "wpinv_settings[$id]",
708
		'readonly' => ! empty( $args['faux'] ),
709
		'value'    => ! empty( $args['faux'] ) ? $value : wpinv_get_option( $args['id'], $value ),
710
		'id'       => 'wpinv-settings-' . $args['id'],
711
		'style'    => $args['style'],
712
		'class'    => $args['class'],
713
		'placeholder' => $args['placeholder'],
714
		'data-placeholder' => $args['placeholder'],
715
	);
716
717
	if ( ! empty( $args['onchange'] ) ) {
718
		$attrs['onchange'] = $args['onchange'];
719
	}
720
721
	foreach ( $attrs as $key => $value ) {
722
723
		if ( false === $value ) {
724
			continue;
725
		}
726
727
		if ( true === $value ) {
728
			echo ' ' . esc_attr( $key );
729
		} else {
730
			echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
731
		}
732
733
	}
734
735
}
736
737
/**
738
 * Displays a text input settings callback.
739
 */
740
function wpinv_text_callback( $args ) {
741
742
	$desc = empty( $desc ) ? '' : "<p class='description'>$desc</p>";
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $desc seems to never exist and therefore empty should always be true.
Loading history...
743
744
	?>
745
		<label style="width: 100%;">
746
			<input type="text" <?php wpinv_settings_attrs_helper( $args ); ?>>
747
			<?php echo wp_kses_post( $desc ); ?>
748
		</label>
749
	<?php
750
751
}
752
753
/**
754
 * Displays a number input settings callback.
755
 */
756
function wpinv_number_callback( $args ) {
757
758
	$desc = empty( $desc ) ? '' : "<p class='description'>$desc</p>";
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $desc seems to never exist and therefore empty should always be true.
Loading history...
759
760
	?>
761
		<label style="width: 100%;">
762
			<input type="number" step="<?php echo floatval( $args['step'] ); ?>" max="<?php echo intval( $args['max'] ); ?>" min="<?php echo intval( $args['min'] ); ?>" <?php wpinv_settings_attrs_helper( $args ); ?>>
763
			<?php echo wp_kses_post( $desc ); ?>
764
		</label>
765
	<?php
766
767
}
768
769
function wpinv_textarea_callback( $args ) {
770
771
    $sanitize_id = wpinv_sanitize_key( $args['id'] );
772
	$std     = isset( $args['std'] ) ? $args['std'] : '';
773
	$value   = wpinv_get_option( $args['id'], $std );
774
775
    $size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular';
776
    $class = ( isset( $args['class'] ) && ! is_null( $args['class'] ) ) ? $args['class'] : 'large-text';
777
778
	echo '<textarea class="' . esc_attr( $class ) . ' txtarea-' . esc_attr( $size ) . ' wpi-' . esc_attr( sanitize_html_class( $sanitize_id ) ) . ' " cols="' . esc_attr( $args['cols'] ) . '" rows="' . esc_attr( $args['rows'] ) . '" id="wpinv_settings[' . esc_attr( $sanitize_id ) . ']" name="wpinv_settings[' . esc_attr( $args['id'] ) . ']">' . esc_textarea( stripslashes( $value ) ) . '</textarea>';
779
	echo '<br /><label for="wpinv_settings[' . esc_attr( $sanitize_id ) . ']"> ' . wp_kses_post( $args['desc'] ) . '</label>';
780
781
}
782
783
function wpinv_password_callback( $args ) {
784
785
    $sanitize_id = wpinv_sanitize_key( $args['id'] );
786
	$std     = isset( $args['std'] ) ? $args['std'] : '';
787
	$value   = wpinv_get_option( $args['id'], $std );
788
789
	$size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular';
790
	echo '<input type="password" class="' . esc_attr( $size ) . '-text" id="wpinv_settings[' . esc_attr( $sanitize_id ) . ']" name="wpinv_settings[' . esc_attr( $args['id'] ) . ']" value="' . esc_attr( $value ) . '"/>';
791
	echo '<label for="wpinv_settings[' . esc_attr( $sanitize_id ) . ']"> ' . wp_kses_post( $args['desc'] ) . '</label>';
792
793
}
794
795
function wpinv_missing_callback( $args ) {
796
	printf(
797
		esc_html__( 'The callback function used for the %s setting is missing.', 'invoicing' ),
798
		'<strong>' . esc_html( $args['id'] ) . '</strong>'
799
	);
800
}
801
802
/**
803
 * Displays a number input settings callback.
804
 */
805
function wpinv_select_callback( $args ) {
806
807
	$desc   = wp_kses_post( $args['desc'] );
808
	$desc   = empty( $desc ) ? '' : "<p class='description'>$desc</p>";
809
	$value  = isset( $args['std'] ) ? $args['std'] : '';
810
	$value  = wpinv_get_option( $args['id'], $value );
811
	$rand   = uniqid( 'random_id' );
812
813
	?>
814
		<label style="width: 100%;">
815
			<select <?php wpinv_settings_attrs_helper( $args ); ?> data-allow-clear="true">
816
				<?php foreach ( $args['options'] as $option => $name ) : ?>
817
					<option value="<?php echo esc_attr( $option ); ?>" <?php echo selected( $option, $value ); ?>><?php echo esc_html( $name ); ?></option>
818
				<?php endforeach; ?>
819
			</select>
820
821
			<?php if ( substr( $args['id'], -5 ) === '_page' && is_numeric( $value ) ) : ?>
822
				<a href="<?php echo esc_url( get_edit_post_link( $value ) ); ?>" target="_blank" class="button getpaid-page-setting-edit"><?php esc_html_e( 'Edit Page', 'invoicing' ); ?></a>
0 ignored issues
show
Bug introduced by
$value of type string is incompatible with the type WP_Post|integer expected by parameter $id of get_edit_post_link(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

822
				<a href="<?php echo esc_url( get_edit_post_link( /** @scrutinizer ignore-type */ $value ) ); ?>" target="_blank" class="button getpaid-page-setting-edit"><?php esc_html_e( 'Edit Page', 'invoicing' ); ?></a>
Loading history...
823
			<?php endif; ?>
824
825
			<?php if ( substr( $args['id'], -5 ) === '_page' && ! empty( $args['default_content'] ) ) : ?>
826
				&nbsp;<a href="#TB_inline?&width=400&height=550&inlineId=<?php echo esc_attr( $rand ); ?>" class="button thickbox getpaid-page-setting-view-default"><?php esc_html_e( 'View Default Content', 'invoicing' ); ?></a>
827
				<div id='<?php echo esc_attr( $rand ); ?>' style='display:none;'>
828
					<div>
829
						<h3><?php esc_html_e( 'Original Content', 'invoicing' ); ?></h3>
830
						<textarea readonly onclick="this.select()" rows="8" style="width: 100%;"><?php echo wp_kses_post( gepaid_trim_lines( $args['default_content'] ) ); ?></textarea>
831
						<h3><?php esc_html_e( 'Current Content', 'invoicing' ); ?></h3>
832
						<textarea readonly onclick="this.select()" rows="8" style="width: 100%;"><?php $_post = get_post( $value ); echo empty( $_post ) ? '' : wp_kses_post( gepaid_trim_lines( $_post->post_content ) ); ?></textarea>
833
					</div>
834
				</div>
835
			<?php endif; ?>
836
837
			<?php echo wp_kses_post( $desc ); ?>
838
		</label>
839
	<?php
840
841
}
842
843
function wpinv_color_select_callback( $args ) {
844
845
    $sanitize_id = wpinv_sanitize_key( $args['id'] );
846
	$std     = isset( $args['std'] ) ? $args['std'] : '';
847
	$value   = wpinv_get_option( $args['id'], $std );
848
849
	echo '<select id="wpinv_settings[' . esc_attr( $sanitize_id ) . ']" name="wpinv_settings[' . esc_attr( $args['id'] ) . ']"/>';
850
851
	foreach ( $args['options'] as $option => $color ) {
852
		echo '<option value="' . esc_attr( $option ) . '" ' . selected( $option, $value ) . '>' . esc_html( $color['label'] ) . '</option>';
853
	}
854
855
	echo '</select>';
856
	echo '<label for="wpinv_settings[' . esc_attr( $sanitize_id ) . ']"> ' . wp_kses_post( $args['desc'] ) . '</label>';
857
858
}
859
860
function wpinv_rich_editor_callback( $args ) {
861
	global $wp_version;
862
863
    $sanitize_id = wpinv_sanitize_key( $args['id'] );
864
865
	$std     = isset( $args['std'] ) ? $args['std'] : '';
866
	$value   = wpinv_get_option( $args['id'], $std );
867
868
	if ( ! empty( $args['allow_blank'] ) && empty( $value ) ) {
869
		$value = $std;
870
	}
871
872
	$rows = isset( $args['size'] ) ? $args['size'] : 20;
873
874
	echo '<div class="getpaid-settings-editor-input">';
875
	if ( $wp_version >= 3.3 && function_exists( 'wp_editor' ) ) {
876
		wp_editor(
877
            stripslashes( $value ),
878
            'wpinv_settings_' . esc_attr( $args['id'] ),
879
            array(
880
				'textarea_name' => 'wpinv_settings[' . esc_attr( $args['id'] ) . ']',
881
				'textarea_rows' => absint( $rows ),
882
				'media_buttons' => false,
883
            )
884
        );
885
	} else {
886
		echo '<textarea class="large-text" rows="10" id="wpinv_settings[' . esc_attr( $sanitize_id ) . ']" name="wpinv_settings[' . esc_attr( $args['id'] ) . ']" class="wpi-' . esc_attr( sanitize_html_class( $args['id'] ) ) . '">' . esc_textarea( stripslashes( $value ) ) . '</textarea>';
887
	}
888
889
	echo '</div><br/><label for="wpinv_settings[' . esc_attr( $sanitize_id ) . ']"> ' . wp_kses_post( $args['desc'] ) . '</label>';
890
891
}
892
893
function wpinv_upload_callback( $args ) {
894
895
    $sanitize_id = wpinv_sanitize_key( $args['id'] );
896
897
	$std     = isset( $args['std'] ) ? $args['std'] : '';
898
	$value   = wpinv_get_option( $args['id'], $std );
899
900
	$size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular';
901
	echo '<input type="text" class="' . sanitize_html_class( $size ) . '-text" id="wpinv_settings[' . esc_attr( $sanitize_id ) . ']" name="wpinv_settings[' . esc_attr( $args['id'] ) . ']" value="' . esc_attr( stripslashes( $value ) ) . '"/>';
902
	echo '<span>&nbsp;<input type="button" class="wpinv_settings_upload_button button-secondary" value="' . esc_attr__( 'Upload File', 'invoicing' ) . '"/></span>';
903
	echo '<label for="wpinv_settings[' . esc_attr( $sanitize_id ) . ']"> ' . wp_kses_post( $args['desc'] ) . '</label>';
904
905
}
906
907
function wpinv_color_callback( $args ) {
908
909
	$std         = isset( $args['std'] ) ? $args['std'] : '';
910
	$value       = wpinv_get_option( $args['id'], $std );
911
    $sanitize_id = wpinv_sanitize_key( $args['id'] );
912
913
	echo '<input type="text" class="wpinv-color-picker" id="wpinv_settings[' . esc_attr( $sanitize_id ) . ']" name="wpinv_settings[' . esc_attr( $args['id'] ) . ']" value="' . esc_attr( $value ) . '" data-default-color="' . esc_attr( $std ) . '" />';
914
	echo '<label for="wpinv_settings[' . esc_attr( $sanitize_id ) . ']"> ' . wp_kses_post( $args['desc'] ) . '</label>';
915
916
}
917
918
function wpinv_country_states_callback( $args ) {
919
920
	$std     = isset( $args['std'] ) ? $args['std'] : '';
921
	$value   = wpinv_get_option( $args['id'], $std );
922
923
    $sanitize_id = wpinv_sanitize_key( $args['id'] );
924
925
	if ( isset( $args['placeholder'] ) ) {
926
		$placeholder = $args['placeholder'];
927
	} else {
928
		$placeholder = '';
929
	}
930
931
	$states = wpinv_get_country_states();
932
933
	$class = empty( $states ) ? 'wpinv-no-states' : 'wpi_select2';
934
	echo '<select id="wpinv_settings[' . esc_attr( $sanitize_id ) . ']" name="wpinv_settings[' . esc_attr( $args['id'] ) . ']" class="' . esc_attr( $class ) . '" data-placeholder="' . esc_html( $placeholder ) . '"/>';
935
936
	foreach ( $states as $option => $name ) {
937
		echo '<option value="' . esc_attr( $option ) . '" ' . selected( $option, $value ) . '>' . esc_html( $name ) . '</option>';
938
	}
939
940
	echo '</select>';
941
	echo '<label for="wpinv_settings[' . esc_attr( $sanitize_id ) . ']"> ' . wp_kses_post( $args['desc'] ) . '</label>';
942
943
}
944
945
/**
946
 * Displays the tax rates edit table.
947
 */
948
function wpinv_tax_rates_callback() {
949
950
	?>
951
		</td>
952
	</tr>
953
	<tr class="bsui">
954
    	<td colspan="2" class="p-0">
955
			<?php include plugin_dir_path( __FILE__ ) . 'views/html-tax-rates-edit.php'; ?>
956
957
	<?php
958
959
}
960
961
/**
962
 * Displays a tax rate' edit row.
963
 */
964
function wpinv_tax_rate_callback( $tax_rate, $key ) {
965
966
	$key                      = sanitize_key( $key );
967
	$tax_rate['reduced_rate'] = empty( $tax_rate['reduced_rate'] ) ? 0 : $tax_rate['reduced_rate'];
968
	include plugin_dir_path( __FILE__ ) . 'views/html-tax-rate-edit.php';
969
970
}
971
972
/**
973
 * Displays the tax rules edit table.
974
 */
975
function wpinv_tax_rules_callback() {
976
977
	?>
978
		</td>
979
	</tr>
980
	<tr class="bsui">
981
    	<td colspan="2" class="p-0">
982
			<?php include plugin_dir_path( __FILE__ ) . 'views/html-tax-rules-edit.php'; ?>
983
984
	<?php
985
986
}
987
988
function wpinv_tools_callback( $args ) {
989
    ?>
990
    </td><tr>
991
    <td colspan="2" class="wpinv_tools_tdbox">
992
    <?php
993
    if ( $args['desc'] ) {
994
?>
995
<p><?php echo wp_kses_post( $args['desc'] ); ?></p><?php } ?>
996
    <?php do_action( 'wpinv_tools_before' ); ?>
997
    <table id="wpinv_tools_table" class="wp-list-table widefat fixed posts">
998
        <thead>
999
            <tr>
1000
                <th scope="col" class="wpinv-th-tool"><?php esc_html_e( 'Tool', 'invoicing' ); ?></th>
1001
                <th scope="col" class="wpinv-th-desc"><?php esc_html_e( 'Description', 'invoicing' ); ?></th>
1002
                <th scope="col" class="wpinv-th-action"><?php esc_html_e( 'Action', 'invoicing' ); ?></th>
1003
            </tr>
1004
        </thead>
1005
1006
        <tbody>
1007
			<tr>
1008
                <td><?php esc_html_e( 'Check Pages', 'invoicing' ); ?></td>
1009
                <td>
1010
                    <small><?php esc_html_e( 'Creates any missing GetPaid pages.', 'invoicing' ); ?></small>
1011
                </td>
1012
                <td>
1013
					<a href="
1014
                    <?php
1015
						echo esc_url(
1016
							wp_nonce_url(
1017
								add_query_arg( 'getpaid-admin-action', 'create_missing_pages' ),
1018
								'getpaid-nonce',
1019
								'getpaid-nonce'
1020
							)
1021
						);
1022
					?>
1023
                    " class="button button-primary"><?php esc_html_e( 'Run', 'invoicing' ); ?></a>
1024
                </td>
1025
            </tr>
1026
			<tr>
1027
                <td><?php esc_html_e( 'Create Database Tables', 'invoicing' ); ?></td>
1028
                <td>
1029
                    <small><?php esc_html_e( 'Run this tool to create any missing database tables.', 'invoicing' ); ?></small>
1030
                </td>
1031
                <td>
1032
					<a href="
1033
                    <?php
1034
						echo esc_url(
1035
							wp_nonce_url(
1036
								add_query_arg( 'getpaid-admin-action', 'create_missing_tables' ),
1037
								'getpaid-nonce',
1038
								'getpaid-nonce'
1039
							)
1040
						);
1041
					?>
1042
                    " class="button button-primary"><?php esc_html_e( 'Run', 'invoicing' ); ?></a>
1043
                </td>
1044
            </tr>
1045
			<tr>
1046
                <td><?php esc_html_e( 'Migrate old invoices', 'invoicing' ); ?></td>
1047
                <td>
1048
                    <small><?php esc_html_e( 'If your old invoices were not migrated after updating from Invoicing to GetPaid, you can use this tool to migrate them.', 'invoicing' ); ?></small>
1049
                </td>
1050
                <td>
1051
					<a href="
1052
                    <?php
1053
						echo esc_url(
1054
							wp_nonce_url(
1055
								add_query_arg( 'getpaid-admin-action', 'migrate_old_invoices' ),
1056
								'getpaid-nonce',
1057
								'getpaid-nonce'
1058
							)
1059
						);
1060
					?>
1061
                    " class="button button-primary"><?php esc_html_e( 'Run', 'invoicing' ); ?></a>
1062
                </td>
1063
            </tr>
1064
1065
			<tr>
1066
                <td><?php esc_html_e( 'Recalculate Discounts', 'invoicing' ); ?></td>
1067
                <td>
1068
                    <small><?php esc_html_e( 'Recalculate discounts for existing invoices that have discount codes but are not discounted.', 'invoicing' ); ?></small>
1069
                </td>
1070
                <td>
1071
					<a href="
1072
                    <?php
1073
						echo esc_url(
1074
							wp_nonce_url(
1075
								add_query_arg( 'getpaid-admin-action', 'recalculate_discounts' ),
1076
								'getpaid-nonce',
1077
								'getpaid-nonce'
1078
							)
1079
						);
1080
					?>
1081
                    " class="button button-primary"><?php esc_html_e( 'Run', 'invoicing' ); ?></a>
1082
                </td>
1083
            </tr>
1084
1085
			<tr>
1086
                <td><?php esc_html_e( 'Set-up Wizard', 'invoicing' ); ?></td>
1087
                <td>
1088
                    <small><?php esc_html_e( 'Launch the quick set-up wizard.', 'invoicing' ); ?></small>
1089
                </td>
1090
                <td>
1091
					<a href="
1092
                    <?php
1093
						echo esc_url( admin_url( 'index.php?page=gp-setup' ) );
1094
					?>
1095
                    " class="button button-primary"><?php esc_html_e( 'Launch', 'invoicing' ); ?></a>
1096
                </td>
1097
            </tr>
1098
1099
			<?php do_action( 'wpinv_tools_row' ); ?>
1100
        </tbody>
1101
    </table>
1102
    <?php do_action( 'wpinv_tools_after' ); ?>
1103
    <?php
1104
}
1105
1106
1107
function wpinv_descriptive_text_callback( $args ) {
1108
	echo wp_kses_post( $args['desc'] );
1109
}
1110
1111
function wpinv_raw_html_callback( $args ) {
1112
	echo wp_kses( $args['desc'], getpaid_allowed_html() );
1113
}
1114
1115
function wpinv_hook_callback( $args ) {
1116
	do_action( 'wpinv_' . $args['id'], $args );
1117
}
1118
1119
function wpinv_set_settings_cap() {
1120
	return wpinv_get_capability();
1121
}
1122
add_filter( 'option_page_capability_wpinv_settings', 'wpinv_set_settings_cap' );
1123
1124
1125
function wpinv_on_update_settings( $old_value, $value, $option ) {
1126
    $old = ! empty( $old_value['remove_data_on_unistall'] ) ? 1 : '';
1127
    $new = ! empty( $value['remove_data_on_unistall'] ) ? 1 : '';
1128
1129
    if ( $old != $new ) {
1130
        update_option( 'wpinv_remove_data_on_invoice_unistall', $new );
1131
    }
1132
}
1133
add_action( 'update_option_wpinv_settings', 'wpinv_on_update_settings', 10, 3 );
1134
1135
/**
1136
 * Returns the merge tags help text.
1137
 *
1138
 * @since    2.1.8
1139
 *
1140
 * @return string
1141
 */
1142
function wpinv_get_merge_tags_help_text( $subscription = false ) {
1143
1144
	$url  = $subscription ? 'https://gist.github.com/picocodes/3d213982d57c34edf7a46fd3f0e8583e' : 'https://gist.github.com/picocodes/43bdc4d4bbba844534b2722e2af0b58f';
1145
	$link = sprintf(
1146
		'<strong><a href="%s" target="_blank">%s</a></strong>',
1147
		$url,
1148
		esc_html__( 'View available merge tags.', 'wpinv-quotes' )
1149
	);
1150
1151
	$description = esc_html__( 'The content of the email (Merge Tags and HTML are allowed).', 'invoicing' );
1152
1153
	return "$description $link";
1154
1155
}
1156