리스트 불러오는 데이터의 쿼리를 수정하는 방법이 궁금합니다.

안녕하세요. 

$content = $list->hasNext()로 데이터를 받는 건 알겠는데 그 데이터의 쿼리를 어디서 수정해야 하는지 모르겠습니다.
'현재 프로그램'과 '지난 프로그램'으로 나눴는데 마감 기간이 긴 데이터가 있을 때 그 기간 사이에 인원수가 다 차거나 기간이 종료된 다른 데이터가 생겨서
'현재 프로그램'에 같은 페이지에 있어야 하는 데이터가 다음 페이지로 넘어가져 있습니다. 데이터를 받는 array의 정렬 순서를 '기간이 다 되거나 모집인원이 다차서 마감된 데이터는 뒤로 보내고
모집 중인 데이터는 앞으로 보내서 정렬된 상태'로 되게끔 바꾸고 싶은데 이 데이터의 쿼리를 어디서 수정해야 하나요? 이렇게 바꿔서 '현재 프로그램'에 다음페이지로 넘어가 있는 데이터를 같은 페이지에 뜨게 하고 싶습니다.

참고하실 url 남겨드리겠습니다. http://gsyouth.or.kr/youth_center/yc_program/?pageid=1&mod=list

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

    KBoard 플러그인의 kboard_list_select 필터를 활용하시면

    게시글 목록을 가져오는 DB쿼리문의 SELECT절을 편집할 수 있습니다.

    kboard_list_from 필터를 활용하시면 게시글 목록을 가져오는 DB쿼리문의 FROM절을 편집할 수 있습니다.

    kboard_list_where 필터를 활용하시면 게시글 목록을 가져오는 DB쿼리문의 WHERE절을 편집할 수 있습니다.

     

    해당 필터들은

    FTP로 접속해서 /wp-content/plugins/kboard/class/KBContentList.class.php 파일에 getList 메소드에서 확인해보실 수 있습니다.

     

    KBoard 주요 액션과 필터에 대한 자세한 내용은

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

    https://www.cosmosfarm.com/products/kboard/hooks

    고맙습니다.

  • 답변 감사합니다. 말씀해주신 걸로 적용해본 결과 리스트가 잘 나왔습니다. 질문이 있어서 또 남깁니다. WHERE절에 2가지의 값을 넣고싶어서 functions.php에

    add_filter('kboard_list_from', 'my_kboard_list_from', 10, 3);
    function my_kboard_list_from($from, $board_id, $content_list){
    	if($board_id == '10' && !kboard_search_option()){
    		global $wpdb;
    		$from = "`{$wpdb->prefix}kboard_board_content` LEFT JOIN `{$wpdb->prefix}kboard_board_option` ON `{$wpdb->prefix}kboard_board_content`.`uid`=`{$wpdb->prefix}kboard_board_option`.`content_uid`";
    	}
    	return $from;
    }
    
    add_filter('kboard_list_where', 'my_kboard_list_where', 10, 3);
    function my_kboard_list_where($where, $board_id, $content_list){
    	if($board_id == '10' && !kboard_search_option()){
    		global $wpdb;
    		$meta_key = 'people';
    		$where .= " AND (`option_key`='{$meta_key}' )";
    		$meta_key2 = 'ed';
    		$where .= " AND (`option_key`='{$meta_key2}' )";
    	}
    	return $where;
    }
    
    
    add_filter('kboard_list_orderby','my_kboard_list_orderby', 10, 3);
    function my_kboard_list_orderby($order, $board_id, $content_list){
    	if($board_id=='10' && !kboard_search_option()){
    		global $wpdb;
    		$order="`{$wpdb->prefix}kboard_board_option`.`option_value` DESC";
    	}
    	return $order;
    }

    이렇게 넣고 돌려봤는데 리스트가 또 안불러지더라구요. where절에 추가할 때 저렇게 하면 되지 않나요? 질문이 너무 많아서 죄송합니다..

  • 데이터베이스(DB) kboard_board_option 테이블에는 ed 컬럼이 없기 때문에 에러 메시지가 표시됩니다.

    $order="`{$wpdb->prefix}kboard_board_option`.`ed` ASC"; 부분을

    $order="`{$wpdb->prefix}kboard_board_option`.`option_value` ASC";로 교체해보시겠어요?

     

    코드를 직접 수정하시는 경우에는

    저희 쪽에서 모든 상황을 알기 어렵기 때문에 답변을 드리는 데 한계가 있을 수도 있습니다.

    고맙습니다.

  • 답변 감사드립니다. 말씀해주신 링크를 토대로 만들어봤는데 오류가 발생해서 질문드립니다.

    현재 editor.php에

    <div class="kboard-attr-row kboard-attr-title">
    			<label class="attr-name" for="kboard-input-title"><?php echo __('Title', 'kboard')?></label>
    			<div class="attr-value"><input type="text" id="kboard-input-title" name="title" value="<?php echo $content->title?>" placeholder="<?php echo __('Title', 'kboard')?>..." required></div>
    		</div>
    		
    		<div class="kboard-attr-row">
    			<label class="attr-name" for="kboard_option_sd">접수 시작</label>
    			<div class="attr-value"><input type="date" id="kboard_option_sd" name="kboard_option_sd" value="<?php echo $content->option->sd?>" required></div>
    		</div>
    		
    		<div class="kboard-attr-row">
    			<label class="attr-name" for="kboard_option_ed">접수 종료</label>
    			<div class="attr-value"><input type="date" id="kboard_option_ed" name="kboard_option_ed" value="<?php echo $content->option->ed?>" required></div>
    		</div>
    		
    		<div class="kboard-attr-row">
    			<label class="attr-name" for="kboard_option_people">모집 인원</label>
    			<div class="attr-value"><input type="number" id="kboard_option_people" name="kboard_option_people" value="<?php echo $content->option->people?>" required></div>
    		</div>

     이렇게 추가한 필드들이 들어가있고

    list.php에

    <?php $kboard_search_option = kboard_search_option()?>
    <div class="search_wrap">
    				<div class="date_title">
    					날짜
    				</div>
    				<div class="date_input">
    					<input type="hidden" name="kboard_search_option[ed][key]" value="ed">
    					<input type="hidden" name="kboard_search_option[ed][compare]" value=">=">
    					<input id="input_date" type="date" name="kboard_search_option[ed][value]" value="<?php echo isset($kboard_search_option['ed']['value']) ? $kboard_search_option['ed']['value'] : ''?>" placeholder="">
    				</div>
    				<div class="keyword_title">
    					검색어
    				</div>
    				<div class="keyword_input">
    					<select name="target">
    						<option value=""><?php echo __('All', 'kboard')?></option>
    						<option value="title"<?php if(kboard_target() == 'title'):?> selected<?php endif?>><?php echo __('Title', 'kboard')?></option>
    						<option value="content"<?php if(kboard_target() == 'content'):?> selected<?php endif?>><?php echo __('Content', 'kboard')?></option>
    						<input type="text" name="keyword" value="<?php echo esc_attr(kboard_keyword())?>">
    					</select>
    				</div>
    				<div class="search_btn">
    					<button type="submit" class="kboard-thumbnail-button-small"><?php echo __('Search', 'kboard')?></button>
    				</div>
    			</div>

    이렇게 입력한 상황입니다. 이 상태에서 functions.php에 

    add_filter('kboard_list_from', 'my_kboard_list_from', 10, 3);
    function my_kboard_list_from($from, $board_id, $content_list){
    	if($board_id == '10' && !kboard_search_option()){
    		global $wpdb;
    		$from = "`{$wpdb->prefix}kboard_board_content` LEFT JOIN `{$wpdb->prefix}kboard_board_option` ON `{$wpdb->prefix}kboard_board_content`.`uid`=`{$wpdb->prefix}kboard_board_option`.`content_uid`";
    	}
    	return $from;
    }
    
    add_filter('kboard_list_where', 'my_kboard_list_where', 10, 3);
    function my_kboard_list_where($where, $board_id, $content_list){
    	if($board_id == '10' && !kboard_search_option()){
    		global $wpdb;
    		$meta_key = 'ed';
    		$where .= " AND (`option_key`='{$meta_key}' )";
    	}
    	return $where;
    }
    
    add_filter('kboard_list_orderby','my_kboard_list_orderby', 10, 3);
    function my_kboard_list_orderby($order, $board_id, $content_list){
    	if($board_id=='10' && !kboard_search_option()){
    		global $wpdb;
    		$order="`{$wpdb->prefix}kboard_board_option`.`ed` ASC";
    	}
    	return $order;
    }

    이렇게 from, where, orderby를 추가했는데 현재 상황이 검색을 하면 리스트가 보이는데 검색하지 않은 상황에서 구분이 전체일 때 리스트가 하나도 안나옵니다. 해결방법이 없을까요?

  • 추가한 입력 필드로 정렬하는 방법은

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

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

    고맙습니다.

  • 제가 잘못 이해하고 있었습니다. 죄송합니다... list.php에서 조건을 줄 때 editor에서 추가했던 필드값으로 조건을 줘서 리스트가 따로 뜨게끔 했고 정렬 순서를 바꿀 때 기존에 조건에 사용했던 필드값들을 다 가지고 와서 다시 써야했는데 그 부분을 말씀 안드렸네요... 아 하나만 더 묻겠습니다. kboard_list_orderby를 쓸 때 

    add_filter('kboard_list_orderby','my_kboard_list_orderby', 10, 3);
    function my_kboard_list_orderby($order, $board_id, $content_list){
    	if(in_array($board_id, array('10', '13'))){
    		$ed = $content_list->option->ed;
    		$order = "`content` ASC";
    	}
    	return $order;
    }

    이렇게 쓰는데 저 $order = "`content` ASC"; 여기서 content 대신에 kboard_option_ed로 새로 만든 필드값을 넣고 싶은데 필드값을 넣을 방법이 없을까요?

  • 올려주신 내용만으로는 어떤 것을 하고 싶으신 건지

    이해가 잘 가지 않습니다.

    또한 직접 코드를 수정하신 경우라면 커뮤니티에서는 100% 해결을 보장해드리기 어렵습니다.

    코드 수정이 어려우시다면 저희 고객지원 쪽 이메일로 유료 기술지원 요청을 부탁드립니다.

     

    게시글 목록 페이지에서 목록을 가져올 때 정렬 순서를 변경하시려면

    kboard_list_orderby 필터를 활용하면 가능합니다.

    고맙습니다.

  • 상세한 설명 정말 감사드립니다. functions.php에 조건을 줄 때 궁금한 것이 있어서 질문드립니다. 리스트 받을 때 정렬을 바꾸고 받기 위해서 질문했었는데 그럼 조건을 줘야하는데 현재는 조건이 모집 기간이 끝나는 시간과 오늘을 비교해서 지났으면 지난 프로그램으로 뜨고 기간이 남아있다면 현재프로그램에 뜹니다. 그래서 모집 종료를 기준으로 오늘 날짜와 비교해서 지나지 않은건 앞으로 빼고 지난 건 뒤로 빼고싶은데요. 궁금한게 

    editor.php에서 접수 종료를 'kboard_option_ed' 로 만들어놨고 list.php에서 비교를 할 때 

    $ed = $content->option->ed;
    $diff_day = aaa($ed,$Today);
    
    if($p_type == 0){
    			//현재프로그램
    				if($diff_day >= 0){

    이렇게 되있거든요. 그럼 functions.php에서 kboard_list_where을 추가할 때 

    //오늘 날짜 가져오기
    $Today  = date("Y-m-d"); 
    
    function aaa($date1,$date2) {
    	$tmp_date1 = explode("-",$date1);
    	$tmp_date2 = explode("-", $date2);
    	$tmp1 = mktime(0,0,0,$tmp_date1[1], $tmp_date1[2], $tmp_date1[0]);
    	// echo $tmp1;
    
    	$tmp2 = mktime(0,0,0,$tmp_date2[1], $tmp_date2[2], $tmp_date2[0]);
    	$return_date = ($tmp1 - $tmp2) / 86400;
    
    	// $r = strtotime($date1) - strtotime($date2) ;
    	// $r = ceil($r / (60*60 *24)) ; // 날짜차이
    	// echo $r;
    	return $return_date;
    }
    
    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 = 'ed';
    	$diff_day = aaa($option_key,$Today);
    	$kboard_list_sort = isset($_GET['kboard_list_sort'])?$_GET['kboard_list_sort']:'';
    	
    }

    이런식으로 추가하면 되는건가요? 그리고 정렬 시킬 때 모집종료와 오늘을 비교해서 현재프로그램인지 지난프로그램인지 알아내서 그거 토대로 정렬조건을 줄 때 어떤식으로 줘야할까요? 질문 많이해서 죄송합니다.

  • 테마의 functions.php 파일에 코드를 추가하거나 Code Snippets 플러그인을 사용해서 코드를 추가할 수 있습니다.

    kboard_list_where 필터 사용법은 저희 커뮤니티에도 관련 글들이 있습니다.

    https://www.cosmosfarm.com/search?q=kboard_list_where

    참고해보시겠어요?

    고맙습니다.

  • 상세한 설명 감사드립니다. 워드프레스 초보자라서 죄송하지만 사용방법에 있어서 질문드립니다. kboard_list_where 필터를 사용할려면 현재 게시판의 list.php에서 코드를 어떻게 써야하는건지 궁금합니다. $content = $list->where() 이런식으로 사용하면 되는건가요?

  • 안녕하세요.

    이전 댓글에서도 말씀드린 것처럼

    커뮤니티에서 저희가 모든 코드를 일일이 봐드리는 건 현실적으로 불가능합니다.

     

    또한 직접 코드를 수정하신 경우라면

    저희 쪽에서는 어떤 상황인지 확인이 불가능하기 때문에 도움을 드리는 데 한계가 있습니다.

    고맙습니다.

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