サポート » プラグイン » ソーシャル登録の前にユーザーに権限を選択させる方法

  • 解決済 torasan

    (@torasan)


    お世話になります。

    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 )等に変更するイメージでしょうか???

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • スレッド開始 torasan

    (@torasan)

    プラグインの作者に問い合わせたところ

    「サイトで使用できる可能性のあるすべてのユーザーロールを一覧表示するカスタムコードを記述し、ユーザーが選択できるものをドロップダウンリストに表示してから、選択したロールをユーザーに割り当てます。」

    という回答でした。

    すべてのユーザーロールを取得する方法が分からなかったので、
    単純にドロップリストで選択した値が一致すれば
    それに応じてユーザーロールを割り当てれば良いのではと思ったのですが、
    私の知識ではうまくいかないですね。。。

    どうやったらユーザーロールを割り当てることが出来るのでしょうか?

    // =============================================================================
    
    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);
    });
    
    スレッド開始 torasan

    (@torasan)

    色々やってみたのですが上手くいきません。

    以下のコードと

    <?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」の取得が出来ていないようです。
    ※取得後にどうやってユーザーロールを追加するのかという問題もありますが…

    どなたかお力を貸して頂けないでしょうか?

    スレッド開始 torasan

    (@torasan)

    自己解決出来そうなので、本トピックをクローズにします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「ソーシャル登録の前にユーザーに権限を選択させる方法」には新たに返信することはできません。