roles as $role_key => $role) {
$roles[$role_key] = $role['name'];
}
return $roles;
}
/**
* Render form header with logo and illustration
*/
protected function render_form_header($settings)
{
if ($settings['show_form_header'] !== 'yes') {
return;
}
$has_logo = !empty($settings['form_logo']['url']);
$has_illustration = !empty($settings['form_illustration']['url']);
if (!$has_logo && !$has_illustration) {
return;
}
$illustration_position = $settings['form_illustration_position'];
$wrapper_class = 'king-addons-form-header';
if ($has_illustration) {
$wrapper_class .= ' king-addons-form-header-' . $illustration_position;
}
?>
can_use_premium_code__premium_only()) {
return;
}
if ($settings['enable_social_login'] !== 'yes') {
return;
}
$show_google = $settings['enable_google_login'] === 'yes' && !empty($settings['google_client_id']);
$show_facebook = $settings['enable_facebook_login'] === 'yes' && !empty($settings['facebook_app_id']);
if (!$show_google && !$show_facebook) {
return;
}
?>
can_use_premium_code__premium_only()) {
return;
}
if (empty($settings['custom_fields'])) {
return;
}
foreach ($settings['custom_fields'] as $index => $field) {
$field_id = 'custom_field_' . $index;
$field_name = 'custom_field_' . $index;
$field_class = 'king-addons-form-field';
$field_label = !empty($field['field_label']) ? $field['field_label'] : 'Field ' . ($index + 1);
if ($field['field_width'] === 'half') {
$field_class .= ' king-addons-field-half';
}
$required = $field['field_required'] === 'yes' ? 'required' : '';
?>
get_id();
$recaptcha_id = 'recaptcha-' . $form_type . '-' . $widget_id;
if ($settings['recaptcha_version'] === 'v2') {
?>
start_controls_section(
'section_general',
[
'label' => esc_html__('General', 'king-addons'),
]
);
$this->add_control(
'default_form_type',
[
'label' => esc_html__('Default Form Type', 'king-addons'),
'type' => Controls_Manager::SELECT,
'options' => [
'login' => esc_html__('Login', 'king-addons'),
'register' => esc_html__('Register', 'king-addons'),
],
'default' => 'login',
]
);
$this->add_control(
'show_labels',
[
'label' => esc_html__('Show Labels', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->add_control(
'enable_ajax',
[
'label' => esc_html__('Enable AJAX', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->end_controls_section();
// Form Header Section
$this->start_controls_section(
'section_form_header',
[
'label' => esc_html__('Form Header', 'king-addons'),
]
);
$this->add_control(
'show_form_header',
[
'label' => esc_html__('Show Form Header', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
]
);
$this->add_control(
'form_logo',
[
'label' => esc_html__('Logo', 'king-addons'),
'type' => Controls_Manager::MEDIA,
'condition' => [
'show_form_header' => 'yes',
],
]
);
$this->add_responsive_control(
'form_logo_width',
[
'label' => esc_html__('Logo Width', 'king-addons'),
'type' => Controls_Manager::SLIDER,
'size_units' => ['px', '%'],
'range' => [
'px' => [
'min' => 0,
'max' => 500,
],
'%' => [
'min' => 0,
'max' => 100,
],
],
'default' => [
'unit' => 'px',
'size' => 150,
],
'condition' => [
'show_form_header' => 'yes',
'form_logo[url]!' => '',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-header-logo img' => 'width: {{SIZE}}{{UNIT}};',
],
]
);
$this->add_control(
'form_illustration',
[
'label' => esc_html__('Illustration', 'king-addons'),
'type' => Controls_Manager::MEDIA,
'condition' => [
'show_form_header' => 'yes',
],
]
);
$this->add_control(
'form_illustration_position',
[
'label' => esc_html__('Illustration Position', 'king-addons'),
'type' => Controls_Manager::SELECT,
'options' => [
'left' => esc_html__('Left', 'king-addons'),
'right' => esc_html__('Right', 'king-addons'),
'top' => esc_html__('Top', 'king-addons'),
'bottom' => esc_html__('Bottom', 'king-addons'),
],
'default' => 'left',
'condition' => [
'show_form_header' => 'yes',
'form_illustration[url]!' => '',
],
]
);
$this->add_responsive_control(
'form_illustration_width',
[
'label' => esc_html__('Illustration Width', 'king-addons'),
'type' => Controls_Manager::SLIDER,
'size_units' => ['px', '%'],
'range' => [
'px' => [
'min' => 0,
'max' => 800,
],
'%' => [
'min' => 0,
'max' => 100,
],
],
'default' => [
'unit' => '%',
'size' => 50,
],
'condition' => [
'show_form_header' => 'yes',
'form_illustration[url]!' => '',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-illustration' => 'width: {{SIZE}}{{UNIT}};',
],
]
);
$this->end_controls_section();
// Login Form Section
$this->start_controls_section(
'section_login_form',
[
'label' => esc_html__('Login Form', 'king-addons'),
]
);
$this->add_control(
'login_form_title',
[
'label' => esc_html__('Form Title', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Login to Your Account', 'king-addons'),
'placeholder' => esc_html__('Enter title', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'login_form_subtitle',
[
'label' => esc_html__('Form Subtitle', 'king-addons'),
'type' => Controls_Manager::TEXTAREA,
'default' => esc_html__('Please enter your username and password to log in.', 'king-addons'),
'placeholder' => esc_html__('Enter subtitle', 'king-addons'),
'dynamic' => ['active' => true],
]
);
$this->add_control(
'login_username_label',
[
'label' => esc_html__('Username/Email Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Username or Email', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'login_username_placeholder',
[
'label' => esc_html__('Username/Email Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Enter your username or email', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'login_password_label',
[
'label' => esc_html__('Password Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Password', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'login_password_placeholder',
[
'label' => esc_html__('Password Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Enter your password', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'login_button_text',
[
'label' => esc_html__('Login Button Text', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Login', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'show_password_visibility_login',
[
'label' => esc_html__('Show Password Visibility Toggle', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->add_control(
'show_remember_me',
[
'label' => esc_html__('Show Remember Me', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->add_control(
'remember_me_text',
[
'label' => esc_html__('Remember Me Text', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Remember Me', 'king-addons'),
'condition' => [
'show_remember_me' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'show_lost_password',
[
'label' => esc_html__('Show Lost Password Link', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->add_control(
'lost_password_text',
[
'label' => esc_html__('Lost Password Text', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Forgot Password?', 'king-addons'),
'condition' => [
'show_lost_password' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'show_register_link',
[
'label' => esc_html__('Show Register Link', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->add_control(
'register_link_text',
[
'label' => esc_html__('Register Link Text', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__("Don't have an account? Register", 'king-addons'),
'condition' => [
'show_register_link' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'show_lost_password_link',
[
'label' => esc_html__('Show Lost Password Link', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->add_control(
'lost_password_link_text',
[
'label' => esc_html__('Lost Password Link Text', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Forgot your password?', 'king-addons'),
'condition' => [
'show_lost_password_link' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->end_controls_section();
// Email Notifications Section
$this->start_controls_section(
'section_email_notifications',
[
'label' => esc_html__('Email Notifications', 'king-addons'),
]
);
$this->add_control(
'enable_user_email',
[
'label' => esc_html__('Send Email to User', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
'description' => esc_html__('Send a welcome email to the user after successful registration.', 'king-addons'),
]
);
$this->add_control(
'user_email_subject',
[
'label' => esc_html__('User Email Subject', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Welcome to {site_name}!', 'king-addons'),
'condition' => [
'enable_user_email' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
if (!king_addons_freemius()->can_use_premium_code__premium_only()) {
\King_Addons\Core::renderUpgradeProNotice($this, Controls_Manager::RAW_HTML, 'login-register-form', 'user_email_subject', ['']);
}
$this->add_control(
'user_email_content',
[
'label' => esc_html__('User Email Content', 'king-addons'),
'type' => Controls_Manager::TEXTAREA,
'rows' => 10,
'default' => "Hello {user_name},\n\nWelcome to {site_name}!\n\nYour account has been successfully created.\n\nUsername: {username}\nEmail: {user_email}\n\nThank you for joining us!\n\nBest regards,\n{site_name} Team",
'condition' => [
'enable_user_email' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
if (!king_addons_freemius()->can_use_premium_code__premium_only()) {
\King_Addons\Core::renderUpgradeProNotice($this, Controls_Manager::RAW_HTML, 'login-register-form', 'user_email_content', ['']);
}
$this->add_control(
'enable_admin_email',
[
'label' => sprintf(__('Send Email to Admin %s', 'king-addons'), ' '),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
'description' => esc_html__('Send a notification email to the admin when a user registers.', 'king-addons'),
'classes' => 'king-addons-pro-control',
]
);
if (!king_addons_freemius()->can_use_premium_code__premium_only()) {
\King_Addons\Core::renderUpgradeProNotice($this, Controls_Manager::RAW_HTML, 'login-register-form', 'enable_admin_email', ['yes']);
} else {
$this->add_control(
'admin_email_address',
[
'label' => esc_html__('Admin Email Address', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => get_option('admin_email'),
'condition' => [
'enable_admin_email' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'admin_email_subject',
[
'label' => esc_html__('Admin Email Subject', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('New User Registration on {site_name}', 'king-addons'),
'condition' => [
'enable_admin_email' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'admin_email_content',
[
'label' => esc_html__('Admin Email Content', 'king-addons'),
'type' => Controls_Manager::TEXTAREA,
'rows' => 10,
'default' => "Hello Admin,\n\nA new user has registered on {site_name}.\n\nUser Details:\nName: {user_name}\nUsername: {username}\nEmail: {user_email}\nRole: {user_role}\nRegistration Date: {registration_date}\n\nYou can view the user profile in the admin dashboard.\n\nBest regards,\n{site_name}",
'condition' => [
'enable_admin_email' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
}
$this->add_control(
'email_placeholders_info',
[
'type' => Controls_Manager::RAW_HTML,
'raw' => esc_html__('Available placeholders: {site_name}, {user_name}, {username}, {user_email}, {user_role}, {registration_date}', 'king-addons'),
'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
]
);
$this->end_controls_section();
// Mailchimp Integration Section
$this->start_controls_section(
'section_mailchimp_integration',
[
'label' => esc_html__('Mailchimp Integration', 'king-addons'),
]
);
$this->add_control(
'enable_mailchimp_integration',
[
'label' => sprintf(__('Enable Mailchimp Integration %s', 'king-addons'), ' '),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
'description' => esc_html__('Automatically subscribe users to your Mailchimp list upon registration.', 'king-addons'),
'classes' => 'king-addons-pro-control',
]
);
if (!king_addons_freemius()->can_use_premium_code__premium_only()) {
\King_Addons\Core::renderUpgradeProNotice($this, Controls_Manager::RAW_HTML, 'login-register-form', 'enable_mailchimp_integration', ['yes']);
} else {
$this->add_control(
'mailchimp_api_key',
[
'label' => esc_html__('Mailchimp API Key', 'king-addons'),
'type' => Controls_Manager::TEXT,
'placeholder' => esc_html__('Enter your Mailchimp API Key', 'king-addons'),
'condition' => [
'enable_mailchimp_integration' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
'frontend_available' => false, // Security: prevent exposure to frontend/REST API
]
);
$this->add_control(
'mailchimp_list_id',
[
'label' => esc_html__('Mailchimp List ID', 'king-addons'),
'type' => Controls_Manager::TEXT,
'placeholder' => esc_html__('Enter your Mailchimp List ID', 'king-addons'),
'condition' => [
'enable_mailchimp_integration' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
'frontend_available' => false, // Security: prevent exposure to frontend/REST API
]
);
$this->add_control(
'mailchimp_double_optin',
[
'label' => esc_html__('Double Opt-in', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
'description' => esc_html__('Send confirmation email to subscribers.', 'king-addons'),
'condition' => [
'enable_mailchimp_integration' => 'yes',
],
]
);
$this->add_control(
'mailchimp_setup_info',
[
'type' => Controls_Manager::RAW_HTML,
'raw' => sprintf(
esc_html__('To get your API key and List ID, go to your %s and navigate to Account > Extras > API keys and Audience > Manage Audience > Settings > Audience name and defaults.', 'king-addons'),
'Mailchimp account '
),
'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
'condition' => [
'enable_mailchimp_integration' => 'yes',
],
]
);
}
$this->end_controls_section();
// Register Actions Section
$this->start_controls_section(
'section_register_actions',
[
'label' => esc_html__('Register Actions', 'king-addons'),
]
);
$this->add_control(
'auto_login_after_register',
[
'label' => esc_html__('Auto Login After Registration', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
'description' => esc_html__('Automatically log in the user after successful registration.', 'king-addons'),
]
);
$this->add_control(
'redirect_after_register',
[
'label' => esc_html__('Redirect After Registration', 'king-addons'),
'type' => Controls_Manager::URL,
'placeholder' => esc_html__('https://yoursite.com/welcome', 'king-addons'),
'dynamic' => ['active' => true],
'description' => esc_html__('Leave empty to stay on the current page.', 'king-addons'),
]
);
$this->add_control(
'redirect_after_login',
[
'label' => esc_html__('Redirect After Login', 'king-addons'),
'type' => Controls_Manager::URL,
'placeholder' => esc_html__('https://yoursite.com/dashboard', 'king-addons'),
'dynamic' => ['active' => true],
'description' => esc_html__('Leave empty to stay on the current page.', 'king-addons'),
]
);
$this->add_control(
'redirect_logout_user',
[
'label' => esc_html__('Redirect Already Logged Users', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
'description' => esc_html__('Redirect users who are already logged in.', 'king-addons'),
]
);
$this->add_control(
'redirect_logout_url',
[
'label' => esc_html__('Redirect URL for Logged Users', 'king-addons'),
'type' => Controls_Manager::URL,
'placeholder' => esc_html__('https://yoursite.com/dashboard', 'king-addons'),
'condition' => [
'redirect_logout_user' => 'yes',
],
'dynamic' => ['active' => true],
]
);
$this->end_controls_section();
// Lost Password Form Section
$this->start_controls_section(
'section_lost_password_form',
[
'label' => esc_html__('Lost Password Form', 'king-addons'),
'condition' => [
'show_lost_password_link' => 'yes',
],
]
);
$this->add_control(
'lostpassword_form_title',
[
'label' => esc_html__('Form Title', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Lost Your Password?', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'lostpassword_form_subtitle',
[
'label' => esc_html__('Form Subtitle', 'king-addons'),
'type' => Controls_Manager::TEXTAREA,
'default' => esc_html__('Enter your email address and we will send you a link to reset your password.', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'lostpassword_email_label',
[
'label' => esc_html__('Email Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Email', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'lostpassword_email_placeholder',
[
'label' => esc_html__('Email Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Enter your email address', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'lostpassword_button_text',
[
'label' => esc_html__('Button Text', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Reset Password', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'show_login_link_from_lostpassword',
[
'label' => esc_html__('Show Login Link', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->add_control(
'login_link_text_from_lostpassword',
[
'label' => esc_html__('Login Link Text', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Back to Login', 'king-addons'),
'condition' => [
'show_login_link_from_lostpassword' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->end_controls_section();
// Social Login Section
$this->start_controls_section(
'section_social_login',
[
'label' => esc_html__('Social Login', 'king-addons'),
]
);
$this->add_control(
'enable_social_login',
[
'label' => sprintf(__('Enable Social Login %s', 'king-addons'), ' '),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
'classes' => 'king-addons-pro-control',
]
);
if (!king_addons_freemius()->can_use_premium_code__premium_only()) {
\King_Addons\Core::renderUpgradeProNotice($this, Controls_Manager::RAW_HTML, 'login-register-form', 'enable_social_login', ['yes']);
} else {
$this->add_control(
'social_login_separator',
[
'label' => esc_html__('Show Separator', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
'condition' => [
'enable_social_login' => 'yes',
],
]
);
$this->add_control(
'social_login_setup_note',
[
'type' => Controls_Manager::RAW_HTML,
'raw' => esc_html__('Note: Social login requires proper API setup. Google and Facebook apps need to be configured with valid credentials.', 'king-addons'),
'content_classes' => 'elementor-panel-alert elementor-panel-alert-warning',
'condition' => [
'enable_social_login' => 'yes',
],
]
);
// Google Login Settings
$this->add_control(
'google_login_heading',
[
'label' => esc_html__('Google Login', 'king-addons'),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
'condition' => [
'enable_social_login' => 'yes',
],
]
);
$this->add_control(
'enable_google_login',
[
'label' => esc_html__('Enable Google Login', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
'condition' => [
'enable_social_login' => 'yes',
],
]
);
$this->add_control(
'google_client_id',
[
'label' => esc_html__('Google Client ID', 'king-addons'),
'type' => Controls_Manager::TEXT,
'placeholder' => esc_html__('Enter your Google Client ID', 'king-addons'),
'condition' => [
'enable_social_login' => 'yes',
'enable_google_login' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'google_client_secret',
[
'label' => esc_html__('Google Client Secret', 'king-addons'),
'type' => Controls_Manager::TEXT,
'placeholder' => esc_html__('Enter your Google Client Secret', 'king-addons'),
'condition' => [
'enable_social_login' => 'yes',
'enable_google_login' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'google_setup_instructions',
[
'type' => Controls_Manager::RAW_HTML,
'raw' => sprintf(
'
🔧 Google OAuth Setup Instructions:
Go to Google Cloud Console
Create a new project or select existing one
Enable "Google+ API" in APIs & Services
Go to "Credentials" → "Create Credentials" → "OAuth 2.0 Client IDs"
Set Application type to "Web application"
Add your domain to "Authorized JavaScript origins"
Add redirect URI: %s
Copy Client ID and Client Secret to fields above
',
home_url('/wp-admin/admin-ajax.php?action=king_addons_google_callback')
),
'condition' => [
'enable_social_login' => 'yes',
'enable_google_login' => 'yes',
],
]
);
// Facebook Login Settings
$this->add_control(
'facebook_login_heading',
[
'label' => esc_html__('Facebook Login', 'king-addons'),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
'condition' => [
'enable_social_login' => 'yes',
],
]
);
$this->add_control(
'enable_facebook_login',
[
'label' => esc_html__('Enable Facebook Login', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
'condition' => [
'enable_social_login' => 'yes',
],
]
);
$this->add_control(
'facebook_app_id',
[
'label' => esc_html__('Facebook App ID', 'king-addons'),
'type' => Controls_Manager::TEXT,
'placeholder' => esc_html__('Enter your Facebook App ID', 'king-addons'),
'condition' => [
'enable_social_login' => 'yes',
'enable_facebook_login' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'facebook_app_secret',
[
'label' => esc_html__('Facebook App Secret', 'king-addons'),
'type' => Controls_Manager::TEXT,
'placeholder' => esc_html__('Enter your Facebook App Secret', 'king-addons'),
'condition' => [
'enable_social_login' => 'yes',
'enable_facebook_login' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'facebook_setup_instructions',
[
'type' => Controls_Manager::RAW_HTML,
'raw' => sprintf(
'
🔧 Facebook OAuth Setup Instructions:
Go to Facebook Developers
Create a new app or select existing one
Add "Facebook Login" product to your app
Go to Facebook Login → Settings
Add Valid OAuth Redirect URI: %s
Get App ID and App Secret from App Settings → Basic
Copy App ID and App Secret to fields above
Make sure app is live (not in development mode)
',
home_url('/wp-admin/admin-ajax.php?action=king_addons_facebook_callback')
),
'condition' => [
'enable_social_login' => 'yes',
'enable_facebook_login' => 'yes',
],
]
);
}
$this->end_controls_section();
// reCAPTCHA Section
$this->start_controls_section(
'section_recaptcha',
[
'label' => esc_html__('reCAPTCHA', 'king-addons'),
]
);
$this->add_control(
'enable_recaptcha',
[
'label' => esc_html__('Enable reCAPTCHA', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
]
);
$this->add_control(
'recaptcha_version',
[
'label' => esc_html__('reCAPTCHA Version', 'king-addons'),
'type' => Controls_Manager::SELECT,
'options' => [
'v2' => esc_html__('reCAPTCHA v2', 'king-addons'),
'v3' => esc_html__('reCAPTCHA v3', 'king-addons'),
],
'default' => 'v2',
'condition' => [
'enable_recaptcha' => 'yes',
],
]
);
$this->add_control(
'recaptcha_site_key',
[
'label' => esc_html__('Site Key', 'king-addons'),
'type' => Controls_Manager::TEXT,
'placeholder' => esc_html__('Enter your reCAPTCHA Site Key', 'king-addons'),
'condition' => [
'enable_recaptcha' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'recaptcha_secret_key',
[
'label' => esc_html__('Secret Key', 'king-addons'),
'type' => Controls_Manager::TEXT,
'placeholder' => esc_html__('Enter your reCAPTCHA Secret Key', 'king-addons'),
'condition' => [
'enable_recaptcha' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
'frontend_available' => false, // Security: prevent exposure to frontend/REST API
]
);
$this->add_control(
'recaptcha_theme',
[
'label' => esc_html__('Theme', 'king-addons'),
'type' => Controls_Manager::SELECT,
'options' => [
'light' => esc_html__('Light', 'king-addons'),
'dark' => esc_html__('Dark', 'king-addons'),
],
'default' => 'light',
'condition' => [
'enable_recaptcha' => 'yes',
'recaptcha_version' => 'v2',
],
]
);
$this->add_control(
'recaptcha_size',
[
'label' => esc_html__('Size', 'king-addons'),
'type' => Controls_Manager::SELECT,
'options' => [
'normal' => esc_html__('Normal', 'king-addons'),
'compact' => esc_html__('Compact', 'king-addons'),
],
'default' => 'normal',
'condition' => [
'enable_recaptcha' => 'yes',
'recaptcha_version' => 'v2',
],
]
);
$this->add_control(
'recaptcha_score_threshold',
[
'label' => esc_html__('Score Threshold', 'king-addons'),
'type' => Controls_Manager::SLIDER,
'range' => [
'' => [
'min' => 0,
'max' => 1,
'step' => 0.1,
],
],
'default' => [
'size' => 0.5,
],
'condition' => [
'enable_recaptcha' => 'yes',
'recaptcha_version' => 'v3',
],
'description' => esc_html__('reCAPTCHA v3 returns a score (1.0 is very likely a good interaction, 0.0 is very likely a bot). Based on the score, you can take variable action in the context of your site.', 'king-addons'),
]
);
$this->add_control(
'recaptcha_hide_badge',
[
'label' => esc_html__('Hide reCAPTCHA Badge', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
'condition' => [
'enable_recaptcha' => 'yes',
'recaptcha_version' => 'v3',
],
'description' => esc_html__('Hide the reCAPTCHA badge. Note: You must include the reCAPTCHA branding visibly in the user flow.', 'king-addons'),
]
);
$this->add_control(
'recaptcha_apply_on',
[
'label' => esc_html__('Apply reCAPTCHA On', 'king-addons'),
'type' => Controls_Manager::SELECT2,
'multiple' => true,
'options' => [
'login' => esc_html__('Login Form', 'king-addons'),
'register' => esc_html__('Register Form', 'king-addons'),
'lostpassword' => esc_html__('Lost Password Form', 'king-addons'),
],
'default' => ['login', 'register'],
'condition' => [
'enable_recaptcha' => 'yes',
],
]
);
$this->add_control(
'recaptcha_setup_note',
[
'type' => Controls_Manager::RAW_HTML,
'raw' => sprintf(
esc_html__('To use reCAPTCHA, you need to get API keys from %s. For more details, check the documentation.', 'king-addons'),
'Google reCAPTCHA '
),
'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
'condition' => [
'enable_recaptcha' => 'yes',
],
]
);
$this->end_controls_section();
// Register Form Section
$this->start_controls_section(
'section_register_form',
[
'label' => esc_html__('Register Form', 'king-addons'),
]
);
$this->add_control(
'register_form_title',
[
'label' => esc_html__('Form Title', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Create New Account', 'king-addons'),
'placeholder' => esc_html__('Enter title', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_form_subtitle',
[
'label' => esc_html__('Form Subtitle', 'king-addons'),
'type' => Controls_Manager::TEXTAREA,
'default' => esc_html__('Create an account to enjoy awesome features.', 'king-addons'),
'placeholder' => esc_html__('Enter subtitle', 'king-addons'),
'dynamic' => ['active' => true],
]
);
$this->add_control(
'register_email_label',
[
'label' => esc_html__('Email Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Email', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_email_placeholder',
[
'label' => esc_html__('Email Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Enter your email', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_username_label',
[
'label' => esc_html__('Username Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Username', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_username_placeholder',
[
'label' => esc_html__('Username Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Enter your username', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_password_label',
[
'label' => esc_html__('Password Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Password', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_password_placeholder',
[
'label' => esc_html__('Password Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Enter your password', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_confirm_password_label',
[
'label' => esc_html__('Confirm Password Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Confirm Password', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_confirm_password_placeholder',
[
'label' => esc_html__('Confirm Password Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Confirm your password', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_additional_fields_heading',
[
'label' => esc_html__('Additional Fields', 'king-addons'),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
]
);
$this->add_control(
'show_first_name',
[
'label' => esc_html__('Show First Name', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
]
);
$this->add_control(
'register_first_name_label',
[
'label' => esc_html__('First Name Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('First Name', 'king-addons'),
'condition' => [
'show_first_name' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_first_name_placeholder',
[
'label' => esc_html__('First Name Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('First Name', 'king-addons'),
'condition' => [
'show_first_name' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'show_last_name',
[
'label' => esc_html__('Show Last Name', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
]
);
$this->add_control(
'register_last_name_label',
[
'label' => esc_html__('Last Name Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Last Name', 'king-addons'),
'condition' => [
'show_last_name' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_last_name_placeholder',
[
'label' => esc_html__('Last Name Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Last Name', 'king-addons'),
'condition' => [
'show_last_name' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'show_website',
[
'label' => esc_html__('Show Website', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
]
);
$this->add_control(
'register_website_label',
[
'label' => esc_html__('Website Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Website', 'king-addons'),
'condition' => [
'show_website' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_website_placeholder',
[
'label' => esc_html__('Website Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('https://yourwebsite.com', 'king-addons'),
'condition' => [
'show_website' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'show_phone',
[
'label' => esc_html__('Show Phone', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
]
);
$this->add_control(
'register_phone_label',
[
'label' => esc_html__('Phone Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Phone', 'king-addons'),
'condition' => [
'show_phone' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_phone_placeholder',
[
'label' => esc_html__('Phone Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Phone Number', 'king-addons'),
'condition' => [
'show_phone' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'register_button_text',
[
'label' => esc_html__('Register Button Text', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Register', 'king-addons'),
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'show_password_visibility_register',
[
'label' => esc_html__('Show Password Visibility Toggle', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->add_control(
'show_login_link',
[
'label' => esc_html__('Show Login Link', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
]
);
$this->add_control(
'login_link_text',
[
'label' => esc_html__('Login Link Text', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Already have an account? Login', 'king-addons'),
'condition' => [
'show_login_link' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
// Custom Fields for Registration
$this->add_control(
'custom_fields_heading',
[
'label' => sprintf(__('Custom Fields %s', 'king-addons'), ' '),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
]
);
if (!king_addons_freemius()->can_use_premium_code__premium_only()) {
$this->add_control(
'custom_fields_pro_notice',
[
'type' => Controls_Manager::RAW_HTML,
'raw' => 'Custom Registration Fields are available in the Pro version ',
'content_classes' => 'king-addons-pro-notice',
]
);
} else {
$repeater = new \Elementor\Repeater();
$repeater->add_control(
'field_type',
[
'label' => esc_html__('Field Type', 'king-addons'),
'type' => Controls_Manager::SELECT,
'options' => [
'text' => esc_html__('Text', 'king-addons'),
'email' => esc_html__('Email', 'king-addons'),
'number' => esc_html__('Number', 'king-addons'),
'tel' => esc_html__('Phone', 'king-addons'),
'url' => esc_html__('URL', 'king-addons'),
'textarea' => esc_html__('Textarea', 'king-addons'),
'select' => esc_html__('Select', 'king-addons'),
'checkbox' => esc_html__('Checkbox', 'king-addons'),
'radio' => esc_html__('Radio', 'king-addons'),
'date' => esc_html__('Date', 'king-addons'),
'file' => esc_html__('File Upload', 'king-addons'),
],
'default' => 'text',
]
);
$repeater->add_control(
'field_label',
[
'label' => esc_html__('Field Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Custom Field', 'king-addons'),
'dynamic' => ['active' => true],
]
);
$repeater->add_control(
'field_placeholder',
[
'label' => esc_html__('Placeholder', 'king-addons'),
'type' => Controls_Manager::TEXT,
'dynamic' => ['active' => true],
'condition' => [
'field_type!' => ['checkbox', 'radio', 'file'],
],
]
);
$repeater->add_control(
'field_required',
[
'label' => esc_html__('Required', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
]
);
$repeater->add_control(
'field_options',
[
'label' => esc_html__('Options', 'king-addons'),
'type' => Controls_Manager::TEXTAREA,
'description' => esc_html__('Enter each option on a new line. For radio/checkbox use format: value|label', 'king-addons'),
'condition' => [
'field_type' => ['select', 'checkbox', 'radio'],
],
'default' => "option1|Option 1\noption2|Option 2\noption3|Option 3",
]
);
$repeater->add_control(
'field_width',
[
'label' => esc_html__('Field Width', 'king-addons'),
'type' => Controls_Manager::SELECT,
'options' => [
'full' => esc_html__('Full Width', 'king-addons'),
'half' => esc_html__('Half Width', 'king-addons'),
],
'default' => 'full',
]
);
$this->add_control(
'custom_fields',
[
'label' => esc_html__('Additional Fields', 'king-addons'),
'type' => Controls_Manager::REPEATER,
'fields' => $repeater->get_controls(),
'title_field' => '{{ field_label }}',
'default' => [],
]
);
}
// User Role Selection
$this->add_control(
'user_role_heading',
[
'label' => esc_html__('User Role', 'king-addons'),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
]
);
$this->add_control(
'show_user_role_selection',
[
'label' => esc_html__('Show User Role Selection', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
]
);
$this->add_control(
'user_role_label',
[
'label' => esc_html__('User Role Label', 'king-addons'),
'type' => Controls_Manager::TEXT,
'default' => esc_html__('Select Role', 'king-addons'),
'condition' => [
'show_user_role_selection' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'allowed_user_roles',
[
'label' => esc_html__('Allowed User Roles', 'king-addons'),
'type' => Controls_Manager::SELECT2,
'multiple' => true,
'options' => $this->get_user_roles(),
'default' => ['subscriber'],
'condition' => [
'show_user_role_selection' => 'yes',
],
]
);
$this->add_control(
'default_user_role',
[
'label' => esc_html__('Default User Role', 'king-addons'),
'type' => Controls_Manager::SELECT,
'options' => $this->get_user_roles(),
'default' => 'subscriber',
'condition' => [
'show_user_role_selection' => 'yes',
],
]
);
// Terms & Conditions
$this->add_control(
'terms_conditions_heading',
[
'label' => esc_html__('Terms & Conditions', 'king-addons'),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
]
);
$this->add_control(
'show_terms_conditions',
[
'label' => esc_html__('Show Terms & Conditions', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => '',
]
);
$this->add_control(
'terms_conditions_text',
[
'label' => esc_html__('Terms & Conditions Text', 'king-addons'),
'type' => Controls_Manager::TEXTAREA,
'default' => esc_html__('I agree to the Terms & Conditions', 'king-addons'),
'condition' => [
'show_terms_conditions' => 'yes',
],
'dynamic' => ['active' => true],
'ai' => ['active' => false],
]
);
$this->add_control(
'terms_conditions_link',
[
'label' => esc_html__('Terms & Conditions Link', 'king-addons'),
'type' => Controls_Manager::URL,
'placeholder' => esc_html__('https://yoursite.com/terms', 'king-addons'),
'condition' => [
'show_terms_conditions' => 'yes',
],
'dynamic' => ['active' => true],
]
);
$this->add_control(
'terms_required',
[
'label' => esc_html__('Required', 'king-addons'),
'type' => Controls_Manager::SWITCHER,
'label_on' => esc_html__('Yes', 'king-addons'),
'label_off' => esc_html__('No', 'king-addons'),
'return_value' => 'yes',
'default' => 'yes',
'condition' => [
'show_terms_conditions' => 'yes',
],
]
);
$this->end_controls_section();
// Redirect Settings (Legacy - for backward compatibility)
$this->start_controls_section(
'section_redirect',
[
'label' => esc_html__('Redirect Settings', 'king-addons'),
]
);
$this->add_control(
'redirect_info_notice',
[
'type' => Controls_Manager::RAW_HTML,
'raw' => esc_html__('Note: Redirect settings have been moved to the "Register Actions" section above for better organization.', 'king-addons'),
'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
]
);
$this->end_controls_section();
// Pro Features Section
\King_Addons\Core::renderProFeaturesSection($this, '', Controls_Manager::RAW_HTML, 'login-register-form', [
'Custom Registration Fields (Text, Email, Phone, File Upload, Select, Checkbox, Radio)',
'Advanced Social Login (Google, Facebook with OAuth Setup)',
'Mailchimp Integration with Double Opt-in Support',
'Advanced Email Notifications (Custom Templates, Placeholders)',
'Admin Email Notifications for New Registrations',
'Email Template Customization with Placeholders',
'Enhanced Security Features (Rate Limiting, File Validation)',
'Advanced Redirect Options (Role-based Redirects)',
'User Role Assignment & Selection',
'Advanced Form Validation (Client & Server Side)',
'File Upload Security & Validation',
'reCAPTCHA v2/v3 Integration',
'Custom Fields User Meta Storage',
'Priority Support & Updates'
]);
// Style Controls Start Here
$this->register_style_controls();
}
protected function register_style_controls()
{
// Form Container Style
$this->start_controls_section(
'section_form_container_style',
[
'label' => esc_html__('Form Container', 'king-addons'),
'tab' => Controls_Manager::TAB_STYLE,
]
);
$this->add_responsive_control(
'form_container_padding',
[
'label' => esc_html__('Padding', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '30',
'right' => '30',
'bottom' => '30',
'left' => '30',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-login-register-form' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_control(
'form_container_background',
[
'label' => esc_html__('Background Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#ffffff',
'selectors' => [
'{{WRAPPER}} .king-addons-login-register-form' => 'background-color: {{VALUE}};',
],
]
);
$this->add_group_control(
Group_Control_Border::get_type(),
[
'name' => 'form_container_border',
'label' => esc_html__('Border', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-login-register-form',
'fields_options' => [
'border' => [
'default' => 'solid',
],
'width' => [
'default' => [
'top' => '1',
'right' => '1',
'bottom' => '1',
'left' => '1',
'unit' => 'px',
],
],
'color' => [
'default' => '#e1e5e9',
],
],
]
);
$this->add_control(
'form_container_border_radius',
[
'label' => esc_html__('Border Radius', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%'],
'default' => [
'top' => '8',
'right' => '8',
'bottom' => '8',
'left' => '8',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-login-register-form' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_group_control(
Group_Control_Box_Shadow::get_type(),
[
'name' => 'form_container_box_shadow',
'label' => esc_html__('Box Shadow', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-login-register-form',
'fields_options' => [
'box_shadow_type' => [
'default' => 'yes',
],
'box_shadow' => [
'default' => [
'horizontal' => 0,
'vertical' => 4,
'blur' => 20,
'spread' => 0,
'color' => 'rgba(0,0,0,0.1)',
],
],
],
]
);
$this->end_controls_section();
// Form Title Style
$this->start_controls_section(
'section_form_title_style',
[
'label' => esc_html__('Form Title', 'king-addons'),
'tab' => Controls_Manager::TAB_STYLE,
]
);
$this->add_group_control(
Group_Control_Typography::get_type(),
[
'name' => 'form_title_typography',
'label' => esc_html__('Typography', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-form-title',
]
);
$this->add_control(
'form_title_color',
[
'label' => esc_html__('Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#333333',
'selectors' => [
'{{WRAPPER}} .king-addons-form-title' => 'color: {{VALUE}};',
],
]
);
$this->add_responsive_control(
'form_title_margin',
[
'label' => esc_html__('Margin', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '0',
'right' => '0',
'bottom' => '10',
'left' => '0',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-title' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->end_controls_section();
// Form Subtitle Style
$this->start_controls_section(
'section_form_subtitle_style',
[
'label' => esc_html__('Form Subtitle', 'king-addons'),
'tab' => Controls_Manager::TAB_STYLE,
]
);
$this->add_group_control(
Group_Control_Typography::get_type(),
[
'name' => 'form_subtitle_typography',
'label' => esc_html__('Typography', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-form-subtitle',
]
);
$this->add_control(
'form_subtitle_color',
[
'label' => esc_html__('Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#666666',
'selectors' => [
'{{WRAPPER}} .king-addons-form-subtitle' => 'color: {{VALUE}};',
],
]
);
$this->add_responsive_control(
'form_subtitle_margin',
[
'label' => esc_html__('Margin', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '0',
'right' => '0',
'bottom' => '20',
'left' => '0',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-subtitle' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->end_controls_section();
// Input Fields Style
$this->start_controls_section(
'section_input_fields_style',
[
'label' => esc_html__('Input Fields', 'king-addons'),
'tab' => Controls_Manager::TAB_STYLE,
]
);
$this->add_group_control(
Group_Control_Typography::get_type(),
[
'name' => 'input_fields_typography',
'label' => esc_html__('Typography', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-form-field input',
]
);
$this->add_control(
'input_fields_color',
[
'label' => esc_html__('Text Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#333333',
'selectors' => [
'{{WRAPPER}} .king-addons-form-field input' => 'color: {{VALUE}};',
],
]
);
$this->add_control(
'input_fields_background',
[
'label' => esc_html__('Background Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#ffffff',
'selectors' => [
'{{WRAPPER}} .king-addons-form-field input' => 'background-color: {{VALUE}};',
],
]
);
$this->add_responsive_control(
'input_fields_padding',
[
'label' => esc_html__('Padding', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '12',
'right' => '15',
'bottom' => '12',
'left' => '15',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-field input' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_responsive_control(
'input_fields_margin',
[
'label' => esc_html__('Margin', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '0',
'right' => '0',
'bottom' => '15',
'left' => '0',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-field' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_group_control(
Group_Control_Border::get_type(),
[
'name' => 'input_fields_border',
'label' => esc_html__('Border', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-form-field input',
]
);
$this->add_control(
'input_fields_border_radius',
[
'label' => esc_html__('Border Radius', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%'],
'default' => [
'top' => '3',
'right' => '3',
'bottom' => '3',
'left' => '3',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-field input' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_control(
'input_fields_focus_color',
[
'label' => esc_html__('Focus Border Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#007cba',
'selectors' => [
'{{WRAPPER}} .king-addons-form-field input:focus' => 'border-color: {{VALUE}};',
],
]
);
$this->end_controls_section();
// Labels Style
$this->start_controls_section(
'section_labels_style',
[
'label' => esc_html__('Labels', 'king-addons'),
'tab' => Controls_Manager::TAB_STYLE,
'condition' => [
'show_labels' => 'yes',
],
]
);
$this->add_group_control(
Group_Control_Typography::get_type(),
[
'name' => 'labels_typography',
'label' => esc_html__('Typography', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-form-field label',
]
);
$this->add_control(
'labels_color',
[
'label' => esc_html__('Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#333333',
'selectors' => [
'{{WRAPPER}} .king-addons-form-field label' => 'color: {{VALUE}};',
],
]
);
$this->add_responsive_control(
'labels_margin',
[
'label' => esc_html__('Margin', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '0',
'right' => '0',
'bottom' => '5',
'left' => '0',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-field label' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->end_controls_section();
// Button Style
$this->start_controls_section(
'section_button_style',
[
'label' => esc_html__('Buttons', 'king-addons'),
'tab' => Controls_Manager::TAB_STYLE,
]
);
$this->add_group_control(
Group_Control_Typography::get_type(),
[
'name' => 'button_typography',
'label' => esc_html__('Typography', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-form-button',
]
);
$this->start_controls_tabs('button_style_tabs');
$this->start_controls_tab(
'button_normal_tab',
[
'label' => esc_html__('Normal', 'king-addons'),
]
);
$this->add_control(
'button_color',
[
'label' => esc_html__('Text Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#ffffff',
'selectors' => [
'{{WRAPPER}} .king-addons-form-button' => 'color: {{VALUE}};',
],
]
);
$this->add_control(
'button_background',
[
'label' => esc_html__('Background Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#007cba',
'selectors' => [
'{{WRAPPER}} .king-addons-form-button' => 'background-color: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->start_controls_tab(
'button_hover_tab',
[
'label' => esc_html__('Hover', 'king-addons'),
]
);
$this->add_control(
'button_hover_color',
[
'label' => esc_html__('Text Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#ffffff',
'selectors' => [
'{{WRAPPER}} .king-addons-form-button:hover' => 'color: {{VALUE}};',
],
]
);
$this->add_control(
'button_hover_background',
[
'label' => esc_html__('Background Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#005a87',
'selectors' => [
'{{WRAPPER}} .king-addons-form-button:hover' => 'background-color: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->end_controls_tabs();
$this->add_responsive_control(
'button_padding',
[
'label' => esc_html__('Padding', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '12',
'right' => '30',
'bottom' => '12',
'left' => '30',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-button' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
'separator' => 'before',
]
);
$this->add_responsive_control(
'button_margin',
[
'label' => esc_html__('Margin', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '10',
'right' => '0',
'bottom' => '15',
'left' => '0',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-button' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_group_control(
Group_Control_Border::get_type(),
[
'name' => 'button_border',
'label' => esc_html__('Border', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-form-button',
]
);
$this->add_control(
'button_border_radius',
[
'label' => esc_html__('Border Radius', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%'],
'default' => [
'top' => '3',
'right' => '3',
'bottom' => '3',
'left' => '3',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-button' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_responsive_control(
'button_width',
[
'label' => esc_html__('Width', 'king-addons'),
'type' => Controls_Manager::SLIDER,
'size_units' => ['px', '%'],
'range' => [
'px' => [
'min' => 0,
'max' => 1000,
],
'%' => [
'min' => 0,
'max' => 100,
],
],
'default' => [
'unit' => '%',
'size' => 100,
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-button' => 'width: {{SIZE}}{{UNIT}};',
],
]
);
$this->end_controls_section();
// Links Style
$this->start_controls_section(
'section_links_style',
[
'label' => esc_html__('Links', 'king-addons'),
'tab' => Controls_Manager::TAB_STYLE,
]
);
$this->add_group_control(
Group_Control_Typography::get_type(),
[
'name' => 'links_typography',
'label' => esc_html__('Typography', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-form-link, {{WRAPPER}} .king-addons-form-toggle',
]
);
$this->start_controls_tabs('links_style_tabs');
$this->start_controls_tab(
'links_normal_tab',
[
'label' => esc_html__('Normal', 'king-addons'),
]
);
$this->add_control(
'links_color',
[
'label' => esc_html__('Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#007cba',
'selectors' => [
'{{WRAPPER}} .king-addons-form-link, {{WRAPPER}} .king-addons-form-toggle' => 'color: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->start_controls_tab(
'links_hover_tab',
[
'label' => esc_html__('Hover', 'king-addons'),
]
);
$this->add_control(
'links_hover_color',
[
'label' => esc_html__('Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#005a87',
'selectors' => [
'{{WRAPPER}} .king-addons-form-link:hover, {{WRAPPER}} .king-addons-form-toggle:hover' => 'color: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->end_controls_tabs();
$this->add_responsive_control(
'links_margin',
[
'label' => esc_html__('Margin', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '10',
'right' => '0',
'bottom' => '0',
'left' => '0',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-link, {{WRAPPER}} .king-addons-form-toggle' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
'separator' => 'before',
]
);
$this->end_controls_section();
// Messages Style
$this->start_controls_section(
'section_messages_style',
[
'label' => esc_html__('Messages', 'king-addons'),
'tab' => Controls_Manager::TAB_STYLE,
]
);
$this->add_group_control(
Group_Control_Typography::get_type(),
[
'name' => 'messages_typography',
'label' => esc_html__('Typography', 'king-addons'),
'selector' => '{{WRAPPER}} .king-addons-form-message',
]
);
$this->add_control(
'success_message_color',
[
'label' => esc_html__('Success Message Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#4caf50',
'selectors' => [
'{{WRAPPER}} .king-addons-form-message.success' => 'color: {{VALUE}};',
],
]
);
$this->add_control(
'error_message_color',
[
'label' => esc_html__('Error Message Color', 'king-addons'),
'type' => Controls_Manager::COLOR,
'default' => '#f44336',
'selectors' => [
'{{WRAPPER}} .king-addons-form-message.error' => 'color: {{VALUE}};',
],
]
);
$this->add_responsive_control(
'messages_padding',
[
'label' => esc_html__('Padding', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '10',
'right' => '15',
'bottom' => '10',
'left' => '15',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-message' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_responsive_control(
'messages_margin',
[
'label' => esc_html__('Margin', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%', 'em'],
'default' => [
'top' => '0',
'right' => '0',
'bottom' => '15',
'left' => '0',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-message' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_control(
'messages_border_radius',
[
'label' => esc_html__('Border Radius', 'king-addons'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px', '%'],
'default' => [
'top' => '3',
'right' => '3',
'bottom' => '3',
'left' => '3',
'unit' => 'px',
],
'selectors' => [
'{{WRAPPER}} .king-addons-form-message' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->end_controls_section();
}
protected function render()
{
$settings = $this->get_settings_for_display();
if (king_addons_freemius()->can_use_premium_code__premium_only()) {
$this->render_pro($settings);
} else {
$this->render_free($settings);
}
}
/**
* Render Pro version with all features
*/
private function render_pro($settings)
{
// Full implementation with all features
$this->render_full_form($settings);
}
/**
* Render Free version with limited features
*/
private function render_free($settings)
{
// Disable premium features for free users
$settings['custom_fields'] = []; // No custom fields in free
$settings['enable_social_login'] = 'no'; // No social login in free
$settings['enable_mailchimp_integration'] = 'no'; // No Mailchimp in free
$settings['enable_admin_email'] = 'no'; // No admin emails in free
// Render with limited settings
$this->render_full_form($settings);
// Show upgrade notice if premium features are attempted
if ($this->get_settings('enable_social_login') === 'yes' ||
$this->get_settings('enable_mailchimp_integration') === 'yes' ||
!empty($this->get_settings('custom_fields'))) {
?>
get_id();
$post_id = get_the_ID();
if (empty($post_id)) {
$post_id = get_queried_object_id();
}
$default_form = $settings['default_form_type'];
$enable_ajax = $settings['enable_ajax'] === 'yes';
$show_labels = $settings['show_labels'] === 'yes';
// Check if user registration is enabled
$user_can_register = get_option('users_can_register');
// Check if user is already logged in and should be redirected
if (is_user_logged_in() && $settings['redirect_logout_user'] === 'yes' && !empty($settings['redirect_logout_url']['url'])) {
$redirect_url = $settings['redirect_logout_url']['url'];
?>