WordPressでは、個別投稿の場合、ヘッダー部分にrel=canonicalが表示されます。
<link rel='canonical' href='http://example.com/hello-world' />
のように表示されます。この表示が行われる仕組みを、WordPress4.0で調べてみました。
rel=canonicalが表示される仕組み
WordPressのテーマにはヘッダー部分にwp_head()関数が埋め込まれています。rel=canonicalも、この部分で表示されています。
表示する関数は、wp-includes/link-template.phpにある、rel_canonical()関数です。
function rel_canonical() { if ( !is_singular() ) return; global $wp_the_query; if ( !$id = $wp_the_query->get_queried_object_id() ) return; $link = get_permalink( $id ); if ( $page = get_query_var('cpage') ) $link = get_comments_pagenum_link( $page ); echo "<link rel='canonical' href='$link' />\n"; }
個別投稿の場合に、canonical属性を追加します。is_singular()で判定しているので、投稿、固定ページの双方が対象となります。皆さんのブログでも、固定ページでもcanonical属性が表示されているはずです。
フックで実行されている
さて、wp-includes/link-template.phpではrel_canonical()関数が定義されていました。ではrel_canonical()関数はどこで実行されているのでしょうか。実行場所は、wp-includes/default-filters.phpにある、
add_action( 'wp_head', 'rel_canonical' );
が決めています。add_action()関数は、関数の実行場所を決める関数です。上の例は、「wp_headのところで、rel_canonicalを実行せよ」という命令になります。
フックを無効にする
rel=’canonical’を表示させたくない場合は、rel_canonical()関数を実行させないようにすればよいですね。そのためにはどうすれば良いでしょうか。
wp-includes/default-filters.php を書き換えて、
/* add_action( 'wp_head', 'rel_canonical' ); */
とすることもできます。WordPressでは「/*」と「*/」の間はコメントとみなされるので、add_action( … ) の部分は実行されません。しかし、この方法だと、WordPress本体をアップデートすると元に戻ってしまいます。
テーマのfunctions.phpに書き加える
WordPress本体のコードは書き換えずに、自分のテーマのfunctions.phpに書き加えれば、WordPress本体をアップデートしても、自分で編集したコードが維持されます。
remove_action( ‘wp_head’, ‘rel_canonical’ );
と記述します。remove_action()関数は、add_action()関数を打ち消す関数です。
こうすることで、WordPressの標準で出力するrel=’canonical’を消す事ができました。
検索エンジン最適化等の目的で、自分でrel=’canonical’の出力をカスタマイズしたい場合は、このように標準の出力を消してからカスタマイズすると、「標準の出力と自分の出力の両方を表示してしまう」といったミスが防げます。