save_settings(); // Determine the current active settings tab. $this->view = isset( $_GET['view'] ) ? sanitize_key( wp_unslash( $_GET['view'] ) ) : 'general'; // phpcs:ignore WordPress.CSRF.NonceVerification add_action( 'admin_enqueue_scripts', array( $this, 'enqueues' ) ); add_action( 'wpforms_admin_page', array( $this, 'output' ) ); // Monitor custom tables. $this->monitor_custom_tables(); // Hook for addons. do_action( 'wpforms_settings_init', $this ); } /** * Sanitize and save settings. * * @since 1.3.9 */ public function save_settings() { // Check nonce and other various security checks. if ( ! isset( $_POST['wpforms-settings-submit'] ) || empty( $_POST['nonce'] ) ) { return; } if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wpforms-settings-nonce' ) ) { return; } if ( ! wpforms_current_user_can() ) { return; } if ( empty( $_POST['view'] ) ) { return; } $current_view = sanitize_key( $_POST['view'] ); // Get registered fields and current settings. $fields = $this->get_registered_settings( $current_view ); $settings = get_option( 'wpforms_settings', array() ); // Views excluded from saving list. $exclude_views = apply_filters( 'wpforms_settings_exclude_view', array(), $fields, $settings ); if ( is_array( $exclude_views ) && in_array( $current_view, $exclude_views, true ) ) { // Run a custom save processing for excluded views. do_action( 'wpforms_settings_custom_process', $current_view, $fields, $settings ); return; } if ( empty( $fields ) || ! is_array( $fields ) ) { return; } // Sanitize and prep each field. foreach ( $fields as $id => $field ) { // Certain field types are not valid for saving and are skipped. $exclude = apply_filters( 'wpforms_settings_exclude_type', array( 'content', 'license', 'providers' ) ); if ( empty( $field['type'] ) || in_array( $field['type'], $exclude, true ) ) { continue; } // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $value = isset( $_POST[ $id ] ) ? trim( wp_unslash( $_POST[ $id ] ) ) : false; $value_prev = isset( $settings[ $id ] ) ? $settings[ $id ] : false; // Custom filter can be provided for sanitizing, otherwise use defaults. if ( ! empty( $field['filter'] ) && is_callable( $field['filter'] ) ) { $value = call_user_func( $field['filter'], $value, $id, $field, $value_prev ); } else { switch ( $field['type'] ) { case 'checkbox': $value = (bool) $value; break; case 'image': $value = esc_url_raw( $value ); break; case 'color': $value = wpforms_sanitize_hex_color( $value ); break; case 'number': $value = (float) $value; break; case 'text': case 'radio': case 'select': default: $value = sanitize_text_field( $value ); break; } } // Add to settings. $settings[ $id ] = $value; } // Save settings. wpforms_update_settings( $settings ); \WPForms\Admin\Notice::success( esc_html__( 'Settings were successfully saved.', 'wpforms-lite' ) ); } /** * Enqueue assets for the settings page. * * @since 1.0.0 */ public function enqueues() { do_action( 'wpforms_settings_enqueue' ); } /** * Return registered settings tabs. * * @since 1.3.9 * * @return array */ public function get_tabs() { $tabs = [ 'general' => [ 'name' => esc_html__( 'General', 'wpforms-lite' ), 'form' => true, 'submit' => esc_html__( 'Save Settings', 'wpforms-lite' ), ], 'email' => [ 'name' => esc_html__( 'Email', 'wpforms-lite' ), 'form' => true, 'submit' => esc_html__( 'Save Settings', 'wpforms-lite' ), ], 'validation' => [ 'name' => esc_html__( 'Validation', 'wpforms-lite' ), 'form' => true, 'submit' => esc_html__( 'Save Settings', 'wpforms-lite' ), ], 'integrations' => [ 'name' => esc_html__( 'Integrations', 'wpforms-lite' ), 'form' => false, 'submit' => false, ], 'geolocation' => [ 'name' => esc_html__( 'Geolocation', 'wpforms-lite' ), 'form' => false, 'submit' => false, ], 'misc' => [ 'name' => esc_html__( 'Misc', 'wpforms-lite' ), 'form' => true, 'submit' => esc_html__( 'Save Settings', 'wpforms-lite' ), ], ]; return apply_filters( 'wpforms_settings_tabs', $tabs ); } /** * Output tab navigation area. * * @since 1.3.9 */ public function tabs() { $tabs = $this->get_tabs(); echo '
' . esc_html__( 'Your license key provides access to updates and addons.', 'wpforms-lite' ) . '
', 'type' => 'content', 'no_label' => true, 'class' => [ 'section-heading' ], ], 'license-key' => [ 'id' => 'license-key', 'name' => esc_html__( 'License Key', 'wpforms-lite' ), 'type' => 'license', ], 'general-heading' => [ 'id' => 'general-heading', 'content' => '', '', '' ), 'type' => 'content', 'no_label' => true, 'class' => [ 'section-heading' ], ], 'validation-required' => [ 'id' => 'validation-required', 'name' => esc_html__( 'Required', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'This field is required.', 'wpforms-lite' ), ], 'validation-url' => [ 'id' => 'validation-url', 'name' => esc_html__( 'Website URL', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'Please enter a valid URL.', 'wpforms-lite' ), ], 'validation-email' => [ 'id' => 'validation-email', 'name' => esc_html__( 'Email', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'Please enter a valid email address.', 'wpforms-lite' ), ], 'validation-email-suggestion' => [ 'id' => 'validation-email-suggestion', 'name' => esc_html__( 'Email Suggestion', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'Did you mean {suggestion}?', 'wpforms-lite' ), ], 'validation-email-restricted' => [ 'id' => 'validation-email-restricted', 'name' => esc_html__( 'Email Restricted', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'This email address is not allowed.', 'wpforms-lite' ), ], 'validation-number' => [ 'id' => 'validation-number', 'name' => esc_html__( 'Number', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'Please enter a valid number.', 'wpforms-lite' ), ], 'validation-number-positive' => [ 'id' => 'validation-number-positive', 'name' => esc_html__( 'Number Positive', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'Please enter a valid positive number.', 'wpforms-lite' ), ], 'validation-confirm' => [ 'id' => 'validation-confirm', 'name' => esc_html__( 'Confirm Value', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'Field values do not match.', 'wpforms-lite' ), ], 'validation-input-mask-incomplete' => [ 'id' => 'validation-input-mask-incomplete', 'name' => esc_html__( 'Input Mask Incomplete', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'Please fill out all blanks.', 'wpforms-lite' ), ], 'validation-check-limit' => [ 'id' => 'validation-check-limit', 'name' => esc_html__( 'Checkbox Selection Limit', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'You have exceeded the number of allowed selections: {#}.', 'wpforms-lite' ), ], 'validation-character-limit' => [ 'id' => 'validation-character-limit', 'name' => esc_html__( 'Character Limit', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'Limit is {limit} characters. Characters remaining: {remaining}.', 'wpforms-lite' ), ], 'validation-word-limit' => [ 'id' => 'validation-word-limit', 'name' => esc_html__( 'Word Limit', 'wpforms-lite' ), 'type' => 'text', 'default' => esc_html__( 'Limit is {limit} words. Words remaining: {remaining}.', 'wpforms-lite' ), ], ], // Provider integrations settings tab. 'integrations' => [ 'integrations-heading' => [ 'id' => 'integrations-heading', 'content' => '
' . esc_html__( 'Manage integrations with popular providers such as Constant Contact, Mailchimp, Zapier, and more.', 'wpforms-lite' ) . '
', 'type' => 'content', 'no_label' => true, 'class' => [ 'section-heading' ], ], 'integrations-providers' => [ 'id' => 'integrations-providers', 'content' => '' . esc_html__( 'Manage integrations with popular providers such as Constant Contact, Mailchimp, Zapier, and more.', 'wpforms-lite' ) . '
', 'type' => 'providers', 'wrap' => 'none', ], ], // Misc. settings tab. 'misc' => [ 'misc-heading' => [ 'id' => 'misc-heading', 'content' => '