특정 옵션이 선택된 글만 모아보는 전체 게시판

안녕하세요.

항상 문의사항에 좋은 해답 주셔서 감사합니다. ㅎㅎ

케이보드에서 cate_select 라는 메타키를 가지고 있는 옵션에 카테1 이라는 항목을 선택한 글들만 한 게시판에 모아서 보고 싶은데요.

기존 스레드들을 보면서 아래와 같은 코드를 넣어봤는데, 전체 게시물 모아보는 코드까지는 작동을 하지만 AND (`option_key`='{$option_key}' AND `option_value` = '{$option_value}') 이 코드가 들어가면 작동이 안 하더라고요.

add_filter('kboard_list_where', 'all_kboard_list_where', 10, 3);
function all_kboard_list_where($where, $board_id, $content_list){
    global $wpdb;
    
    $option_key = 'cate_select';
	$option_value = '카테1';
    
	if($board_id == '4'){
		$where = "(`board_id` BETWEEN '2' AND '23') AND `parent_uid`='0' AND `notice`='' AND (`status`='' OR `status` IS NULL OR `status`='pending_approval') AND (`option_key`='{$option_key}' AND `option_value` = '{$option_value}')";
	}
	return $where;
}

쿼리문이나 php에 대한 체계적인 지식이 없다보니까... 다른 글들에 있는 코드들을 짜집기 하면 뜰 줄 알았던 결과물이 안 떠서 방법이 떠오르지가 않아서 문의 드립니다!

혹시 어떤 부분을 수정하면 될지 말씀해주시면 적용해보겠습니다.

 

그리고 추가로, 회원가입을 할 때 받은 옵션에 따라서 '카테1'이었던 것을 '카테2'나 그 외의 옵션으로 바꿔서 게시판에 뜨도록 할 수도 있을까요?

예를 들면 회원가입할 때 company_subject 라는 메타키를 가진 항목에 카테2 라는 입력값을 받았으면 전체 게시판에서 cate_select 의 카테2 가 선택된 글들만 모아볼 수 있게요.

company_subject 에 카테1을 받았으면 전체 게시판에서는 cate_select 의 카테1만 보이는 식으로.. 만들어보려고 생각하고 있습니다.

제 생각에는 if($board_id == '4') 이거 옆에 다른 조건을 붙여서 어찌저찌 하면 될 거 같은데.. 그 어찌저찌의 실마리를 못 찾고 있습니다. ㅠㅠ

문의사항 정리 드리자면

 

1. 모든 게시판에서 cate_select 옵션에서 카테1 이라는 값을 가진 글들을 모아서 보는 코드를 짜봤는데 작동이 되지 않습니다. 이유가 뭘까요...?

 

2. 회원가입시 입력받은 값에 따라 전체 게시판에서 보이는 글들의 조건을 변경하고 싶습니다.

 

문의사항 검토해주시고 가능하시다면 개선 방향 알려주세요.

