Last active
April 1, 2025 09:21
-
-
Save ipokkel/61ec7b455b655d96f8b4c717e454a63c to your computer and use it in GitHub Desktop.
Restrict membership signup by email domain only for set membership levels.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Restrict Membership Signup by Email Domain for set levels. | |
* Make sure to edit the $restricted_levels and $valid_domains array defined | |
* further below to include only the domains you'd like to allow. | |
* | |
* You can add this recipe to your site by creating a custom plugin | |
* or using the Code Snippets plugin available for free in the WordPress repository. | |
* Read this companion article for step-by-step directions on either method. | |
* https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/ | |
*/ | |
function my_pmpro_registration_checks_restrict_email_addresses_per_level( $continue_registration ) { | |
// Set your restricted levels here. | |
$restricted_levels = array( 1, 2, 3 ); // IDs of levels to restrict | |
$level = pmpro_getLevelAtCheckout(); // Get the level object. | |
$level_id = intval( $level->id ); // Get the level ID. | |
if ( ! in_array( $level_id, $restricted_levels ) ) { | |
return $continue_registration; // Bail if the level is not restricted. | |
} | |
// Do we have an email? | |
if ( ! isset( $_REQUEST['bemail'] ) || empty( $_REQUEST['bemail'] ) ) { | |
return $continue_registration; // Bail if there is no email. | |
} | |
$email = wp_unslash( $_REQUEST['bemail'] ); // Get the email. | |
if ( ! my_checkForValidDomain( $email ) ) { | |
pmpro_setMessage( 'Please enter a valid email address', 'pmpro_error' ); | |
return false; | |
} | |
return $continue_registration; | |
} | |
add_filter( 'pmpro_registration_checks', 'my_pmpro_registration_checks_restrict_email_addresses_per_level', 10, 1 ); | |
//Taken from: http://www.bitrepository.com/how-to-extract-domain-name-from-an-e-mail-address-string.html | |
function my_getDomainFromEmail( $email ) { | |
// Get the data after the @ sign | |
$domain = substr( strrchr( $email, '@' ), 1 ); | |
return $domain; | |
} | |
function my_checkForValidDomain( $email ) { | |
$domain = my_getDomainFromEmail( $email ); | |
// Update this array to include the domains you want to allow. | |
$valid_domains = array( 'yahoo.com', '*.gmail.com', '*.domain.uk' ); | |
foreach ( $valid_domains as $valid_domain ) { | |
$components = explode( '.', $valid_domain ); | |
$domain_to_check = explode( '.', $domain ); | |
if ( $components[0] == '*' && count( $domain_to_check ) > 2 ) { | |
if ( $components[1] == $domain_to_check[1] && $components[2] == $domain_to_check[2] ) { | |
return true; | |
} | |
} else { | |
if ( ! ( strpos( $valid_domain, $domain ) === false ) ) { | |
return true; | |
} | |
} | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment