コード
functions.php
/*----------------------------------------------------
記事の本文の中の絶対パスを相対パスに書き換える
(head の canonical・og:url・og:image・構造化データは
絶対 URL が必要なので書き換えない)
----------------------------------------------------*/
if ( !function_exists( 'my_relative_content_url' ) ){
function my_relative_content_url( $content ) {
// 管理画面・RSS フィード・REST API(ブロックエディター)では書き換えない
if ( is_admin() || is_feed() || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) {
return $content;
}
$host = wp_parse_url( home_url(), PHP_URL_HOST );
if ( empty( $host ) ) {
return $content;
}
$host = preg_quote( $host, '#' );
// href="…" src="…" srcset="…" の頭にある https://ドメイン だけを消す
// (https://ドメイン.example.com のような別のドメインは書き換えない)
return preg_replace(
array(
'#(?<=["\']|, )https?://' . $host . '(?=/)#i', // https://ドメイン/… → /…
'#(?<=["\'])https?://' . $host . '(?=["\'])#i', // https://ドメイン → /
),
array( '', '/' ),
$content
);
}
// 20:画像の srcset が付いたあと(wp_filter_content_tags は 12)に書き換える
add_filter( 'the_content', 'my_relative_content_url', 20 );
}
ふだんは絶対パスのままがおすすめ
前のコードは、ページ全体の https://ドメイン を消していたため、canonical や RSS のリンクまで相対パスになっていました。サイトによっては og:url・og:image・構造化データも相対パスになります。これらは絶対 URL が必要なので、検索エンジンや SNS で正しく扱われなくなります。上のコードでは、書き換えるのを記事の本文の中だけにしています。
どうしても相対パスにしたいとき以外は、使わないほうがよいと思います。
問題となる例 – Pagespeed Insights


