특정 게시판 이동 시간

add_action('init', 'kboard_best_move_update');
function kboard_best_move_update(){
	global $wpdb;
	
	// 조건에 맞는 게시글이 이동될 특정게시판의 ID값을 입력해주세요.
	$best_board_id = '00';
	
	// 제외할 게시판의 ID를 입력해주세요.
	$no_board_id = '00';
	
	$results = $wpdb->get_results("SELECT * FROM `{$wpdb->prefix}kboard_board_content` WHERE `board_id` NOT IN ($no_board_id) AND ((`vote` * 10) + `view`)>100 AND `notice` = ''");
	foreach($results as $row){
		$content = new KBContent();
		$content->initWithUID($row->uid);
		$content->board_id = $best_board_id;
		$content->updateContent();
	}
}

 

수고 많으십니다. :))

저번에 vote 값이 10이 넘는 게시물을 특정게시판으로 이동시키는 코드를 알려주셔서 적용하였는데요.

다행스럽게도 잘 작동해서 잘 사용하고 있습니다.

 

사용하다가 문제점을 조금 발견하게 되었는데

위 코드를 적용하면 서버의 CPU 점유율이 약 20~30% 가량 급격하게 올라갑니다.

vote값이 10이 넘어가는 게시물을 매초 마다 검색하기 때문인 것 같은데

혹시 5분마다 한번씩 검색하여 이동하게 만들 수는 없을까요?

 

해당 코드가 5분마다 한번씩 작동한다는 것으로 이해하셨으면 좋겠네요!

워드프레스 에러 기술지원 서비스 전문가에게 맡기세요
워드프레스 에러 기술지원 서비스 전문가에게 맡기세요
  • 추가적으로 저 코드가 DB나 FTP에 캐시 혹은 로그 같은 파일을 생성하는지 궁금합니다!

  • 안녕하세요~^^

    위 코드가 매 초마다 실행되는 것은 아닙니다.

    init action은 워드프레스가 로드를 완료한 후 헤더를 전송하기 전에 시작합니다.

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

    https://codex.wordpress.org/Plugin_API/Action_Reference/init

     

    5분 간격으로 코드를 실행하시려면

    워드프레스 크론(Wordpress Cron)을 이용하시면 될 듯합니다.

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

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

    if(!wp_next_scheduled('my_task_hook')){
    	wp_schedule_event(time(), 'hourly', 'my_task_hook');
    }
    
    add_filter('cron_schedules', 'my_add_weekly');
    function my_add_weekly($schedules){
    	$schedules['hourly'] = array(
    		'interval' => 300, // 초 단위 300은 5분
    		'display' => __('Once Hourly')
    	);
    	return $schedules;
    }
    
    add_action('my_task_hook', 'my_task_function');
    function my_task_function(){
    	global $wpdb;
    	
    	// 조건에 맞는 게시글이 이동될 특정게시판의 ID값을 입력해주세요.
    	$best_board_id = '00';
    	
    	// 제외할 게시판의 ID를 입력해주세요.
    	$no_board_id = '00';
    	
    	$results = $wpdb->get_results("SELECT * FROM `{$wpdb->prefix}kboard_board_content` WHERE `board_id` NOT IN ($no_board_id) AND ((`vote` * 10) + `view`)>100 AND `notice` = ''");
    	foreach($results as $row){
    		$content = new KBContent();
    		$content->initWithUID($row->uid);
    		$content->board_id = $best_board_id;
    		$content->updateContent();
    	}
    }

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

    https://codex.wordpress.org/Function_Reference/wp_schedule_event

    https://codex.wordpress.org/Plugin_API/Filter_Reference/cron_schedules

     

    general log와 같은 기능을 따로 설정하고 있지 않다면

    로그 파일을 생성하지 않고 기록하지 않습니다.

    고맙습니다.

  • 명쾌한 답변 감사드립니다. :)) 궁금증이 많이 해결되었네요!

  • 적용시켜보니 아예 먹지를 않는 것 같습니다 ㅠㅠ

    조회수랑 추천수를 충족시켰는데도 옮겨지지 않네요 ㅠㅠ

     

    혹시나 해서 인터벌을 1로 설정해두었는데도

    전혀 이동되지 않습니다 ㅠㅠ

  • 아예 동작이 안되는건 워드프레스 크론이 동작하지 않는 듯합니다.

    아무래도 플러그인쪽에 적용을 해야 할 듯합니다.

    기존 플러그인 또는 새로운 플러그인을 만들어서 적용해보세요.

    아래 링크를 보시면 register_activation_hook 과 register_deactivation_hook 에 이벤트를 등록하는 예제를 보실 수 있습니다.

    https://codex.wordpress.org/Function_Reference/wp_schedule_event

    참고 해보시겠어요?

    고맙습니다.

  • 링크 확인을 해보니 대충 이해는 가는 것 같습니다.

    잘은 모르겠지만

     

    add_filter('cron_schedules', 'my_add_weekly');
    function my_add_weekly($schedules){
    	$schedules['hourly'] = array(
    		'interval' => 300, // 초 단위 300은 5분
    		'display' => __('Once Hourly')
    	);
    	return $schedules;
    }

     

    이쪽에 my_task_hook 처럼 연결시켜주는게 들어가야할 것 같은데 아닐까요?ㅠㅠ

  • 링크에서 Plugin API 말씀하시는 건가요? 

  • 기존 다른 코드는 지워주신 다음에,

    아래 코드 내용을 복사해서 플러그인을 만들어주시겠어요?

    /wp-content/plugins 폴더에 test.php 등의 파일을 만들어서 내용을 그대로 붙여넣기 해주세요.

    그리고 워드프레스 관리자 페이지에서 해당 플러그인을 활성화 해주세요.

    <?php
    /*
    Plugin Name: 테스트 플러그인
    Plugin URI: http://www.cosmosfarm.com/
    Description: 테스트 플러그인 입니다.
    Version: 1.0.0
    Author: 코스모스팜 - Cosmosfarm
    Author URI: http://www.cosmosfarm.com/
    */
    
    if(!defined('ABSPATH')) exit;
    
    register_activation_hook(__FILE__, 'my_activation');
    function my_activation(){
        if (! wp_next_scheduled('my_hourly_event')){
    	wp_schedule_event(time(), 'hourly', 'my_hourly_event');
        }
    }
    
    add_action('my_hourly_event', 'do_this_hourly');
    function do_this_hourly(){
    	global $wpdb;
    	
    	// 조건에 맞는 게시글이 이동될 특정게시판의 ID값을 입력해주세요.
    	$best_board_id = '00';
    	
    	// 제외할 게시판의 ID를 입력해주세요.
    	$no_board_id = '00';
    	
    	$results = $wpdb->get_results("SELECT * FROM `{$wpdb->prefix}kboard_board_content` WHERE `board_id` NOT IN ($no_board_id) AND ((`vote` * 10) + `view`)>100 AND `notice` = ''");
    	foreach($results as $row){
    		$content = new KBContent();
    		$content->initWithUID($row->uid);
    		$content->board_id = $best_board_id;
    		$content->updateContent();
    	}
    }
    
    register_deactivation_hook(__FILE__, 'my_deactivation');
    function my_deactivation(){
    	wp_clear_scheduled_hook('my_hourly_event');
    }

    한 시간 단위로 코드가 실행될 겁니다.

    그래도 잘 안되신다면 유료 기술지원을 요청해주시겠어요?

    저희가 직접 점검해드리겠습니다.

    고맙습니다.

워드프레스 에러 기술지원 서비스 전문가에게 맡기세요