WordPress

外部サイトに同じ記事を載せるので、WordPress の canonical リンク要素を書き換える

投稿日:

1. Canonical リンク要素

WordPress サイトに書いた記事と同じ内容を外部サイトに転載する場合の話です。

そのままにしておくと、Googleなどの検索ボットから、コピペ記事だと見なされかねないので、どちらか片方のページに「あちら(のURL)が正規のページですよ」という記述を追加することが望まれます。

これを行うには、HTMLのヘッダ部分に Canonical リンク要素を記述します。

こんな記述です。

<link rel="canonical" href="https://example.com/foobar">

href= の後ろに正規なページのURLを指定します。

本記事では、WordPress のページ側で Canonicalリンク要素を書き換える方法を紹介します。

2. WordPress サイト側で Canonical リンク要素を書き換える

WordPress では標準で Canonical リンク要素を出力していますので、その処理を一旦削除して、独自の処理に書き換えます。

仕様としては以下を想定します。

  1. 特定の記事にアクセスされた場合(記事のIDで判別する)、その記事に対する正規のURLを Canonicalリンク要素にセットして出力する。
  2. それ以外のページの場合は、そのページのURLを Canonical リンク要素にセットして出力する。

それでは WordPress の処理を書き換える作業です。

WordPress が標準機能として Canonical リンク要素を設定している部分を探すと、wp-includes/default-filters.php というファイルであることが分かりました。この中で add_action( 'wp_head', 'rel_canonical' ); を実行しています。これは、wp_head というフックに、rel_canonical という関数を登録している命令です。まず、これを取り消す必要があります。wp-settings.php ファイルや Plugin API/Action Reference « WordPress Codex を見て、WordPress が実行する処理の順番を調べたところ、wp-includes/default-filter.php より後に、テーマの functions.php が実行されることが分かったので、functions.php に以下を記述することにします(何行目に書いても構いません)。

remove_action('wp_head', 'rel_canonical');

これは、先程の登録を削除する命令になります。

次に、wp_head フックに独自の関数を登録します。Canonical リンク要素の出力はこちらで全て担当することにします。先程処理を記述した直後に、以下を記述します。

add_action( 'wp_head', function() {
	global $post;
	$post_id = $post->ID;
	if ( $post_id == 99999 ) { 
		echo PHP_EOL . '<link rel="canonical" href="https://example.com/123456">' . PHP_EOL;
	} elseif ( $post_id == 88888 ) { 
		echo PHP_EOL . '<link rel="canonical" href="https://example.com/234567">' . PHP_EOL; 
	} else {
		$url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
		echo PHP_EOL . '<link rel="canonical" href="' . esc_url($url) . '">' . PHP_EOL;
	}
});

ここでは、例として2つの記事に対して、外部サイトのURLをセットした Canonical リンク要素を出力しています。その際、記事のIDで比較していますが、記事のIDは、記事の編集ページのURLに入っています。

記事編集ページのURLにIDが入っています

それ以外のページに対しては、その時アクセスしているURLをセットしています。

このコードでは、if 文を使って記事毎に条件分岐していますが、これ以上条件分岐の数が増えるようであれば、記述方法を改善した方がよいでしょう(見づらいので)。

後は、Canonical リンク要素を外部サイトのURLに書き換えたページにアクセスして、<head></head> の間のどこかに 以下が出力されているか確認します(ページの「ソース」を見ます)。

Canonical リンク要素が出力されています

3. おわりに

Canonical リンク要素は「正規のURL」を(参考として)伝えるものです。そのため、Google 検索からすると「正規でないURL」側のページは評価が下がる可能性があります。

また、将来的に外部の記事を消すことになったら、今回追加した記述は消しておきましょう。

4. 参考

📂-WordPress

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

WordPress

WordPress プラグイン開発における多言語対応(gettextを利用する場合)

目次1. はじめに2. 想定している開発環境3. gettext のインストール4. 多言語対応の作業1. プログラム中の翻訳文字列を使用する箇所で、専用の関数を使うようにします。2. 翻訳ファイルを …

WordPress

WordPress の機能を使って独自のPHPファイルにヘッダーとフッターを追加するサンプルページを作成しました

WordPress の持つ get_header(), get_footer() 関数を利用して、独自のPHPファイルにヘッダとフッターを表示するサンプルページを作成しました。 サンプルページのURL …

WordPress

WordPress に関する srcset と sizes 属性値の簡単な説明

目次1. はじめに2. srcset と sizes の仕組み3. WordPress での srcset と sizes3-1. sizes 属性3-2. srcset 属性3-3. [設定] &# …

WordPress

WordPress: サイトヘルスの特定のチェック項目を無効にする方法

WordPress: サイトヘルスの特定のチェック項目を無効にする方法について説明します。

WordPress の robots.txt に関する処理はどうなっているのか?

WordPressでの robots.txt に関する処理を調べてみました。 少しネットで調べてみると「robots.txt を自分で作成してルートディレクトリに置いておけば、それが使われるし、なけれ …