vaughanm
12/2/2015 - 9:49 PM

Make blogname on wordpress require a minimum of 2 numbers throughout the network (Multisite)

Make blogname on wordpress require a minimum of 2 numbers throughout the network (Multisite)

// 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);