• File: settings-api.php
  • Full Path: /home/matthif/www/wp-content/plugins/wpforms-lite/includes/admin/settings-api.php
  • Date Modified: 02/16/2024 11:45 AM
  • File size: 19.46 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php
/**
 * Settings API.
 *
 * @since 1.3.7
 */

use WPForms\Admin\Education\Helpers as EducationHelpers;

/**
 * Settings output wrapper.
 *
 * @since 1.3.9
 *
 * @param array $args
 *
 * @return string
 */
function wpforms_settings_output_field$args ) {

    
// Define default callback for this field type.
    
$callback = ! empty( $args['type'] ) && function_exists'wpforms_settings_' $args['type'] . '_callback' ) ? 'wpforms_settings_' $args['type'] . '_callback' 'wpforms_settings_missing_callback';

    
// Allow custom callback to be provided via arg.
    
if ( ! empty( $args['callback'] ) && function_exists$args['callback'] ) ) {
        
$callback $args['callback'];
    }

    
// Store returned markup from callback.
    
$field call_user_func$callback$args );

    
// Allow arg to bypass standard field wrap for custom display.
    
if ( ! empty( $args['wrap'] ) ) {
        return 
$field;
    }

    
// Default class names.
    
$class = [
        
'wpforms-setting-row',
        
"wpforms-setting-row-{$args['type']}",
        
'wpforms-clear',
    ];

    
// Row attributes.
    
$wrapper_attributes wpforms_html_attributes(
        
'wpforms-setting-row-' wpforms_sanitize_key$args['id'] ),
        ! empty( 
$args['class'] ) ? array_merge$class, (array) $args['class'] ) : $class,
        ! empty( 
$args['data_attributes'] ) && is_array$args['data_attributes'] ) ? $args['data_attributes'] : [],
        ! empty( 
$args['is_hidden'] ) ? [ 'style' => 'display:none;' ] : []
    );

    
// Build standard field markup and return.
    
$output "<div {$wrapper_attributes}>";

    if ( ! empty( 
$args['name'] ) && empty( $args['no_label'] ) ) {
        
$output .= '<span class="wpforms-setting-label">';
        
$output .= '<label for="wpforms-setting-' wpforms_sanitize_key$args['id'] ) . '">' esc_html$args['name'] );

        
// Add education badge, if needed.
        // The badge should be added after the label text, but before the label closing tag.
        
if ( ! empty( $args['education_badge'] ) ) {
            
$output .= wp_kses$args['education_badge'], [ 'span' => [ 'class' => [] ] ] );
        }

        
$output .= '</label>';
        
$output .= '</span>';
    }

    
$output .= '<span class="wpforms-setting-field">';
    
$output .= $field;
    if ( ! empty( 
$args['desc_after'] ) ) {
        
$output .= '<div class="wpforms-clear">' $args['desc_after'] . '</div>';
    }
    
$output .= '</span>';

    
$output .= '</div>';

    return 
$output;
}

/**
 * Missing Callback.
 *
 * If a function is missing for settings callbacks alert the user.
 *
 * @since 1.3.9
 *
 * @param array $args Arguments passed by the setting.
 *
 * @return string
 */
function wpforms_settings_missing_callback$args ) {

    return 
sprintf(
        
/* translators: %s - ID of a setting. */
        
esc_html__'The callback function used for the %s setting is missing.''wpforms-lite' ),
        
'<strong>' wpforms_sanitize_key$args['id'] ) . '</strong>'
    
);
}

/**
 * Settings content field callback.
 *
 * @since 1.3.9
 *
 * @param array $args
 *
 * @return string
 */
function wpforms_settings_content_callback$args ) {
    return ! empty( 
$args['content'] ) ? $args['content'] : '';
}

/**
 * Settings license field callback.
 *
 * @since 1.3.9
 *
 * @param array $args Settings arguments.
 *
 * @return string
 */
function wpforms_settings_license_callback$args ) {

    
$output  '<p>' esc_html__'You\'re using WPForms Lite - no license needed. Enjoy!''wpforms-lite' ) . ' ðŸ™‚</p>';
    
$output .=
        
'<p>' .
        
sprintf(
            
wp_kses/* translators: %s - WPForms.com upgrade URL. */
                
__'To unlock more features consider <strong><a href="%s" target="_blank" rel="noopener noreferrer" class="wpforms-upgrade-modal">upgrading to PRO</a></strong>.''wpforms-lite' ),
                [
                    
'a'      => [
                        
'href'   => [],
                        
'class'  => [],
                        
'target' => [],
                        
'rel'    => [],
                    ],
                    
'strong' => [],
                ]
            ),
            
