데브포일 홈
WordPress 자동화
Guest
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 요소
📝
Description
CTR에 직접적
영향을 미침
📊
+30%
리치 스니펫의
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)