LION MEDIAテーマのパンくずdata-vocabulary.orgサポート終了問題を解決【対処方法】

ライオンのアイキャッチ画像
『 data-vocabulary.org スキーマのサポートは終了します 』ってなんだよォ。

私、いくつかのサイト・ブログでWordPressテーマのLION MEDIAを使っているのですが。

LION MEDIAを使っているサイト、Google SearchConsole(通称サチコ)でパンくずに『 data-vocabulary.org スキーマのサポートは終了します 』と警告が出るようになったんですよ。

テーマのカスタマイズで対応できたので、対処方法を解説。LION MEDIAをお使いのあなたも、SEO対策の一環として対応しておくことをオススメします。

data-vocabulary.org スキーマのサポートは終了しますってなに?

data-vocabulary.org スキーマのサポートは終了しますとの警告
SearchConsoleで警告が出ている。

SearchConsole、通称サチコで『 data-vocabulary.org スキーマのサポートは終了します 』警告が出た原因は、構造化マークアップのサポート問題

もともとGoogleはBing / Yahoo!とともに策定したschema.orgを推進していますが、同時に一般的だったdata-vocabulary.org形式での構造化マークアップにも対応していました。

で、ついにdata-vocabulary.org形式での構造化マークアップはサポートを終了し、今後はschema.orgにしてね、ってこと。

現状では警告でも一応有効な状況ですが、2020年4月6日でサポート終了なので以降はエラーになるのでしょう。

エラーではパンくずGoogle検索画面のリッチリザルトに表示されなくなり、アクセス減のリスクがあります。っていうか多分減ると思う。

構造化マークアップって?

構造化マークアップとは、要約すればGoogle、Yahoo!、Bingなど検索エンジンのクローラー・robotがサイト上のデータを認識しやすいよう「 こういう風にコーディングするといいですよ~ 」と決めた書き方。

人間はデザインを視覚的に見て「 これはパンくず 」といったことがわかりますが、検索エンジンのクローラー・roborはそれがパンくずとして使われているのか目次なのか本文中の箇条書きリストなのか判断がつきません。

クローラー・robotでもわかるよう、「 これは○○ですよ 」と目印をつけてあげているわけです。

で、Googleとしては一般的だったdata-vocabulary.orgもサポートしてきたのですが、今後は自身が推進するschema.orgに絞りたいのでサポート終了にする、ってわけですね。

ちなみに構造化マークアップをしても基本的にサイト上の表示自体は変わらないため、逆に人間にはわからなかったりする。

表示上は無駄なソースが増える点ではデメリットといえますが、言ってもただのコードが増えるだけなので、容量的にいえばサイトの表示速度に関わるほどでもありません。

反面きちんと構造化マークアップをすると、リッチリザルトといってGoogleの検索画面にわかりやすく表示され、アクセスが増える要因にもなります。圧倒的なメリットがあってデメリットは微弱なので、きちにんと対応した方が吉です。

対処方法

schema.orgロゴ
schema.orgに対応させましょう。

data-vocabulary.orgがダメならschema.orgを使えばいいじゃない。

LION MEDIAテーマ パンくず部分の吐き出し形式を変えます。

といってもやることは簡単で、LION MEDIA親テーマの5389行目~5533行目までの記述を上書きする形でコピペするだけ。

ただ、子テーマではなくLION MEDIA親テーマのfunction.phpをカスタマイズする必要があります。

function.phpはWordPressサイト・テーマの根幹となるファイルで、ミスするとサイトに入れなくなるなどの不具合も起こりえます。

最悪LION MEDIA親テーマをインストールし直るかとは思いますが、すでにLION MEDIA親テーマのfunction.phpをカスタマイズしている方は無理でしょうから。

特にカスタマイズしていない方も念のためfunction.phpのバックアップをとってから作業されることをオススメします。

下記がスタートの5389行目とラストの5533行目付近がなのでそれぞれ目印にしてください。

もちろん行数はデフォルトの場合を想定しているので、すでにLION MEDIA親テーマのfunction.phpをカスタマイズしている方は行数がズレるかも。よく見て同じ記述を見つけてください。

//////////////////////////////////////////////////
//オリジナルパンくずリストを作成
//////////////////////////////////////////////////
function fit_breadcrumb( $args = array() ){


〜〜〜(↑スタート)(中略)(↓ラスト)〜〜〜


            $str.='</ol>';
            $str.='</div>';
            $str.='</div>';
        }
    echo $str;

