sanitize_general_settings( isset( $_POST['affcf_settings'] ) ? wp_unslash( $_POST['affcf_settings'] ) : array() ); update_option( 'affcf_settings', $sanitized_data ); break; case 'pages': $sanitized_data = $settings->sanitize_pages_settings( isset( $_POST['affcf_default_pages'] ) ? wp_unslash( $_POST['affcf_default_pages'] ) : array() ); update_option( 'affcf_default_pages', $sanitized_data ); break; case 'email': $sanitized_data = $settings->sanitize_email_templates( isset( $_POST['affcf_email_templates'] ) ? wp_unslash( $_POST['affcf_email_templates'] ) : array() ); update_option( 'affcf_email_templates', $sanitized_data ); break; case 'security': $sanitized_data = $settings->sanitize_security_settings( isset( $_POST['affcf_security_settings'] ) ? wp_unslash( $_POST['affcf_security_settings'] ) : array() ); update_option( 'affcf_security_settings', $sanitized_data ); break; case 'captcha': $sanitized_data = $settings->sanitize_captcha_settings( isset( $_POST['affcf_captcha_settings'] ) ? wp_unslash( $_POST['affcf_captcha_settings'] ) : array() ); update_option( 'affcf_captcha_settings', $sanitized_data ); break; case 'submission_limits': $sanitized_data = $settings->sanitize_submission_limits( isset( $_POST['affcf_submission_limits'] ) ? wp_unslash( $_POST['affcf_submission_limits'] ) : array() ); update_option( 'affcf_submission_limits', $sanitized_data ); break; case 'rate_limiting': $sanitized_data = $settings->sanitize_rate_limit_settings( isset( $_POST['affcf_rate_limit_settings'] ) ? wp_unslash( $_POST['affcf_rate_limit_settings'] ) : array() ); update_option( 'affcf_rate_limit_settings', $sanitized_data ); break; } // phpcs:enable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized echo '

' . esc_html__( 'Settings saved successfully!', 'airy-frontend-forms' ) . '

'; } // Get settings. $general_settings = get_option( 'affcf_settings', array() ); $pages_settings = get_option( 'affcf_default_pages', array() ); $email_settings = get_option( 'affcf_email_templates', array() ); $security_settings = get_option( 'affcf_security_settings', array() ); $captcha_settings = get_option( 'affcf_captcha_settings', array() ); $submission_limits = get_option( 'affcf_submission_limits', array() ); $rate_limit_settings = get_option( 'affcf_rate_limit_settings', array() ); // Define tabs. $settings_tabs = array( 'general' => __( 'General', 'airy-frontend-forms' ), 'pages' => __( 'Default Pages', 'airy-frontend-forms' ), 'email' => __( 'Email Templates', 'airy-frontend-forms' ), 'security' => __( 'Security', 'airy-frontend-forms' ), 'captcha' => __( 'CAPTCHA', 'airy-frontend-forms' ), 'submission_limits' => __( 'Submission Limits', 'airy-frontend-forms' ), 'rate_limiting' => __( 'Rate Limiting', 'airy-frontend-forms' ), ); ?>



get_names(); $allowed_roles = $general_settings['allowed_submission_roles'] ?? array(); $roles_to_display = array(); // Remove administrator from the list (they always have permission). foreach ( $all_roles as $role_slug => $role_name ) { if ( 'administrator' !== $role_slug ) { $roles_to_display[ $role_slug ] = translate_user_role( $role_name ); } } // Display checkboxes for each role. foreach ( $roles_to_display as $role_slug => $role_name ) : ?>



'affcf_default_pages[custom_dashboard_page_id]', 'selected' => absint( $custom_dashboard ), 'show_option_none' => esc_html__( 'Select a page', 'airy-frontend-forms' ), ) ); ?>



'affcf_default_pages[custom_submit_page_id]', 'selected' => absint( $custom_submit ), 'show_option_none' => esc_html__( 'Select a page', 'airy-frontend-forms' ), ) ); ?>



'affcf_default_pages[custom_edit_page_id]', 'selected' => absint( $custom_edit ), 'show_option_none' => esc_html__( 'Select a page', 'airy-frontend-forms' ), ) ); ?>


✅

%username%, %user_email%, %post_title%, %post_url%, %edit_link%, %rejection_reason%, %site_name%, %site_url%, %submission_date%, %admin_edit_link%

Google reCAPTCHA


0.9-1.0 = , 0.5-0.7 = , 0.0-0.4 =

prefix . 'affcf_forms'; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Table name from $wpdb->prefix, simple query $forms = $wpdb->get_results( "SELECT id, form_name FROM {$forms_table} ORDER BY form_name ASC" ); if ( $forms ) : $per_form_limits = $submission_limits['per_form_limits'] ?? array(); ?>
form_name ); ?> id ]['enabled'] ) ); ?>>


1800 = 30 , 3600 = 1 , 7200 = 2