특정 게시판 이동 시간

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분마다 한번씩 작동한다는 것으로 이해하셨으면 좋겠네요!

좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기
좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기
  • 기존 다른 코드는 지워주신 다음에,

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

    /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');
    }

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

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

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

    고맙습니다.

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

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

    잘은 모르겠지만

     

    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 처럼 연결시켜주는게 들어가야할 것 같은데 아닐까요?ㅠㅠ

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

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

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

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

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

    참고 해보시겠어요?

    고맙습니다.

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

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

     

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

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

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

  • 안녕하세요~^^

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

    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와 같은 기능을 따로 설정하고 있지 않다면

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

    고맙습니다.

  • 추가적으로 저 코드가 DB나 FTP에 캐시 혹은 로그 같은 파일을 생성하는지 궁금합니다!

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