下記がschema.org形式の構造化マークアップ対応済みのコード。実際には一部の行を書き換えただけですが、改変箇所が飛び飛びなのでひとつのコードにまとめました。

コード自体が結構長めです。コピペするときご注意ください。右上にCopyボタンが出るので、そちらご利用いただければ。

//////////////////////////////////////////////////
//オリジナルパンくずリストを作成
//////////////////////////////////////////////////
function fit_breadcrumb( $args = array() ){
    global $post;
    $str ='';
    $defaults = array(
        'class' => "breadcrumb",
        'home' => "HOME",
        'search' => "の検索結果 ",
        'tag' => "",
        'author' => "",
        'notfound' => "Hello! My Name Is 404",
    );

    $args = wp_parse_args( $args, $defaults );
    extract( $args, EXTR_SKIP );

        if( !is_home() && !is_admin() ){
            $str.= '<div class="'. $class .'" >';
            $str.= '<div class="container" >';
            $str.= '<ol class="breadcrumb__list" itemscope itemtype="http://schema.org/BreadcrumbList">';
            $str.= '<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. home_url() .'/" itemprop="item"><span class="icon-home" itemprop="name">'. $home .'</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
            $my_taxonomy = get_query_var( 'taxonomy' );
            $cpt = get_query_var( 'post_type' );

        if( $my_taxonomy && is_tax( $my_taxonomy ) ) {
            $my_tax = get_queried_object();
            $post_types = get_taxonomy( $my_taxonomy )->object_type;
            $cpt = $post_types[0];
            $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="' .get_post_type_archive_link( $cpt ).'" itemprop="item"><span itemprop="name">'. get_post_type_object( $cpt )->label.'</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';

        if( $my_tax -> parent != 0 ) {
            $ancestors = array_reverse( get_ancestors( $my_tax -> term_id, $my_tax->taxonomy ) );

            foreach( $ancestors as $ancestor ){
                $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_term_link( $ancestor, $my_tax->taxonomy ) .'" itemprop="item"><span itemprop="name">'. get_term( $ancestor, $my_tax->taxonomy )->name .'</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
            }
        }
            $str.='<li class="breadcrumb__item">'. $my_tax -> name . '</li>';
        }

        elseif( is_category() ) {
            $cat = get_queried_object();
            if( $cat -> parent != 0 ){
                $ancestors = array_reverse( get_ancestors( $cat -> cat_ID, 'category' ));
                foreach( $ancestors as $ancestor ){
                    $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_category_link( $ancestor ) .'" itemprop="item"><span itemprop="name">'. get_cat_name( $ancestor ) .'</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
                }
            }
            $str.='<li class="breadcrumb__item">'. $cat -> name . '</li>';
        }

        elseif( is_post_type_archive() ) {
            $cpt = get_query_var( 'post_type' );
            $str.='<li class="breadcrumb__item">'. get_post_type_object( $cpt )->label . '</li>';
        }

        elseif( $cpt && is_singular( $cpt ) ){
            $taxes = get_object_taxonomies( $cpt );
            $mytax = $taxes[0];
            $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="' .get_post_type_archive_link( $cpt ).'" itemprop="item"><span itemprop="name">'. get_post_type_object( $cpt )->label.'</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
            $taxes = get_the_terms( $post->ID, $mytax );
            $tax = get_youngest_tax( $taxes, $mytax );

        if( $tax -> parent != 0 ){
            $ancestors = array_reverse( get_ancestors( $tax -> term_id, $mytax ) );
            foreach( $ancestors as $ancestor ){
                $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_term_link( $ancestor, $mytax ).'" itemprop="item"><span itemprop="name">'. get_term( $ancestor, $mytax )->name . '</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
            }
        }
            $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_term_link( $tax, $mytax ).'" itemprop="item"><span itemprop="name">'. $tax -> name . '</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
            $str.= '<li class="breadcrumb__item">'. $post -> post_title .'</li>';
        }

        elseif( is_single() ){
            $categories = get_the_category( $post->ID );
            $cat = get_youngest_cat( $categories );
            if( $cat -> parent != 0 ){
                $ancestors = array_reverse( get_ancestors( $cat -> cat_ID, 'category' ) );
            foreach( $ancestors as $ancestor ){
                $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_category_link( $ancestor ).'" itemprop="item"><span itemprop="name">'. get_cat_name( $ancestor ). '</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
            }
        }
            $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_category_link( $cat -> term_id ). '" itemprop="item"><span itemprop="name">'. $cat-> cat_name . '</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
            $str.= '<li class="breadcrumb__item">'. $post -> post_title .'</li>';
        }

        elseif( is_page() ){
            if( $post -> post_parent != 0 ){
                $ancestors = array_reverse( get_post_ancestors( $post->ID ) );
                foreach( $ancestors as $ancestor ){
                    $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_permalink( $ancestor ).'" itemprop="item"><span itemprop="name">'. get_the_title( $ancestor ) .'</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
                }
            }
            $str.= '<li class="breadcrumb__item">'. $post -> post_title .'</li>';
        }

        elseif( is_date() ){
            if( get_query_var( 'day' ) != 0){
                $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_year_link(get_query_var('year')). '" itemprop="item"><span itemprop="name">' . get_query_var( 'year' ). '年</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
                $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_month_link(get_query_var( 'year' ), get_query_var( 'monthnum' ) ). '" itemprop="item"><span itemprop="name">'. get_query_var( 'monthnum' ) .'月</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
                $str.='<li class="breadcrumb__item">'. get_query_var('day'). '日</li>';
        }

        elseif( get_query_var('monthnum' ) != 0){
            $str.='<li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_year_link( get_query_var('year') ) .'" itemprop="item"><span itemprop="name">'. get_query_var( 'year' ) .'年</span><meta itemprop="position" content="'. ++$position .'" /></a></li>';
            $str.='<li class="breadcrumb__item">'. get_query_var( 'monthnum' ). '月</li>';
        }

        else {
            $str.='<li class="breadcrumb__item">'. get_query_var( 'year' ) .'年</li>';
        }
        }

        elseif( is_search() ) {
            $str.='<li class="breadcrumb__item">「'. get_search_query() .'」'. $search .'</li>';
        }

        elseif( is_author() ){
            $str .='<li class="breadcrumb__item">'. $author . get_the_author_meta('display_name', get_query_var( 'author' )).'</li>';
        }

        elseif( is_tag() ){
            $str.='<li class="breadcrumb__item">'. $tag . single_tag_title( '' , false ). '</li>';
        }

        elseif( is_attachment() ){
            $str.= '<li class="breadcrumb__item">'. $post -> post_title .'</li>';
        }

        elseif( is_404() ){
            $str.='<li class="breadcrumb__item">'.$notfound.'</li>';
        }

        else{
            $str.='<li class="breadcrumb__item">'. wp_title( '', true ) .'</li>';
        }

            $str.='</ol>';
            $str.='</div>';
            $str.='</div>';
        }
    echo $str;
}