esc_urlwpforms_admin_upgrade_link'settings-license''Upgrade to WPForms Pro text Link' ) )
        ) .
        
'</p>';
    
$output .=
        
'<p class="discount-note">' .
            
wp_kses(
                
__'As a valued WPForms Lite user you receive <strong>50% off</strong>, automatically applied at checkout!''wpforms-lite' ),
                [
                    
'strong' => [],
                ]
            ) .
        
'</p>';

    
$output .= '<hr><p>' esc_html__'Already purchased? Simply enter your license key below to enable WPForms PRO!''wpforms-lite' ) . '</p>';
    
$output .= '<p>';
    
$output .= '<input type="password" spellcheck="false" id="wpforms-settings-upgrade-license-key" placeholder="' esc_attr__'Paste license key here''wpforms-lite' ) . '" value="">';
    
$output .= '<button class="wpforms-btn wpforms-btn-md wpforms-btn-blue" id="wpforms-settings-connect-btn">' esc_html__'Verify Key''wpforms-lite' ) . '</button>';
    
$output .= '</p>';

    
/**
     * Filter license settings HTML output.
     *
     * @since 1.7.9
     *
     * @param string $output HTML markup to be rendered in place of license settings.
     */
    
return apply_filters'wpforms_settings_license_output'$output );
}

/**
 * Settings text input field callback.
 *
 * @since 1.3.9
 *
 * @param array $args Settings arguments.
 *
 * @return string
 */
function wpforms_settings_text_callback$args ) {

    if ( ! 
in_array$args['type'], [ 'text''password' ], true ) ) {
        
$args['type'] = 'text';
    }

    
$default = isset( $args['default'] ) ? esc_html$args['default'] ) : '';
    
$value   wpforms_setting$args['id'], $default );
    
$id      wpforms_sanitize_key$args['id'] );

    
$output '<input type="' esc_attr$args['type'] ) . '" id="wpforms-setting-' $id '" name="' $id '" value="' esc_attr$value ) . '">';

    if ( ! empty( 
$args['desc'] ) ) {
        
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
    }

    return 
$output;
}

/**
 * Settings password input field callback.
 *
 * @since 1.8.4
 *
 * @param array $args Setting field arguments.
 *
 * @return string
 */
function wpforms_settings_password_callback$args ) {

    return 
wpforms_settings_text_callback$args );
}

/**
 * Settings number input field callback.
 *
 * @since 1.5.3
 *
 * @param array $args Setting field arguments.
 *
 * @return string
 */
function wpforms_settings_number_callback$args ) {

    
$default = isset( $args['default'] ) ? esc_html$args['default'] ) : '';
    
$id      'wpforms-setting-' wpforms_sanitize_key$args['id'] );
    
$attr    = [
        
'value' => wpforms_setting$args['id'], $default ),
        
'name'  => wpforms_sanitize_key$args['id'] ),
    ];
    
$data    = ! empty( $args['data'] ) ? $args['data'] : [];

    if ( ! empty( 
$args['attr'] ) ) {
        
$attr array_merge$attr$args['attr'] );
    }

    
$output sprintf(
        
'<input type="number" %s>',
        
wpforms_html_attributes$id, [], $data$attr )
    );

    if ( ! empty( 
$args['desc'] ) ) {
        
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
    }

    return 
$output;
}

/**
 * Settings select field callback.
 *
 * @since 1.3.9
 *
 * @param array $args
 *
 * @return string
 */
function wpforms_settings_select_callback$args ) {

    
$default     = isset( $args['default'] ) ? esc_html$args['default'] ) : '';
    
$value       wpforms_setting$args['id'], $default );
    
$id          wpforms_sanitize_key$args['id'] );
    
$select_name $id;
    
$class       = ! empty( $args['choicesjs'] ) ? 'choicesjs-select' '';
    
$choices     = ! empty( $args['choicesjs'] ) ? true false;
    
$data        = isset( $args['data'] ) ? (array) $args['data'] : [];
    
$attr        = isset( $args['attr'] ) ? (array) $args['attr'] : [];

    if ( 
$choices && ! empty( $args['search'] ) ) {
        
$data['search'] = 'true';
    }

    if ( ! empty( 
$args['placeholder'] ) ) {
        
$data['placeholder'] = $args['placeholder'];
    }

    
$size_attr '';

    if ( 
$choices && ! empty( $args['multiple'] ) ) {
        
$attr[]      = 'multiple';
        
$select_name $id '[]';
        
$size_attr   ' size="1"';
    }

    foreach ( 
$data as $name => $val ) {
        
$data$name ] = 'data-' sanitize_html_class$name ) . '="' esc_attr$val ) . '"';
    }

    
