炭火Blog

[Json-ld]構造化データをプラグインを使わないで出力する[WordPress]

Blogging
/

※このページにはプロモーションが含まれています。

Table of Contents

WordPress用のSEOプラグインはどのような機能があるのかを、プラグインを導入して調べました。

その中で構造化データというものが、ほぼすべてのSEOプラグインから出力されていてたので、これをプラグインを使わずに出力したいと思います。

実際にリッチリザルトテストで構造化データがどう認識されるかを知りたくなり

構造化データ マークアップをテストする | Google 検索セントラル  |  Search Central  |  Google for Developers

何種類かのプラグインでリッチリザルトテストを行い、出力されている構造化データを参考にして下記コードを作りました。

コードを利用するための用意

このコードは投稿者の似顔絵とブログのロゴを出力するようになっていますので、次の3種類の画像を使用します。

実際にコードを使用する場合は用意してください。画像の種類ははWebPかPNGの軽い方。投稿者のアバターとブログのロゴは112px四方以上の正方形が推奨されています。また、サムネイル画像がない場合の代替画像はサムネイルと同じサイズのものを指定してください。

SNSのアドレスは例としてFacebookページと旧Twitterを記述していますが、それ以外にもあれば同じ形式で付け足してください。SNSのアドレスが不要な場合は下記を削除します。

 'sameAs'    => array(
                    'Facebookページのアドレス',
                    'X(旧Twitter)のアドレス',
                ),

コードの使用方法

画像やその他の日本語で書かれている部分を環境に合わせて書き換えた後に、functions.phpにコードを追加するとwp_footer()にJson-ldの構造化データが出力されます。

