WordPress5.1でnoopennerが自動付与される件について調べたことメモ

WordPress5.1のtarget=”_blank”、つまりは別窓で開くようにしたときに リンクにrel=”noopenner”が自動付与される件について調べたことをメモしておきます。

WordPressのnoopenerの歴史

WordPressのtarget=”_blank”を記述したリンクにnoopenerが自動付与される件の歴史はわりと古くからあったみたいです。

rel=”noopener”が付与されるようになったのはWordPress4.7.4からだそうです。そのころはnoopennerだけではなくてnoreferrerという属性も自動付与されていたそうです。しかし4.8あたりからはnoreferreの自動付与はなくなったそうです。このあたりの歴史についてはもっと深く追求してもよかったのですが、そこらへんはあまり重要ではないのでこのぐらいにしておきます。

問題はWordPress5.1になってまたnoopennerが自動付与されるようになったことです。

noopenerの役割とはそもそもなにか

noopenerには以下のような役割があるそうです。

target=”_blank” にはセキュリティ上の脆弱性もあります。リンク先のページでは window.opener を使用して親ウィンドウのオブジェクトにアクセスしたり、window.opener.location = newURL によって親ページの URL を変更したりできます。

引用元: Tools for Web Developers

target=”_blank” を使用して任意のページから別のページにリンクしている場合、リンク元のページとリンク先のページは同じプロセスで動作します。 そのため、リンク先のページで負荷の高い JavaScript が実行されていると、リンク元のページのパフォーマンスが低下するおそれがあります。

引用元: Tools for Web Developers

WordPressでnoopenerを自動付与しないようにする

WordPressでリンクにtarget=”_blank”を記述すると、エディターや投稿保存時に、そのリンクに自動的にrel=”noopenner”が自動付与されてしまいます。これを解除するコードが以下になりますが、noopenerをつけないということは上記にあるとおりセキュリティが下がることにつながると思いますのでそこは自己責任です。

//エディターでrel="noopener noreferrer"自動付加の解除
add_filter('tiny_mce_before_init','tinymce_allow_unsafe_link_target_demo');
function tinymce_allow_unsafe_link_target_demo( $mce_init ) {
 $mce_init['allow_unsafe_link_target']=true;
 return $mce_init;
}
 
//投稿時に強制付加されるnoreferrer削除
add_filter( 'wp_targeted_link_rel', 'wp_targeted_link_rel_custom_demo', 10, 2 );
function wp_targeted_link_rel_custom_demo( $rel_value, $link_html ){
  $rel_value = str_replace(' noreferrer', '', $rel_value); 
  //return $rel_value;// noopenerだけを付与する。
  return "";//nullもしくは空文字の指定でnoopenerも付与しない
}

エディターのほうのコードに関してはビジュアルエディターを使用していないのであれば、記述する必要はありません。デフォルトの第一引数$rel_valueには「noopener noreferrer」という値が入っています。


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78