将新密码规则添加到旗舰会员注册表单

时间:2020-09-04 作者:Vincent Decaux

我使用终极会员和经典表格进行注册。

我已启用“;强密码“;,但我希望我的用户至少用一个特殊字符(如“\\\\%$…”)填写他们的密码

我没有找到任何插件,所以我试图找到好的挂钩,并尝试了以下代码:

function um_submit_form_register_theme($args) {
    global $ultimatemember;
    $password = $_POST[\'user_password-257\'];
    
    if ( !isset($ultimatemember->form->errors) ) {
        if (!preg_match("/\\W/", $password)) {
            $ultimatemember->classes[\'form\']->add_error( \'user_password-257\', __(\'Your password must a special caractere\') );
        } else {
            do_action(\'um_user_registration\', $args); 
        }
    }
 
    do_action(\'um_user_registration_extra_hook\', $args ); 
}
add_action(\'um_submit_form_register\', \'um_submit_form_register_theme\', 10);
但它不起作用。。。无特殊字符的注册。有什么线索吗?

1 个回复
SO网友:Raashid Din

你必须做各种各样的事情。但您可以更改最终成员使用的挂钩。他们使用验证类。但是记住您的需要,您可以绕过这个类的使用。这是我认为可行的解决方案

remove_action( \'um_submit_form_register\', \'um_submit_form_register\', 10 );
现在我们将注册新方法。

add_action( \'um_submit_form_register\', \'my_custom_submit_form_register\', 10 );
下面是函数。我认为开发人员在下一个版本中必须做的是在验证类中提供过滤器。

function my_custom_submit_form_register( $args ) {
    if ( isset( UM()->form()->errors ) ) {
        return false;
    }

    /**
     * UM hook
     *
     * @type filter
     * @title um_add_user_frontend_submitted
     * @description Extend user data on registration form submit
     * @input_vars
     * [{"var":"$submitted","type":"array","desc":"Registration data"}]
     * @change_log
     * ["Since: 2.0"]
     * @usage
     * <?php add_filter( \'um_add_user_frontend_submitted\', \'function_name\', 10, 1 ); ?>
     * @example
     * <?php
     * add_filter( \'um_add_user_frontend_submitted\', \'my_add_user_frontend_submitted\', 10, 1 );
     * function my_add_user_frontend_submitted( $submitted ) {
     *     // your code here
     *     return $submitted;
     * }
     * ?>
     */
    $args = apply_filters( \'um_add_user_frontend_submitted\', $args );

    extract( $args );

    if ( ! empty( $username ) && empty( $user_login ) ) {
        $user_login = $username;
    }

    if ( ! empty( $first_name ) && ! empty( $last_name ) && empty( $user_login ) ) {

        if ( UM()->options()->get( \'permalink_base\' ) == \'name\' ) {
            $user_login = rawurlencode( strtolower( str_replace( " ", ".", $first_name . " " . $last_name ) ) );
        } elseif ( UM()->options()->get( \'permalink_base\' ) == \'name_dash\' ) {
            $user_login = rawurlencode( strtolower( str_replace( " ", "-", $first_name . " " . $last_name ) ) );
        } elseif ( UM()->options()->get( \'permalink_base\' ) == \'name_plus\' ) {
            $user_login = strtolower( str_replace( " ", "+", $first_name . " " . $last_name ) );
        } else {
            $user_login = strtolower( str_replace( " ", "", $first_name . " " . $last_name ) );
        }

        // if full name exists
        $count = 1;
        $temp_user_login = $user_login;
        while ( username_exists( $temp_user_login ) ) {
            $temp_user_login = $user_login . $count;
            $count++;
        }
        if ( $temp_user_login !== $user_login ) {
            $user_login = $temp_user_login;
        }
    }

    if ( empty( $user_login ) && ! empty( $user_email ) ) {
        $user_login = $user_email;
    }

    $unique_userID = UM()->query()->count_users() + 1;

    if ( empty( $user_login ) || strlen( $user_login ) > 30 && ! is_email( $user_login ) ) {
        $user_login = \'user\' . $unique_userID;
    }

    if ( isset( $username ) && is_email( $username ) ) {
        $user_email = $username;
    }

    if ( ! isset( $user_password ) ) {
        $user_password = apply_filters(\'my_custom_password_strength\', UM()->validation()->generate( 8 ));
    }

    if ( empty( $user_email ) ) {
        $site_url = @$_SERVER[\'SERVER_NAME\'];
        $user_email = \'nobody\' . $unique_userID . \'@\' . $site_url;
        /**
         * UM hook
         *
         * @type filter
         * @title um_user_register_submitted__email
         * @description Change user default email if it\'s empty on registration
         * @input_vars
         * [{"var":"$user_email","type":"string","desc":"Default email"}]
         * @change_log
         * ["Since: 2.0"]
         * @usage
         * <?php add_filter( \'um_user_register_submitted__email\', \'function_name\', 10, 1 ); ?>
         * @example
         * <?php
         * add_filter( \'um_user_register_submitted__email\', \'my_user_register_submitted__email\', 10, 1 );
         * function my_user_register_submitted__email( $user_email ) {
         *     // your code here
         *     return $user_email;
         * }
         * ?>
         */
        $user_email = apply_filters( \'um_user_register_submitted__email\', $user_email );
    }

    $credentials = array(
        \'user_login\'    => $user_login,
        \'user_password\' => $user_password,
        \'user_email\'    => trim( $user_email ),
    );

    $args[\'submitted\'] = array_merge( $args[\'submitted\'], $credentials );
    $args = array_merge( $args, $credentials );

    //get user role from global or form\'s settings
    $user_role = UM()->form()->assigned_role( UM()->form()->form_id );

    //get user role from field Role dropdown or radio
    if ( isset( $args[\'role\'] ) ) {
        global $wp_roles;
        $um_roles = get_option( \'um_roles\' );

        if ( ! empty( $um_roles ) ) {
            $role_keys = array_map( function( $item ) {
                return \'um_\' . $item;
            }, get_option( \'um_roles\' ) );
        } else {
            $role_keys = array();
        }

        $exclude_roles = array_diff( array_keys( $wp_roles->roles ), array_merge( $role_keys, array( \'subscriber\' ) ) );

        //if role is properly set it
        if ( ! in_array( $args[\'role\'], $exclude_roles ) ) {
            $user_role = $args[\'role\'];
        }
    }

    /**
     * UM hook
     *
     * @type filter
     * @title um_registration_user_role
     * @description Change user role on registration process
     * @input_vars
     * [{"var":"$role","type":"string","desc":"User role"},
     * {"var":"$submitted","type":"array","desc":"Registration data"}]
     * @change_log
     * ["Since: 2.0"]
     * @usage
     * <?php add_filter( \'um_registration_user_role\', \'function_name\', 10, 2 ); ?>
     * @example
     * <?php
     * add_filter( \'um_registration_user_role\', \'my_registration_user_role\', 10, 2 );
     * function my_user_register_submitted__email( $role, $submitted ) {
     *     // your code here
     *     return $role;
     * }
     * ?>
     */
    $user_role = apply_filters( \'um_registration_user_role\', $user_role, $args );

    $userdata = array(
        \'user_login\'    => $user_login,
        \'user_pass\'     => $user_password,
        \'user_email\'    => $user_email,
        \'role\'          => $user_role,
    );

    $user_id = wp_insert_user( $userdata );

    /**
     * UM hook
     *
     * @type action
     * @title um_user_register
     * @description After complete UM user registration.
     * @input_vars
     * [{"var":"$user_id","type":"int","desc":"User ID"},
     * {"var":"$args","type":"array","desc":"Form data"}]
     * @change_log
     * ["Since: 2.0"]
     * @usage add_action( \'um_user_register\', \'function_name\', 10, 2 );
     * @example
     * <?php
     * add_action( \'um_user_register\', \'my_user_register\', 10, 2 );
     * function my_user_register( $user_id, $args ) {
     *     // your code here
     * }
     * ?>
     */
    do_action( \'um_user_register\', $user_id, $args );

    return $user_id;
}
我没有更改任何内容,只是添加了过滤器,所以如果开发人员更改了任何内容,都不会出现问题(如果开发人员添加了新的内容,您将面临问题,否则我会联系他们添加过滤器)。这里是过滤函数。

function my_custom_password_strength() {
    global $ultimatemember;
    $password = $_POST[\'user_password-257\'];

     if (preg_match(" /^(?=.*[!@#$%^&*-])(?=.*[0-9])(?=.*[A-Z]).{8,20}$/", $password)) {
             return wp_generate_password(8)
        } else {
            $ultimatemember->classes[\'form\']->add_error( \'user_password-257\', __(\'Your password must have a special character\') );
            do_action(\'um_user_registration\', $args); 
        }
}
这是你能做到这一点的唯一方法。您可能需要再添加一些支票。但请记住只需使用过滤器功能my_custom_password_strength().

希望这有帮助。谢谢

相关推荐

是否有必要清理wp_set_password用户输入?

我正在尝试向WP注册表添加密码表单。请参见下面的代码。我想知道是否需要清理这个特定的用户输入?(如果是,怎么做?)如果我理解正确,WP为某些东西内置了净化功能,密码可能就是其中之一。对吗?WP会在将其添加到数据库之前自动对其进行清理吗?add_action( \'register_new_user\', \'registration_change_pass\', 10, 99 ); function registration_change_pass( $user_id ) { &