KBoard 플러그인 훅 action 정리

1. 시스템 & 관리자 영역 훅

1.1 관리자 메뉴 커스터마이징

kboard_admin_menu

관리자 메뉴가 생성될 때 실행되는 훅입니다.

add_action('kboard_admin_menu', 'my_admin_menu_customization');
function my_admin_menu_customization() {
    echo '
'; echo '관리자 전용 공지사항이 있습니다!'; echo '
'; }

실무 활용 예시:

add_action('kboard_admin_menu', 'add_kboard_stats_widget');
function add_kboard_stats_widget() {
    global $wpdb;
    $total_posts = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}kboard_board_content");
    
    echo '
'; echo '

KBoard 통계

'; echo '

총 게시글: ' . number_format($total_posts) . '

'; echo '
'; }

1.2 다중 사이트 관리

kboard_switch_to_blog & kboard_restore_current_blog

다중 사이트 환경에서 블로그 전환을 관리하는 훅들입니다.

add_action('kboard_switch_to_blog', 'track_blog_switches');
function track_blog_switches($args) {
    error_log('블로그 전환: ' . print_r($args, true));
    
    if (get_current_blog_id() == 2) {
        add_filter('kboard_list_rpp', function() { return 50; });
    }
}

2. UI & 헤더 영역 훅

2.1 헤드 영역 커스터마이징

kboard_head

게시판 페이지의 헤드 영역에서 실행됩니다.

add_action('kboard_head', 'kboard_custom_head_content');
function kboard_custom_head_content() {
    if (is_kboard()) {
        echo '';
        echo '';
    }
    
    echo '';
}

kboard_iframe_head

iframe 모드에서 특별한 스타일링을 적용할 때 사용합니다.

add_action('kboard_iframe_head', 'iframe_custom_styling');
function iframe_custom_styling() {
    echo '';
}

2.2 인쇄 페이지 최적화

kboard_document_print_head

문서 인쇄 시 전용 스타일을 적용합니다.

add_action('kboard_document_print_head', 'optimize_print_layout');
function optimize_print_layout() {
    echo '';
}

3. 스킨 & 빌더 훅

3.1 스킨 헤더/푸터 커스터마이징

kboard_skin_header

게시판 상단에 커스텀 콘텐츠를 추가할 수 있습니다.

add_action('kboard_skin_header', 'add_board_header_info');
function add_board_header_info($boardBuilder) {
    $board = $boardBuilder->board;
    
    echo '
'; echo '
'; echo $board->board_name; echo ' | 총 ' . number_format($board->getTotal()) . '개 게시글'; echo ' | 회원 전용: ' . ($board->permission_read ? 'Yes' : 'No'); echo '
'; if ($board->id == 1) { echo '
'; echo '중요 공지사항을 확인하세요!'; echo '
'; } echo '
'; }

kboard_skin_footer

게시판 하단에 추가 정보나 링크를 넣을 수 있습니다.

add_action('kboard_skin_footer', 'add_board_footer_links');
function add_board_footer_links($boardBuilder) {
    echo '';
    
    echo '';
}

3.2 에디터 영역 개선

kboard_skin_editor_header_before

글 작성 폼 상단에 가이드라인을 추가합니다.

add_action('kboard_skin_editor_header_before', 'show_writing_guidelines', 10, 2);
function show_writing_guidelines($content, $board) {
    echo '
'; echo '

글 작성 가이드라인

'; echo '
    '; echo '
  • 욕설, 비방, 광고글은 삭제됩니다
  • '; echo '
  • 이미지는 5MB 이하로 업로드해주세요
  • '; echo '
  • 개인정보는 절대 게시하지 마세요
  • '; echo '
'; echo '
'; }

kboard_skin_editor_option

에디터에 커스텀 옵션을 추가합니다.

add_action('kboard_skin_editor_option', 'add_custom_editor_options', 10, 3);
function add_custom_editor_options($content, $board, $boardBuilder) {
    echo '
'; echo ''; if ($board->use_anonymous) { echo ''; } echo '
'; }

4. 필드 시스템 훅

4.1 전체 필드 제어

kboard_skin_field_before & kboard_skin_field_after

모든 필드에 공통으로 적용되는 래퍼를 추가합니다.

add_action('kboard_skin_field_before', 'wrap_field_start', 10, 3);
function wrap_field_start($field, $content, $board) {
    echo '
'; if (!empty($field['required'])) { echo '*'; } } add_action('kboard_skin_field_after', 'wrap_field_end', 10, 3); function wrap_field_end($field, $content, $board) { if (!empty($field['help_text'])) { echo '' . esc_html($field['help_text']) . ''; } echo '
'; }

4.2 특정 필드별 커스터마이징

동적 훅 패턴 활용

필드명을 기반으로 한 동적 훅을 사용합니다.

add_action('kboard_skin_field_before_phone', 'phone_field_enhancement', 10, 3);
function phone_field_enhancement($field, $content, $board) {
    echo '
'; echo '연락처는 하이픈(-) 없이 숫자만 입력해주세요'; echo '
'; } add_action('kboard_skin_field_after_email', 'email_field_validation_note', 10, 3); function email_field_validation_note($field, $content, $board) { echo ''; } add_action('kboard_skin_field_before_attach', 'file_upload_guide', 10, 3); function file_upload_guide($field, $content, $board) { echo '
'; echo '

파일 업로드 안내:

'; echo '
    '; echo '
  • 최대 파일 크기: 10MB
  • '; echo '
  • 허용 형식: jpg, png, gif, pdf, doc, hwp
  • '; echo '
  • 동시 업로드: 최대 5개
  • '; echo '
'; echo '
'; }

5. 문서 생명주기 훅

5.1 문서 등록 프로세스

kboard_pre_document_insert

문서 등록 전 검증 및 데이터 가공을 수행합니다.

add_action('kboard_pre_document_insert', 'validate_document_before_insert', 10, 4);
function validate_document_before_insert($uid, $board_id, $content, $board) {
    if (mb_strlen($content->title) < 5) {
        wp_die('제목은 5글자 이상 입력해주세요.');
    }
    
    $forbidden_words = ['스팸', '광고', '홍보'];
    foreach ($forbidden_words as $word) {
        if (strpos($content->title, $word) !== false || strpos($content->content, $word) !== false) {
            wp_die('부적절한 내용이 포함되어 있습니다.');
        }
    }
    
    global $wpdb;
    $duplicate = $wpdb->get_var($wpdb->prepare(
        "SELECT uid FROM {$wpdb->prefix}kboard_board_content 
         WHERE board_id = %d AND title = %s AND date > %s",
        $board_id, $content->title, date('Y-m-d H:i:s', strtotime('-1 hour'))
    ));
    
    if ($duplicate) {
        wp_die('1시간 내에 동일한 제목의 글이 등록되었습니다.');
    }
}

kboard_document_insert

문서 등록 후 후속 처리를 수행합니다.

add_action('kboard_document_insert', 'process_after_document_insert', 10, 4);
function process_after_document_insert($content_uid, $board_id, $content, $board) {
    if (function_exists('mycred_add')) {
        mycred_add('post_content', get_current_user_id(), 10, '게시글 작성 보상');
    }
    
    $important_boards = [1, 3, 5];
    if (in_array($board_id, $important_boards)) {
        wp_mail(
            get_option('admin_email'),
            '[' . $board->board_name . '] 새 게시글 등록',
            "제목: {$content->title}\n작성자: {$content->member_display}\n내용: " . wp_strip_all_tags($content->content)
        );
    }
    
    if (!empty($content->content) && preg_match('/<img[^>]+src="([^"]+)"/', $content->content, $matches)) {
        update_post_meta($content_uid, 'kboard_thumbnail', $matches[1]);
    }
}

5.2 게시판별 특화 처리

동적 훅으로 게시판별 로직 구현

add_action('kboard_document_insert_1', 'notice_board_special_handler', 10, 4);
function notice_board_special_handler($content_uid, $board_id, $content, $board) {
    send_push_notification_to_all_users(
        '새 공지사항', 
        $content->title
    );
    
    update_post_meta($content_uid, 'kboard_priority', 'high');
}

add_action('kboard_document_insert_3', 'event_board_special_handler', 10, 4);
function event_board_special_handler($content_uid, $board_id, $content, $board) {
    share_to_social_media($content->title, get_permalink($content_uid));
    
    if (function_exists('tribe_create_event')) {
        $event_date = get_post_meta($content_uid, 'event_date', true);
        if ($event_date) {
            tribe_create_event([
                'post_title' => $content->title,
                'post_content' => $content->content,
                'EventStartDate' => $event_date,
            ]);
        }
    }
}

6. 고급 활용 패턴

6.1 조건부 훅 적용

add_action('kboard_skin_header', 'mobile_only_header');
function mobile_only_header($boardBuilder) {
    if (wp_is_mobile()) {
        echo '
'; echo '모바일 앱을 다운로드하세요!'; echo '
'; } } add_action('kboard_skin_footer', 'member_only_footer'); function member_only_footer($boardBuilder) { if (is_user_logged_in()) { $user = wp_get_current_user(); echo '
'; echo '안녕하세요, ' . $user->display_name . '님!'; echo '
'; } }

6.2 훅 우선순위 활용

add_action('kboard_document_insert', 'first_priority_handler', 1, 4);
function first_priority_handler($uid, $board_id, $content, $board) {
    // 최우선 처리 로직
}

add_action('kboard_document_insert', 'after_default_handler', 20, 4);

add_action('kboard_document_insert', 'final_cleanup_handler', 999, 4);