$data implode' '$data );
    
$attr implode' 'array_map'sanitize_html_class'$attr ) );

    
$output  $choices '<span class="choicesjs-select-wrap">' '';
    
$output .= '<select id="wpforms-setting-' $id '" name="' $select_name '" class="' $class '"' $data $attr $size_attr '>';

    foreach ( 
$args['options'] as $option => $name ) {
        if ( empty( 
$args['selected'] ) ) {
            
$selected selected$value$optionfalse );
        } else {
            
$selected is_array$args['selected'] ) && in_array$option$args['selected'], true ) ? 'selected' '';
        }
        
$output .= '<option value="' esc_attr$option ) . '" ' $selected '>' esc_html$name ) . '</option>';
    }

    
$output .= '</select>';
    
$output .= $choices '</span>' '';

    if ( ! empty( 
$args['desc'] ) ) {
        
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
    }

    return 
$output;
}

/**
 * Settings checkbox field callback.
 *
 * @since 1.3.9
 *
 * @param array $args
 *
 * @return string
 */
function wpforms_settings_checkbox_callback$args ) {

    
$value    wpforms_setting$args['id'] );
    
$id       wpforms_sanitize_key$args['id'] );
    
$checked  = ! empty( $value ) ? checked1$valuefalse ) : '';
    
$disabled = ! empty( $args['disabled'] ) ? ' disabled' '';

    
$output '<input type="checkbox" id="wpforms-setting-' $id '" name="' $id '" ' $checked $disabled '>';

    if ( ! empty( 
$args['desc'] ) ) {
        
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
    }

    if ( ! empty( 
$args['disabled_desc'] ) ) {
        
$output .= '<p class="disabled-desc">' wp_kses_post$args['disabled_desc'] ) . '</p>';
    }

    return 
$output;
}

/**
 * Settings radio field callback.
 *
 * @since 1.3.9
 *
 * @param array $args
 *
 * @return string
 */
function wpforms_settings_radio_callback$args ) {

    
$default = isset( $args['default'] ) ? esc_html$args['default'] ) : '';
    
$value   wpforms_setting$args['id'], $default );
    
$id      wpforms_sanitize_key$args['id'] );
    
$output  '';
    
$x       1;

    foreach ( 
$args['options'] as $option => $name ) {

        
$checked checked$value$optionfalse );
        
$output .= '<span class="wpforms-settings-field-radio-wrapper">';
        
$output .= '<input type="radio" id="wpforms-setting-' $id '[' $x ']" name="' $id '" value="' esc_attr$option ) . '" ' $checked '>';
        
$output .= '<label for="wpforms-setting-' $id '[' $x ']" class="option-' sanitize_html_class$option ) . '">';
        
$output .= esc_html$name );
        
$output .= '</label>';
        
$output .= '</span>';

        
$x ++;
    }

    if ( ! empty( 
$args['desc'] ) ) {
        
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
    }

    return 
$output;
}

/**
 * Email template endpoint field callback.
 *
 * @since 1.8.5
 *
 * @param array $args Field arguments.
 *
 * @return string
 */
function wpforms_settings_email_template_callback$args ) {

    
$id             wpforms_sanitize_key$args['id'] );
    
$is_pro         wpforms()->is_pro();
    
$output         '';
    
$x              1;
    
$education_args = [
        
'name'   => esc_html__'Email Templates''wpforms-lite' ),
        
'plural' => '1',
        
'action' => 'upgrade',
    ];

    foreach ( 
$args['options'] as $option => $attrs ) {
        
$checked       checked$args['value'], $optionfalse );
        
$has_education = ! $is_pro && isset( $attrs['is_pro'] ) && $attrs['is_pro'];
        
$class         = [ 'wpforms-settings-field-radio-wrapper''wpforms-card-image' ];
        
$datas         = [];

        
// Add class and data attributes for education modal, if needed.
        
if ( $has_education ) {
            
$class[] = 'education-modal'// This class is used for JS.
            
$datas   $education_args// This data is used for JS.
        
}

        
$output .= '<span ' wpforms_html_attributes''$class$datas ) . '>';
        
$output .= '<input type="radio" id="wpforms-setting-' $id '[' $x ']" name="' $id '" value="' esc_attr$option ) . '" ' $checked '>';
        
$output .= '<label for="wpforms-setting-' $id '[' $x ']" class="option-' sanitize_html_class$option ) . '">';
        
$output .= esc_html$attrs['name'] );

        
// Add class and data attributes for education modal, if needed.
        