function jsonld_data() {

    $post_ID      = get_the_ID();
    $description  = get_the_excerpt();
    $cat = get_the_category();
    $author_name = get_the_author_meta('nickname');

    if (has_post_thumbnail()) {
        $image = get_the_post_thumbnail_url($post_ID, 'full');
        $thumbID = get_post_thumbnail_id( $post_ID );
        $image_alt = get_post_meta($thumbID, '_wp_attachment_image_alt', true);
        $imege_size = wp_get_attachment_image_src( $thumbID , 'full' );
    } else {
        $image = 'サムネイルがない場合の代替画像のフルパス(例:https://~.webp)';
        $image_alt = 'サムネイルがない場合の代替画像のalt属性(例:白い花)';
        $imege_size[1] = 'サムネイルがない場合の代替画像の幅(例:1200)';
        $imege_size[2] = 'サムネイルがない場合の代替画像の高さ(例:630)';
    }
    if (empty($image_alt)) {
        $image_alt = get_bloginfo( 'name' );
    }
    $jsonld       = array();

if (is_front_page() || is_home()){

    $jsonld = array(
        '@context' => 'https://schema.org',
        '@graph'   => array(
            array(
                '@type'   => 'Person',
                '@id'     => home_url() . '/#person',
                'name'    => $author_name,
                'sameAs'  => array(
                    'Facebookページのアドレス',
                    'X(旧Twitter)のアドレス',
                ),
                'image'   => array(
                    '@type'      => 'ImageObject',
                    '@id'        => home_url() . '/#logo',
                    'url'        => 'ロゴ画像の絶対パス',
                    'contentUrl' => 'ロゴ画像の絶対パス',
                    'caption'    => get_bloginfo( 'name' ),
                    'width'      => 'ロゴ画像の幅',
                    'height'     => 'ロゴ画像の高さ',
                    'inLanguage' => 'ja',
                ),
            ),
            array(
                '@type'           => 'WebSite',
                '@id'             => home_url() . '/#website',
                'url'             => home_url(),
                'name'            => get_bloginfo( 'name' ),
                'publisher'       => array(
                    '@id' => home_url() . '/#person',
                ),
                'potentialAction' => array(
                    '@type'       => 'SearchAction',
                    'target'      => home_url() . '/?s={search_term_string}',
                    'query-input' => 'required name=search_term_string',
                ),
            ),
            array(
                '@type'     => 'CollectionPage',
                '@id'       => home_url() . '/#webpage',
                'url'       => home_url('/'),
                'name'      => get_bloginfo( 'name' ) . ' - ' . get_bloginfo( 'description' ),
                'about'     => array(
                    '@id' => home_url() . '/#person',
                ),
                'isPartOf' => array(
                    '@id' => home_url() . '/#website',
                ),
            ),
        ),
    );
} 
if (is_single()) {
  
    $jsonld = array(
        '@context'      => 'https://schema.org',
        '@graph'        => array(
            array(
                '@type'     => array(
                    'Person',
                    'Organization',
                ),
                '@id'       => home_url() . '/#person',
                'name'      => get_bloginfo( 'name' ),
                'sameAs'    => array(
                    'Facebookページのアドレス',
                    'X(旧Twitter)のアドレス',
                ),
                'logo'      => array(
                    '@type'         => 'ImageObject',
                    '@id'           => home_url() . '/#logo',
                    'url'           => 'ロゴ画像の絶対パス',
                    'contentUrl'    => 'ロゴ画像の絶対パス',
                    'caption'       => get_bloginfo( 'name' ),
                    'inLanguage'    => 'ja',
                    'width'         => 'ロゴ画像の幅',
                    'height'        =>'ロゴ画像の高さ',
                ),
                'image'     => array(
                    '@type'         => 'ImageObject',
                    '@id'           => home_url() . '/#logo',
                    'url'           => 'ロゴ画像の絶対パス',
                    'contentUrl'    => 'ロゴ画像の絶対パス',
                    'caption'       => get_bloginfo( 'name' ),
                    'inLanguage'    => 'ja',
                    'width'         => 'ロゴ画像の幅',
                    'height'        => 'ロゴ画像の高さ',
                ),
            ),
            array(
                '@type'      => 'WebSite',
                '@id'        => home_url() . '/#website',
                'url'        => home_url(),
                'name'       => get_bloginfo( 'name' ),
                'publisher'  => array(
                    '@id'       => home_url() . '/#person',
                ),
                'inLanguage' => 'ja',
            ),
            array(
                '@type'         => 'ImageObject',
                '@id'           => $image,
                'url'           => $image,
                'width'         => $imege_size[1],
                'height'        => $imege_size[2],
                'caption'       => $image_alt,
                'inLanguage'    => 'ja',
            ),
            array(
                '@type'           => 'BreadcrumbList',
                '@id'             => get_the_permalink() . '#breadcrumb',
                'itemListElement' => array(
                    array(
                        '@type'     => 'ListItem',
                        'position'  => 1,
                        'item'      => array(
                            '@id'       => home_url(),
                            'name'      => 'Home',
                        ),
                    ),
                    array(
                        '@type'     => 'ListItem',
                        'position'  => 2,
                        'item'      => array(
                            '@id'       => get_category_link( $cat[0]->term_id ),
                            'name'      => $cat[0]->name,
                        ),
                    ),
                    array(
                        '@type'     => 'ListItem',
                        'position'  => 3,
                        'item'      => array(
                            '@id'       => get_the_permalink(),
                            'name'      => get_the_title(),
                        ),
                    ),
                ),
            ),
            array(
                '@type'         => 'WebPage',
                '@id'           => get_the_permalink() . '#webpage',
                'url'           => get_the_permalink(),
                'name'          => get_the_title() . ' - ' . get_bloginfo( 'name' ),
                'datePublished' => get_the_time( 'c' ),
                'dateModified'  => get_the_modified_time( 'c' ),
                'isPartOf'      => array(
                    '@id'       => get_the_permalink() . '#website',
                ),
                'primaryImageOfPage'   => array(
                    '@id'       => $image,
                ),
                'inLanguage'        => 'ja',
                'breadcrumb'        => array(
                    '@id'       => get_the_permalink() . '#breadcrumb',
                ),
            ),
            array(
                '@type'     => 'Person',
                '@id'       => get_the_permalink() . '#author',
                'name'      => $author_name,
                'image'     => array(
                    '@type'         => 'ImageObject',
                    '@id'           => '似顔絵のフルパス',
                    'url'           => '似顔絵のフルパス',
                    'caption'       => $author_name,
                    'inLanguage'    => 'ja',
                ),
                'sameAs' => array(
                    home_url('/'),
                ),
            ),
            array(
                '@type'             => 'BlogPosting',
                'headline'          => get_the_title() . ' - ' . get_bloginfo( 'name' ),
                'datePublished'     => get_the_time( 'c' ),
                'dateModified'      => get_the_modified_time( 'c' ),
                'articleSection'    => $cat[0]->name,
                'author'            => array(
                    '@id'       => get_the_permalink() . '#author',
                    'name'      => $author_name,
                ),
                'publisher'     => array(
                    '@id'       => home_url() . '/#parson',
                ),
                'description'   => $description,
                'name'          => get_the_title() . ' - ' . get_bloginfo( 'name' ),
                '@id'           => get_the_permalink() . '#richSnippet',
                'isPartOf'      => array(
                    '@id'       => get_the_permalink() . '#webpage',
                ),
                'image'         => array(
                    '@id'       => $image,
                ),
                'inLanguage'        => 'ja',
                'mainEntityOfPage'  => array(
                    '@id'       => get_the_permalink() . '#webpage',
                ),
            ),
        ),
    );
}

    echo '<script type="application/ld+json">';
    echo json_encode($jsonld, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    echo '</script>';

}

add_filter('wp_footer', 'jsonld_data');

コードの説明

構造化データが出力されるのはフロントページと投稿ページになっており

フロントページは検索ボックス、投稿ページはパンくずリストと記事が出力されます。調べてみると投稿ページの作成者をPersonにはできなくてOrganizationとしなければならないそうなので、多くのプラグインの出力方法に習ってPersonとOrganizationの併記する方法をとっています。

メタディスクリプションは「抜粋」を表示させています。投稿ページ内の「抜粋を入力 (任意)」に入力された文章がそのまま表示されます。未入力の場合は本文の最初から抜粋した文章を表示します。これはWordPressの機能ですが、意味が分からない文章になる可能性があります。

投稿者名はWordPressの設定の中からニックネームを、画像のサイズはアップロードしたもとの大きさ「full」を表示させます。

パンくずリストは3階層までになっていて「ホーム > カテゴリー > 投稿タイトル」の表示にのみ対応しています。

パーマリンクは最後に「/」が在ることを前提になっているので、ない場合は出力結果を確認のうえ、正しく出力されるように調整してください。

最後までお読みくださり、誠にありがとうございます。

Amazon.co.jp
これからのWordPressSEO内部対策本格講座
Amazon.co.jp
10倍はかどるSEOの進め方

関連投稿

週間アクセスランキング

このブログを書いている人

管理者 ほんだ

数多くあるブログの中で、このページをお読みくださりありがとうございます。このブログは、炭火で美味しいものを作ることを中心に、日々の趣味についてを文章にすることで、WordPressを使ってのWebページ作成を忘れないようにしています。熱帯魚の世話や野菜の栽培、Linuxについて興味のあることを、つたない文章で綴っています。兵庫県在住です。