웹사이트 검색

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단계: 사용자 프로필 페이지에 확인란 추가

가장 먼저 해야 할 일은 각 사용자 프로필 편집 페이지에 확인란을 추가하는 것입니다. 이 확인란을 선택하면 사용자가 더 이상 웹사이트에 로그인할 수 없음을 나타내는 사용자 메타 옵션이 저장됩니다.

코드는 다음과 같습니다.

/**
 * 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()라는 두 가지 다른 함수를 사용합니다. 그들의 이름은 꽤 명확합니다. 첫 번째 이름은 사용자가 금지되었다는 사실을 데이터베이스에 저장하고 두 번째 이름은 사용자 잠금을 해제합니다.

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 );

사용자 프로필 편집 페이지에 체크박스를 추가하는 플러그인을 만들었습니다. 두 번째 함수를 사용하여 확인란에 값을 저장하고 WordPress 사용자를 금지하는 함수와 사용자를 잠금 해제하는 함수를 만듭니다. 또한 사용자가 차단되었는지 여부를 확인하는 작은 기능도 만들었습니다. 그리고 마침내 WP_Error WordPress 기본 클래스를 사용하여 “wp_authenticate_user” 필터에 함수를 연결했습니다.

Github에서 전체 코드 다운로드