向默认的WordPress多站点注册表添加自定义用户配置文件字段

时间:2020-04-24 作者:Andrew

我正在尝试向WP Multisite注册添加自定义字段。我找到了显示我的字段的挂钩,但我无法将其值保存到用户配置文件,因为要这样做,我需要用户ID,但在用户通过电子邮件中的链接确认注册之前,我假设用户ID不存在。我尝试了以下代码:

add_action( \'wpmu_new_user\', \'phone_register_extra_fields\' );
function phone_register_extra_fields ( $user_id, $password = "", $meta = array() ) {
    $phone_number = filter_var($_POST[\'phone_number\'], FILTER_SANITIZE_NUMBER_INT);
    update_user_meta( $user_id, \'phone_number\', $phone_number );
}
如何将字段值保存到尚未具有ID的挂起用户配置文件?上面的函数update\\u user\\u meta()无效,因为它需要用户ID。

我发现,可以在这个钩子上访问用户ID(在通过电子邮件链接激活博客和用户之后):

add_action( \'wpmu_activate_blog\', \'mu_add_phone_after_activation\', 10, 3 );
function mu_add_phone_after_activation( $blog_id, $user_id, $password, $signup_title, $meta ) {
    $user_phone = \'TESTnumber\';

    // $user_phone = $meta[\'user_phone\']; // How to put data in the $meta[\'user_phone\']? On which hook to take it from a $_POST[\'user_phone\'] ?

    update_user_meta( $user_id, \'phone_number\', $user_phone );      
}
但我需要存储多站点用户和博客注册页表单中的电话号码。可能可以将其存储在$meta 变量,但我尝试了很多挂钩,但都没有成功。可能是做错了。以下是我尝试的方式:

    add_filter( \'signup_user_meta\', \'mu_add_phone_in_signup\', 10, 4 );
function mu_add_phone_in_signup( $meta, $domain, $path, $title, $user, $user_email, $key ) {

    $meta[\'phone_number\'] = \'1111111\';
    return $meta;
}

add_filter( \'add_signup_meta\', \'mu_add_phone_in_signup2\', 10, 4 );
function mu_add_phone_in_signup2( $meta_defaults = array() ) {

    $meta_defaults = array( \'phone_number\'  => \'11111111\' );
    return $meta_defaults;
}

add_filter( \'signup_site_meta\', \'mu_add_phone_in_signup3\', 10, 4 );
function mu_add_phone_in_signup3( $domain, $path, $title, $user, $user_email, $key, $meta ) {

    $meta[\'phone_number\'] = \'11111111\';
    return $meta;
}
我没有太多经验,所以我快疯了,三天都做不到。感谢您的帮助:)谢谢!

1 个回复
SO网友:Andrew

我很好地做到了这一点:

// Sending custom field data to $meta
add_filter(\'add_signup_meta\', \'sb_add_signup_meta\');
function sb_add_signup_meta($meta) {
    if( isset( $_POST[\'phone_number\'] ) ) {
        $phone_number = filter_var( $_POST[\'phone_number\'], FILTER_SANITIZE_NUMBER_INT );
        $meta[\'phone_number\'] = $phone_number;
        return $meta;
    }
    else return $meta;
}

// Updating user meta on user activation. Works only if user chose registration without a blog
add_action(\'wpmu_activate_user\',\'activate_user\',10,3);
function activate_user( $user_id, $password, $meta )   {

    if ( isset( $meta[\'phone_number\'] ) ) {
        update_user_meta( $user_id, "phone_number", $meta[\'phone_number\'] );    
    }
}

// Updating user meta on user activation when user has regisration + gets a blog.
add_action( \'wpmu_activate_blog\', \'mu_add_roles_after_activation\', 10, 3 );
function mu_add_roles_after_activation( $blog_id, $user_id, $password, $signup_title, $meta ) {

    $user_info = get_userdata( $user_id );

    $user_login = $user_info->user_login;

    global $wpdb;

    $signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE user_login = %s", $user_login ) );

    $meta = maybe_unserialize( $signup->meta );

    if ( isset( $meta[\'phone_number\'] ) ) {
        update_user_meta( $user_id, "phone_number", $meta[\'phone_number\'] );    
    }   
}
也许WP开发人员应该做钩子wpmu_activate_user 当用户+博客被激活时工作,因为用户在这里仍然处于激活状态,令人困惑wpmu_activate_user 钩子对激活博客的用户不起作用。而且,每次都连接到DB并不是最佳做法。所以,如果你有更好的想法,我会很感激的。

相关推荐

MultiSite有SSL证书,但媒体库仍为http://

我们的多站点WordPress安装的URL为https://xx.com 对于主域,例如,https://yy.xx.com 作为子网站。我们正在使用WP的内置域映射功能。媒体库链接仍显示为http://xx 尽管如此,子域上使用的任何图像都被标记为不安全。只有一个子域(我们最近的一个子域)具有与结构的媒体库链接https://zz.xx.com. SSL证书可能是在创建其他子域之后安装的,但在ZZ之前:我不确定。我如何获得WP媒体库链接,所有链接都显示为https://-最好是URL中的子域?理想情况下