페이지 접근제한 기능 관련 버그(?) - 코스모스팜 회원관리 플러그인

1. 정확한 제품 또는 플러그인 이름

회원관리 플러그인

 

2. 상세 내용

특정 회원 Role역할만 접근 가능하도록 페이지 접근제한 설정함에도 불구하고 페이지 레이아웃이나 내용이 보이는 문제

비로그인일 경우 로그인하라는 알림창이 뜨면서 접근이 제한되지만,
로그인 사용자이면서 해당 권한이 없는 경우임에도 페이지 접근 시 컨텐츠가 보이는 문제가 발생합니다.

 

3. 확인 가능한 상세 페이지 주소

https://metamind.kr/courses/beginner/lessons/beginner1/topic/beginner1-1/

https://imgur.com/a/tAUtDLf
권한이 없는 로그인한 회원이 접근했을 때
자세히 보시면 강의 영상 플레이어 밑에 조그맣게 권한이 없다고만 표시될 뿐입니다.

 

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

    정확한 원인은 파악해보아야 알겠지만

    실행 순서의 문제가 아닌가 하는 추측이 됩니다.

     

    cosmosfarm-members/class/Cosmosfarm_Members.class.php 파일 내에서

    add_filter('the_content', array($this, 'page_restriction'), 10, 1);

    코드를 찾아서

    add_filter('the_content', array($this, 'page_restriction'), 999, 1);

    로 변경하신 다음에도 같은 문제가 발생하는지 확인해보시겠어요?

    고맙습니다.

  • 코스모스팜 회원관리 플러그인을 최신버전으로 업데이트하니까 수정했던 플러그인 php파일이 초기화되었습니다.

    혹시 위와 같은 코드로 자식 테마의 function.php에 적용하려면 어떻게 해야 할까요?

    아래와 같이 적용해봤는데 오류가 납니다.

    add_filter('cosmosfarm_members_page_restriction', 'metamind_page_restriction');
    function metamind_page_restriction() {
    		if($page_restriction){
    			if(!is_user_logged_in()){
    				if($option->page_restriction_redirect == '1'){
    					?>
    					<script>
    					(function(){
    						if(confirm("<?php echo esc_js($page_restriction_login_message)?>")){
    							window.location.href=<?php echo wp_json_encode(esc_url_raw(wp_login_url($_SERVER['REQUEST_URI'])))?>;
    						}
    						else{
    							window.location.href=<?php echo wp_json_encode(esc_url_raw($referer_url))?>;
    						}
    					})();
    					</script>
    					<?php
    					exit;
    				}
    				else if($option->page_restriction_redirect == '2'){
    					echo '<script>window.location.href="' . wp_login_url($_SERVER['REQUEST_URI']) . '";</script>';
    					exit;
    				}
    				else if($option->page_restriction_redirect == '3'){
    					?>
    					<script>
    					(function(){
    						if(confirm("<?php echo esc_js($page_restriction_login_message)?>")){
    							window.location.href=<?php echo wp_json_encode(esc_url_raw(wp_registration_url()))?>;
    						}
    						else{
    							window.location.href=<?php echo wp_json_encode(esc_url_raw($referer_url))?>;
    						}
    					})();
    					</script>
    					<?php
    					exit;
    				}
    				else if($option->page_restriction_redirect == '4'){
    					echo '<script>window.location.href="' . wp_registration_url() . '";</script>';
    					exit;
    				}
    				else{
    					$_REQUEST['redirect_to'] = $_SERVER['REQUEST_URI'];
    					if(has_excerpt()){
    						$content = wpautop(get_the_excerpt());
    						$content .= wpmem_inc_regmessage('page_restriction', $page_restriction_message) . wpmem_inc_login('page_restriction');
    					}
    					else{
    						$content = wpmem_inc_regmessage('page_restriction', $page_restriction_message) . wpmem_inc_login('page_restriction');
    					}
    					$content = apply_filters('cosmosfarm_members_page_restriction_content', $content, 'page_restriction');
    				}
    			}
    			else{
    				$current_user = wp_get_current_user();
    				$restriction_roles = get_post_meta($post->ID, 'cosmosfarm_members_page_restriction_roles', true);
    				
    				$this_restriction = true;
    				foreach($current_user->roles as $role){
    					if(in_array($role, $restriction_roles)){
    						$this_restriction = false;
    						break;
    					}
    				}
    				
    				if($this_restriction){
    					$_REQUEST['redirect_to'] = $_SERVER['REQUEST_URI'];
    					if(has_excerpt()){
    						$content = wpautop(get_the_excerpt());
    						$content .= wpmem_inc_regmessage('page_restriction_permission', $page_restriction_permission_message);
    					}
    					else{
    						?>
    						<script>
    						alert('권한이 없습니다!!! 관리자에게 문의하세요.');
    						window.history.go(-1);
    						</script>
    						<?php
    						$content = wpmem_inc_regmessage('page_restriction_permission', $page_restriction_permission_message);
    					}
    					$content = apply_filters('cosmosfarm_members_page_restriction_content', $content, 'page_restriction');
    				}
    			}
    		}
      }

     

  • 앗 해결된 줄 알았는데 아직 완벽하게 해결되진 않았습니다.

    권한이 없는 회원이 접근했을 때, 비디오 플레이어는 이제 보이지 않는데 레이아웃은 여전히 보이고 있습니다.

    https://imgur.com/a/vzzMrDx

     

    아래 이미지처럼 아예 없는 페이지라고 뜨게 할 순 없나요? 이건 다른 해외의 페이지 접근제한 플러그인을 사용한 겁니다.
    https://imgur.com/a/lKHGYWh

  • 코스모스팜에서 제공되는 기능은 the_content 필터를 사용하기 때문에

    내용이 표시될 때 동작하여 side_bar 부분에서는 동작하지 않을 수 있습니다.

     

    아래 코드를 적절히 수정하여 테마 functions.php에

    입력해보시겠어요?

    add_action('template_redirect', function(){
    	$post = get_post();
    	$option = get_cosmosfarm_members_option();
    	
    	$restriction_roles = get_post_meta($post->ID, 'cosmosfarm_members_page_restriction_roles', true);
    	
    	if($restriction_roles){
    		if(is_user_logged_in()){
    			$user_id    = get_current_user_id();
    			$user_meta  = get_userdata($user_id);
    			$user_roles = $user_meta->roles;
    			
    			foreach($restriction_roles as $role_name){
    				if(in_array($role_name, $user_roles)){
    					return true;
    				}
    				else{
    					wp_redirect('/'); // 권한 없을 때 이동할 페이지 url
    				};
    			}
    		}
    		else{
    			wp_redirect('/'); // 로그아웃 상태 시 이동할 페이지 url
    		}
    		exit;
    	}
    });

    고맙습니다.

  • 코드 입력하니까 다른 페이지로 접근이 안 되고 계속 리다이렉트 설정한 페이지로 리디렉션됩니다.

    로그인 페이지로도 안 들어가지고 오직 우커머스 장바구니 페이지만 들어가지네요.

    관리자 계정만 정상작동합니다.

  • 해결했습니다!

    그냥 테마 fuction.php에 추가하지 않고, Cosmosfarm_Members.class.php에서 restriction_roles 항목을 찾아서 다음의 코드를 수정했습니다.

    수정 전

     

    			else{
    				$current_user = wp_get_current_user();
    				$restriction_roles = get_post_meta($post->ID, 'cosmosfarm_members_page_restriction_roles', true);
    				
    				$this_restriction = true;
    				foreach($current_user->roles as $role){
    					if(in_array($role, $restriction_roles)){
    						$this_restriction = false;
    						break;
    					}
    				
    				if($this_restriction){
    					$_REQUEST['redirect_to'] = $_SERVER['REQUEST_URI'];
    					if(has_excerpt()){
    						$content = wpautop(get_the_excerpt());
    						$content .= wpmem_inc_regmessage('page_restriction_permission', $page_restriction_permission_message);
    					}
    					else{
    						$content = wpmem_inc_regmessage('page_restriction_permission', $page_restriction_permission_message);
    					}
    					$content = apply_filters('cosmosfarm_members_page_restriction_content', $content, 'page_restriction');
    				}
    			}

     

    수정 후

    			else{
    				$current_user = wp_get_current_user();
    				$restriction_roles = get_post_meta($post->ID, 'cosmosfarm_members_page_restriction_roles', true);
    				
    				$this_restriction = true;
    				foreach($current_user->roles as $role){
    					if(in_array($role, $restriction_roles)){
    						$this_restriction = false;
    						break;
    					}
    					else {
    						?>
    						<script>
    						alert('권한이 없습니다!!! 관리자에게 문의하세요');
    						window.history.go(-1);
    						</script>
    						<?php
    					}
    				}
    				
    				if($this_restriction){
    					$_REQUEST['redirect_to'] = $_SERVER['REQUEST_URI'];
    					if(has_excerpt()){
    						$content = wpautop(get_the_excerpt());
    						$content .= wpmem_inc_regmessage('page_restriction_permission', $page_restriction_permission_message);
    					}
    					else{
    						$content = wpmem_inc_regmessage('page_restriction_permission', $page_restriction_permission_message);
    					}
    					$content = apply_filters('cosmosfarm_members_page_restriction_content', $content, 'page_restriction');
    				}
    			}

     

     

    이상... 코드 한번도 배우지 않은 까막눈이 며칠간 삽질하며 얻어낸 해결책이었습니다. ㅎ

    혹시라도 고칠 점이 있다면 꼭 말씀해주세요. 감사합니다.

  • 아 그런데 이렇게 하니까 또 다른 문제점이 나오네요.

    역할 '변경'이 아닌, 역할 '추가'로 부여된 역할에 대해선 페이지 접근권한이 적용되질 않습니다.

    즉, 기본 역할이 '구독자'이고, 상품을 구매하여 '유료회원'이라는 역할이 추가되었다면,

    구독자와 유료회원 두 개의 역할을 갖게 되는데,

    이 경우 구독자에 대한 권한만 갖는 것처럼 되어서 유료회원만 들어갈 수 있는 페이지가 들어가지지 않습니다.

    그래서 기본 역할을 아예 유료회원으로 변경하니 잘 들어가지구요.

     

    역할 추가로 얻은 역할에 대해선 어떻게 권한 적용이 되게 할 수 있을까요?ㅠㅠ

  • 추가적인 문제까지 완벽하게 해결했습니다!

    다행히 코드도 계속 보다 보니 구조가 눈에 보이네요.

    스크립트 구문 위치가 잘못됐었습니다.

     

    최종 수정 코드입니다.

     

    			else{
    				$current_user = wp_get_current_user();
    				$restriction_roles = get_post_meta($post->ID, 'cosmosfarm_members_page_restriction_roles', true);
    				
    				$this_restriction = true;
    					foreach($current_user->roles as $role){
    						if(in_array($role, $restriction_roles)){
    							$this_restriction = false;
    							break;
    						}
    					}
    
    				if($this_restriction){
    					$_REQUEST['redirect_to'] = $_SERVER['REQUEST_URI'];
    					if(has_excerpt()){
    						$content = wpautop(get_the_excerpt());
    						$content .= wpmem_inc_regmessage('page_restriction_permission', $page_restriction_permission_message);
    					}
    					else{
    						?>
    						<script>
    						alert('권한이 없습니다!!! 관리자에게 문의하세요.');
    						window.history.go(-1);
    						</script>
    						<?php
    						$content = wpmem_inc_regmessage('page_restriction_permission', $page_restriction_permission_message);
    					}
    					$content = apply_filters('cosmosfarm_members_page_restriction_content', $content, 'page_restriction');
    				}
    			}

     

  • 로그아웃 상태 시 접근제한은 문제가 없는 터라, 해당 부분의 코드를 지우고 접속해보니 로그인까지는 가능해졌습니다.

    다만 권한이 없을 때 부분의 코드를 어떻게 수정해야 할지 모르겠습니다.

    이제 로그인은 되지만 전체공개 상태의 다른 모든 페이지에 접근 시 여전히 권한이 없다고 뜹니다.

좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기