답변 7개 / 댓글 10개
채택된 답변
+20 포인트
2026-06-29 (월) 16:40:50
Copy
<?php
/**
* 그누보드5 / 영카트5 게시글 작성일 변경 관리자 페이지
*
* 저장 위치:
* /adm/write_datetime_change.php
*
* 사용:
* 최고관리자 로그인 후 /adm/write_datetime_change.php 접속
*/
$sub_menu = '300100';
include_once('./_common.php');
include_once(G5_ADMIN_PATH.'/admin.lib.php');
if ($is_admin !== 'super') {
alert('최고관리자만 접근 가능합니다.');
}
$g5['title'] = '게시글 작성일 변경';
function wd_clean_bo_table($bo_table)
{
$bo_table = trim((string)$bo_table);
if ($bo_table === '') {
return '';
}
if (!preg_match('/^[a-zA-Z0-9_]+$/', $bo_table)) {
alert('잘못된 게시판 ID입니다.');
}
return $bo_table;
}
function wd_normalize_datetime($value)
{
$value = trim((string)$value);
$formats = array(
'Y-m-d\TH:i',
'Y-m-d\TH:i:s',
'Y-m-d H:i',
'Y-m-d H:i:s',
'Y-m-d'
);
foreach ($formats as $format) {
$dt = DateTime::createFromFormat($format, $value);
$errors = DateTime::getLastErrors();
$ok = $dt && (
$errors === false ||
((int)$errors['warning_count'] === 0 && (int)$errors['error_count'] === 0)
);
if ($ok) {
if ($format === 'Y-m-d') {
return $dt->format('Y-m-d 00:00:00');
}
return $dt->format('Y-m-d H:i:s');
}
}
return '';
}
$allowed_sfl = array(
'wr_subject',
'wr_content',
'wr_name',
'mb_id'
);
$bo_table = isset($_REQUEST['bo_table']) ? wd_clean_bo_table($_REQUEST['bo_table']) : '';
$sfl = isset($_REQUEST['sfl']) ? trim($_REQUEST['sfl']) : 'wr_subject';
$stx = isset($_REQUEST['stx']) ? trim($_REQUEST['stx']) : '';
$page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
if (!in_array($sfl, $allowed_sfl, true)) {
$sfl = 'wr_subject';
}
$board = array();
$write_table = '';
if ($bo_table !== '') {
$bo_table_sql = sql_escape_string($bo_table);
$board = sql_fetch("
SELECT bo_table, bo_subject
FROM {$g5['board_table']}
WHERE bo_table = '{$bo_table_sql}'
");
if (!$board['bo_table']) {
alert('존재하지 않는 게시판입니다.');
}
$write_table = $g5['write_prefix'] . $bo_table;
}
/*
|--------------------------------------------------------------------------
| 작성일 변경 처리
|--------------------------------------------------------------------------
*/
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['act']) && $_POST['act'] === 'change_datetime') {
check_admin_token();
$bo_table = isset($_POST['bo_table']) ? wd_clean_bo_table($_POST['bo_table']) : '';
if ($bo_table === '') {
alert('게시판을 선택해 주세요.');
}
$bo_table_sql = sql_escape_string($bo_table);
$board = sql_fetch("
SELECT bo_table, bo_subject
FROM {$g5['board_table']}
WHERE bo_table = '{$bo_table_sql}'
");
if (!$board['bo_table']) {
alert('존재하지 않는 게시판입니다.');
}
$write_table = $g5['write_prefix'] . $bo_table;
$new_datetime = isset($_POST['new_datetime']) ? wd_normalize_datetime($_POST['new_datetime']) : '';
if ($new_datetime === '') {
alert('변경할 날짜를 올바르게 입력해 주세요.');
}
$wr_ids = isset($_POST['wr_ids']) && is_array($_POST['wr_ids']) ? $_POST['wr_ids'] : array();
$wr_ids = array_values(array_unique(array_filter(array_map('intval', $wr_ids))));
if (!$wr_ids) {
alert('작성일을 변경할 게시글을 선택해 주세요.');
}
$change_wr_last = isset($_POST['change_wr_last']) ? true : false;
$change_board_new = isset($_POST['change_board_new']) ? true : false;
$count = 0;
foreach ($wr_ids as $wr_id) {
if ($wr_id < 1) {
continue;
}
$post = sql_fetch("
SELECT wr_id
FROM {$write_table}
WHERE wr_id = '{$wr_id}'
AND wr_is_comment = 0
");
if (!$post['wr_id']) {
continue;
}
$set_sql = " wr_datetime = '{$new_datetime}' ";
if ($change_wr_last) {
$set_sql .= ", wr_last = '{$new_datetime}' ";
}
sql_query("
UPDATE {$write_table}
SET {$set_sql}
WHERE wr_id = '{$wr_id}'
AND wr_is_comment = 0
");
if ($change_board_new) {
sql_query("
UPDATE {$g5['board_new_table']}
SET bn_datetime = '{$new_datetime}'
WHERE bo_table = '{$bo_table_sql}'
AND wr_id = '{$wr_id}'
");
}
$count++;
}
$return_url = $_SERVER['SCRIPT_NAME'] . '?bo_table=' . urlencode($bo_table);
if ($sfl !== '') {
$return_url .= '&sfl=' . urlencode($sfl);
}
if ($stx !== '') {
$return_url .= '&stx=' . urlencode($stx);
}
alert($count . '개 게시글의 작성일을 변경했습니다.', $return_url);
}
/*
|--------------------------------------------------------------------------
| 게시판 목록
|--------------------------------------------------------------------------
*/
$boards = array();
$result = sql_query("
SELECT bo_table, bo_subject
FROM {$g5['board_table']}
ORDER BY bo_order, bo_table
");
while ($row = sql_fetch_array($result)) {
$boards[] = $row;
}
/*
|--------------------------------------------------------------------------
| 게시글 목록
|--------------------------------------------------------------------------
*/
$list = array();
$total_count = 0;
$total_page = 1;
$rows = 50;
if ($bo_table !== '') {
$where = " WHERE wr_is_comment = 0 ";
if ($stx !== '') {
$stx_sql = sql_escape_string($stx);
$where .= " AND {$sfl} LIKE '%{$stx_sql}%' ";
}
$total = sql_fetch("
SELECT COUNT(*) AS cnt
FROM {$write_table}
{$where}
");
$total_count = (int)$total['cnt'];
$total_page = max(1, (int)ceil($total_count / $rows));
$from_record = ($page - 1) * $rows;
$sql = "
SELECT wr_id,
wr_subject,
wr_name,
mb_id,
wr_datetime,
wr_last,
wr_hit
FROM {$write_table}
{$where}
ORDER BY wr_num, wr_reply
LIMIT {$from_record}, {$rows}
";
$result = sql_query($sql);
while ($row = sql_fetch_array($result)) {
$list[] = $row;
}
}
include_once(G5_ADMIN_PATH.'/admin.head.php');
?>
<style>
.write-date-box {
padding: 15px;
margin: 0 0 15px;
border: 1px solid #d9dee9;
background: #f8fafc;
}
.write-date-box .frm_input {
height: 36px;
}
.write-date-help {
margin: 8px 0 0;
color: #6b7280;
line-height: 1.6;
}
.write-date-actions {
display: flex;
gap: 8px;
align-items: center;
flex-wrap: wrap;
}
.write-date-options {
margin-top: 10px;
}
.write-date-options label {
margin-right: 15px;
}
</style>
<div class="local_desc01 local_desc">
<p>
선택한 게시글의 작성일을 원하는 날짜로 변경합니다.
DB를 직접 수정하는 기능이므로 작업 전 백업을 권장합니다.
</p>
<p>
그누보드 기본 게시판 목록 순서는 보통 작성일이 아니라
<strong>wr_num</strong>, <strong>wr_reply</strong> 기준입니다.
따라서 작성일을 변경해도 게시글 위치가 자동으로 이동하지 않을 수 있습니다.
</p>
</div>
<form method="get" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" class="local_sch01 local_sch">
<label for="bo_table" class="sound_only">게시판 선택</label>
<select name="bo_table" id="bo_table">
<option value="">게시판 선택</option>
<?php foreach ($boards as $b) { ?>
<option value="<?php echo get_text($b['bo_table']); ?>" <?php echo $bo_table === $b['bo_table'] ? 'selected' : ''; ?>>
<?php echo get_text($b['bo_subject']); ?> (<?php echo get_text($b['bo_table']); ?>)
</option>
<?php } ?>
</select>
<select name="sfl">
<option value="wr_subject" <?php echo $sfl === 'wr_subject' ? 'selected' : ''; ?>>제목</option>
<option value="wr_content" <?php echo $sfl === 'wr_content' ? 'selected' : ''; ?>>내용</option>
<option value="wr_name" <?php echo $sfl === 'wr_name' ? 'selected' : ''; ?>>작성자</option>
<option value="mb_id" <?php echo $sfl === 'mb_id' ? 'selected' : ''; ?>>회원ID</option>
</select>
<input type="text" name="stx" value="<?php echo get_text($stx); ?>" class="frm_input" placeholder="검색어">
<input type="submit" value="검색" class="btn_submit">
</form>
<?php if ($bo_table !== '') { ?>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" onsubmit="return writeDateChangeSubmit(this);">
<input type="hidden" name="token" value="<?php echo get_admin_token(); ?>">
<input type="hidden" name="act" value="change_datetime">
<input type="hidden" name="bo_table" value="<?php echo get_text($bo_table); ?>">
<input type="hidden" name="sfl" value="<?php echo get_text($sfl); ?>">
<input type="hidden" name="stx" value="<?php echo get_text($stx); ?>">
<div class="write-date-box">
<div class="write-date-actions">
<strong>변경할 작성일</strong>
<input type="datetime-local" name="new_datetime" class="frm_input" required>
<input type="submit" value="선택 게시글 작성일 변경" class="btn_submit btn">
</div>
<div class="write-date-options">
<label>
<input type="checkbox" name="change_wr_last" value="1" checked>
wr_last도 함께 변경
</label>
<label>
<input type="checkbox" name="change_board_new" value="1" checked>
새글 테이블 날짜도 함께 변경
</label>
</div>
<p class="write-date-help">
예: 2026-06-29 10:30:00<br>
같은 날짜로 여러 게시글을 한 번에 변경할 수 있습니다.
</p>
</div>
<div class="tbl_head01 tbl_wrap">
<table>
<caption><?php echo get_text($board['bo_subject']); ?> 게시글 목록</caption>
<thead>
<tr>
<th scope="col">
<input type="checkbox" id="chk_all" onclick="writeDateCheckAll(this.checked);">
</th>
<th scope="col">번호</th>
<th scope="col">제목</th>
<th scope="col">작성자</th>
<th scope="col">회원ID</th>
<th scope="col">작성일</th>
<th scope="col">wr_last</th>
<th scope="col">조회</th>
</tr>
</thead>
<tbody>
<?php if ($list) { ?>
<?php foreach ($list as $row) { ?>
<tr>
<td class="td_chk">
<input type="checkbox" name="wr_ids[]" value="<?php echo (int)$row['wr_id']; ?>" class="wr_id_chk">
</td>
<td class="td_num">
<?php echo (int)$row['wr_id']; ?>
</td>
<td class="td_left">
<a href="<?php echo G5_BBS_URL; ?>/board.php?bo_table=<?php echo urlencode($bo_table); ?>&wr_id=<?php echo (int)$row['wr_id']; ?>" target="_blank">
<?php echo get_text(cut_str($row['wr_subject'], 80)); ?>
</a>
</td>
<td class="td_name">
<?php echo get_text($row['wr_name']); ?>
</td>
<td class="td_name">
<?php echo get_text($row['mb_id']); ?>
</td>
<td class="td_datetime">
<?php echo get_text($row['wr_datetime']); ?>
</td>
<td class="td_datetime">
<?php echo get_text($row['wr_last']); ?>
</td>
<td class="td_num">
<?php echo number_format((int)$row['wr_hit']); ?>
</td>
</tr>
<?php } ?>
<?php } else { ?>
<tr>
<td colspan="8" class="empty_table">게시글이 없습니다.</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</form>
<?php
$qstr = 'bo_table=' . urlencode($bo_table) . '&sfl=' . urlencode($sfl) . '&stx=' . urlencode($stx) . '&page=';
echo get_paging(
$config['cf_write_pages'],
$page,
$total_page,
$_SERVER['SCRIPT_NAME'] . '?' . $qstr
);
?>
<script>
function writeDateCheckAll(checked) {
var checks = document.querySelectorAll('.wr_id_chk');
for (var i = 0; i < checks.length; i++) {
checks[i].checked = checked;
}
}
function writeDateChangeSubmit(f) {
var checks = document.querySelectorAll('.wr_id_chk:checked');
if (!checks.length) {
alert('작성일을 변경할 게시글을 선택해 주세요.');
return false;
}
if (!f.new_datetime.value) {
alert('변경할 날짜를 입력해 주세요.');
f.new_datetime.focus();
return false;
}
return confirm('선택한 게시글의 작성일을 변경하시겠습니까?');
}
</script>
<?php } ?>
<?php
include_once(G5_ADMIN_PATH.'/admin.tail.php');
?>
adm폴더에 write_datetime_change.php을 만들고 관리자로 로그인후 https://도메인/adm/write_datetime_change.php
실행하세요
기능은 다음과 같습니다.
게시판 선택
제목/내용/작성자/회원ID 검색
게시글 체크 선택
원하는 작성일 입력
선택 글의 wr_datetime 변경
필요 시 wr_last, g5_board_new.bn_datetime도 같이 변경
주의할 점은 있습니다.
주의할 점은 있습니다.
그누보드5 기본 게시판 목록 순서는 보통 작성일이 아니라 wr_num, wr_reply 기준입니다.
그래서 이 파일로 작성일을 바꾸면 표시되는 날짜는 변경되지만 글 위치가 최신글처럼 자동 이동하지 않을 수 있습니다.
최신글/새글 표시 날짜까지 맞추려면 파일 안에 있는 옵션 중
새글 테이블 날짜도 함께 변경
을 체크한 상태로 변경하면 됩니다
답변에 대한 댓글 3개
2026-06-29 (월) 19:46:51
2026-06-29 (월) 19:58:17
저장하실때 문자 인코딩을 UTF-8로 저장하세요~
2026-06-29 (월) 19:59:24
현재 깨진 글자는 인코딩 문제이고, 인코딩해도 코드가 그대로 보이는 것은 <?php 시작 태그 문제입니다.
2026-07-20 (월) 09:46:29
해결되셨을까요?
답변에 대한 댓글 1개
2026-07-21 (화) 10:23:38
네. 제가 아는것이 없다보니 어렵게어렵게 해내기는 했네요. 관심 가져 주셔서 감사합니다. ^^
2026-07-06 (월) 04:53:43
그누보드5 게시글의 작성일은 해당 게시판 글 테이블의 wr_datetime 값입니다. 그래서 원리는 wr_datetime 값을 원하는 날짜로 update 해주면 됩니다.
관리자가 글을 수정할 때 작성일을 현재 시간으로 바꾸는 정도라면 게시판 스킨 폴더에 write_update.skin.php 파일을 만들어 아래처럼 처리할 수 있습니다.
원하는 임의 날짜로 바꾸려면 G5_TIME_YMDHIS 대신 직접 지정한 값을 넣으면 됩니다.
예를 들어 특정 글을 2024-01-01 10:00:00 으로 바꾸려면 이런 식입니다.
다만 이 기능은 반드시 관리자만 실행되도록 막아야 합니다. 일반 회원이 날짜를 바꿀 수 있으면 게시판 정렬이나 운영 기록이 꼬일 수 있습니다.
파일을 올렸는데 한글이 깨지거나 코드가 화면에 그대로 보이면 보통 두 가지를 확인하면 됩니다.
1. 파일 저장 인코딩을 UTF-8로 저장했는지
2. 파일이 <?php 로 시작하고 실제 PHP 파일로 저장됐는지
관리자 화면에서 날짜를 직접 선택해서 바꾸고 싶다면 별도 관리자용 페이지를 만들어 wr_id, bo_table, 변경할 날짜를 받아 update 하는 방식으로 구현하는 게 깔끔합니다.
관리자가 글을 수정할 때 작성일을 현재 시간으로 바꾸는 정도라면 게시판 스킨 폴더에 write_update.skin.php 파일을 만들어 아래처럼 처리할 수 있습니다.
Copy
<?php
if (!defined('_GNUBOARD_')) exit;
if ($is_admin && $w == 'u') {
sql_query(" update {$write_table} set wr_datetime = '".G5_TIME_YMDHIS."' where wr_id = '{$wr_id}' ");
}
?>
원하는 임의 날짜로 바꾸려면 G5_TIME_YMDHIS 대신 직접 지정한 값을 넣으면 됩니다.
예를 들어 특정 글을 2024-01-01 10:00:00 으로 바꾸려면 이런 식입니다.
Copy
sql_query(" update {$write_table} set wr_datetime = '2024-01-01 10:00:00' where wr_id = '{$wr_id}' ");
다만 이 기능은 반드시 관리자만 실행되도록 막아야 합니다. 일반 회원이 날짜를 바꿀 수 있으면 게시판 정렬이나 운영 기록이 꼬일 수 있습니다.
파일을 올렸는데 한글이 깨지거나 코드가 화면에 그대로 보이면 보통 두 가지를 확인하면 됩니다.
1. 파일 저장 인코딩을 UTF-8로 저장했는지
2. 파일이 <?php 로 시작하고 실제 PHP 파일로 저장됐는지
관리자 화면에서 날짜를 직접 선택해서 바꾸고 싶다면 별도 관리자용 페이지를 만들어 wr_id, bo_table, 변경할 날짜를 받아 update 하는 방식으로 구현하는 게 깔끔합니다.
답변에 대한 댓글 2개
2026-07-21 (화) 13:15:31
죄송합니다. 그누보드5 를 학습한 AI 의 답변입니다.
답변주신것 기반으로 좀더 답변 품질을 높히는데 사용하도록 하겠습니다. (좋은 피드백을 다시 학습에 사용하게 됩니다.)
답변주신것 기반으로 좀더 답변 품질을 높히는데 사용하도록 하겠습니다. (좋은 피드백을 다시 학습에 사용하게 됩니다.)
2026-06-30 (화) 22:47:46
2026-06-30 (화) 13:11:29
답변에 대한 댓글 2개
2026-07-21 (화) 11:08:14
댓글 감사 합니다.
https://sir.kr/boards/g5_tip/24853
팁 자료실에 올려놓았으니 참고하시기 바랍니다.
팁 자료실에 올려놓았으니 참고하시기 바랍니다.
답변에 대한 댓글 1개
2026-06-29 (월) 17:15:20
디비툴 사용이 가능하다면..
sqlyog나 phpMyAdmin 으로 게시판 테이블의 게시글 로우에서 wr_datetime 만 변경해도 됩니다
답변에 대한 댓글 1개
답변을 작성하려면 로그인이 필요합니다.
답변 감사합니다.
말씀 해주신것처럼 해 보았는데 깨져서 보이는데 무엇이 문제일까요?