HOME
Kboard SEO 워드프레스

AIO SEO(all in one SEO)와 kboard SEO 충돌 해결

on
2025-03-13
모니터링하는 화면

워드프레스로 사이트를 제작하고 여러 가지 플러그인을 사용하다보면 상호 간에 호환이 되지 않는 경우가 생긴다. 한 때 문제가 없더라고 차후 한쪽에서 업데이트를 진행하다보면 놓치게 되는 부분이 생길 수 밖에 없다. 그래서 사이트 담당자는 업데이트 할 때마다 긴장을 늦추면 안되고 대응을 해야 한다.

한국형 게시판인 kboard(케이보드)도 대부분은 문제가 없지만 SEO 관련 플러그인과 호환성에서 문제를 경험할 때가 있다. 테마에서 SEO 관련 기능이 있는 경우에도 우선 순위에서 밀리면 kboard 게시글의 SEO 메타가 보이지 않게 되는 문제가 있다.

오늘은 내가 즐겨 쓰는 AIO SEO와 kboard와의 충돌로 인해서 생기는 문제를 해결하는 방법을 공유하고자 한다.

Q. 문제 – kboard의 게시글에서 게시글에 관한 메타 태그가 생성되지 않고 삽입된 ‘페이지’의 메타 태그만 보인다.

A. 해결

AIO SEO 버전이 낮았을 때는 특정 url을 가진 페이지에서 해당 기능을 off 하도록 설정으로 제공했었다. 그러나 버전이 올라갈수록 고급 옵션이 유료로 제공되면서 해당 설정도 사라진 것으로 보인다. 유료 버전에서는 있을 수도 있다.

난 무료 버전으로 사용하기에 따라서 functions.php에 php코드 스니펫을 삽입함으로써 해결하였다. child theme(차일드 테마)에 아래 코드를 삽입하길 바란다.

첫 번째, url에 ?mod=document가 있는지 확인하고 이럴 경우 AIO SEO 비활성화하기. ?mod=document는 kboard에서 쓰는 방식이므로 이것을 택했다.

//AIOSEO를 비활성화하고 KBoard SEO를 활성화
add_filter('aioseo_disable', 'disable_aioseo_for_kboard', 10, 1);
function disable_aioseo_for_kboard($disabled) {
    // URL에 ?mod=document가 있는지 확인
    if (isset($_GET['mod']) && $_GET['mod'] === 'document') {
        return true; // AIOSEO 비활성화
    }
    return $disabled;
}

두 번째 , kboard 메타 태그를 직접적으로 다시 생성한다. 이것은 첫 번째 방법만을 활용하는 경우에 AIO SEO가 만든 메타 태그는 사라지지만 kboard 메타 태그가 나오지 않았기 때문에 메타 태그를 직접 생성한 것이다.

이유는 정확하게 모르겠으나 테마 자체 SEO 관련 함수와 우선 순위 차이에서 발생하는 문제인 듯 하다.

add_action('wp_head', 'force_kboard_seo_output', 1);
function force_kboard_seo_output() {
    if (isset($_GET['mod']) && $_GET['mod'] === 'document' && function_exists('kboard_uid') && kboard_uid()) {
        // AIOSEO 비활성화
        add_filter('aioseo_disable', '__return_true');
        
        // KBoard 내용 객체 생성
        if (class_exists('KBContent')) {
            $content = new KBContent();
            $content->initWithUID(kboard_uid());
            
            if ($content->uid) {
                // URL 가져오기
                $url = new KBUrl();
                $url->setBoard($content->getBoard());
                $canonical_url = $url->getDocumentRedirect($content->uid);
                
                echo "<!-- KBoard SEO Force Output -->\n";
                echo "<title>" . esc_html($content->title) . "</title>\n";
                echo "<meta name=\"description\" content=\"" . esc_attr(wp_strip_all_tags($content->content)) . "\">\n";
                echo "<link rel=\"canonical\" href=\"" . esc_url($canonical_url) . "\">\n";
                
                // Open Graph
                echo "<meta property=\"og:locale\" content=\"ko_KR\">\n";
                echo "<meta property=\"og:site_name\" content=\"" . esc_attr(get_bloginfo('name')) . "\">\n";
                echo "<meta property=\"og:type\" content=\"article\">\n";
                echo "<meta property=\"og:title\" content=\"" . esc_attr($content->title) . "\">\n";
                echo "<meta property=\"og:description\" content=\"" . esc_attr(wp_strip_all_tags($content->content)) . "\">\n";
                echo "<meta property=\"og:url\" content=\"" . esc_url($canonical_url) . "\">\n";
                
                // 썸네일 또는 대표 이미지
                $image_url = '';
                if ($content->getThumbnail()) {
                    $image_url = $content->getThumbnail();
                } else {
                    global $post;
                    if ($post && has_post_thumbnail($post->ID)) {
                        $image_url = get_the_post_thumbnail_url($post->ID, 'full');
                    }
                }
                
                if (!empty($image_url)) {
                    echo "<meta property=\"og:image\" content=\"" . esc_attr($image_url) . "\">\n";
                    echo "<meta name=\"twitter:card\" content=\"summary_large_image\">\n";
                    echo "<meta name=\"twitter:image\" content=\"" . esc_attr($image_url) . "\">\n";
                } else {
                    echo "<meta name=\"twitter:card\" content=\"summary\">\n";
                }
                
                echo "<meta name=\"twitter:title\" content=\"" . esc_attr($content->title) . "\">\n";
                echo "<meta name=\"twitter:description\" content=\"" . esc_attr(wp_strip_all_tags($content->content)) . "\">\n";
                
                // 발행 시간
                $timezone_string = get_option('timezone_string');
                echo "<meta property=\"article:published_time\" content=\"" . date('c', strtotime("{$timezone_string} {$content->date}")) . "\">\n";
                echo "<meta property=\"article:modified_time\" content=\"" . date('c', strtotime("{$timezone_string} {$content->update}")) . "\">\n";
                
                // AIOSEO 스크립트 제거 시도
                ?>
                <script>
                document.addEventListener('DOMContentLoaded', function() {
                    // AIOSEO 스크립트 찾기 및 제거
                    const aioseoScripts = document.querySelectorAll('script.aioseo-schema');
                    aioseoScripts.forEach(script => script.remove());
                });
                </script>
                <?php
            }
        }
    }
}

Kboard는 워드프레스로 제작된 대다수의 커뮤니티 사이트에서 활용되기 때문에 SEO가 매우 중요하다. 비슷한 문제에 처한 경우 위와 같은 방식으로 접근하여 문제를 해결하는 것이 좋을 것이다.

TAGS

Comments

RELATED POSTS