add_filter 안에 또 다른 add_filter 사용할 수 있나요?

안녕하세요.

아래와 같이 하나의 필터를 적용한 func 안에 또 다른 필터를 또 써도 되나요..?

if(!function_exists('application_end_date_extends_setting_update')){
	add_filter('kboard_extends_setting_update', 'my_extends_setting_update', 10, 2);
	function my_extends_setting_update($meta, $board_id){
		$board = new KBoard($board_id);
		$board->meta->my_date = isset($_POST['my_date'])?$_POST['my_date']: '';
		

		add_filter('kboard_is_writer', 'no_more_writing', 10, 3);
		function no_more_writing($is_writer, $board, $meta){
			if(!$board->isAdmin() && $board == $this){
				$current_date = date('YmdHis', current_time('timestamp'));
				$my_date = $board->meta->my_date;
		
			if($current_date >= $my_date){
				$is_writer = false;
			}
		}
		return $is_writer;
		}


	}
}

 

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

    워드프레스 필터나 액션 함수 내부에 또 다른 필터나 액션을 추가하실 수 있지만

    상황에 따라서는 동작하지 않을 수도 있습니다.

    올려주신 코드를 보니 함수 안에 함수가 새로 정의되어 있는데요.

    이럴 경우 코드가 정상적으로 동작하지 않을 수도 있습니다.

    올려주신 코드는 어떤 용도로 추가하셨는지

    좀 더 구체적인 상황을 설명해주시겠어요?

    고맙습니다.

  • 답변 감사합니다.

    특정 날짜를 설정하여 해당 날짜가 지나면 글 수정을 제한하고자 하는 기능입니다.

    이 기능을 게시판 관리자 페이지 - 확장 탭에 추가하려고 아래와 같은 코드를 작성해 보았습니다.

     

    //마감일시 설정 - 관리자 확장기능에 추가
    if(!function_exists('my_extends_setting')){
    add_filter('kboard_extends_setting', 'my_extends_setting', 10, 3);
    	function my_extends_setting($html, $meta, $board_id){
    		if(in_array($board_id, array('2'))){	//마감일시 적용할 게시판의 id 추가 - 현재는 2 만.
    			
    		echo '<table class="form-table"><tbody>';
    		$current_date = date('YmdHis', current_time('timestamp'));
    		$my_date = $board->meta->my_date ? $board->meta->my_date :'';
    		
    		echo '<tr valign="top">';
    		echo '<th scope="row">마감일시 입력</th><td>';
    		echo '<input type="number" id="my_date" name="my_date" style="width: 20%;" placeholder="'.$current_date.'">';
    		echo '<p class="description">날짜형식 : yyyymmddhhiiss</p>';
    		echo '</td></tr>';
    		
    		echo '</tbody></table>';
    		
    		return $html;
    		}
    	}
    }
    
    
    //확장기능 업데이트(저장) 클릭하면 실행
    if(!function_exists('my_extends_setting_update')){
    	add_filter('kboard_extends_setting_update', 'my_extends_setting_update', 10, 2);
    	function my_extends_setting_update($meta, $board_id){
    		$board = new KBoard($board_id);
    		$board->meta->my_date = isset($_POST['my_date'])?$_POST['my_date']: ''; //my_date를 set
    		
    		
    		//my_date가 되면 작성 제한
    		add_filter('kboard_is_writer', 'no_more_writing', 10, 3);
    		function no_more_writing($is_writer, $board, $meta){
    			if(!$board->isAdmin() && $board == $this){
    				$current_date = date('YmdHis', current_time('timestamp'));
    				$my_date = $board->meta->my_date;
    		
    			if($current_date >= $my_date){
    				$is_writer = false;
    			}
    		}
    		return $is_writer;
    		}
    
    
    	}
    }

     

  • 필터에 등록된 파라미터를 임의로 수정할 경우 정상적으로 동작하지 않습니다.

    또한 코드를 분리하면 해결되실 듯합니다.

    올려주신 코드 대신 아래의 코드로 교체해보시겠어요?

    add_filter('kboard_extends_setting', 'my_extends_setting', 10, 3);
    if(!function_exists('my_extends_setting')){
    	function my_extends_setting($html, $meta, $board_id){
    		if(in_array($board_id, array('1'))){	//마감일시 적용할 게시판의 id 추가 - 현재는 2 만.
    			$board = new KBoard($board_id);
    			
    			echo '<table class="form-table"><tbody>';
    			$current_date = date('YmdHis', current_time('timestamp'));
    			$my_date = $board->meta->my_date ? $board->meta->my_date :'';
    			
    			echo '<tr valign="top">';
    			echo '<th scope="row">마감일시 입력</th><td>';
    			echo '<input type="number" id="my_date" name="my_date" style="width: 20%;" value="'.$my_date.'" placeholder="'.$current_date.'">';
    			echo '<p class="description">날짜형식 : yyyymmddhhiiss</p>';
    			echo '</td></tr>';
    			
    			echo '</tbody></table>';
    			
    			return $html;
    		}
    	}
    }
    
    //확장기능 업데이트(저장) 클릭하면 실행
    add_filter('kboard_extends_setting_update', 'my_extends_setting_update', 10, 2);
    if(!function_exists('my_extends_setting_update')){
    	function my_extends_setting_update($board_meta, $board_id){
    		$board_meta->my_date = isset($_POST['my_date'])?$_POST['my_date']: ''; //my_date를 set
    	}
    }
    
    //my_date가 되면 작성 제한
    add_filter('kboard_is_writer', 'no_more_writing', 10, 2);
    if(!function_exists('no_more_writing')){
    	function no_more_writing($is_writer, $board){
    		if(!$board->isAdmin() && $board->id == '1'){ // 실제 게시판 id로 적용해주세요.
    			$current_date = date('YmdHis', current_time('timestamp'));
    			$my_date = $board->meta->my_date;
    			
    			if($current_date >= $my_date){
    				$is_writer = false;
    			}
    		}
    		return $is_writer;
    	}
    }

    고맙습니다.

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