데브포일 홈
WordPress 자동화
Guest
STAGE 17 · Lv.88

테크니컬 SEO 자동 감사

깨진 링크 감지, 리다이렉트 체인 알림, 크롤 에러 모니터링, Core Web Vitals 추적, 자동 수정 시스템을 구축합니다.

테크니컬 SEO 자동 감사의 중요성

기술적 SEO가 순위에 미치는 영향

아무리 좋은 콘텐츠와 백링크를 가지고 있어도, 기술적 SEO 문제가 있으면 검색엔진이 사이트를 효과적으로 크롤링하고 인덱싱할 수 없습니다. 테크니컬 SEO는 사이트의 기술적 기반을 건강하게 유지하여, 콘텐츠와 백링크의 SEO 효과가 100% 발휘될 수 있도록 합니다.


주요 테크니컬 SEO 이슈:


1. 깨진 링크 (404 에러): 사용자 경험을 해치고 크롤링 예산을 낭비합니다.

2. 리다이렉트 체인: 여러 번의 리다이렉트는 페이지 로딩 속도를 저하시킵니다.

3. 중복 콘텐츠: 같은 내용의 여러 URL은 SEO 가치를 분산시킵니다.

4. 느린 로딩 속도: Core Web Vitals는 Google 순위 요소입니다.

5. 모바일 호환성: Mobile-First Indexing 시대에 필수입니다.

6. 보안 문제: HTTPS가 아닌 페이지는 순위 불이익을 받습니다.

🔗
404
깨진 링크
자동 감지
🔄
301
리다이렉트 체인
자동 감시
CWV
Core Web Vitals
자동 추적
🛡️
SSL
보안/인증서
모니터링

깨진 링크 자동 감지 시스템

// 깨진 링크 종합 스캐너
class Broken_Link_Scanner {
    private $results = array();
    private $checked_urls = array();
    private $batch_size = 20;

    public function full_scan() {
        global $wpdb;

        $posts = $wpdb->get_results(
            "SELECT ID, post_content, post_title
             FROM {$wpdb->posts}
             WHERE post_status = 'publish'
             AND post_type IN ('post', 'page', 'product')"
        );

        foreach ($posts as $post) {
            $this->scan_post($post);
        }

        // 결과 저장
        update_option('broken_link_scan_results', $this->results);
        update_option('broken_link_scan_date', current_time('mysql'));

        return $this->results;
    }

    private function scan_post($post) {
        // 모든 링크 추출
        preg_match_all('/href=["\']([^"\']+)["\']/i', $post->post_content, $matches);

        foreach ($matches[1] as $url) {
            // 상대 URL을 절대 URL로 변환
            if (strpos($url, '/') === 0) {
                $url = home_url($url);
            }

            // 이미 체크한 URL 스킵
            if (isset($this->checked_urls[$url])) {
                if ($this->checked_urls[$url] !== 200) {
                    $this->add_result($post, $url, $this->checked_urls[$url]);
                }
                continue;
            }

            // HTTP 상태 코드 확인
            $status = $this->check_url($url);
            $this->checked_urls[$url] = $status;

            if ($status !== 200 && $status !== 301 && $status !== 302) {
                $this->add_result($post, $url, $status);
            }
        }
    }

    private function check_url($url) {
        $response = wp_remote_head($url, array(
            'timeout' => 10,
            'redirection' => 0,
            'sslverify' => false,
        ));

        if (is_wp_error($response)) return 0;
        return wp_remote_retrieve_response_code($response);
    }

    private function add_result($post, $url, $status) {
        $this->results[] = array(
            'post_id' => $post->ID,
            'post_title' => $post->post_title,
            'post_url' => get_permalink($post->ID),
            'broken_url' => $url,
            'status_code' => $status,
            'type' => $this->classify_error($status),
        );
    }

    private function classify_error($status) {
        if ($status === 0) return 'connection_failed';
        if ($status === 403) return 'forbidden';
        if ($status === 404) return 'not_found';
        if ($status >= 500) return 'server_error';
        return 'other_error';
    }
}

깨진 링크 자동 수정

깨진 링크를 감지한 후 자동으로 수정하는 시스템을 구축합니다. 404 URL에 대해 Wayback Machine이나 유사 페이지를 자동으로 찾아 대체 링크를 제안하거나, 자동 수정을 적용합니다.

// 깨진 링크 자동 수정 시스템
function auto_fix_broken_links($scan_results) {
    $fixed = 0;
    $suggestions = array();

    foreach ($scan_results as $result) {
        if ($result['status_code'] !== 404) continue;

        $broken_url = $result['broken_url'];
        $post_id = $result['post_id'];

        // 1. 내부 링크인 경우: 리다이렉트 맵에서 대체 URL 찾기
        if (strpos($broken_url, home_url()) === 0) {
            $redirect_url = find_redirect_for_url($broken_url);
            if ($redirect_url) {
                replace_url_in_post($post_id, $broken_url, $redirect_url);
                $fixed++;
                continue;
            }

            // 유사한 slug의 페이지 찾기
            $path = parse_url($broken_url, PHP_URL_PATH);
            $slug = basename(rtrim($path, '/'));
            $similar = find_similar_post($slug);
            if ($similar) {
                $suggestions[] = array(
                    'post_id' => $post_id,
                    'broken_url' => $broken_url,
                    'suggested_url' => get_permalink($similar->ID),
                    'suggested_title' => $similar->post_title,
                    'confidence' => 'high',
                );
            }
        }

        // 2. 외부 링크인 경우: 제거 또는 Wayback Machine 링크로 대체
        else {
            $wayback_url = "https://web.archive.org/web/" . $broken_url;
            $suggestions[] = array(
                'post_id' => $post_id,
                'broken_url' => $broken_url,
                'suggested_url' => $wayback_url,
                'suggested_title' => 'Wayback Machine 아카이브',
                'confidence' => 'low',
            );
        }
    }

    return array('fixed' => $fixed, 'suggestions' => $suggestions);
}

function replace_url_in_post($post_id, $old_url, $new_url) {
    $content = get_post_field('post_content', $post_id);
    $content = str_replace($old_url, $new_url, $content);
    wp_update_post(array('ID' => $post_id, 'post_content' => $content));
}
🔒
여기까지는 미리보기입니다
테크니컬 SEO 자동 감사
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)