ソーシャル登録の前にユーザーに権限を選択させる方法
-
お世話になります。
Wordpressを使用した会員サイトで登録時にタイプAかタイプBを選択してユーザー登録をして頂いています。
「Nextend Social Login and Register」というプラグインを利用して
ソーシャルログインが出来るようにしたのですが、この場合登録時にデフォルトのWordpressユーザーが割り当てられてしまいます。「Social Login, Social Sharing by miniOrange」プラグインの有料版を使用すれば、
ソーシャルログイン→ユーザーの権限を選択→ソーシャルログインによる登録終了
というのが実装できるようなのですが、
「Nextend Social Login and Register」でも登録前に使用できるフィルターとアクションがあるらしく(以下参照)
https://nextendweb.com/nextend-social-login-docs/backend-developer/#custom-fields
このコードを編集すれば何とかなるのかも知れません。
ただ具体的にどうすればよいか分からないので、お知恵をお借りしたいです。
※カスタムフィールドの部分をset_role( $role )等に変更するイメージでしょうか???
-
プラグインの作者に問い合わせたところ
「サイトで使用できる可能性のあるすべてのユーザーロールを一覧表示するカスタムコードを記述し、ユーザーが選択できるものをドロップダウンリストに表示してから、選択したロールをユーザーに割り当てます。」
という回答でした。
すべてのユーザーロールを取得する方法が分からなかったので、
単純にドロップリストで選択した値が一致すれば
それに応じてユーザーロールを割り当てれば良いのではと思ったのですが、
私の知識ではうまくいかないですね。。。どうやったらユーザーロールを割り当てることが出来るのでしょうか?
// ============================================================================= add_action('nsl_before_register', function ($provider) { /** @var $provider NextendSocialProvider */ /** * You must return true if you want to add custom fields */ add_filter('nsl_registration_require_extra_input', function ($askExtraData) { return true; }); add_filter('nsl_registration_validate_extra_input', function ($userData, $errors) { /** @var $errors WP_Error */ $isPost = isset($_POST['submit']); if ($isPost) { /** * You must add an error if your fields are not filled or does not fulfill your validation. * If no errors added, that means that the register form is fine. */ if (!empty($_POST['type']) && is_string($_POST['type'])) { $userData['type'] = $_POST['type']; } else { $userData['type'] = ''; $errors->add('favorite_color_missing', '<strong>' . __('ERROR') . '</strong>: Favorite Color can not be empty.', array('form-field' => 'favorite_color')); } } else { /** * Fill up user data with default values to prevent the notice in the form */ $userData['type'] = ""; } return $userData; }, 10, 2); /** You can use nsl_registration_form_start and nsl_registration_form_end action. */ add_action('nsl_registration_form_start', function ($userData) { ?> <select name="type"> <? $Options = array("Jobseeker"=>"Jobseeker","Employer"=>"Employer"); foreach($Options as $key=>$value){ $selected=""; if($key==$item["type"]){$selected ="selected";} print "<option value=\"$key\"$selected>$value</option>\n"; } ?> </select> <?php }); /** * $user_id contains the created user's id * $userData contains the previously validated input */ $user = new WP_User( $id ); if ($key == "Jobseeker"){ $user-> set_role('Jobseeker'); } elseif ($key == "Employer"){ $user-> set_role('Employer'); } else{} add_action('nsl_registration_store_extra_input', function ($user_id, $userData) { add_user_meta($user_id, 'type', $userData['type']); }, 10, 2); });
色々やってみたのですが上手くいきません。
以下のコードと
<?php add_action('nsl_before_register', function ($provider) { /** @var $provider NextendSocialProvider */ /** * You must return true if you want to add custom fields */ add_filter('nsl_registration_require_extra_input', function ($askExtraData) { return true; }); add_filter('nsl_registration_validate_extra_input', function ($userData, $errors) { /** @var $errors WP_Error */ $isPost = isset($_POST['submit']); if ($isPost) { /** * You must add an error if your fields are not filled or does not fulfill your validation. * If no errors added, that means that the register form is fine. */ if (!empty($_POST['favorite_color']) && is_string($_POST['favorite_color'])) { $userData['favorite_color'] = $_POST['favorite_color']; } else { $userData['favorite_color'] = ''; $errors->add('favorite_color_missing', '<strong>' . __('ERROR') . '</strong>: Favorite Color can not be empty.', array('form-field' => 'favorite_color')); } } else { /** * Fill up user data with default values to prevent the notice in the form */ $userData['favorite_color'] = ''; } return $userData; }, 10, 2); /** You can use nsl_registration_form_start and nsl_registration_form_end action. */ add_action('nsl_registration_form_start', function ($userData) { ?> <p> <label for="favorite_color">Favorite Color<br/> <input type="text" name="favorite_color" id="favorite_color" class="input" value="<?php echo esc_attr(wp_unslash($userData['favorite_color'])); ?>" size="20"/></label> </p> <?php }); /** * $user_id contains the created user's id * $userData contains the previously validated input */ add_action('nsl_registration_store_extra_input', function ($user_id, $userData) { add_user_meta($user_id, 'favorite_color', $userData['favorite_color']); }, 10, 2); });
テーマで使用しているclass-woocommerce-registration.phpのコード(以下)を組み合わせてみたのですが、
<?php class Jobify_WooCommerce_Registration { public function __construct() { add_action( 'woocommerce_register_form', array( $this, 'register_form' ) ); add_filter( 'woocommerce_new_customer_data', array( $this, 'new_customer_data' ) ); } public function new_customer_data( $data ) { if ( ! isset( $_POST['reg_role'] ) ) { return $data; } $role = esc_attr( $_POST['reg_role'] ); $whitelist = $this->get_registration_roles(); if ( ! in_array( $role, array_keys( $whitelist ) ) ) { return $data; } $data['role'] = $role; return $data; } public function get_allowed_roles() { $roles = get_theme_mod( 'registration-roles', array( 'employer' ) ); if ( '' == $roles ) { return array(); } if ( ! is_array( $roles ) ) { $roles = explode( ',', $roles ); } $roles = array_map( 'trim', $roles ); return $roles; } private function get_editable_roles() { global $wp_roles; $all_roles = $wp_roles->roles; $editable_roles = apply_filters( 'editable_roles', $all_roles ); return $editable_roles; } public function get_registration_roles() { add_filter( 'editable_roles', array( $this, 'editable_roles' ) ); $roles = $this->get_editable_roles(); if ( empty( $roles ) ) { return array(); } $value = array_keys( $roles ); $labels = wp_list_pluck( $roles, 'name' ); $options = array_combine( $value, $labels ); remove_filter( 'editable_roles', array( $this, 'editable_roles' ) ); return $options; } public function editable_roles( $roles ) { $remove = apply_filters( 'jobify_removed_roles', array( 'administrator', 'editor', 'author', 'contributor', 'shop_manager' ) ); foreach ( $remove as $role ) { unset( $roles[ $role ] ); } return $roles; } public function register_form() { $default = get_theme_mod( 'registration-default', array( 'employer' ) ); $roles = $this->get_allowed_roles(); $labels = $this->get_registration_roles(); if ( empty( $roles ) ) { return; } if ( 1 == count( $roles ) ) { echo '<input type="hidden" value="' . esc_attr( $roles[0] ) . '" name="reg_role" />'; return; } $options = array(); foreach ( $roles as $value ) { // in case things get out of sync if ( ! isset( $labels[ $value ] ) ) { continue; } $label = apply_filters( 'jobify_registration_role_' . $value, $labels[ $value ] ); $options[] = '<option value="' . $value . '"' . selected( $default, $value, false ) . '>' . esc_attr( $label ) . '</option>'; } $options = implode( '', $options ); ?> <p class="form-row form-row-wide"> <label for="reg_role"><?php _e( 'Register As', 'jobify' ); ?></label> <select name="reg_role" class="jobify-registration-role"><?php echo $options; ?></select> </p> <?php } }
「$options」の値が取得できません。
作成したコード↓<?php add_action('nsl_before_register', function ($provider) { add_filter('nsl_registration_require_extra_input', function ($askExtraData) { return true; }); /** You can use nsl_registration_form_start and nsl_registration_form_end action. */ add_action('nsl_registration_form_start', function ($data) { ?> <?php function new_Register( $data ) { if ( ! isset( $_POST['reg_role'] ) ) { return $data; } $role = esc_attr( $_POST['reg_role'] ); $whitelist = $this->get_registration_roles(); if ( ! in_array( $role, array_keys( $whitelist ) ) ) { return $data; } $data['role'] = $role; return $data; } function get_allowed_roles() { $roles = get_theme_mod( 'registration-roles', array( 'employer' ) ); if ( '' == $roles ) { return array(); } if ( ! is_array( $roles ) ) { $roles = explode( ',', $roles ); } $roles = array_map( 'trim', $roles ); return $roles; } function get_editable1_roles() { global $wp_roles; $all_roles = $wp_roles->roles; $editable_roles = apply_filters( 'editable_roles', $all_roles ); return $editable_roles; } function get_registration_roles() { add_filter( 'editable_roles', array( $this, 'editable_roles' ) ); $roles = $this->get_editable1_roles(); if ( empty( $roles ) ) { return array(); } $value = array_keys( $roles ); $labels = wp_list_pluck( $roles, 'name' ); $options = array_combine( $value, $labels ); remove_filter( 'editable_roles', array( $this, 'editable_roles' ) ); return $options; } function editable_roles( $roles ) { $remove = apply_filters( 'jobify_removed_roles', array( 'administrator', 'editor', 'author', 'contributor', 'shop_manager' ) ); foreach ( $remove as $role ) { unset( $roles[ $role ] ); } return $roles; } function register_form() { $default = get_theme_mod( 'registration-default', array( 'employer' ) ); $roles = $this->get_allowed_roles(); $labels = $this->get_registration_roles(); if ( empty( $roles ) ) { return; } if ( 1 == count( $roles ) ) { echo '<input type="hidden" value="' . esc_attr( $roles[0] ) . '" name="reg_role" />'; return; } $options = array(); foreach ( $roles as $value ) { // in case things get out of sync if ( ! isset( $labels[ $value ] ) ) { continue; } $label = apply_filters( 'jobify_registration_role_' . $value, $labels[ $value ] ); $options[] = '<option value="' . $value . '"' . selected( $default, $value, false ) . '>' . esc_attr( $label ) . '</option>'; } $options = implode( '', $options );var_dump($options); } ?> <p class="form-row form-row-wide"> <label for="reg_role"><?php _e( 'Register As', 'jobify' ); ?></label> <select name="reg_role" class="jobify-registration-role"><?php echo $options; ?></select> </p> <?php }); add_action('nsl_registration_store_extra_input', function ($user_id, $data) { add_user_meta($user_id, 'reg_role', $data['role'] ); }, 10, 2); });
構文チェックは問題ないのですが、var_dump($options);としても何も表示されないので、function以降「role」の取得が出来ていないようです。
※取得後にどうやってユーザーロールを追加するのかという問題もありますが…どなたかお力を貸して頂けないでしょうか?
- トピック「ソーシャル登録の前にユーザーに権限を選択させる方法」には新たに返信することはできません。