STAGE 17 · Lv.85
메타 태그 & 스키마 자동 생성
동적 메타 태그 생성, JSON-LD 스키마 마크업, Article/Product/FAQ/HowTo 스키마, 콘텐츠 기반 자동 생성 시스템을 마스터합니다.
메타 태그와 스키마가 검색 결과를 지배하는 방법
메타 태그의 SEO 영향력
메타 태그(Meta Tags)는 HTML의 <head> 섹션에 위치하며, 검색엔진과 소셜 미디어 플랫폼에 페이지의 정보를 전달합니다. 특히 title 태그와 meta description은 검색 결과 페이지(SERP)에 직접 노출되어 클릭률(CTR)에 결정적인 영향을 미칩니다.
메타 태그 최적화만으로도 CTR을 20-50% 개선할 수 있다는 연구 결과가 있습니다. 페이지 순위가 같더라도 더 매력적인 메타 태그를 가진 결과가 더 많은 클릭을 받으며, 이 클릭률 차이가 다시 순위에 영향을 미치는 선순환 구조를 만듭니다.
스키마 마크업(Schema Markup)은 한 단계 더 나아가, 검색엔진이 페이지 콘텐츠의 의미를 정확히 이해할 수 있도록 구조화된 데이터를 제공합니다. 스키마를 적용하면 검색 결과에 별점, 가격, FAQ, 단계별 가이드 등의 리치 스니펫(Rich Snippet)이 표시되어, 일반 결과보다 훨씬 높은 클릭률을 달성할 수 있습니다.
Title
가장 중요한 온페이지
SEO 요소
SEO 요소
Description
CTR에 직접적
영향을 미침
영향을 미침
+30%
리치 스니펫의
CTR 증가 효과
CTR 증가 효과
Schema
구조화된 데이터로
리치 결과 획득
리치 결과 획득
동적 메타 태그 자동 생성 시스템
WordPress 메타 태그 자동 생성 프레임워크
각 페이지 유형에 맞는 최적의 메타 태그를 자동으로 생성하는 시스템을 구축합니다. 이 시스템은 글 제목, 내용, 카테고리, 이미지 등을 분석하여 SEO에 최적화된 메타 태그를 동적으로 생성합니다.
// 동적 메타 태그 자동 생성 클래스
class Dynamic_Meta_Generator {
public function __construct() {
add_action('wp_head', array($this, 'output_meta_tags'), 1);
// Yoast/Rank Math가 없을 때만 작동
if (!defined('WPSEO_VERSION') && !class_exists('RankMath')) {
add_filter('pre_get_document_title', array($this, 'generate_title'));
}
}
// SEO 최적 타이틀 자동 생성
public function generate_title($title) {
if (is_singular()) {
global $post;
$custom_title = get_post_meta($post->ID, '_seo_title', true);
if ($custom_title) return $custom_title;
$site_name = get_bloginfo('name');
$post_title = get_the_title();
// 60자 제한 내에서 최적화
$max_title_length = 60 - mb_strlen(" | {$site_name}") - 1;
if (mb_strlen($post_title) > $max_title_length) {
$post_title = mb_substr($post_title, 0, $max_title_length - 3) . '...';
}
return "{$post_title} | {$site_name}";
}
if (is_category()) {
$cat = get_queried_object();
return "{$cat->name} 카테고리 글 모음 | " . get_bloginfo('name');
}
return $title;
}
// 메타 태그 출력
public function output_meta_tags() {
if (is_singular()) {
global $post;
$this->singular_meta($post);
} elseif (is_category() || is_tag()) {
$this->taxonomy_meta();
} elseif (is_front_page()) {
$this->home_meta();
}
}
private function singular_meta($post) {
// Meta Description 자동 생성
$description = get_post_meta($post->ID, '_seo_description', true);
if (!$description) {
$description = $this->auto_generate_description($post);
}
$image = get_the_post_thumbnail_url($post->ID, 'large') ?: '';
$author = get_the_author_meta('display_name', $post->post_author);
$published = get_the_date('c', $post);
$modified = get_the_modified_date('c', $post);
// 기본 메타
echo '<meta name="description" content="' . esc_attr($description) . '">' . "\n";
echo '<meta name="author" content="' . esc_attr($author) . '">' . "\n";
// Open Graph (Facebook/카카오톡)
echo '<meta property="og:type" content="article">' . "\n";
echo '<meta property="og:title" content="' . esc_attr(get_the_title($post)) . '">' . "\n";
echo '<meta property="og:description" content="' . esc_attr($description) . '">' . "\n";
echo '<meta property="og:url" content="' . esc_url(get_permalink($post)) . '">' . "\n";
if ($image) {
echo '<meta property="og:image" content="' . esc_url($image) . '">' . "\n";
}
echo '<meta property="article:published_time" content="' . $published . '">' . "\n";
echo '<meta property="article:modified_time" content="' . $modified . '">' . "\n";
// Twitter Card
echo '<meta name="twitter:card" content="summary_large_image">' . "\n";
echo '<meta name="twitter:title" content="' . esc_attr(get_the_title($post)) . '">' . "\n";
echo '<meta name="twitter:description" content="' . esc_attr($description) . '">' . "\n";
if ($image) {
echo '<meta name="twitter:image" content="' . esc_url($image) . '">' . "\n";
}
// Canonical URL
echo '<link rel="canonical" href="' . esc_url(get_permalink($post)) . '">' . "\n";
// Naver 웹마스터 도구용
echo '<meta name="naver-site-verification" content="YOUR_CODE">' . "\n";
}
// 콘텐츠에서 자동 Description 생성
private function auto_generate_description($post) {
$content = strip_tags($post->post_content);
$content = strip_shortcodes($content);
$content = preg_replace('/\s+/', ' ', trim($content));
// 첫 번째 문장 또는 155자
$first_sentence = preg_match('/^(.+?[.!?])\s/', $content, $matches)
? $matches[1] : '';
if ($first_sentence && mb_strlen($first_sentence) = 50) {
return $first_sentence;
}
// 155자로 자르기 (단어 단위)
if (mb_strlen($content) > 155) {
$content = mb_substr($content, 0, 155);
$last_space = mb_strrpos($content, ' ');
if ($last_space !== false) {
$content = mb_substr($content, 0, $last_space);
}
$content .= '...';
}
return $content;
}
private function taxonomy_meta() {
$term = get_queried_object();
$description = $term->description ?: "{$term->name} 관련 글 모음 - " . get_bloginfo('description');
echo '<meta name="description" content="' . esc_attr($description) . '">' . "\n";
echo '<meta property="og:type" content="website">' . "\n";
echo '<meta property="og:title" content="' . esc_attr($term->name) . '">' . "\n";
echo '<meta property="og:description" content="' . esc_attr($description) . '">' . "\n";
}
private function home_meta() {
$description = get_bloginfo('description');
$site_name = get_bloginfo('name');
echo '<meta name="description" content="' . esc_attr($description) . '">' . "\n";
echo '<meta property="og:type" content="website">' . "\n";
echo '<meta property="og:title" content="' . esc_attr($site_name) . '">' . "\n";
echo '<meta property="og:description" content="' . esc_attr($description) . '">' . "\n";
echo '<meta property="og:site_name" content="' . esc_attr($site_name) . '">' . "\n";
}
}
new Dynamic_Meta_Generator();
🔒
여기까지는 미리보기입니다
메타 태그 & 스키마 자동 생성
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.