[공유] 유저별, 권한별로 페이지 접근제한 방법 정리

안녕하세요.

워드프레스 저변이 국내에서는 아직 그렇게까지는 넓지가 않은 지 뭐하나 찾으려면 매우 어렵습니다.

제가 찾았던 내용들 보면 전부 단편적으로 기술되어 종합적으로 그걸 왜 그렇게 해야하는지 여기서 뭘 바꾸면 되는지 상세하게 설명된 케이스를 보지를 못했습니다.

이 글은 제가 경험한 내용 중 가입 유저별 또는 권한별로 페이지 접근을 제한하는 방법을 공유하고자 정리해 드립니다.

여기저기 무슨 플러그인이 좋다 이거 쓰면 된다 저거 쓰면 된다 말들은 많은데 내용 찾다보면 유료버전을 사야한다던가 내용이 대충 나와 있던가 너무 머리가 아픕니다.

여기서는 그냥 깔끔하게 님이 직접 몇 줄 코딩하는 것으로 끝냅니다.

 

먼저 wp-admin 페이지의 좌측 메뉴에서 테마 디자인 > 테마 편집기를 여신 다음에

화면 우측의 테마 파일 중에 위에서 두번 째 있는 테마 함수(fuctions.php) 클릭

테마 편집이라고 하얀 바탕에 글자들이 적혀있는데 슬라이드 끌어내려서 맨 밑으로 갑니다.

그리고 맨 밑에 클릭하고 Enter 이후에는 아래 케이스에 맞춰 작성합니다.

1. 유저별로 페이지 제한

    - 먼저 각 페이지의 id를 알아야 합니다. wp-admin 페이지 메뉴인 페이지 > 모든 페이지를 클릭하시고 거기 나오는 것들 중에 내가 제한하고자 하는 페이지를 클릭하시면

       https://xxxx.com/wp-admin/post.php?post=133&action=edit 이런 URL을 보실 수 있는데 여기서는 133이 이 페이지 id입니다.

   - 제한할 페이지 id를 엑셀에 정리하세요. 다음으로 각 페이지별로 제한을 할 유저 id(사용자 > 모든 사용자 클릭하면 나오는 사용자명)을 엑셀의 페이지 id 옆에 정리하세요.

   아래 코드를 그대로 복사 붙여넣기 하신 후 ID 번호와 Page_id만 변경하시면 됩니다. Page가 많으시다면 elseif에 있는 is_page(array(1,2,3,4,5,...))을 사용하세요.

   is_page() 함수는 현재 페이지를 반환받아 array에 있는 id와 비교합니다. $page_id를 받을 필요도 없고요.

​add_filter('the_content', 'page_restrict');
function my_page_restriction($content){
	$user = wp_get_current_user();
	$page_id = get_the_ID();
	
	if(($user->ID == '1' and $page_id == '1')){
		?>
		<script>
		alert('권한이 없습니다.');
		window.history.go(-1);
		</script>
		<?php
		exit;
	}
    elseif(($user->ID == '2' and is_page(array(2,3,4,5)){
		?>
		<script>
		alert('권한이 없습니다.');
		window.history.go(-1);
		</script>
		<?php
		exit;
	}
	return $content;
}
​

 

2. 제한할 페이지도 많고 유저별로 하려니 반복문이 한도없이 길어진다고요? 그럼 다음 방법으로 유저를 그룹으로 묶으세요. 

플러그인 User Role Editor를 설치하시면 오른쪽에 Update 버튼 아래로 Add Role/Rename Role/Add Capability/Delete Role/Delete Capability 메뉴가 있습니다.

Add Role을 클릭하면 팝업창이 나타납니다. 거기에 Role name을 넣어서 생성하세요. Role name (ID)라고 되어 있으니 구분하기 좋은 영어로 넣어야겠죠?

하여간 New Role들을 생성하셨으면 그 Role이 할 수 있는 기능으로 Add Capability를 클릭해서 page_restrict라고 생성하세요. New Role에 기능으로 추가한 Capability를 설정하시는 건 당연하겠죠?

하나를 만들고 나면 Add New Role에 copy 기능도 있어요 ㅎ

그런 다음 아래의 코드를 복사하여 붙여 넣으시고 current_user_can('') 안의 ' ' 부분을 생성하신 Role name으로 is_page(array(1,2,3,4,...))의 숫자를 해당하는 id로 바꾸시고 elseif를 필요한 수만큼 늘리면

/** 
 *  restrict page for user role editor
*/
add_filter('the_content', 'page_restrict');
function page_restrict($content){
	if(current_user_can('illegal') and is_page(array(118,121,123,125,127,129,131,133))){
		?>
     	<script>
	 	alert('권한이 없습니다!!! 관리자에게 문의하세요');
	 	window.history.go(-1);
	 	</script>
     	<?php
	 	exit;
	}
	elseif(current_user_can('intellectual-r') and is_page(array(98,121,123,125,127,129,131,133))){
		?>
     	<script>
	 	alert('권한이 없습니다!!! 관리자에게 문의하세요');
	 	window.history.go(-1);
	 	</script>
     	<?php
	 	exit;
	}
	return $content;
}

끝.

제가 구글링하고 적용해보고 하다하다 안되서 이곳에 문의해보고 되는 것을 확인하고 다시 코드 변경해서 성공시킨 내용을 정리해 보았습니다.

저와 같은 상황에 닥치신 분들께서 이글을 쉽게 찾아내셔서 고생 안하시길 기원합니다. 모두에게 행운을...

좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기
워드프레스 에러 기술지원 서비스 전문가에게 맡기세요
좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기