【WP】W3Cのマークアップバリデーションエラーを解決する方法
WordPressで作ったサイトをW3Cのマークアップバリデーションに通すと、CSSとJSの読み込みでエラーが起きてしまいます。原因は「type=”~~~”」の属性が自動挿入されてしまうためなので、今回はこのtype属性を削除する方法を解説します。
やりたいこと
// W3Cエラーの出るタグ(CSS) <link rel='stylesheet' id='style-css' href='https://example.com/wp-content/themes/hoge/style.css' type='text/css' media='all' /> // W3Cエラーを解決するタグ(CSS) <link rel='stylesheet' id='style-css' href='https://example.com/wp-content/themes/hoge/style.css' media='all' /> // W3Cエラーの出るタグ(JS) <script type='text/javascript' src='https://example.com/wp-includes/js/jquery/jquery.js?ver=1.12.4-wp'></script> // W3Cエラーを解決するタグ(JS) <script src='https://example.com/wp-includes/js/jquery/jquery.js?ver=1.12.4-wp'></script>
上記のように、タグから「type=”***/***”」の属性をなくすことで、W3Cのマークアップバリデーションのエラーを回避するため処理をfunctions.phpに書いていきます。
結論
add_action('template_redirect', function()
{
ob_start(function($buffer){
$scriptTags = [
'<script type="text/javascript"',
'<script type=\'text/javascript\'',
];
$styleTags = [
'<style type="text/css"',
'<style type=\'text/css\'',
];
$buffer = str_replace($scriptTags, '<script', $buffer);
$buffer = str_replace($styleTags, '<style', $buffer);
return $buffer;
});
});
add_filter('style_loader_tag', function($tag)
{
$tags = [
' type="text/css"',
' type=\'text/css\'',
];
$tag = str_replace($tags, '', $tag);
return $tag;
});
add_filter('script_loader_tag', function($tag)
{
$tags = [
' type="text/javascript"',
' type=\'text/javascript\'',
];
$tag = str_replace($tags, '', $tag);
return $tag;
});
上記プログラムの説明
そんなに難しいことはないのですが、上記プログラムが何をしているか説明していきます。
add_action('template_redirect', function()
{
ob_start(function($buffer){
$styleTags = [
'<style type="text/css"',
'<style type=\'text/css\'',
];
$buffer = str_replace($styleTags, '<style', $buffer);
$scriptTags = [
'<script type="text/javascript"',
'<script type=\'text/javascript\'',
];
$buffer = str_replace($scriptTags, '<script', $buffer);
return $buffer;
});
});
上の部分は、インラインのCSSとJSに関するタグの変更です。
$styleTagsと$scriptTabsでtype属性のついた部分を指定し、これらをstr_replace()でそれぞれのタグに変更するという記述です。
それぞれの$~~~Tagsの関数の2行目はバックスラッシュ(\)でシングルクォーテーション(’)をエスケープしています。
add_filter('style_loader_tag', function($tag)
{
$tags = [
' type="text/css"',
' type=\'text/css\'',
];
$tag = str_replace($tags, '', $tag);
return $tag;
});
add_filter('script_loader_tag', function($tag)
{
$tags = [
' type="text/javascript"',
' type=\'text/javascript\'',
];
$tag = str_replace($tags, '', $tag);
return $tag;
});
これは二つの add_filter() を使っていますが、上がCSSの置き換えで下がJSです。
基本的な操作はインラインと同じですが、それぞれのtype属性を空文字に変更して削除します。
filterフックとactionフックの知識が必要
コピペするだけでそのまま使えちゃうのですが、この辺をいじるにはfilterフックやactionフックの知識が必要になってきますね。
ちょっと難しそうな感じはしますが、この辺を勉強するとWordPressでできる事が増えるのでオススメです。