정기결제 관련 글쓰기 권한 커스텀

수고하십니다. 

정기결제 관련 역할이 변경되어, board의 권한설정에서 역할 설정을 하는 것은 확인을 했습니다. 

 

그러나 저희는 각 board마다 역할이 달라야 합니다. 

그래서 역할을 정기결제 상품 구매시, 역할이 변경되는것이 아닌, 추가가 되어야 합니다. 

즉, 다중역할이 필요합니다. 

 

혹 그것이 안된다면, 

읽기/쓰기 권한을 역할이 아닌, 오더쪽에 상품이 구매되었는지를 판단하여 권한을 주고싶습니다. 

또한 구매한 상품이 만료가 될 경우 읽기/쓰기 권한은 다시 사라져야합니다. 

그리고, 상품 구매하여 작성했던 글이 만료가 되면 글도 같이 삭제되어야 합니다.

 

역할을 다중역할 주는 것이나, 

구매 상품 기준으로 권한을 주는 방법이 있습니까?

좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기
좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기
  • 안녕하세요~^^

    코스모스팜 회원관리 플러그인 정기결제 중 사용자 역할 설정은

    이용기간 동안 사용자의 역할을 변경하는 기능입니다.

     

    정기결제 시 역할을 변경하는 게 아닌 추가하시려면

    cosmosfarm_members_subscription_request_pay 액션에

    add_role 함수를 활용해보시겠어요?

     

    정기결제 만료 시 추가된 역할을 삭제하시려면

    cosmosfarm_members_subscription_expiry 액션에

    remove_role 함수를 활용해보세요.

     

    간단한 예제 코드를 작성해봤습니다.

    워드프레스 관리자 -> 외모 -> 테마 편집기 페이지에서 functions.php 파일 하단에

    아래의 코드를 활용해보세요.

    add_action('cosmosfarm_members_subscription_request_pay', 'my_cosmosfarm_members_subscription_request_pay', 10, 2);
    function my_cosmosfarm_members_subscription_request_pay($order, $product){
        $product_id = $product->ID();
        $user = wp_get_current_user();
        
        if($product_id == '1'){ // 실제 상품 ID로 적용해주세요.
            if(!is_super_admin($user->ID)){
                $user->add_role('editor');
            }
        }
    }
    
    add_action('cosmosfarm_members_subscription_expiry', 'my_cosmosfarm_members_subscription_expiry', 10, 2);
    function my_cosmosfarm_members_subscription_expiry($order, $product){
        $product_id = $product->ID();
        $user = $order->user();
        
        if($product_id == '1'){ // 실제 상품 ID로 적용해주세요.
            if(!is_super_admin($user->ID)){
                $user->remove_role('editor');
            }
        }
    }

    위의 코드에서 $product_id == '1' 부분은 실제 상품 ID로 적용해보세요.

    고맙습니다.

  • 안녕하세요. 

    실오픈 전에.,. 문제가 발생하여 문의드립니다.

     

    if(kboard_mod() == 'editor' && !$board->isAdmin()){
            $user = wp_get_current_user();
            if(!in_array("buy_sell_vip_90","buy_sell_vip_30","buy_sell_vip_7", $user->roles) && $board->id == '1'){ // 실제 게시판 id로 적용해주세요.
                $redirect_url = '/gym_buy_sell_vip_membership';
                echo "<script>alert('글을 작성하시려면 이용권을 먼저 구매해야 합니다. 이용권구매 페이지로 이동합니다')</script>";
                echo "<script>window.location.href='{$redirect_url}';</script>";
            }

     

    여기서 in_array 부분에 역할을 넣어주었는데, 

    저중 한가지라도 포함이 되면, 글이 작성이 되어야 합니다. 

    역할 부분을 저렇게 넣는것이 아닌가요?

     

    실제 글쓰기 버튼을 누르면, 역할 구분을 못해서요.

    역할을 한가지만 넣었을때는 잘됩니다.

     

    역할 3가지를 넣고, 

    buy_sell_vip_90 또는

    buy_sell_vip_30 또는

    buy_sell_vip_7 의 역할을 가지고 있다면, 글쓰기가 가능하도록 하고싶습니다. 

     

    도움 부탁드립니다.

  • 안녕하세요.

    역할에 관계없이 본인이 쓴 글은 볼 수 있게 하시려면

    아래의 코드를 활용해보시겠어요?

    add_action('kboard_skin_header', 'my_kboard_skin_header', 999, 1);
    function my_kboard_skin_header($builder){
    	$board = $builder->board;
    	if(kboard_mod() == 'document' && !$board->isAdmin() && $board->id == '1'){ // 실제 게시판 id로 적용해주세요.
    		$content_uid = kboard_uid();
    		$content = new KBContent();
    		$content->initWithUID($content_uid);
    		$user = wp_get_current_user();
    		
    		if($user->ID != $content->member_uid){
    			if(!in_array($user->roles[0], array('recruit1_vip_90,recruit1_vip_30,recruit1_vip_7,recruit1_premium_30,recruit_view_7,recruit_view_30,recruit_view_90'))){
    				$redirect_url = '/recruit_view/';
    				echo "<script>alert('구인글을 보기 위해서는 열람권이 있어야 합니다. 열람권구매 페이지로 이동합니다')</script>";
    				echo "<script>window.location.href='{$redirect_url}';</script>";
    			}
    		}
    	}
    }

    고맙습니다.

  • 수고하십니다. 읽기권한 관련하여, 문의드립니다.

    위에 알려주신 코드대로, 

    읽기권한을 설정하였습니다. 

    읽기는 관리자, 열람권을 구매한 회원으로 설정해주었는데, 여기서 한가지 문제점이 발생하였습니다.

    쓰기 권한은 "제한없음"입니다. 

    그렇기 때문에 일반 회원이 글을 작성할수 있습니다.

    그런데, 여기서 문제는

    자신이 쓴글을 볼때도, 혹은 수정을 하거나 삭제를 해야할때도, 

    document로 이동을 해야 하는데, 위에 설정한 읽기권한 문제때문에, 자신이 쓴글에도 접근을 하지 못합니다.

    자신이 쓴글은 접근할 수 있도록 해야 하는데, 어떻게 하면 좋을까요?

     

    if(kboard_mod() == 'document' && !$board->isAdmin()){
            $user_ID = get_current_user_id();
            if(!in_array('recruit1_vip_90,recruit1_vip_30,recruit1_vip_7,recruit1_premium_30,recruit_view_7,recruit_view_30,recruit_view_90', $user->roles) && $board->id == '8'){ // 실제 게시판 id로 적용해주세요.
                $redirect_url = '/recruit_view/';
                echo "<script>alert('구인글을 보기 위해서는 열람권이 있어야 합니다. 열람권구매 페이지로 이동합니다')</script>";
                echo "<script>window.location.href='{$redirect_url}';</script>";
            }

    여기서 수정해야할 부분이 어떻게 될까요?

    팁 부탁드립니다.

  • 안녕하세요.

    KBoard 플러그인에서 게시글을 한번만 작성하게 하시려면

    kboard_pre_document_insert 액션을 활용해서 이미 등록된 게시글이 있는지 체크하시면 가능할 듯합니다.

    만료 시 게시글 삭제는 이전 댓글에도 안내해드린 것처럼

    cosmosfarm_members_subscription_expiry 액션을 활용하시면 가능할 듯합니다.

    아래의 코드를 활용해보시겠어요?

    add_action('kboard_pre_document_insert', 'my_kboard_pre_document_insert', 10, 4);
    function my_kboard_pre_document_insert($content_uid, $board_id, $content, $board){
    	global $wpdb;
    	if(!$board->isAdmin() && in_array($board_id , array('1','2','3'))){ // 실제 게시판 id로 적용해보세요.
    		$user_id = get_current_user_id();
    		$count = $wpdb->get_var("SELECT COUNT(*) FROM `{$wpdb->prefix}kboard_board_content` WHERE `board_id`='{$board_id}' AND `member_uid` = '{$user_id}'");
    		
    		if($count){
    			die("<script>alert('더 이상 등록할 수 없습니다.'); history.go(-1);</script>");
    		}
    	}
    }
    
    add_action('cosmosfarm_members_subscription_expiry', 'my_cosmosfarm_members_subscription_expiry', 10, 2);
    function my_cosmosfarm_members_subscription_expiry($order, $product){
    	global $wpdb;
    	
    	$product_id = $product->ID();
    	$user = $order->user();
    	$board_id_list = array('1', '2', '3'); // 실제 게시판 id로 적용해주세요.
    	
    	if($product_id == '1'){ // 실제 상품 ID로 적용해주세요.
    		if(!is_super_admin($user->ID)){
    			foreach($board_id_list as $board_id){
    				$list = new KBContentList($board_id);
    				$list->memberUID($user->ID);
    				$list->getList();
    				
    				while($content = $list->hasNext()){
    					$delete_immediately = get_option('kboard_content_delete_immediately');
    					
    					if($delete_immediately){
    						$content->remove();
    					}
    					else{
    						$content->status = 'trash';
    						$content->updateContent();
    					}
    				}
    			}
    		}
    	}
    }

    고맙습니다.

  • 수고하십니다.

    정기결제 관련해서 한가지 더 질문드립니다.

     

    위에 언급했듯이, 코스모스 정기결제 이용중이고, 각각 이용권을 등록하여 게시글을 작성하게 합니다.

     

    여기에서 각 게시판별로 회원등급을 다르게 주어 시스템은 원할하게 되었고,

    한가지 더 여쭤봅니다.

     

    각, 게시판별로 이용권 구매를 하여 이용권 구매가 완료된 경우 회원등급이 추가가 되고,

    이용권 기간 동안 회원등급이 유지되도록 설정해두었습니다.

    여기서, 해당 이용권 동안, 게시글을 한번만 작성할 수 있도록 하는 방법은 어떻게 될까요?

     

    그리고, 해당 이용기간 완료후 작성한 게시글도 삭제가 되도록 설정하는 방법도 설명부탁드립니다.

     

    이용권 기간은 정기결제 상품 등록할때 이용기간 설정을 해주었습니다.

    예) 1개월, 3개월, 1주일

     

    총 부여받은 기간동안 한번의 게시글만 작성할 수 있도록 해야합니다.

    또한 부여받은 기간이 종료될경우 작성한 해당 게시판의 게시글이 삭제되도록 해야합니다.

    팁좀 부탁드립니다.

    ** 각 게시판별로 부여받은 회원등급이 다르므로, 게시판별로 분리하여 생각해주셔야합니다.

     

  • alert 창을 표시하고 페이지를 이동하게 하시려면

    아래의 코드를 활용해보세요.

    add_action('kboard_skin_header', 'my_kboard_skin_header', 999, 1);
    function my_kboard_skin_header($builder){
    	$board = $builder->board;
    	if(kboard_mod() == 'editor' && !$board->isAdmin()){
    		$user = wp_get_current_user();
    		if(!in_array('역할', $user->roles) && $board->id == '1'){ // 실제 게시판 id로 적용해주세요.
    			$redirect_url = '페이지주소';
    			echo "<script>alert('권한이 없습니다.')</script>";
    			echo "<script>window.location.href='{$redirect_url}';</script>";
    		}
    		else if(!in_array('역할', $user->roles) && $board->id == '2'){  // 실제 게시판 id로 적용해주세요.
    			$redirect_url = '페이지주소';
    			echo "<script>alert('권한이 없습니다.')</script>";
    			echo "<script>window.location.href='{$redirect_url}';</script>";
    		}
    	}
    }

     

    권한이 없습니다. 문구를 수정하시려면 위의 코드에서

    해당 문구를 원하시는 문구로 교체해보세요.

    고맙습니다.

  • 답변주신 1번 항목에 대해 다시 문의드립니다. 

    저희는 역할별로 작성페이지를 변경하려는것이 아니라, 

    게시글 작성시 설정해둔 역할이 아닐때 나오는 "권한이 없습니다"후 리다이렉트를 변경하고싶은것입니다.

    현재 권한이 없는 경우 "권한이없습니다." 얼럿메시지 후 리스트화면으로 이동되는데, 리스트로 가는것이 아닌,

    각 게시판별로 만들어둔 정기결제 상품 페이지로 이동하고싶은것입니다.

     

    다시 확인 부탁드립니다.

    또한 "권한이 없습니다" 가 아닌 다른 멘트로 바꾸고 싶은데 어떻게 하면될까요?

  • 안녕하세요.

    1. KBoard 플러그인의 kboard_url_content_editor 필터를 활용하시면

    게시글 작성 주소를 편집하실 수 있습니다.

    간단한 예제 코드를 작성해봤습니다.

    워드프레스 관리자 -> 외모 -> 테마 편집기 페이지에서 functions.php 파일 하단에

    아래의 코드를 추가해보시겠어요?

    add_filter('kboard_url_content_editor', 'my_kboard_url_content_editor', 10, 3);
    function my_kboard_url_content_editor($url, $content_uid, $board){
    	$user = wp_get_current_user();
    	if($board->id == '1'){ // 실제 게시판 id로 적용해주세요.
    		if(!$board->isAdmin() && !in_array('역할', $user->roles)){
    			$url = '페이지주소';
    		}
    	}
    	else if($board->id == '2'){ // 실제 게시판 id로 적용해주세요.
    		if(!$board->isAdmin() && !in_array('역할', $user->roles)){
    			$url = '페이지주소';
    		}
    	}
    	return $url;
    }

    위의 코드에서 역할 부분에는 실제 워드프레스 역할을 적용해보시겠어요?

    페이지주소 부분에는 게시판 별로 각 상품 페이지 주소로 교체해보세요.

     

    워드프레스 역할과 권한에 대한 설명은

    아래의 링크를 참고해보세요.

    https://wordpress.org/support/article/roles-and-capabilities/

     

    2. 정기결제 완료 후 특정 페이지로 이동하게 하시려면

    cosmosfarm_members_subscription_pay_success_url 필터를 활용해보시겠어요?

    테마 쪽 functions.php 파일 하단에

    아래의 코드를 활용해보세요.

    add_filter('cosmosfarm_members_subscription_pay_success_url', 'my_cosmosfarm_members_subscription_pay_success_url', 10, 2);
    function my_cosmosfarm_members_subscription_pay_success_url($pay_success_url, $product){
    	$product_id = $product->ID();
    	if($product_id == '상품ID'){
    		$pay_success_url = '페이지주소';
    	}
    	else if($product_id == '상품ID'){
    		$pay_success_url = '페이지주소';
    	}
    		
    	return $pay_success_url;
    }

    위의 코드에서 상품ID 부분은 실제 각 상품 ID로 적용해주세요.

    페이지주소 부분에는 결제 완료 후 이동할 페이지로 각각 설정해보시겠어요?

    고맙습니다.

  • 수고하십니다.

    관련된 내용으로 몇가지 더 질문드리고 싶습니다.

     

    위의 질문과 관련하여, 

    글쓰기의 프로세스를

     

    1. 비회원일경우, 로그인페이지로 이동 (기본설정으로 처리가능)

    2. 로그인 후 각 게시글별로 글쓰기 버튼을 클릭, 권한이 있는지 확인 후 없으면, 정기결제 상품 페이지로 이동(각 게시판의 글쓰기 버튼클릭시 상품 페이지 이동이 각각 다름) 

       -> 결제 완료 후 글쓰기 페이지로 구매한 상품과 관련된 게시판의 글쓰기 페이지로 이동(이부분은 product id를 체크해서 결제완료후 구매한 product id별로 redirect 시키면 될것같은데; 어떻게 소스를 넣어야 될지 모르겠네요.)

    예를 들면 

    팝니다 vip 게시판/ 팝니다 프리미엄 게시판 / 팝니다 일반게시판 이 있고,

    각 게시판별로 역할이 다릅니다. 

    그래서 각각 정기결제 상품 페이지가 다릅니다. 

     

    간단하게 보면 

    글쓰기를 하려면 얼마를 결제해야 글쓰기가 가능하게끔 하려는 것을 정기결제를 활용하려고 하는 것입니다. 

     

    위와 해당하여 팁좀 부탁드립니다.

     

     

     

     

  • in_array 함수 쪽을

    아래처럼 적용해보시겠어요?

    in_array($user->roles[0], array("buy_sell_vip_90","buy_sell_vip_30","buy_sell_vip_7"))

     

    이전 댓글에 안내해드린 코드에도 버그가 있어 수정해두었습니다.

    in_array 함수 사용법은

    아래의 링크를 참고 부탁드립니다.

    https://www.php.net/manual/en/function.in-array.php

    고맙습니다.

이미지 사진은 imgur에 업로드한 뒤 링크 걸어주세요.
좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기