省エネ運転中

【WordPress】これひとつでOK!Cocoonテーマ使用時、投稿者名(author/作成者/ユーザー名)の情報を読み取られないように(非表示/非出力)するカスタマイズ

WordPressカスタマイズ

WordPressではデフォルトで投稿者名(author、作成者、ユーザー名)が複数の方法で読み取り可能な状態(ほぼ丸見え)になっています。

これはWordPressのポリシーらしいのですが、やっぱりちょっと気になるので非表示にしたいと思います。

WordPress投稿者名が丸見えの仕様は知らない方も多いようで、よくわからないIDが知られてしまう分にはまあ良いのですが、ユーザー名(ログインID)をメールアドレスで登録していて丸見えのまま運用してたり。。。私です。

すでに情報提供されている方が多くいらっしゃるのですが、調べたところいくつかの対策方法を組み合わせて行う必要があったため、私が行ったひととおりの方法を記録のためにまとめておきます。

WordPress+Cocoonテーマを適用している環境が対象ですが、WordPress全般の設定がメインなので、他のテーマでも参考になれば幸いです。

WordPress+Cocoonで投稿者名を読み取ることができる箇所

まずは対策の対象となる部分です。

大きく4か所あります。

  • WordPressの投稿者、author、作成者、ユーザー名のアーカイブページ
  • Cocoonテーマの投稿者名(のソースコード)
  • コメントリストのソースコード
  • WordPress REST API

WordPress自体が投稿者名を秘匿する設計で作られていないため、バージョンアップなどにより出力箇所が変わってしまいイタチごっこになる可能性が高いですが、分かっている箇所については対応をしていきたいところです。

それぞれについてざっと解説します。

WordPressの投稿者、author、作成者、ユーザー名のアーカイブページ

WordPressのデフォルトの設定では、投稿者ごとのアーカイブページが自動的に作成され、これはユーザー名を把握していなくても決まったURLの書式でアクセスすることができます。

しかも、アクセスするとユーザー名がわかるようなURLにリダイレクトする、というおまけ付きです。

例えば、未対策のWordPressのサイトで、「https://サイトのURL/?author=1(例:https://cravelweb.com/?author=1)」にアクセスします。

そうすると「https://サイトのURL/author/投稿者名(例:https://cravelweb.com/author/cravel)」のようなページにリダイレクトされ、投稿者が投稿した記事の一覧が表示されます。

この「投稿者名」がユーザ名そのままなので、WordPressのログインIDがわかってしまうほか、ユーザー名をメールアドレスなどで登録していると、そのまま投稿者のメールアドレスを読み取ることができてしまいます。

そもそもメールアドレスでユーザー登録することが問題なのかもしれませんが、意外にやりがちで気づかないままになってたりするんですよね。

Cocoonテーマの投稿者名(のソースコード)

Cocoonテーマでは投稿の下部に投稿者名が表示されます。

ここで表示されるのはWordpressのユーザープロフィールで設定した「ブログ上の表示名」の情報が表示されるようになっているのですが、同時にテキスト上にリンクが設定されていて、そのリンク先が前述の「https://サイトのURL/author/投稿者名になっています。

そのため、こちらからも同様にWordPressのユーザー名を読み取ることができます。

また、Coconテーマでは、「Cocoon設定」→「本文」→「投稿情報表示設定」→「投稿関連情報」→「投稿者名の表示」のチェックボックスからこちらの表示を「非表示」にすることができるのですが、これは実際は見えないような処理が施されるのみで、ソースコードには前述の内容がそのまま残されているため、WordPressのユーザー名を読み取ることができてしまいます。

この非表示の処理については、ページの構造化データのエラー回避のためとされていますが、できれば「非表示」ではなく、情報自体を「非出力」にするようなカスタマイズが望ましいです。

コメントリストのソースコード

WordPress投稿のコメント欄にはユーザー名やコメントの内容が表示されますが、こちらのコメントのソースコードを見ると、スタールシートのクラス名にWordPressのユーザー名が使用されています。

こちらもページ上では非表示ですが、ソースコードから読み取れてしまう内容のため非出力にしたい箇所になります。

WordPress REST API

WordPressのバージョン4.4以降、REST APIが導入され、こちらの内容からもユーザー名を読み取ることができるようになっています。

以下のURLでアクセスしてみると、内容にユーザー名が含まれたデータ(json)が表示されます。

「https://サイトのURL/wp-json/wp/v2/users (例:https://cravelweb.com/wp-json/wp/v2/users)」

こちらも意図してアクセスすることは少ないデータだとは思いますが、簡単にユーザー名を読み取ることができてしまうため、出力自体を無効にしたい箇所となります。

それぞれの対策手順

前述の4か所に対する対策ですが、大きく2つの対応について紹介します。

ひとつは、phpのソースコードなどを書き換える方法。もう一つはWordPressのプラグイン「XO Security」を使用する方法です。

結論から言うと、「Cocoonの投稿者名」の変更以外の3つについてはすべて「XO Security」が提供する機能で問題なく対策できます。素晴らしいプラグインです。ありがとうございます。

ですので、手軽な対応としてはXO Securityをインストールし、必要な設定を行った後「Cocoonの投稿者名」の表示カスタマイズを行ってください。

