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": "http://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": "http://◯◯◯◯.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": "http://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": "http://◯◯◯◯.jp/lib/img/common/ogimg.png",';echo "\n";
    }
    ?>
    "mainEntityOfPage": "<?php the_permalink(); ?>"
}
</script>
<?php } else { ?>
<?php } ?>

Top Stories with AMP  |  Structured Data  |  Google Developers

WordPressでおすすめのバックアップとセキュリティ系プラグイン

WordPressのオリジナルテンプレートでウェブサイトを制作する際に、個人的な経験(汗)からできる限りプラグインを使わずに制作を行っています。

しかしながら簡便さよりも必要性という理由から、いくつかのプラグインは利用させてもらっていて、そういった基本プラグインセットも定期的に入れ替えを行っています。

今回、バックアップ・セキュリティ系のプラグインを見直すにあたり、ちょっと便利だなあと思うプラグインをご紹介させていただきます。

バックアップ系プラグイン

内部・受注どちらでも最低限の定期バックアップを行うためにプラグインを利用していて、その中でも一番利用頻度が高かったのがWP-DB-Backupなんですが、ちょっと別のものも物色。

できればデータベースだけでなく、ファイル全体のバックアップ(cron設定とかをこっちでしなくても)できるものがあれば良いなあと思い、
また、同一サイト内で複数のWordPressを利用する場合もあるので、DBのみ・ファイル全体など選択できるものがあればと思いいくつか試してみたところ、BackUpWordPressがかなり良い感じでした。

BackUpWordPress

BackUpWordPress

近い機能のプラグインも別途あったのですが、BackUpWordPressが一番しっくりきました。
気に入った点は以下。

  • サーバー設定せずに自動バックアップが可能
  • バックアップスケジュールの指定ができる
  • 保存する個数(新しいものから何番目までとか)を指定できる
  • DBのみ・ファイル全体など選択できる

また、有料($99)でDropbox・Google Drive・Amazon S3・FTP(別サーバー)・Rackspace Cloud・Windows Azure・DreamObjectsへのバックアップも設定できます。

セキュリティ系プラグイン – 外部対策用

ログイン画面についてはいろいろと対策含めあるかと思いますが、最終的に外部の人やその他のツールにログインパスワードをブルートフォースアタックされた場合にログイン画面をロックして不正ログインを防いでくれるプラグインです。

SiteGuard WP Plugin

SiteGuard WP Plugin

同類のプラグインもいくつかりますが、個々の設定ができたりCAPTCHA(画像認証)があったりと多機能です。

セキュリティ系プラグイン – 内部用

テーマの問題点をチェックするプラグインなどもありますが、こちらはオリジナルテンプレートに限らず使用するテンプレートやWordPressの設定状況・脆弱性のセキュリティをチェックするプラグインです。

Acunetix WP Security

Acunetix WP Security

セキュリティ上の脆弱性を一括でチェックでき、必要な箇所は任意で設定変更が可能です。
また、チェックする脆弱性のレベルも選択可能です。

常に使うことはないかもしれませんが、公開前とかのチェックには役立つのではないでしょうか。


2015.07.10
Acunetix WP Securityを有効化しておくと、読み込みがかなり遅くなる(?)ように。常時は停止しておいた方が良いかもしれません。

こういった防止策の前にユーザー名にadminを使わないとか、オリジナルテーマを制作せずに無料のテーマを使用する際にはものによっては一応注意するとか、初歩的な対策も大切ですよね。

WordPressのトップページで投稿数によってページ内容が切り替わらない場合の対処方法(query_postsを使わない場合)

WordPressのトップページなどで投稿数によってページ送りを設置した際に、index.phpを使わず別途固定ページに別テンプレート(front_page.phpなど)を使っている場合、「表示設定 > 固定ページ (以下を選択)」を設定してるかと思います。

その際にURL(〜/page/2/)は変化しても表示される投稿内容は時系列などでソートされたものが変化しない場合の解決方法です。

query_posts やWP_query絡み(?)っぽいものはわりと目にしましたが、query_postsは使っておらず、今回自分もちょっとハマってしまったのでその解決方法となります。

早速ですが解決方法↓

◎「表示設定 > 固定ページ (以下を選択)」を「最新の投稿」へ戻す(デフォルト)
※1ページに表示する最大投稿数と「’posts_per_page’ => ◯,」も注意

以上(笑)

状況、好み(?)によりますが個人的に大抵の場合、index.phpをトップページに使わないため「表示設定 > 固定ページ (以下を選択)で作成した固定ページ(スラッシュ/で終わる固定ページに指定)」を設定していました。
※トップページでページ送り的なの使うとき、「最新の投稿」でないとダメなんだろうか…。