if ( $has_education ) {
            
$output .= EducationHelpers::get_badge'Pro' );
        }

        
$output .= '<span class="wpforms-card-image-overlay">';
        
$output .= '<span class="wpforms-btn-choose wpforms-btn wpforms-btn-md wpforms-btn-orange">';
        
$output .= esc_html__'Choose''wpforms-lite' ) . '</span>';

        
// Only add the preview action button if provided.
        
if ( ! empty( $attrs['preview'] ) ) {
            
$output .= '<a href="' esc_url$attrs['preview'] ) . '" class="wpforms-btn-preview wpforms-btn wpforms-btn-md wpforms-btn-light-grey" target="_blank">';
            
$output .= esc_html__'Preview''wpforms-lite' );
            
$output .= '</a>';
        }

        
$output .= '</span>';
        
$output .= '</label>';
        
$output .= '</span>';

        ++
$x;
    }

    if ( ! empty( 
$args['desc'] ) ) {
        
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
    }

    return 
$output;
}

/**
 * Settings toggle field callback.
 *
 * @since 1.7.4
 *
 * @param array $args Arguments.
 *
 * @return string
 */
function wpforms_settings_toggle_callback$args ) {

    
$value      wpforms_setting$args['id'] );
    
$id         wpforms_sanitize_key$args['id'] );
    
$class      = ! empty( $args['control-class'] ) ? $args['control-class'] : '';
    
$class     .= ! empty( $args['is-important'] ) ? ' wpforms-important' '';
    
$input_attr = ! empty( $args['input-attr'] ) ? $args['input-attr'] : '';

    
$default_args = [
        
'control-class' => $class,
    ];

    
$args wp_parse_args$args$default_args );

    
$output wpforms_panel_field_toggle_control(
        
$args,
        
'wpforms-setting-' $id,
        
$id,
        ! empty( 
$args['label'] ) ? $args['label'] : '',
        
$value,
        
$input_attr
    
);

    
$desc_on  = ! empty( $args['desc'] ) ? $args['desc'] : '';
    
$desc_on  = ! empty( $args['desc-on'] ) ? $args['desc-on'] : $desc_on;
    
$desc_off = ! empty( $args['desc-off'] ) ? $args['desc-off'] : '';

    
$output .= sprintf(
        
'<p class="desc desc-on wpforms-toggle-desc%1$s">%2$s</p>',
        empty( 
$value ) && ! empty( $desc_off ) ? ' wpforms-hidden' '',
        
wp_kses_post$desc_on )
    );

    if ( ! empty( 
$desc_off ) ) {
        
$output .= sprintf(
            
'<p class="desc desc-off wpforms-toggle-desc%1$s">%2$s</p>',
            empty( 
$value ) ? '' ' wpforms-hidden',
            
wp_kses_post$desc_off )
        );
    }

    return 
$output;
}

/**
 * Settings image upload field callback.
 *
 * @since 1.3.9
 *
 * @param array $args Arguments.
 *
 * @return string
 */
function wpforms_settings_image_callback$args ) {

    
$default = isset( $args['default'] ) ? esc_html$args['default'] ) : '';
    
$value   wpforms_setting$args['id'], $default );
    
$id      wpforms_sanitize_key$args['id'] );
    
$output  '';

    if ( ! empty( 
$value ) ) {
        
$output .= '<img src="' esc_url_raw$value ) . '">';
    }

    
$output .= '<input type="text" id="wpforms-setting-' $id '" name="' $id '" value="' esc_url_raw$value ) . '">';

    
// Show the remove button if specified.
    
if ( isset( $args['show_remove'] ) && $args['show_remove'] ) {
        
$output .= '<button class="wpforms-btn wpforms-btn-md wpforms-setting-remove-image">' esc_html__'Remove Image''wpforms-lite' ) . '</button>';
    }

    
$output .= '<button class="wpforms-btn wpforms-btn-md wpforms-btn-light-grey wpforms-setting-upload-image">' esc_html__'Upload Image''wpforms-lite' ) . '</button>';

    if ( ! empty( 
$args['desc'] ) ) {
        
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
    }

    return 
$output;
}

/**
 * Settings color picker field callback.
 *
 * @since 1.3.9
 *
 * @param array $args
 *
 * @return string
 */
function wpforms_settings_color_callback$args ) {

    
$default = isset( $args['default'] ) ? esc_html$args['default'] ) : '';
    
$value   wpforms_setting$args['id'], $default );
    
$id      wpforms_sanitize_key$args['id'] );
    
