Created
December 2, 2015 21:49
-
-
Save vaughanm/dfb9f589db7afc1033e4 to your computer and use it in GitHub Desktop.
Make blogname on wordpress require a minimum of 2 numbers throughout the network (Multisite)
This file contains 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
// Filters blog signup validation methods | |
// Blogname must now contain minimum of 2 numbers | |
function wpmudev_blogname_numbers( $content ) { | |
global $wpdb, $domain; | |
| |
$current_site = get_current_site(); | |
$base = $current_site->path; | |
| |
$blog_title = strip_tags( $content['blog_title'] ); | |
$blog_title = substr( $blog_title, 0, 50 ); | |
| |
$errors = new WP_Error(); | |
$illegal_names = get_site_option( 'illegal_names' ); | |
if ( $illegal_names == false ) { | |
$illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); | |
add_site_option( 'illegal_names', $illegal_names ); | |
} | |
| |
/* | |
* On sub dir installs, some names are so illegal, only a filter can | |
* spring them from jail. | |
*/ | |
if ( ! is_subdomain_install() ) { | |
$illegal_names = array_merge( | |
$illegal_names, | |
/** | |
* Filter reserved site names on a sub-directory Multisite install. | |
* | |
* @since 3.0.0 | |
* | |
* @param array $subdirectory_reserved_names Array of reserved names. | |
*/ | |
apply_filters( 'subdirectory_reserved_names', array( 'page', 'comments', 'blog', 'files', 'feed' ) ) | |
); | |
} | |
$blogname = $content['blogname']; | |
| |
if ( empty( $blogname ) ) | |
$errors->add('blogname', __( 'Please enter a site name.' ) ); | |
| |
if ( preg_match( '/[^a-z0-9]+/', $blogname ) ) | |
$errors->add('blogname', __( 'Only lowercase letters (a-z) and numbers are allowed.' ) ); | |
| |
$blogname_numbers = 2; | |
if (strlen(preg_replace('/[^0-9]/','',$blogname)) < $blogname_numbers) | |
$errors->add('blogname', __( 'Blog name must contain at least ' . $blogname_numbers . ' numbers.' ) ); | |
| |
if ( in_array( $blogname, $illegal_names ) == true ) | |
$errors->add('blogname', __( 'That name is not allowed.' ) ); | |
| |
if ( strlen( $blogname ) < 4 && !is_super_admin() ) | |
$errors->add('blogname', __( 'Site name must be at least 4 characters.' ) ); | |
| |
if ( strpos( $blogname, '_' ) !== false ) | |
$errors->add( 'blogname', __( 'Sorry, site names may not contain the character “_”!' ) ); | |
| |
// do not allow users to create a blog that conflicts with a page on the main blog. | |
if ( !is_subdomain_install() && $wpdb->get_var( $wpdb->prepare( "SELECT post_name FROM " . $wpdb->get_blog_prefix( $current_site->blog_id ) . "posts WHERE post_type = 'page' AND post_name = %s", $blogname ) ) ) | |
$errors->add( 'blogname', __( 'Sorry, you may not use that site name.' ) ); | |
| |
// all numeric? | |
if ( preg_match( '/^[0-9]*$/', $blogname ) ) | |
$errors->add('blogname', __('Sorry, site names must have letters too!')); | |
| |
/** | |
* Filter the new site name during registration. | |
* | |
* The name is the site's subdomain or the site's subdirectory | |
* path depending on the network settings. | |
* | |
* @since MU | |
* | |
* @param string $blogname Site name. | |
*/ | |
$blogname = apply_filters( 'newblogname', $blogname ); | |
| |
$blog_title = wp_unslash( $blog_title ); | |
| |
if ( empty( $blog_title ) ) | |
$errors->add('blog_title', __( 'Please enter a site title.' ) ); | |
| |
// Check if the domain/path has been used already. | |
if ( is_subdomain_install() ) { | |
$mydomain = $blogname . '.' . preg_replace( '|^www\.|', '', $domain ); | |
$path = $base; | |
} else { | |
$mydomain = "$domain"; | |
$path = $base.$blogname.'/'; | |
} | |
if ( domain_exists($mydomain, $path, $current_site->id) ) | |
$errors->add( 'blogname', __( 'Sorry, that site already exists!' ) ); | |
| |
if ( username_exists( $blogname ) ) { | |
if ( is_object( $user ) == false || ( is_object($user) && ( $user->user_login != $blogname ) ) ) | |
$errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) ); | |
} | |
| |
// Has someone already signed up for this domain? | |
$signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE domain = %s AND path = %s", $mydomain, $path) ); // TODO: Check email too? | |
if ( ! empty($signup) ) { | |
$diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered); | |
// If registered more than two days ago, cancel registration and let this signup go through. | |
if ( $diff > 2 * DAY_IN_SECONDS ) | |
$wpdb->delete( $wpdb->signups, array( 'domain' => $mydomain , 'path' => $path ) ); | |
else | |
$errors->add('blogname', __('That site is currently reserved but may be available in a couple days.')); | |
} | |
| |
$result = array('domain' => $mydomain, 'path' => $path, 'blogname' => $blogname, 'blog_title' => $blog_title, 'user' => $user, 'errors' => $errors); | |
| |
/** | |
* Filter site details and error messages following registration. | |
* | |
* @since MU | |
* | |
* @param array $result { | |
* Array of domain, path, blog name, blog title, user and error messages. | |
* | |
* @type string $domain Domain for the site. | |
* @type string $path Path for the site. Used in subdirectory installs. | |
* @type string $blogname The unique site name (slug). | |
* @type string $blog_title Blog title. | |
* @type string $user User email address. | |
* @type WP_Error $errors WP_Error containing any errors found. | |
* } | |
*/ | |
return $result; | |
} | |
add_filter( 'wpmu_validate_blog_signup', 'wpmudev_blogname_numbers', 999); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
mu-plugin which adds a number check to the blog name, in this case blog name must contain 2 numbers.
Change the value of $blogname_numbers to increase/decrease the minimum required.