감사합니다!

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

    KBoard 플러그인에서 입력 필드는 kboard_board_option 테이블에

    option_key 컬럼과 option_value 컬럼 등으로 저장됩니다.

    그렇기 때문에 올려주신 코드는 에러가 발생합니다.

     

    kboard_list_from 필터를 활용해서 테이블 조인도 해주셔야 할 듯합니다.

    아래 링크의 코드를 참고해보시겠어요?

    https://www.cosmosfarm.com/threads/document/27474

     

    회원가입 시 입력한 값을 가져오는 건

    워드프레스 get_user_meta 함수를 활용하시면 가능합니다.

    자세한 내용은 아래의 링크를 참고해보세요.

    https://developer.wordpress.org/reference/functions/get_user_meta/

    고맙습니다.

  • 답변 감사합니다!

    옵션값에 따라 불러오는 것 말씀해주신 글대로 아래 코드 넣으니까 정상적으로 나왔습니다.

    add_filter('kboard_list_from', 'my_kboard_list_from', 10, 3);
    function my_kboard_list_from($from, $board_id, $content_list){
    	global $wpdb;
    	if($board_id == '4'){ // 실제 게시판 id로 적용해주세요.
    		$from .= " LEFT JOIN `{$wpdb->prefix}kboard_board_option` ON `{$wpdb->prefix}kboard_board_content`.`uid`=`{$wpdb->prefix}kboard_board_option`.`content_uid`";
    	}
    	return $from;
    }
    

     

    그리고 회원 옵션값에 따라서 보이는 게시글 조정은 현재 접속한 유저의 옵션을 사용해야해서 wp_get_current_user() 를 사용했습니다.

    아래 코드로 적용을 했고요.

    아는 거라곤 if문밖에 없어서 너무 더럽게 짜여진 거 같긴 하지만... 참고하실 분이 계실 수도 있을 듯 해서 코드 스니펫 함께 첨부합니다.

    add_filter('kboard_list_where', 'all_kboard_list_where', 10, 3);
    function all_kboard_list_where($where, $board_id, $content_list){
        global $wpdb;
        
        $user = wp_get_current_user();
        $option_key = 'cate_select';
        
        if($user->cate1 == 'cate1'){
            $option_value1 = '카테1';
        }
        
        if($user->cate2 == 'cate2') {
            $option_value2 = '카테2';
        }
        
    	if($board_id == '4'){
    		$where = "(`board_id` BETWEEN '2' AND '23') AND `parent_uid`='0' AND `notice`='' AND (`status`='' OR `status` IS NULL OR `status`='pending_approval') AND (`option_key`='{$option_key}' AND `option_value` = '{$option_value1}' OR `option_value` = '{$option_value2}')";
    	}
    	return $where;
    }

     

    도움 주신 덕분에 잘 해결 됐습니다.

    감사합니다! ㅎㅎ

  • 안녕하세요. 저도 같은 문제로 찾아보던 중 너무나 잘 적어주신 글 덕분에 감사히 코드를 넣었습니다 ㅎㅎ

    현재 차일드테마 functions에 넣은 상태인데요~

    혹시 워드프레스에 숏코드로 넣을 수 있는 방법도 있을까요?

  • 안녕하세요~ 방금 글을 올렸었는데요 ㅎㅎ

    코드를 같게 넣었는데 해당 id로 되어있는 게시판이 보이지 않습니다 ㅠㅠ 

    제가 바꾼부분은 

    add_filter('kboard_list_from', 'my_kboard_list_from', 10, 3);
    function my_kboard_list_from($from, $board_id, $content_list){
    	global $wpdb;
    	if($board_id == '4'){ // 실제 게시판 id로 적용해주세요.
    		$from .= " LEFT JOIN `{$wpdb->prefix}kboard_board_option` ON `{$wpdb->prefix}kboard_board_content`.`uid`=`{$wpdb->prefix}kboard_board_option`.`content_uid`";
    	}
    	return $from;
    }

    여기 중 board_id 값과 

     

    add_filter('kboard_list_where', 'all_kboard_list_where', 10, 3);
    function all_kboard_list_where($where, $board_id, $content_list){
        global $wpdb;
        
        $user = wp_get_current_user();
        $option_key = 'cate_select';
        
        if($user->cate1 == 'cate1'){
            $option_value1 = '카테1';
        }
        
        if($user->cate2 == 'cate2') {
            $option_value2 = '카테2';
        }
        
    	if($board_id == '4'){
    		$where = "(`board_id` BETWEEN '2' AND '23') AND `parent_uid`='0' AND `notice`='' AND (`status`='' OR `status` IS NULL OR `status`='pending_approval') AND (`option_key`='{$option_key}' AND `option_value` = '{$option_value1}' OR `option_value` = '{$option_value2}')";
    	}
    	return $where;
    }

     $option_key = 'cate_select';

    이부분의 meta key 값과 

     if($user->cate1 == 'cate1'){
            $option_value1 = '카테1';
        }
      이부분의 '카테1' -> '유료'(옵션이름)

    인데요 혹시 제가 잘못 넣은 부분이 있는지 확인해주실 수 있을까요?ㅠㅠ 

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