블로그 목차, 이제 PHP DOM으로 뚝딱! 시간 절약 & 구글 랭킹 UP
블로그 글을 작성하고 발행할 때마다 항상 고민되는 부분이 바로 목차입니다. 목차는 독자가 글의 전체적인 흐름을 빠르게 파악하고 원하는 정보를 쉽게 찾아갈 수 있도록 돕는 중요한 요소죠. 그런데 매번 수동으로 목차를 만드는 건 여간 번거로운 일이 아닐 수 없습니다. 이럴 때 제가 사용하는 PHP DOM 기반의 목차 자동화 함수는 정말 큰 도움이 됩니다. 이 글에서는 Rankablog 에서 사용하는 코드를 바탕으로 목차가 왜 중요한지, 그리고 어떻게 여러분의 블로그에 적용할 수 있는지 알아보겠습니다.
목차
1. 왜 블로그 글에 목차가 필요할까요?
2. 내 PHP DOM 코드로 목차 자동화하기
3. 자주 묻는 질문
왜 블로그 글에 목차가 필요할까요?

목차가 블로그 글에 미치는 긍정적인 영향은 크게 두 가지로 나눌 수 있습니다.
1. 검색 엔진 최적화(SEO)에 미치는 긍정적인 영향
구글과 같은 검색 엔진은 사용자가 정보를 얼마나 쉽게 찾을 수 있는지, 즉 사용자 경험(UX)을 매우 중요하게 생각합니다. 목차는 이 사용자 경험을 향상시키는 핵심 요소 중 하나이며, 이는 곧 SEO에도 긍정적인 영향을 미칩니다.
- 사이트 링크(Sitelinks) 생성 가능성 증가: 구글은 목차를 활용하여 검색 결과에 '사이트 링크'를 표시할 수 있습니다. 이는 사용자가 검색 결과에서 바로 특정 섹션으로 이동할 수 있게 하여 클릭률(CTR)을 높이는 데 기여합니다.
- 콘텐츠 구조 명확화: 목차는 검색 엔진 크롤러에게 글의 구조와 주요 내용을 명확하게 전달합니다.
<h2>,<h3>태그와 같은 제목 태그의 계층 구조가 목차를 통해 더욱 부각되며, 이는 검색 엔진이 글의 주제를 더 잘 이해하는 데 도움을 줍니다. - 키워드 노출: 목차 자체에 주요 키워드가 포함될 수 있어, 관련 검색어에 대한 가시성을 높일 수 있습니다.
2. 사용자 경험(UX) 향상
독자 입장에서 목차는 글을 읽는 경험을 훨씬 편리하고 효율적으로 만들어 줍니다.
- 빠른 정보 탐색: 긴 글에서 원하는 정보를 찾기 위해 전체를 스크롤 할 필요 없이, 목차를 통해 한 번에 해당 섹션으로 이동할 수 있습니다.
- 글의 개요 파악: 글을 읽기 전 목차를 훑어보면서 어떤 내용이 다뤄질지 미리 파악할 수 있어, 독자가 시간을 효율적으로 사용할 수 있습니다.
- 가독성 증진: 잘 정리된 목차는 글이 체계적이라는 인상을 주어, 독자가 글을 더 신뢰하고 끝까지 읽게 만듭니다.
내 PHP DOM 코드로 목차 자동화하기

