添加一个将三个域连接到一个用户名的登录表单

时间:2017-05-13 作者:omega33

我需要用三个值(而不是一个值)对用户进行身份验证USERNAME 价值让我们给他们打电话VALUE1, VALUE2, VALUE3. 不会要求他们提供特定的PASSWORD.

我研究了修改登录例程,使其请求三个值,并根据这三个值对用户进行身份验证(类似于所描述的here). 但是因为Wordpress需要一个USERNAME 字段,并且在登录页面中输入的值之一实际上需要是USERNAME, 这行不通,很简单,因为这三个值本身都不是唯一的。独特之处在于这三种价值观的结合。

这导致了这样一种想法USERNAME 存储在WP中的值可以是通过连接我需要的三个值而派生的值(VALUE1, VALUE2, VALUE3). 所以USERNAME 将是VALUE1VALUE2VALUE3.

我还将使用此串联值作为PASSWORD, 因为如果用户知道我请求的三个值,我不要求他们输入单独的密码。

问题1我的第一个问题是上述基本原理是否准确?即使我向登录例程添加了其他字段,其中一个字段也需要与USERNAME 值,并且该值必须是唯一的?

问题2如果上述内容正确,那么我的下一个问题是如何创建一个登录表单,该表单请求三个字段(加上密码),并将这些字段连接成一个值,该值根据USERNAME?

例如,自定义登录页面将请求以下内容:

VALUE1, VALUE2, VALUE3

然后将这些连接到VALUE1VALUE2VALUE3 并将其作为USERNAMEPASSWORD 价值观

显然,我希望在不修改核心文件的情况下实现这一切。该站点有一个子主题,因此可以在其中完成所有操作。

2 个回复
最合适的回答,由SO网友:omega33 整理而成

以下是最终奏效的方法。如果这对希望做类似事情的人有用。

我们在子主题中创建了一个自定义模板。

最后的串联值用作用户名和密码。

假设使用了典型自定义页面模板的所有其他必要代码,我将只发布自定义页面模板文件的开头:

<?php
    /**
    Template Name: Custom Login Page
    */
    if ( is_user_logged_in() ) {
        wp_redirect( LOGIN_REDIRECT );  // LOGIN_REDIRECT is set in the config.php file.
    }
    $WP_Error = new WP_Error();

    if(isset($_POST[\'form-action\']) && $_POST[\'form-action\']==\'login\') {
      $VALUE1 = trim($_POST[\'log-sname\']);
      $VALUE1 = preg_replace("/[^A-Za-z0-9\\- \']/", \'\', $VALUE1);
      $VALUE2 = $_POST[\'VALUE2\'];
      $VALUE3 = $_POST[\'VALUE3\'];
      $usernm = strtoupper(trim($VALUE1)).$VALUE2.$VALUE3;
      $passwd = strtoupper(trim($VALUE1)).$VALUE2.$VALUE3;
      $login_data = array();
      $login_data[\'user_login\'] = $usernm;
      $login_data[\'user_password\'] = $passwd;
      $login_data[\'remember\'] = false;
      $user_verify = wp_signon( $login_data, false ); 
      if ( is_wp_error($user_verify) ) 
      {
        $WP_Error->add(\'my_error\', \'<p align="center">We were unable to validate your user credentials. ETC ETC... error message instructions ETC</p>\');
      } else {  
        wp_redirect( LOGIN_REDIRECT ); // LOGIN_REDIRECT is set in the config.php file.
        exit();
      }
    }
这就是处理登录的方法。之后是标题。。

    get_header(); ?>
之后是循环的标准PHP等,如果生成错误,还需要一些代码来显示错误:

<div id="primary" <?php PARENT_THEME_SPECIFIC_content_class( \'content-area\' ); ?> > // use content_class suitable to your theme scenario
    <main id="main" class="site-main" role="main">
      <?php while ( have_posts() ) : the_post(); ?>
        <?php get_template_part( \'template-parts/content\', \'page\' ); ?>
      <?php endwhile; // End of the loop. ?>
      <?php echo $WP_Error->errors[\'my_error\'][0]; ?>
,然后是一个集合VALUE1、VALUE2和VALUE3的窗体。post操作设置为"". 这是form 声明:

最后插入页脚,以及其他可能需要的内容。

就是这样。

SO网友:hwl

如果通过将输入的值传递给组合这些值的函数来创建用户,则可以从另一个调用wp_insert_user. 然后,您可以根据需要保存用户名/密码,并在为WP准备登录时使用相同的函数和表单。以下所有代码仅用于演示。这一点怎么强调都不过分。一定要查看nonce并验证注册。

再说一次,这是ONLY a demo of the idea 指向大致方向。

<form>
    <input type="text" name"value1" />
    <input type="text" name"value2" />
    <input type="text" name"value3" />
</form>
然后,我们有一个函数来处理条目的组合:

<?php 
function getting_posted_values() {
    if(isset($_POST[\'value1\']) && (isset($_POST[\'value2\']) && (isset($_POST[\'value3\']) {
       $value1 = $_POST[\'value1\'];
       $value2 = $_POST[\'value2\'];
       $value3 = $_POST[\'value3\'];
       $new_value = $value1 . $value2 . $value3;
    }
  return $new_value;
 }
然后是一个钩住的函数-(例如,如果您使用Contact Form 7管理表单,您可以钩住wpcf7_before_send_mail 并访问post对象。)-可以调用以下函数并生成新用户:

function build_a_new_user($posted_form) {
    $new_value = getting_posted_values($posted_form);
    $userdata = array(
          \'user_login\'   => $new_value,
          \'user_pass\'    => $new_value, //normally: wp_generate_password( 12, false );
          \'user_email\'   => //note: not sure but may be required?
          \'nickname\'     => $new_value,
          \'display_name\' => $new_value,
          \'first_name\'   => $new_value,
          \'last_name\'    => $new_value,
          \'role\'         => \'subscriber\'
         );
     wp_insert_user($userdata);

}
wp_insert_user() is documented here.

More on handling custom registration here.

对于登录

值为1,2,3的表单将通过在另一个连接到登录的函数中调用来再次运行get\\u post\\u值。也许login_form_defaults filter 可以编辑表单的args数组。以下是完全的推测non-working example.

但是,如果您可以将这些值传递给WP的正常过程(可能通过authenticate 链接示例中提到的过滤器?)作为用户/通行证,您可以放弃自己进行检查。

function log_in_handler($posted_form) {
    $pass_and_username = getting_posted_values($posted_form);
    $args_array = array(
       \'username_id\' => $pass_and_username, 
       \'password\' => $pass_and_username);        
}
这绝对是一个有趣的尝试。希望这有帮助。

结束