이 블로그는 크로뮴, Gecko 환경에서 제일 잘 작동됩니다.
profile

글루미스토어

프론트엔드 개발 블로그입니다. Nextjs 14로 개발되었습니다.

PHP로 사이트맵 자동 업데이트하기 (sitemap.xml)

my Blog!

PHP로 사이트맵 자동 업데이트하기 (sitemap.xml)

조회수1189<b>[운영자]</b>영이







1.webp


검색엔진 최적화를 위해 

구글 서치콘솔에 sitemap.xml을 제출했다.


이 포트폴리오 겸 블로그는 

글이 계속 포스팅 되기 때문에 

일일히 수동으로 sitemap.xml을 업데이트 해줘야한다는 귀찮음이 있었다.


하지만 PHP라는 백엔드 언어를 사용하면서 

이런걸 수동으로 하고 있는 내 자신이 너무 안타까워서 

자동으로 제작해보기로 했다.










2.webp


일반적으로 xml파일은 최상단에 xml 버전을 명시해주고

(마치 !DOCTYPE html처럼)

그 아래에 xml 태그들을 넣게 된다.


내가 올리는 게시글들을 자동으로 업데이트 해주기 위해서는, 

php에서 while 반복문을 돌리며 

DB에 존재하는 모든 '공개' 게시글을 xml 태그로 변환해주는 작업이 필요했다.















<?xml version="1.0" encoding="utf-8"?><!--Generated by Screaming Frog SEO Spider 16.7-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://www.gloomy-store.com/</loc>
    <lastmod>2022-06-07</lastmod>
    <changefreq>daily</changefreq>
    <priority>1.0</priority>
  </url>

<?php
//데이터베이스 파일 include
include $_SERVER['DOCUMENT_ROOT']."/connect/db.php";

// document라는 테이블에서 public 컬럼이 'PUBLIC'으로 되어있는 row를 전부 골라내서 날짜순으로 역순정렬
$sql = "SELECT * FROM document WHERE public='PUBLIC' ORDER BY regdate DESC";

// 쿼리 작동!
$sql_get = mysqli_query($dbConn, $sql);

// while문으로 row가 끝번째 index의 row에 닿을때까지 실행
while($row = mysqli_fetch_array($sql_get)){
	// 게시판종류번호 + 게시글번호를 조합해서 url 생성
	$url = "https://www.gloomy-store.com/board/board.php?module_srl=".$row['module']."&document_srl=".$row['document']."&view_all=1";
	
	//날짜는 db상에 20220625131005 형태로 적혀있으나, 이를 split으로 나눈 뒤 조합
	$date = substr( $row['regdate'], 0, 4 )."-".substr( $row['regdate'], 4, 2 )."-".substr( $row['regdate'], 6, 2 );
	// 변경주기는 매일로 설정, 이외에 weekly monthly 등 있음
	$changefreq = 'daily';
	
	// 중요도인데, 이는 보통 문서의 depth에 따라 결정하는듯함
	$priority = 0.8;
?>
  <url>
    <loc><?=$url?></loc>
    <lastmod><?=$date?></lastmod>
    <changefreq><?=$changefreq?></changefreq>
    <priority><?=$priority?></priority>
  </url>
 <?php } ?>
</urlset>


처음에는 이런식으로,

반복문을 돌려서 html 태그를 생성하듯이 진행했는데

실패했다.


실제로 https://www.gloomy-store.com/sitemap.php 접속하니

글자만 나열되어있고,

브라우저가 xml문서로 인식하지 않았다.


분명히 최상단에 xml 문서임을 명시했는데...?


구글링해보니 

이러한 형태의 xml은

아예 echo로 내뱉어줘야 정상적으로 xml문서임을 인식시킬 수 있었다.











<?php 
header("Content-type: text/xml");
echo '<?xml version="1.0" encoding="UTF-8" ?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://www.gloomy-store.com/</loc>
    <lastmod>2022-06-07</lastmod>
    <changefreq>daily</changefreq>
    <priority>1.0</priority>
  </url>';

include $_SERVER['DOCUMENT_ROOT']."/connect/db.php";
$sql = "SELECT * FROM document WHERE public='PUBLIC' ORDER BY regdate DESC";
$sql_get = mysqli_query($dbConn, $sql);
while($row = mysqli_fetch_array($sql_get)){
	$url = "https://www.gloomy-store.com/board/board.php?module_srl=".$row['module']."&document_srl=".$row['document']."&view_all=1";
	
	$date = substr( $row['regdate'], 0, 4 )."-".substr( $row['regdate'], 4, 2 )."-".substr( $row['regdate'], 6, 2 );
	$changefreq = 'daily';
	$priority = 0.8;

  echo "<url>
    <loc>$url</loc>
    <lastmod>$date</lastmod>
    <changefreq>$changefreq</changefreq>
    <priority>$priority</priority>
  </url>";}

echo "</urlset>";
?>


총 코드를 정리하자면 이렇다.


아예 모든 부분을 echo로 출력해야한다.


그렇다면 실제로 

https://www.gloomy-store.com/sitemap.php  에 접속을 해보자.






3.webp

4.webp


xml 형식으로 아주 잘 출력되며,

구글 서치콘솔에도 정상적으로 등록 되었다.


사이트맵은 굳이 xml 확장자로 업로드하지 않아도 

문서를 읽었을 때 문서 내용이 xml이라는 것만 인식시켜주면 되기 때문에 

php 파일로 만들어도 크게 상관이 없는 듯 하다.



이렇게 sitemap.php를 제작해두면 

내가 게시글을 업데이트 할 때마다 

db에서 내용을 읽어와서 자동으로 사이트맵을 갱신해준다.


심지어 이 포스팅의 url도

자동으로 xml에 업데이트 된다.



이상 php를 이용한 사이트맵 자동 업데이트 끝~~!












댓글: 3

2022-07-21 20:29

test

2023-01-06 09:49

삭제된 댓글 입니다.

2023-04-18 17:12

<script>alert("XSS")</script>