如何从USER_REGISTER挂钩中的USER REGISTERS表单检查用户类型?

时间:2021-02-26 作者:Pushkal Singh

我正在注册两种类型的用户。学生和老师。学生通过学生注册表(简易注册表插件)注册,教师通过教师注册表(也是简易注册表插件)注册。现在,我想使用user\\u register挂钩并创建一个函数,该函数将从数据库中的表中添加当前的折扣。这些将存储在另一个具有用户id的表中。折扣取决于它是教师还是学生。教师折扣的源表与学生折扣的源表不同。

add_action( \'user_register\', \'insertintodiscount\', 10, 1);

function insertintodiscount( $user_id )
{   
   $user = get_user_by(\'id\',$user_id);
   global $wpdb;
   $count_query ="SELECT * FROM discount_for_users WHERE userid=\'$user_id\'";
   $results = $wpdb->get_results ( "SELECT * FROM discount_for_users WHERE userid=\'$user_id\'" );
   $numrows = $wpdb->get_var($count_query);
   
   
   if( $user->has_cap( \'administrator\') or $user->has_cap( \'author\')) {
       $discountMonths = 0;
       $discountValue = 0;
       $disctype =\'admin\';
} else if(  metadata_exists( \'user\', $user_id, \'studentmothermobile\' )) {
   $disctype = \'student\';
           $stdDiscount = $wpdb->get_results ( "SELECT * FROM student_discount WHERE status=\'active\' LIMIT 1" );
           foreach ( $stdDiscount as $print ) 
           {
               $val=1;
               $discountMonths =$print->months;
               $discountValue =$print->discount;
           }
}
   else if ( metadata_exists( \'user\', $user_id, \'teachdobmeta\' ) ) {
       $disctype = \'teacher\';
           $tearesult = $wpdb->get_results ( "SELECT * FROM teacher_discount WHERE status=\'active\' LIMIT 1" );
           foreach ( $tearesult as $teachprint ) 
           {
               $val=1;
               $discountMonths =$teachprint->months;
               $discountValue =$teachprint->discount;
           }
    }
   else 
   {
       $discountMonths = 2;
       $discountValue = 10;
       $disctype =\'user\';
       
   }
       
         $table = \'discount_for_users\';
         $data = array(
             \'userid\' => $curusderid,
             \'discount\' => $discountValue,
             \'vaildity\' => $discountMonths,
             \'type\' => $disctype,
         );
         $format = array(
             \'%d\',
             \'%d\',
             \'%d\',
             \'%s\',
         );
         $success=$wpdb->insert( $table, $data, $format );       
}


每次我注册时,数据都会进入else状态。因此,无法从插入的元键值确定用户是学生还是教师。如何从正在注册的不同注册表中确定学生或教师,并在该功能中使用它?这些元键是不同的。

1 个回复
SO网友:Pushkal Singh

这只是一个备选答案,而不是问题的预期答案。我正在从他们注册的注册表中查找哪个用户是教师还是学生。据我所知,可以通过检查user\\u meta表中的表单元键关系来完成。这是一种查找哪些数据存储给教师,哪些数据存储给学生的方法。利用这个,我们找到了老师和学生。在我的问题中,我使用user\\u register hook中的函数在用户注册后立即获取用户的userid。但这有一个问题。

并非所有元数据都可以使用此函数中的user\\u meta表访问。这是我从stackoverflow的问题中得到的How to get user_meta value for new user regsitered?

我建议的另一种解决方案是在用户首次登录时为其添加折扣。这样做是为了完全访问user\\u元数据,并找到哪个用户是教师,哪个用户是学生。以下是代码:

add_action( \'user_register\', \'function_new_user\');

function function_new_user($user_id) { 
   add_user_meta( $user_id, \'_new_user\', \'1\' );
}

add_action(\'wp_login\', \'function_check_login_redirect\', 10, 2);


function function_check_login_redirect($user_login, $user) {
   $logincontrol = get_user_meta($user->ID, \'_new_user\', \'TRUE\');
if ( $logincontrol ) 
{
    $user_id = $user->ID;
    update_user_meta( $user->ID, \'_new_user\', \'0\' );
    global $wpdb;
    $count_query ="SELECT * FROM discount_for_users WHERE userid=\'$user_id\'";
    $results = $wpdb->get_results ( "SELECT * FROM discount_for_users WHERE userid=\'$user_id\'" );
    $numrows = $wpdb->get_var($count_query);
    
    if( $user->has_cap( \'administrator\') or $user->has_cap( \'author\')) 
    {
        $discountMonths = 0;
        $discountValue = 0;
        $disctype =\'admin\';
    } 
    elseif( metadata_exists( \'user\', $user_id, \'studentmothermobile\' )) 
    {
        $disctype = \'student\';
            $stdDiscount = $wpdb->get_results ( "SELECT * FROM student_discount WHERE status=\'active\' LIMIT 1" );
            foreach ( $stdDiscount as $print ) 
            {
                $val=1;
                $discountMonths =$print->months;
                $discountValue =$print->discount;
            }
    }
    elseif ( metadata_exists( \'user\', $user_id, \'teachdobmeta\' ) ) 
    {
        $disctype = \'teacher\';
            $tearesult = $wpdb->get_results ( "SELECT * FROM teacher_discount WHERE status=\'active\' LIMIT 1" );
            foreach ( $tearesult as $teachprint ) 
            {
                $val=1;
                $discountMonths =$teachprint->months;
                $discountValue =$teachprint->discount;
            }
    }
    else 
    {
        $discountMonths = 0;
        $discountValue = 0;
        $disctype =\'user\';
        
    }
        
          $table = \'discount_for_users\';
          $data = array(
              \'userid\' => $user_id,
              \'discount\' => $discountValue,
              \'vaildity\' => $discountMonths,
              \'type\' => $disctype,
          );
          $format = array(
              \'%d\',
              \'%d\',
              \'%d\',
              \'%s\',
          );
          $success=$wpdb->insert( $table, $data, $format ); 
      
       
   }
}

在解决方案中,我们在注册时为用户元数据添加值1,并在第一次登录时将其更新为0。存在检查元数据值是否为1并运行函数的条件。因此,它只会第一次运行该函数,我们可以使用此方法根据类型添加与教师和学生相关的折扣。请注意,这是替代解决方案,如果有直接解决方案可以解决此问题,请提供。这将很有帮助。我们的首要任务是在注册时增加折扣,而不是在首次登录时。

相关推荐

GET_USERS/WP_USER_QUERY在注销时返回空

我有一个相当基本的用户查询,可以在我正在开发的网站上查询工作人员。当您登录WordPress时,它们会显示在前端。但当注销时,它们不会显示。我做了一个var\\u转储,它在注销时返回为空。我找不到任何合乎逻辑的理由。我尝试了不询问角色,但它也做了同样的事情。<?php $args = array( \'role__in\' => array(\'Staff\') ); // The Query $user_query = get_use