下記ではXO Securityを使用しないphpの追記の方法も加えて解説しています。

WordPressの投稿者、author、作成者、ユーザー名のアーカイブページを非表示にする

XO Securityで設定する場合

「設定」→「XO Security」→「秘匿」→「作成者アーカイブの無効化」チェックボックスをオンにして「変更を保存」をクリックします。

functions.phpで設定する場合

2つの処理をfunctions.phpに加えます。

アーカイブページを無効にする。

add_filter( 'author_rewrite_rules', '__return_empty_array' );

functions.phpファイル更新後、「設定」→「パーマリンク」の「変更を保存」をクリックし、一度設定を保存すると反映されます。(パーマリンクの設定内容自体を変更する必要はありません)

author=1などからのアクセスを404ページにリダイレクトさせる。

add_filter( 'author_rewrite_rules', '__return_empty_array' );
function disable_author_archive() {
	if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) ){
		wp_redirect( home_url( '/404.php' ) );
		exit;
	}
}
add_action('init', 'disable_author_archive');

以上で、投稿者のアーカイブページが無効化され、URLに直接アクセスした場合は404ページが表示されるようになります。

Cocoonテーマの投稿者名を非表示にして、構造化データを修正する

この項目に関してはXO Securityなどでは対応できないため、以下の手順を実施します。

Cocoonテーマの /tmp/content.php にある、投稿者表示用のテンプレート部分をコメントアウトして出力されないようにします。以下の個所を更新します。(185行目付近)

        <?php //投稿者等表示用のテンプレート
        //get_template_part('tmp/footer-meta');
        ?>

/tmp/content.phpは子テーマに含まれていないため、まずは親テーマからファイルをコピーし、親テーマと同じディレクトリ構造(/tmp/配下)に該当ファイルを配置してください。

この変更を加えることで、投稿ページ上の投稿者名の表示が出力されないようになりますが、構造化データに必要なauthorのデータ自体がページ内に出力されなくなってしまうため構造化データのエラーとなります。

構造化データのエラーについてはユーザーの閲覧上大きな問題は発生しませんが、SEOなどに影響するためサイト運営側にとってはできるだけ回避したいものかと思います。

そのため、ソースコードの他の部分をauthorデータとして指定し、このエラーを回避します。

/tmp/content.php の10行目にある内容を以下のように変更します。

<article id="post-<?php the_ID(); ?>" <?php post_class('article') ?> itemscope="itemscope" itemprop="blogPost" itemref="copyright" itemtype="http://schema.org/BlogPosting">

追記されたのは「itemref=”copyright”」の部分です。こちらで構造化データの参照先にページフッターのcopyrightを追加しています。

/tmp/content.php の更新が完了したら、「Cocoon設定」→「フッター」を開き、「クレジット表記」を「独自表記」に変更します。

「上記設定で「独自表記」と入力した場合」のテキストボックスに、以下のような内容を入力します。

<p id="copyright">©2015-2019 <span itemprop="editor author creator copyrightHolder"
 itemscope itemtype="http://schema.org/Person"><span itemprop="name">クラベル</span>
</span> All Rights Reserved.</p>

解説年、著作権者表記はご自身のものに差し替えてください。

コメントリストからユーザー名が読み取れる部分を変更する

XO Securityで設定する場合

「設定」→「XO Security」→「秘匿」→「コメント著者名クラスの無効化」チェックボックスをオンにして「変更を保存」をクリックします。

functions.phpで設定する場合

以下をfunctions.phpに追記します。

add_filter( 'comment_class', function( $classes ) {
    foreach( $classes as $key => $value ) {
        if( stripos( $value, 'comment-author-' ) !== false ) {
            unset( $classes[$key] );
        }
    }
    return $classes;
});

以上で、CSSのクラス名が投稿者名以外の文字列に置き換えられます。

WordPress REST APIによるユーザー情報を隠す

XO Securityで設定する場合

「設定」→「XO Security」→「REST API」→「REST API の無効化」チェックボックスをオンにし、リスト内にある「/wp/v2/users」「/wp/v2/users/(?P<id>[\d]+)」の2つのチェックボックスをオンにしてから「変更を保存」をクリックします。

functions.phpで設定する場合

以下をfunctions.phpに追記します。

function my_filter_rest_endpoints( $endpoints ) {
	if ( isset( $endpoints['/wp/v2/users'] ) ) {
		unset( $endpoints['/wp/v2/users'] );
	}
	if ( isset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ) ) {
		unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
	}
	return $endpoints;
}
add_filter( 'rest_endpoints', 'my_filter_rest_endpoints', 10, 1 );

WordPressプラグインの「XO Security」がとにかく素晴らしい

XO Securityは今回のデータ秘匿設定のほか、ログインログや試行回数制限、遅延設定など、ログイン画面に対する不正アクセスに対して強力な対策を施すことができ、非常に有効です。

いろいろ情報を調べて個別に改修を加えていたのですが、結局XO Securityプラグインにたどり着いてfunctions.phpをすべて修正しなおす、というオチでした。

XO Security、素晴らしいです。

コメント

タイトルとURLをコピーしました