Google AMP対応のWordPressの構造化データ記述方法

GoogleのAMP(Accelerated Mobile Pages)へ対応するためにはAMP HTMLとschema.org/Article(またはNewsArticle)、もしくはschema.org/BlogPosting の構造化データが必要です。

AMP HTMLへの対応はWordPress プラグインでどうにかと思っているのですが、そちらはもう少しエラーの改善まで時間が必要な感じです。
プラグインでも構造化データの対応はされるかもしれませんが、構造化データについてはプラグインを使わない記述方法を用意してみました。宜しければご参考ください。

サイトによってはデータを追加したいプロパティもあるかもしれませんが、基本的な必須内容となります。

一部自前の関数を使っていることもあり、nameやheadline(見出し)などは必要に応じて任意の関数などに変更してください。
また、分岐で投稿ページのみで記載されるようになっていますので、必要でしたら分岐を変更してください。

Articleの場合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//NewsArticleの場合
<?php if (is_front_page()) { ?>
<?php } elseif(is_single() || is_page()) { ?>
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Article",
    "publisher": {
        "@type": "Organization",
        "name": "<?php bloginfo('name'); ?>",
        "logo": {
            "@type": "ImageObject",
            "url": "<?php bloginfo('template_url'); ?>/lib/img/common/shcema_logo600x60.png",
            "width": 600,
            "height": 60
        }
    },
    "author": "<?php $author = get_userdata($post->post_author); echo $author->display_name; ?>",
    "datePublished": "<?php the_time('Y/m/d g:i:s'); ?>",
    "dateModified": "<?php the_modified_time('Y/m/d g:i:s'); ?>",
    "name": "<?php bloginfo('name'); ?>",
    "headline": "<?php 任意の関数とか(); ?>",
    <?php
    $str = $post->post_content;
    $searchPattern = '/<img.*?src=(["\'])(.+?)\1.*?>/i';
    if (has_post_thumbnail() && !is_archive()){
    $image_id = get_post_thumbnail_id();
    $image = wp_get_attachment_image_src( $image_id, 'full');
    echo '"image": "'.$image[0].'",';echo "\n";
    } else if ( preg_match( $searchPattern, $str, $imgurl ) && !is_archive()) {
    echo '"image": "'.$imgurl[2].'",';echo "\n";
    } else {
    echo '"image": "https://◯◯◯◯.jp/lib/img/common/ogimg.png",';echo "\n";
    }
    ?>
    "mainEntityOfPage": "<?php the_permalink(); ?>"
}
</script>
<?php } else { ?>
<?php } ?>

BlogPostingの場合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//BlogPostingの場合
<?php if (is_front_page() || is_page()) { ?>
<?php } elseif(is_single()) { ?>
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "publisher": {
        "@type": "Organization",
        "name": "<?php bloginfo('name'); ?>",
        "logo": {
            "@type": "ImageObject",
            "url": "<?php bloginfo('template_url'); ?>/lib/img/common/shcema_logo600x60.png",
            "width": 600,
            "height": 60
        }
    },
    "author": "<?php $author = get_userdata($post->post_author); echo $author->display_name; ?>",
    <?php if ( is_single() ) { ?>
    <?php if ($post->post_excerpt){ ?>
    "description": "<?php echo $post->post_excerpt; ?>",
    <?php } else {$summary = strip_tags($post->post_content);
    $summary = str_replace("\n","", $summary);
    $summary = str_replace("\r","", $summary);
    $summary = mb_substr($summary, 0, 80). "..."; ?>
    "description": "<?php echo $summary; ?>",
    <?php } ?>
    <?php } else { ?>
    "description": "<?php bloginfo('description'); ?>",
    <?php } ?>
    "name": "<?php bloginfo('name'); ?>",
    "headline": "<?php 任意の関数とか(); ?>",
    "datePublished": "<?php the_time('Y/m/d g:i:s'); ?>",
    "dateModified": "<?php the_modified_time('Y/m/d g:i:s'); ?>",
    <?php if ( is_single() ) { ?>
    <?php if ($post->post_excerpt){ ?>
    "articleBody": "<?php echo $post->post_excerpt; ?>",
    <?php } else {$summary = strip_tags($post->post_content);
    $summary = str_replace("\n","", $summary);
    $summary = str_replace("\r","", $summary);
    $summary = mb_substr($summary, 0, 80). "..."; ?>
    "articleBody": "<?php echo $summary; ?>",
    <?php } ?>
    <?php } else { ?>
    "articleBody": "<?php bloginfo('description'); ?>",
    <?php } ?>
    <?php
    $str = $post->post_content;
    $searchPattern = '/<img.*?src=(["\'])(.+?)\1.*?>/i';
    if (has_post_thumbnail() && !is_archive()){
    $image_id = get_post_thumbnail_id();
    $image = wp_get_attachment_image_src( $image_id, 'full');
    echo '"image": "'.$image[0].'",';echo "\n";
    } else if ( preg_match( $searchPattern, $str, $imgurl ) && !is_archive()) {
    echo '"image": "'.$imgurl[2].'",';echo "\n";
    } else {
    echo '"image": "https://◯◯◯◯.jp/lib/img/common/ogimg.png",';echo "\n";
    }
    ?>
    "mainEntityOfPage": "<?php the_permalink(); ?>"
}
</script>
<?php } else { ?>
<?php } ?>

Top Stories with AMP  |  Structured Data  |  Google Developers

change_history