また、個人的に出来る限りプラグインを使いたくないので、もしかしたらページ構造をアレコレするプラグインを使っていた場合、とくに問題なく投稿記事も変化するかもしれません。

ちなみにどのようなページ遷移の情報が渡っているとか、なぜに上記で大丈夫なのかは詳細見てませんがあしからず。。

ちなみに、front-page.phpでの呼び出しは以下。

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
<?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $total_post_count = wp_count_posts();
    $published_post_count = $total_post_count->publish;
    $total_pages = ceil( $published_post_count / $posts_per_page );
    $args = array(
        'paged' => $paged,
        'post_type' => 'post',
        'posts_per_page' => 4,
        'orderby' => 'post_date',
        'post_status' => 'publish'
        );
    $myposts = get_posts($args);
    foreach($myposts as $post):
?>


<?php get_template_part('temp', 'none'); ?>


<?php endforeach; ?>

<div class="topNavi pageNavi">
<ul>
    <li><?php echo get_next_posts_link( __('&laquo; Older Posts', 'kazunoriiguchi.com blog')); ?></li>
    <li><?php echo get_previous_posts_link( __('Newer Posts &raquo;', 'kazunoriiguchi.com blog')); ?></li>
</ul>
</div>

しかしながら、「表示設定 > 固定ページ (以下を選択)」の場合でもなにかしら方法があるような気も。
どなたかご存知でしたらご教示いただけますと助かりますm(__)m

Google サイト運営者向けWordPressプラグイン(β版)を公開

実際の公開は少し前だったように思いますが、本日、Google ウェブマスターツールのサイト追加やAdSenseの管理が行えるWordPress のプラグイン(ベータ版)が告知されてましたので軽く使ってみました。

プラグインを有効化すると、その時ログインしているGoogle アカウントが認証され、AdSense やGoogle ウェブマスターツールとひも付けされます。

設定箇所は以下。
この設定箇所からウェブマスター ツールでのサイトの確認・管理ページへの遷移、AdSense の設定などができます。

AdSense はサイト上での広告設置プレビューもでき、既存のAdSense のタグを削除する必要があるみたいですが、そのままプレビューから直接広告を挿入できるみたいです。

Google サイト運営者向けWordPressプラグイン(β版)のAdSense 設定

また、その際に広告フォーマットや広告タイプも選択可能。
ページタイプごとの表示もプレビュー上で変更できるのはちょっと便利かもしれません。

Google サイト運営者向けWordPressプラグイン(β版)のAdSense の広告プレビュー
β版ですので、現状の機能のままではないと思いますが、Google ウェブマスターツールのサイト登録はちょっと必要性が分かりかねますが、AdSense についてはプレビュー機能は便利だと思いますし、そのまま広告追加できるというのも、さくっといきたいとき(サイト)の場合とかわりと使いやすいのではないでしょうか。

Google ウェブマスター向け公式ブログ: サイト運営者様向けの Google サービスを WordPress から利用が可能に:Google サイト運営者向けプラグイン(ベータ版)
http://googlewebmastercentral-ja.blogspot.jp/2014/01/google-publisher-plugin-beta-bringing.html

WordPress › Google Publisher Plugin (beta) « WordPress Plugins
http://wordpress.org/plugins/google-publisher/

GOOGLE サイト運営者向けプラグインを使って ADSENSE を使用する
https://support.google.com/adsense/answer/3380632?hl=ja#2

WordPress のテーマ作成時のためのテーマ

WordPress のテーマを作る便利ではなかろうかと思う、ベーシックなテーマのファイルセットになります。

体裁的なものはまったく付加していませんが、たぶん、テーマを作るときやなんらかのテストのときって、
なんらかのフリーのテーマよりも、このぐらいからの方が個人的には使いやすいと思いまして。

おそらく、テーマから造られる際に皆さん独自のものを持っていらっしゃるかと思われますが、
テストやテーマ作成時、または学習時などに宜しければご利用ください。

ダウンロード(GitHub)
https://github.com/kazunoriiguchi/WordPress-ThemeForTheTheme

テーマ ファイル構成

  • 404.php
  • archive.php
  • category.php
  • comments.php
  • footer.php
  • functions.php
  • header.php
  • index.php
  • lib(ディレクトリのみ)
  • license.txt
  • page.php
  • screenshot.png
  • search.php
  • searchform.php
  • sidebar.php
  • single.php
  • style.css
  • tag.php
  • taxonomy.php