꿈을 바구니에 담아 간직하다 보면!!

지금 참 힘들죠? 근데 내일은 지금보다 덜 힘들거예요

힘든 건 오늘만이 아니다. 내일도, 그리고 그 다음 날도 계속될 것이다.

PHP Tip

sitemap.xml 자동 만들기

duaidot 2025. 12. 14. 03:08

<?php
// 공통 설정 파일 불러오기 (DB 연결, 상수 정의 등)
include_once(dirname(__FILE__). "/_common.php");

// 사이트 기본 URL
$SITE_URL = G5_URL;

// sitemap에 포함할 정적 경로 배열
$staticPaths = ['/', '/bbs/board.php', '/bbs/faq.php'];

// 현재 시간 (ISO 8601 형식)
$now = date('c');

// XML 헤더 및 캐시 설정
header('Content-type: text/xml; charset=utf-8');
header('Cache-Control: public, max-age=3600');
header('Pragma: public');

// XML 시작 부분 작성
$xml_code  = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
$xml_code .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;

// ----------------------
// 1. 정적 경로 추가
// ----------------------
foreach ($staticPaths as $path) {
    // 루트('/')는 우선순위 1.0, 나머지는 0.7
    $priority = ($path === '/') ? '1.0' : '0.7';

    // 각 URL 태그 작성
    $xml_code .= "  <url>" . PHP_EOL;
    $xml_code .= "    <loc>" . htmlspecialchars($SITE_URL . $path) . "</loc>" . PHP_EOL;
    $xml_code .= "    <lastmod>{$now}</lastmod>" . PHP_EOL;
    $xml_code .= "    <changefreq>daily</changefreq>" . PHP_EOL;
    $xml_code .= "    <priority>{$priority}</priority>" . PHP_EOL;
    $xml_code .= "  </url>" . PHP_EOL;
}

// ----------------------
// 2. 게시판 목록 추가
// ----------------------
$sql = "SELECT bo_table FROM {$g5['board_table']}";
$result = sql_query($sql);
while ($board = sql_fetch_array($result)) {
    $xml_code .= "  <url>" . PHP_EOL;
    $xml_code .= "    <loc>" . htmlspecialchars($SITE_URL . '/bbs/board.php?bo_table=' . $board['bo_table']) . "</loc>" . PHP_EOL;
    $xml_code .= "    <lastmod>{$now}</lastmod>" . PHP_EOL;
    $xml_code .= "    <changefreq>daily</changefreq>" . PHP_EOL;
    $xml_code .= "    <priority>0.8</priority>" . PHP_EOL;
    $xml_code .= "  </url>" . PHP_EOL;
}

// ----------------------
// 3. 게시글 추가 (최근 5000개)
// ----------------------
$sql = "SELECT bo_table FROM {$g5['board_table']}";
$result = sql_query($sql);
while ($board = sql_fetch_array($result)) {
    $bo_table = $board['bo_table'];
    $write_table = $g5['write_prefix'] . $bo_table;

    // 게시판 테이블 존재 여부 확인
    $table_check = sql_query("SHOW TABLES LIKE '{$write_table}'", false);
    if (!sql_num_rows($table_check)) continue;

    // 최근 게시글 5000개 가져오기 (댓글 제외)
    $post_sql = "SELECT wr_id, wr_datetime 
                 FROM {$write_table} 
                 WHERE wr_is_comment = 0 
                 ORDER BY wr_datetime DESC 
                 LIMIT 5000";
    $post_result = sql_query($post_sql, false);

    if ($post_result) {
        while ($post = sql_fetch_array($post_result)) {
            // 게시글 작성일을 ISO 8601 형식으로 변환
            $lastMod = $post['wr_datetime'] ? date('c', strtotime($post['wr_datetime'])) : $now;

            // 각 게시글 URL 태그 작성
            $xml_code .= "  <url>" . PHP_EOL;
            $xml_code .= "    <loc>" . htmlspecialchars("{$SITE_URL}/bbs/board.php?bo_table={$bo_table}&wr_id={$post['wr_id']}") . "</loc>" . PHP_EOL;
            $xml_code .= "    <lastmod>{$lastMod}</lastmod>" . PHP_EOL;
            $xml_code .= "    <changefreq>weekly</changefreq>" . PHP_EOL;
            $xml_code .= "    <priority>0.6</priority>" . PHP_EOL;
            $xml_code .= "  </url>" . PHP_EOL;
        }
    }
}

// ----------------------
// 4. 마무리
// ----------------------
$xml_code .= "</urlset>";

// sitemap.xml 파일로 저장
file_put_contents("sitemap.xml", $xml_code);
?>