【问题标题】:Create Wordpress user when new custom post created创建新的自定义帖子时创建 Wordpress 用户
【发布时间】:2021-10-24 17:02:03
【问题描述】:

我想从前端和后端创建自定义帖子。当我创建帖子时,我想创建用户。在前端,我使用 form 和 wp_insert_post,因此它可以根据需要创建帖子。在后端,我使用以下代码:

add_action( 'publish_user_contact', 'custom_post_user_create', 1, 3);
function custom_post_user_create($post_id){

 $user_login_id = 'user_'.random_int(100000, 999999);    

 update_post_meta($post_id, 'idr_contact_user_id', $user_login_id); 

 $password = wp_generate_password( 10, true, true );

 if (!empty($_POST['contact_email'])){
  $userdata = [
    'user_login'      => "$user_login_id",
    'user_pass'       => "$password",     
    'user_email'      => $_POST['contact_email'],    
    'display_name'    => sanitize_text_field( $_POST['contact_first_name'] .' '. $_POST['contact_last_name'] ),     
    'first_name'      => sanitize_text_field( $_POST['contact_first_name'] ),
    'last_name'       => sanitize_text_field( $_POST['contact_last_name'] )   
  ];
} else {
  $userdata = [
    'user_login'      => "$user_login_id",
    'user_pass'       => "$password",  
    'display_name'    => sanitize_text_field( $_POST['contact_first_name'] .' '. $_POST['contact_last_name'] ),     
    'first_name'      => sanitize_text_field( $_POST['contact_first_name'] ),   
    'last_name'       => sanitize_text_field( $_POST['contact_last_name'] )   
  ];
}
$user_id = wp_insert_user( $userdata );
}

当我尝试编辑帖子时,它会创建具有自定义帖子螺母的用户,它会创建更多用户。我尝试使用 new_to_publish,但它不起作用(用户不创建)。我尝试使用 save_post 但它也会重复。

如何防止重复?

【问题讨论】:

  • 你必须添加一些独特的东西来检查用户是否已经存在。您正在为 user_login 提供一个随机 ID,因此这不会帮助您检查用户名是否存在,其次,当电子邮件不为空时,您还会创建一个没有电子邮件的用户,因此在这种情况下,您也无法检查电子邮件存在。
  • 是的,我之前创建了元值 idr_contact_user_id 但使用 publish_user_contact 时无法获取元值,因为保存后的元记录。

标签: wordpress


【解决方案1】:

尝试为自定义字段添加检查,然后在编辑帖子时不会执行代码。

add_action( 'publish_user_contact', 'custom_post_user_create', 1, 3);
function custom_post_user_create($post_id){

 $user_login_id = 'user_'.random_int(100000, 999999); 

 if(get_post_meta($post_id, "idr_contact_user_id", true) ) {
    return;
 }

 update_post_meta($post_id, 'idr_contact_user_id', $user_login_id); 

 $password = wp_generate_password( 10, true, true );

 if (!empty($_POST['contact_email'])){
  $userdata = [
    'user_login'      => "$user_login_id",
    'user_pass'       => "$password",     
    'user_email'      => $_POST['contact_email'],    
    'display_name'    => sanitize_text_field( $_POST['contact_first_name'] .' '. $_POST['contact_last_name'] ),     
    'first_name'      => sanitize_text_field( $_POST['contact_first_name'] ),
    'last_name'       => sanitize_text_field( $_POST['contact_last_name'] )   
  ];
} else {
  $userdata = [
    'user_login'      => "$user_login_id",
    'user_pass'       => "$password",  
    'display_name'    => sanitize_text_field( $_POST['contact_first_name'] .' '. $_POST['contact_last_name'] ),     
    'first_name'      => sanitize_text_field( $_POST['contact_first_name'] ),   
    'last_name'       => sanitize_text_field( $_POST['contact_last_name'] )   
  ];
}
$user_id = wp_insert_user( $userdata );
}

【讨论】:

  • 谢谢!其作品。但我不明白。如果我尝试发布元数据,我什么也得不到。那么你的代码是如何工作的呢?你能解释一下吗?
  • 首次运行此代码时 - 额外字段尚未填写,因此检查不起作用。在编辑期间运行此功能时 - 该字段已存在并且检查不允许创建另一个用户。 get_post_meta 什么都不打印,你需要 echo get_post_meta($post_id, "idr_contact_user_id", true);
  • 我检查了 var_dump 但 echo 也没有显示元值。所以这段代码不检查值只存在于元字段?
  • 对您尝试用于打印该字段的代码进行屏幕截图。这个检查真的不检查值,只检查字段的存在。
  • 我在同一个函数中使用这个:$user_email = get_post_meta($post_id, 'idr_contact_user_email', true); if (!empty($user_email)){ $userdata = [ 'user_login' => "$user_login_id", 'user_pass' => "$password", 'user_email' => "$user_email",
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2016-05-13
  • 2015-11-06
相关资源
最近更新 更多