もともとのコードと同じ行数なので、コピペで上書きすれば同じく5389行目~5533行に納まるはずです。

もちろん、ほかでfunction.phpをカスタマイズしている方は行数は変わっているので、よく見て見つけてください。

SearchConsoleで検証開始 → 数日ほどかかるっぽい

SearchConsoleで修正を検証
終わったらSearchConsoleで検証。

function.phpを書き換えたらSearchConsoleで検証を開始を押し、警告が解消されていくか確認。

これで警告の数が減って有効の数が増えるはずです。

パンくずの警告が徐々に減り有効になっていく
パンくずの警告が減って有効が増えてきた。

実際の反映までは数日はかかるので気長に待つべし。

私の場合2日経ったぐらいから少しずつ警告から有効に移っていきました。

SearchConsoleでURL検査(旧Fetch as Google)にかけると反映が早まるって噂もあるので、反映遅さが気になる方は全ページをURL検査かけてもいいかも。

まとめ:LION MEDIAテーマのパンくずdata-vocabulary.orgサポート終了問題を解決

LION MEDIA、本当は『 LION MEDIAの機能・特徴まとめ 』にパンくずリストと投稿記事は構造化データを用いたマークアップ済み(schema.org)って書いてあるんだけどな……

できればLION MEDIAのテーマ作者さんがアップデートしてくれるのを期待したかったけど、もう随分前から更新されていないんですよね。無料テーマの限界ですね。

LION MEDIAがベースになったらしき有料テーマTHORがあるので、そちらならあるいは普通に対応しているかもですが……

本記事は姉妹サイトのブログブログより移植したコンテンツです。