01273 264503 info@mootpoint.org

Contact Form 7 is a popular form plugin for WordPress. You can use it to create a user registration form on the front-end of your web site. Normally Contact Form 7 will email the form submission to the site administrator, who then has to create the user manually in the Users section of the site admin. However, this process can be automated by hooking into the ‘wpcf7_before_send_mail’ action and creating a user from the submitted form fields.

Contact Form 7 version 3.9 introduced a new API to retrieve the form data and I have not found this documented anywhere, so the code below may help users of 3.9 who are scratching their heads.

The code below is placed in your theme’s functions.php file. You will need to adjust it to reflect your own user registration form title and form field names.

function create_user_from_registration($cfdata) {
    if (!isset($cfdata->posted_data) && class_exists('WPCF7_Submission')) {
        // Contact Form 7 version 3.9 removed $cfdata->posted_data and now
        // we have to retrieve it from an API
        $submission = WPCF7_Submission::get_instance();
        if ($submission) {
            $formdata = $submission->get_posted_data();
        }
    } elseif (isset($cfdata->posted_data)) {
        // For pre-3.9 versions of Contact Form 7
        $formdata = $cfdata->posted_data;
    } else {
        // We can't retrieve the form data
        return $cfdata;
    }
    // Check this is the user registration form
    if ( $cfdata->title() == 'Your Registration Form Title') {
        $password = wp_generate_password( 12, false );
        $email = $formdata['form-email-field'];
        $name = $formdata['form-name-field'];
        // Construct a username from the user's name
        $username = strtolower(str_replace(' ', '', $name));
        $name_parts = explode(' ',$name);
        if ( !email_exists( $email ) ) {
        	// Find an unused username
			$username_tocheck = $username;
			$i = 1;
			while ( username_exists( $username_tocheck ) ) {
        		$username_tocheck = $username . $i++;
        	}
        	$username = $username_tocheck;
        	// Create the user
			$userdata = array(
				'user_login' => $username,
				'user_pass' => $password,
				'user_email' => $email,
				'nickname' => reset($name_parts),
				'display_name' => $name,
				'first_name' => reset($name_parts),
				'last_name' => end($name_parts),
				'role' => 'subscriber'
			);
			$user_id = wp_insert_user( $userdata );
			if ( !is_wp_error($user_id) ) {
				// Email login details to user
				$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
				$message = "Welcome! Your login details are as follows:" . "\r\n";
				$message .= sprintf(__('Username: %s'), $username) . "\r\n";
				$message .= sprintf(__('Password: %s'), $password) . "\r\n";
				$message .= wp_login_url() . "\r\n";
				wp_mail($email, sprintf(__('[%s] Your username and password'), $blogname), $message);
			}
        }
    }
    return $cfdata;
}
add_action('wpcf7_before_send_mail', 'create_user_from_registration', 1);

Notes:

  • If the email address is already associated with an existing user, a new one will not be created.
  • You can pass additional fields such as website URL to wp_insert_user – see the documentation.
  • If you need to manually approve the user before giving them access, you can create a ‘pending’ role with limited capabilities, and set the script to allocate that role to the new user. You will then have to manually allocate the user to their full role in the site admin once approved.
  • Justin Tadlock’s Members plugin is useful for managing WordPress Roles from the admin.