채택완료

게시글의 작성일을 임의로 변경하는 방법?

2026-06-29 (월) 16:06:17 219
게시글이 작성된것을 작성일을 관리자가 원하는 날짜로 변경하려면 어떻게 해야 할까요?
예전 그누보드는 여러 방법으로 관리자페이지에서 수정하기도 하고 게시글 수정버튼 누르고 작성일 변경 하기도 했었는데....
지금은 그누보드5를 사용 중인데 어떻게 해야 할까요?

답변 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); ?>&amp;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) . '&amp;sfl=' . urlencode($sfl) . '&amp;stx=' . urlencode($stx) . '&amp;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개

http://www.kfba.kr/adm/write_datetime_change.php

답변 감사합니다.
말씀 해주신것처럼 해 보았는데 깨져서 보이는데 무엇이 문제일까요?
저장하실때 문자 인코딩을 UTF-8로 저장하세요~
현재 깨진 글자는 인코딩 문제이고, 인코딩해도 코드가 그대로 보이는 것은 <?php 시작 태그 문제입니다.
해결되셨을까요?

답변에 대한 댓글 1개

네. 제가 아는것이 없다보니 어렵게어렵게 해내기는 했네요. 관심 가져 주셔서 감사합니다. ^^
그누보드5 게시글의 작성일은 해당 게시판 글 테이블의 wr_datetime 값입니다. 그래서 원리는 wr_datetime 값을 원하는 날짜로 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개

네 답변 감사합니다. ^^
기술자시군요.
죄송합니다. 그누보드5 를 학습한 AI 의 답변입니다.
답변주신것 기반으로 좀더 답변 품질을 높히는데 사용하도록 하겠습니다. (좋은 피드백을 다시 학습에 사용하게 됩니다.)

답변에 대한 댓글 2개

찾을때는 없더니.... 있었군요... ㅋㅋ ^^
감사합니다.
댓글 감사 합니다.
2026-06-30 (화) 01:13:29
https://sir.kr/boards/g5_tip/24853
팁 자료실에 올려놓았으니 참고하시기 바랍니다.

답변에 대한 댓글 1개

간단한 방법이 있었군요.
감사합니다. ^^

디비툴 사용이 가능하다면..

sqlyog나 phpMyAdmin 으로 게시판 테이블의 게시글 로우에서 wr_datetime 만 변경해도 됩니다

답변에 대한 댓글 1개

답변 감사합니다. ^^

답변을 작성하려면 로그인이 필요합니다.