$data    = isset( $args['data'] ) ? (array) $args['data'] : [];

    foreach ( 
$data as $name => $val ) {
        
$data$name ] = 'data-' sanitize_html_class$name ) . '="' esc_attr$val ) . '"';
    }

    
$data implode' '$data );

    
$output '<input type="text" id="wpforms-setting-' $id '" class="wpforms-color-picker" name="' $id '" value="' esc_attr$value ) . '" ' $data '>';

    if ( ! empty( 
$args['desc'] ) ) {
        
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
    }

    return 
$output;
}

/**
 * Color scheme endpoint fieldset callback.
 * This function will output a fieldset with color picker inputs.
 *
 * @since 1.8.5
 *
 * @param array $args Field arguments.
 *
 * @return string
 */
function wpforms_settings_color_scheme_callback$args ) {

    
$id     wpforms_sanitize_key$args['id'] );
    
$value  wpforms_setting$args['id'], [] );
    
$output '';

    foreach ( 
$args['colors'] as $color => $attrs ) {
        
$data             = isset( $attrs['data'] ) ? (array) $attrs['data'] : [];
        
$default_value    = isset( $data['fallback-color'] ) ? wpforms_sanitize_hex_color$data['fallback-color'] ) : '';
        
$field_id         "{$id}-{$color}";
        
$field_value      = isset( $value$color ] ) ? wpforms_sanitize_hex_color$value$color ] ) : $default_value;
        
$input_attributes wpforms_html_attributes(
            
"wpforms-setting-{$field_id}",
            [ 
'wpforms-color-picker' ],
            
$data,
            [
                
'type'  => 'text',
                
'name'  => "{$id}[{$color}]",
                
'value' => esc_attr$field_value ),
            ]
        );

        
$output .= "<input {$input_attributes}>";
        
$output .= '<label for="wpforms-setting-' $field_id '">';
        
$output .= esc_html$attrs['name'] );
        
$output .= '</label>';
    }

    if ( ! empty( 
$args['desc'] ) ) {
        
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
    }

    return 
$output;
}

/**
 * Settings providers field callback - this is for the Integrations tab.
 *
 * @since 1.3.9
 *
 * @param array $args
 *
 * @return string
 */
function wpforms_settings_providers_callback$args ) {

    
$active    wpforms_get_providers_available();
    
$providers wpforms_get_providers_options();

    
$output '<div id="wpforms-settings-providers">';

    
ob_start();
    
do_action'wpforms_settings_providers'$active$providers );
    
$output .= ob_get_clean();

    
$output .= '</div>';

    return 
$output;
}

/**
 * Webhooks' endpoint field callback.
 *
 * @since 1.8.4
 *
 * @param array $args Field arguments.
 *
 * @return string
 */
function wpforms_settings_webhook_endpoint_callback$args ) {

    
$output '';

    if ( ! empty( 
$args['url'] ) ) {
        
$output  '<div class="wpforms-stripe-webhook-endpoint-url">';
        
$output .= '<input type="text" disabled id="wpforms-stripe-webhook-endpoint-url" value="' esc_url_raw$args['url'] ) . '" />';
        
$output .= '<a class="button button-secondary wpforms-copy-to-clipboard" data-clipboard-target="#wpforms-stripe-webhook-endpoint-url" href="" ><span class="dashicons dashicons-admin-page"></span></a>';
        
$output .= '</div>';

        if ( ! empty( 
$args['desc'] ) ) {
            
$output .= '<p class="desc">' wp_kses_post$args['desc'] ) . '</p>';
        }
    }

    return 
$output;
}

/**
 * Settings field columns callback.
 *
 * @since 1.5.8
 *
 * @param array $args Arguments passed by the setting.
 *
 * @return string
 */
function wpforms_settings_columns_callback$args ) {

    if ( empty( 
$args['columns'] ) || ! is_array$args['columns'] ) ) {
        return 
'';
    }

    
$output '<div class="wpforms-setting-columns">';

    foreach ( 
$args['columns'] as $column ) {

        
// Define default callback for this field type.
        
$callback = ! empty( $column['type'] ) ? 'wpforms_settings_' $column['type'] . '_callback' '';

        
// Allow custom callback to be provided via arg.
        
if ( ! empty( $column['callback'] ) ) {
            
$callback $column['callback'];
        }

        
$output .= '<div class="wpforms-setting-column">';

        if ( ! empty( 
$column['name'] ) ) {
            
$output .= '<label><b>' wp_kses_post$column['name'] ) . '</b></label>';
        }

        if ( 
function_exists$callback ) ) {
            
$output .= call_user_func$callback$column );
        }

        
$output .= '</div>';
    }

    
$output .= '</div>';

    return 
$output;
}