Rankablog에서 사용중인 PHP DOM 코드는 블로그 글에서 <h2> 태그의 내용을 효과적으로 추출하여 목차를 자동으로 생성하는 데 최적화되어 있습니다. 이 함수는 다음과 같은 과정을 통해 작동합니다.
PHP DOM 목차 생성 함수 분석
<?php
public function getH2Content(string $html) {
// 1. DOMDocument 객체 생성: HTML 문서를 로드하고 파싱하는 데 사용됩니다.
$dom = new DOMDocument();
// 2. HTML 로드: 제공된 HTML 문자열을 DOMDocument에 로드합니다.
// "<meta http-equiv="Content-Type" content="text/html; charset=utf-8">"를 추가하여 인코딩 문제를 방지하고,
// @를 사용하여 HTML 파싱 중 발생할 수 있는 경고를 억제합니다.
@$dom->loadHTML("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">" . $html);
// 3. DOMXPath 객체 생성: DOM 문서 내에서 XPath 쿼리를 실행하여 특정 요소를 찾기 위해 사용됩니다.
$xpath = new DOMXPath($dom);
// 4. 모든 <h2> 태그 선택: XPath 쿼리 '//h2'를 사용하여 문서 내의 모든 <h2> 요소를 선택합니다.
$h2Nodes = $xpath->query('//h2');
$h2Contents = [];
// 5. <h2> 태그의 텍스트 콘텐츠 추출: 선택된 각 <h2> 노드를 반복하면서 그 안의 텍스트 내용을 가져옵니다.
// trim() 함수로 앞뒤 공백을 제거하여 깔끔한 목차 항목을 만듭니다.
foreach ($h2Nodes as $h2) {
$h2Contents[] = trim($h2->textContent);
}
// 6. 추출된 <h2> 내용 반환: 모든 <h2> 제목이 포함된 배열을 반환합니다.
return $h2Contents;
}
?>
이 함수를 사용하면 여러분이 작성한 블로그 글의 HTML을 입력으로 받아, 모든 <h2> 제목을 배열 형태로 반환해줍니다. 이제 이 배열을 가지고 실제 블로그에 목차를 추가하는 과정을 상상해봅시다.
목차 적용 예시
블로그 글에 목차 삽입 시나리오
만약 블로그 포스트의 HTML 내용이 다음과 같다고 가정해봅시다.
<div class="blog-post-content">
<h2><strong>블로그 목차의 중요성</strong></h2>
<p>목차는 독자와 검색 엔진 모두에게 중요합니다.</p>
<h2><strong>PHP DOM으로 목차 자동화</strong></h2>
<p>코드를 통해 목차를 효율적으로 만들 수 있습니다.</p>
<h3>DOMDocument 사용법</h3>
<h2><strong>SEO 효과 극대화</strong></h2>
<p>구글 랭킹에 긍정적 영향을 줍니다.</p>
</div>
여러분의 getH2Content() 함수를 이 HTML에 적용하면 다음과 같은 결과가 반환됩니다.
<?php
$blogContentHtml = '<div class="blog-post-content">...</div>'; // 위 HTML 내용
$h2Titles = getH2Content($blogContentHtml);
print_r($h2Titles);
/* 결과:
Array
(
[0] => 블로그 목차의 중요성
[1] => PHP DOM으로 목차 자동화
[2] => SEO 효과 극대화
)
*/
?>
이제 이 배열을 사용하여 블로그 글 상단에 동적으로 목차를 생성할 수 있습니다. 각 제목을 클릭하면 해당 <h2> 태그로 스크롤 되는 기능을 추가하면 완벽한 목차가 완성됩니다.
목차를 만들 때는
<h2> 태그의 텍스트만 추출하고, 실제 블로그 글 내의 <h2> 태그에는 고유한 id 값을 부여하여 목차에서 해당 id로 바로 이동할 수 있도록 연결(앵커 링크)해주는 작업이 필요합니다. 이는 PHP 코드 내에서 또는 JavaScript를 사용하여 동적으로 처리할 수 있습니다.
자동 목차 생성의 핵심 이점
getH2Content() 함수로 <h2> 제목 추출 후 동적 목차 생성자주 묻는 질문
<h3>나 다른 제목 태그도 목차에 포함할 수 있나요?getH2Content 함수에서 $xpath->query('//h2') 부분을 $xpath->query('//h2|//h3|//h4') 와 같이 수정하면 <h2>, <h3>, <h4> 태그를 모두 가져올 수 있습니다. 이렇게 하면 더 세분화된 목차를 만들 수 있습니다.@$dom->loadHTML()에서 @를 사용하는 이유가 무엇인가요?@는 PHP의 오류 제어 연산자로, 해당 표현식에서 발생하는 경고나 오류 메시지를 화면에 출력하지 않도록 합니다. loadHTML() 함수는 HTML 문서의 문법이 완벽하지 않을 때 경고를 발생시키는 경우가 많아, 이러한 경고가 사용자에게 노출되는 것을 막기 위해 사용됩니다. 하지만 실제 서비스에서는 libxml_use_internal_errors(true)와 libxml_clear_errors()를 사용하여 더 정교하게 오류를 처리하는 것이 권장됩니다.여러분이 만드신 PHP DOM 함수는 시간을 절약하고 블로그의 가치를 높이는 훌륭한 도구입니다. 이 자동화된 목차 생성 기능을 통해 독자들에게 더 나은 경험을 제공하고, 궁극적으로는 검색 엔진에서의 순위 상승에도 기여할 수 있을 겁니다. 혹시 이 외에도 블로그 최적화에 대해 궁금한 점이 있으신가요?
관련글
태그: PHP DOM, 블로그 목차 자동화, SEO, 사용자 경험, DOMDocument, DOMXPath, 웹 최적화, 콘텐츠 전략, PHP 코드 활용, 검색 엔진 순위







