ウェブサイト検索

WordPress ユーザーを禁止する方法


数日前、WordPress ユーザーのインストールを禁止するシステムを作成するよう依頼されました。そこで、簡単なプラグインを作成しました。このプラグインの基本を共有したいと思います。このチュートリアルでは、WordPress のフィルター、アクション、ユーザー列の管理、その他の優れた機能について説明します。

ステップ 1: プラグインを作成する

もう一度言いますが、これは非常に複雑です。必要なのは、「ban-users」という名前の「wp-content/plugins」を含む新しいフォルダーを作成することだけです。このフォルダーに「ban-users.php」という新しいファイルを作成し、それを開いて次のコードを貼り付けます。

<?php
/*
Plugin Name: Ban Users
Plugin URI: http://www.remicorson.com
Description: Allows you to ban users
Author: Remi Corson
Version: 1.0
Author URI: http://www.remicorson.com
*/

ステップ 2: ユーザーのプロフィール ページにチェックボックスを追加する

最初に行う必要があるのは、各ユーザー プロファイル編集ページにチェックボックスを追加することです。このチェックボックスをオンにすると、ユーザーが Web サイトにログインできなくなったことを示すユーザー メタ オプションが保存されます。

コードは次のとおりです。

/**
 * Admin init
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_admin_init(){
    
	// Edit user profile
	add_action( 'edit_user_profile', 'rc_edit_user_profile' );
	add_action( 'edit_user_profile_update', 'rc_edit_user_profile_update' );
	
}
add_action('admin_init', 'rc_admin_init' );

このコードは、これから作成する必要がある関数への呼び出しを作成しているだけです。この機能は、ユーザーのプロフィール ページにチェックボックスを追加します。

/**
 * Adds custom checkbox to user edition page
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_edit_user_profile() {
	if ( !current_user_can( 'edit_users' ) ) {
		return;
	}
	
	global $user_id;
	
	// User cannot disable itself
	$current_user = wp_get_current_user();
	$current_user_id = $current_user->ID;
	if ( $current_user_id == $user_id ) {
		return;
	}

	// Check if enabled
	$checked = checked( get_user_option( 'rc_banned', $user_id, false ) );

	// Display checkbox
	echo '<table class="form-table">
	<tr>
		<th scope="row">Ban User</th>
		<td>
		<label for="rc_ban">
			<input name="rc_ban" type="checkbox" id="rc_ban" '. $checked .' />Ban this user</label>
		</td>
	</tr>
	</table>';
}

次に、チェックボックスの値をデータベースに保存する関数が必要です。

/**
 * Save custom checkbox
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_edit_user_profile_update() {
			
	if ( !current_user_can( 'edit_users' ) ) {
		return;
	}
	
	global $user_id;
	
	// User cannot disable itself
	$current_user    = wp_get_current_user();
	$current_user_id = $current_user->ID;
	if ( $current_user_id == $user_id ) {
		return;
	}
	
	// Lock
	if( isset( $_POST['rc_ban'] ) && $_POST['rc_ban'] = 'on' ) {
		rc_ban_user( $user_id );
	} else { // Unlock
		rc_unban_user( $user_id );
	}
	
}

ご覧のとおり、この新しい関数は rc_ban_users() と rc_unban_users() という 2 つの他の関数を使用します。それらの名前は非常に明確で、最初の名前はユーザーが禁止されているという事実をデータベースに保存し、2 番目の名前はユーザーのロックを解除します。

ステップ 3: ユーザーを禁止する

ここで、rc_ban_users() 関数を作成します。この関数では、値が既に保存されているかどうかを確認する必要があり、まだ保存されていない場合は値を保存する必要があります。これが、後で説明する関数 rc_is_user_banned() を呼び出す理由です。

/**
 * Ban user
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_ban_user( $user_id ) {
	
	$old_status = rc_is_user_banned( $user_id );
	
	// Update status
	if ( !$old_status ) {
		update_user_option( $user_id, 'rc_banned', true, false );
	}
}

ステップ 4: ユーザーの禁止を解除する

次の関数は、先ほど作成した関数とは逆です。ユーザーに「禁止を解除」する機能を与える必要があります。

/**
 * Un-ban user
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_unban_user( $user_id ) {

	$old_status = rc_is_user_banned( $user_id );
	
	// Update status
	if ( $old_status ) {
		update_user_option( $user_id, 'rc_banned', false, false );
	}
}

ステップ 5: ユーザーは禁止されていますか?

rc_ban_users() と rc_unban_users() では、ユーザーが禁止されているかどうかをチェックするために rc_is_user_banned() という関数を使用していることがわかりました。作成しましょう:

/**
 * Checks if a user is already banned
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_is_user_banned( $user_id ) {
	return get_user_option( 'rc_banned', $user_id, false );
}

基本的に、この関数は rc_ban_users() に保存されたオプションの値を返すだけです。

現時点では、ユーザー エディション ページに次のような新しいチェックボックスが追加されています。

最後のステップは、ログイン フォームに関数をフックして、禁止されたユーザーのログインを回避することです。

ステップ 5: 禁止されたユーザーのログインを回避する

これを行うには、「wp_authenticate_user」という WordPress のデフォルトのフィルターを使用する必要があります。このフィルタに「rc_authenticate_user()」という関数をフックします。この関数は WP_Error クラスを使用します。

/**
 * Check if user is locked while login process
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_authenticate_user( $user ) {

	if ( is_wp_error( $user ) ) {
		return $user;
	}
	
	// Return error if user account is banned
	$banned = get_user_option( 'rc_banned', $user->ID, false );
	if ( $banned ) {
		return new WP_Error( 'rc_banned', __('<strong>ERROR</strong>: This user account is disabled.', 'rc') );
	}
	
	return $user;
}

ここで、フィルターを追加するだけです。

add_filter( 'wp_authenticate_user', 'rc_authenticate_user', 1 );

ユーザープロファイル編集ページにチェックボックスを追加するプラグインを作成しました。 2 番目の関数を使用してチェックボックスの値を保存し、WordPress ユーザーを禁止する関数と、ユーザーのロックを解除する別の関数を作成しました。また、ユーザーが禁止されているかどうかを確認するための小さな関数も作成しました。そして最後に、WP_Error WordPress デフォルト クラスを使用して関数を「wp_authenticate_user」フィルターにフックしました。

Github で完全なコードをダウンロード