/**
* 보상톡 산재 신청 관리 시스템
* (functions.php 맨 아래의 기존 코드를 지우고 이 코드로 교체해주세요)
*/
// 1. 인증 토큰(Nonce)과 API 정보 전달 (헤더 직접 출력 방식)
add_action(‘wp_head’, ‘sjt_print_api_config’);
function sjt_print_api_config()
{
$config = array(
‘nonce’ => wp_create_nonce(‘wp_rest’), // REST API 인증키
‘root’ => esc_url_raw(rest_url()), // API 기본 주소
‘submitUrl’ => esc_url_raw(rest_url(‘sjt/v1/submit’)),
‘listUrl’ => esc_url_raw(rest_url(‘sjt/v1/claims’))
);
?>
array(
‘name’ => __(‘산재 신청’, ‘textdomain’),
‘singular_name’ => __(‘산재 신청’, ‘textdomain’),
),
‘public’ => false, // 외부에 노출되지 않음
‘show_ui’ => true, // 관리자 페이지에 메뉴 표시
‘has_archive’ => false,
‘supports’ => array(‘title’, ‘editor’, ‘custom-fields’),
‘capability_type’ => ‘post’,
)
);
}
add_action(‘init’, ‘sjt_register_claim_post_type’);
// 3. REST API 엔드포인트 등록
add_action(‘rest_api_init’, function () {
// (1) 신청서 제출 (POST /wp-json/sjt/v1/submit)
register_rest_route(‘sjt/v1’, ‘/submit’, array(
‘methods’ => ‘POST’,
‘callback’ => ‘sjt_handle_submission’,
‘permission_callback’ => ‘__return_true’, // 누구나 제출 가능
));
// (2) 신청서 목록 조회 (GET /wp-json/sjt/v1/claims)
register_rest_route(‘sjt/v1’, ‘/claims’, array(
‘methods’ => ‘GET’,
‘callback’ => ‘sjt_get_claims’,
‘permission_callback’ => function () {
// 관리자 권한 확인
return current_user_can(‘manage_options’);
},
));
// (3) 신청서 삭제 (DELETE /wp-json/sjt/v1/claims)
register_rest_route(‘sjt/v1’, ‘/claims’, array(
‘methods’ => ‘DELETE’,
‘callback’ => ‘sjt_delete_claim’,
‘permission_callback’ => function () {
return current_user_can(‘manage_options’);
},
));
});
// 4. (Callback) 신청서 저장 처리
function sjt_handle_submission($request)
{
$params = $request->get_json_params();
if (empty($params[‘name’]) || empty($params[‘contact’])) {
return new WP_Error(‘missing_data’, ‘필수 정보(성함, 연락처)가 누락되었습니다.’, array(‘status’ => 400));
}
// 제목 생성 (이름 + 유형)
$title = !empty($params[‘title’]) ? sanitize_text_field($params[‘title’]) : ($params[‘name’] . ‘님 산재 신청 (‘ . date(‘Y-m-d H:i’) . ‘)’);
$post_id = wp_insert_post(array(
‘post_title’ => sanitize_text_field($title),
‘post_content’ => sanitize_textarea_field($params[‘content’]),
‘post_status’ => ‘publish’,
‘post_type’ => ‘sjt_claim’,
));
if (is_wp_error($post_id)) {
return $post_id;
}
// — 기본 정보 —
update_post_meta($post_id, ‘sjt_name’, sanitize_text_field($params[‘name’]));
update_post_meta($post_id, ‘sjt_contact’, sanitize_text_field($params[‘contact’]));
update_post_meta($post_id, ‘sjt_company’, sanitize_text_field($params[‘company’]));
update_post_meta($post_id, ‘sjt_accident_date’, sanitize_text_field($params[‘accidentDate’]));
// — 1단계: 산재 보상 (객관적 증빙) —
update_post_meta($post_id, ‘sjt_occupation’, sanitize_text_field($params[‘occupation’])); // 직종
// * 파일 업로드는 별도 엔드포인트 구현 필요 (현재는 폼에서 UI만 제공)
// — 2단계: 근재 보상 (상황 데이터) —
update_post_meta($post_id, ‘sjt_safety_edu’, sanitize_text_field($params[‘safetyEdu’])); // 안전교육 여부
update_post_meta($post_id, ‘sjt_safety_gear’, sanitize_text_field($params[‘safetyGear’])); // 보호구 착용 여부
update_post_meta($post_id, ‘sjt_family’, sanitize_text_field($params[‘family’])); // 가족 관계
// — 3단계: 개인 보험 —
update_post_meta($post_id, ‘sjt_insurance_check’, sanitize_text_field($params[‘insuranceCheck’])); // 보험 확인 요청
update_post_meta($post_id, ‘sjt_status’, ‘접수’);
return new WP_REST_Response(array(‘success’ => true, ‘id’ => $post_id), 200);
}
// 5. (Callback) 목록 조회 처리 (중요: 관리자용)
function sjt_get_claims($request)
{
// 최신순 정렬
$args = array(
‘post_type’ => ‘sjt_claim’,
‘posts_per_page’ => -1,
‘post_status’ => ‘publish’,
‘orderby’ => ‘date’,
‘order’ => ‘DESC’,
);
$posts = get_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
‘id’ => $post->ID,
‘title’ => $post->post_title,
‘content’ => $post->post_content,
‘submittedAt’ => $post->post_date,
// 기본
‘name’ => get_post_meta($post->ID, ‘sjt_name’, true),
‘contact’ => get_post_meta($post->ID, ‘sjt_contact’, true),
‘company’ => get_post_meta($post->ID, ‘sjt_company’, true),
‘accidentDate’ => get_post_meta($post->ID, ‘sjt_accident_date’, true),
// Phase 1
‘occupation’ => get_post_meta($post->ID, ‘sjt_occupation’, true),
// Phase 2
‘safetyEdu’ => get_post_meta($post->ID, ‘sjt_safety_edu’, true),
‘safetyGear’ => get_post_meta($post->ID, ‘sjt_safety_gear’, true),
‘family’ => get_post_meta($post->ID, ‘sjt_family’, true),
// Phase 3
‘insuranceCheck’ => get_post_meta($post->ID, ‘sjt_insurance_check’, true),
‘status’ => get_post_meta($post->ID, ‘sjt_status’, true),
);
}
return new WP_REST_Response($data, 200);
}
// 6. (Callback) 삭제 처리
function sjt_delete_claim($request)
{
$id = $request->get_param(‘id’);
$post = get_post($id);
if (!$post || $post->post_type !== ‘sjt_claim’) {
return new WP_Error(‘invalid_id’, ‘유효하지 않은 신청 내역입니다.’, array(‘status’ => 404));
}
$deleted = wp_delete_post($id, true);
if (!$deleted) {
return new WP_Error(‘delete_failed’, ‘삭제에 실패했습니다.’, array(‘status’ => 500));
}
return new WP_REST_Response(array(‘success’ => true, ‘id’ => $id), 200);
}