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 '
';
}
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 '';
}
kboard_skin_footer
게시판 하단에 추가 정보나 링크를 넣을 수 있습니다.
add_action('kboard_skin_footer', 'add_board_footer_links');
function add_board_footer_links($boardBuilder) {
echo '';
echo '© ' . date('Y') . ' ' . get_bloginfo('name') . '. All rights reserved.';
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 '
';
}
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 '';
echo '입력하신 이메일로 답변 알림이 발송됩니다';
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 '안녕하세요, ' . $user->display_name . '님!';
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 '
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);