よろしくお願いします。
PHPでHTMLを書き換え、動的にページのタイトルのデザインを変えようと考えています。
以下では、ページタイトルを表示する部分のスタイルを、投稿がアイキャッチ画像を設定しているのかどうかで条件分岐し、その結果によって、あらかじめ生成していたhtmlの文字列にstyle属性を追加しようとしています。
HTML
1<!-- ページタイトルを表示するHTML --> 2<div class="page-header"> 3 <div class="page-header-inner container"> 4 <h1 class="page-header-title">ページタイトル</h1> 5 </div> 6</div>
php
1// 以下はWordPressのLightningというテーマをカスタマイズするため、子テーマのfunction.phpに記述 2 3/*-------------------------------------------*/ 4/* .page-header の変更 5/*-------------------------------------------*/ 6 7add_filter('lightning_page_header_title_html', 'show_thumb_on_page_header'); 8function show_thumb_on_page_header($page_header_title_html) { 9 // 引数:$page_header_title_html = '<h1 class="page-header-title">ページタイトル</h1>' 10 11 // アイキャッチ画像を設定しているか判定する 12 if (has_post_thumbnail()) { 13 // HTML文字列にstyle属性を追加 14 $new_page_header_title_html = substr_replace($page_header_title_html, ' style="color: #272424; text-shadow: 0 0 4px white;"', strpos($page_header_title_html, '>'), 0); 15 16 // タイトルを表示するh1タグの親要素のスタイルも同時に変更したかったため、そのためのstyleタグを記述 17 $added_style = '<style>.page-header {background-image: url("' . get_the_post_thumbnail_url() . '");} .page-header-inner {height: 100%; width: 100%; -webkit-backdrop-filter: blur(3px) brightness(110%); backdrop-filter: blur(3px) brightness(110%);}</style>'; 18 return $new_page_header_title_html . $added_style; 19 } 20 return $page_header_title_html; 21}
HTML
1<!-- 出力結果 --> 2<div class="page-header"> 3 <div class="page-header-inner container"> 4 <h1 class="page-header-title" style="color: #272424">ページタイトル</h1> 5 <style>.page-header {background-image: url("http://localhost:8080/wp-content/uploads/2021/08/cafe-talking-320x180.webp");} .page-header-inner {height: 100%; width: 100%; -webkit-backdrop-filter: blur(3px) brightness(110%); backdrop-filter: blur(3px) brightness(110%);} .page-header-title {text-shadow: 0 0 4px white;}</style> 6 </div> 7</div>
アイキャッチ画像を設定しているかどうかの条件分岐がうまくいっていることは確認済みです。
style属性で指定したtext-shadow以外はうまく表示されています。
colorとtext-shadowの順番を入れ替える→colorのみ出力
background-colorを追加で指定→colorとbackground-colorのみ出力
text-shadowの指定を$page_header_title_html内のh1タグにstyle属性でするのではなく、
$added_style内のstyleタグで指定するとスタイルは適用されました。(なので、今はこちらで進めています)
style属性でtext-shadowが指定できないのはなぜでしょうか?
style=""で指定してはいけないものなどがあるのでしょうか?
それともPHPのsubstr_replace関数で不具合が起こるのでしょうか?
追記
文章が冗長になってしまい申し訳ないです。
原因が判明したものの、どう解決すればいいのか分からなかったので追記します。
頂いた回答からピンときて、試しに下記のようにechoでapply_filtersを介さずに出力すると、意図した通りになりました。
PHP
1$new_page_header_title_html = substr_replace($page_header_title_html, ' style="color: #272424; text-shadow: 0 0 4px white;"', strpos($page_header_title_html, '>'), 0); 2 3echo $new_page_header_title_html;
HTML
1<!-- 自分でechoして出力したもの --> 2<h1 class="page-header-title" style="color: #272424; text-shadow: 0 0 4px red;">ページタイトル</h1> 3<!-- Lightningのpage-header.phpのapply_filtersを介して出力されたもの --> 4<h1 class="page-header-title" style="color: #272424">ページタイトル</h1>
これらのことからフィルターフックを適用しているLightningテーマのpage-header.phpの部分が原因と判明しました。
PHP
1/*-------------------------------------------*/ 2/* print 3/*-------------------------------------------*/ 4$allowed_html = array( 5 'i' => array( 6 'class' => array(), 7 ), 8 'br' => array(), 9 'strong' => array(), 10); 11?> 12<div class="page-header"><div class="page-header-inner container"> 13<?php echo wp_kses_post( apply_filters( 'lightning_page_header_title_html', $page_header_title_html ) ) ; ?> 14</div></div><!-- [ /.page-header ] -->
こちらのwp_kses_post()で値が変更されてそうです。
関数リファレンス/wp kses post
最終的な質問
wp_kses_post()でh2タグのstyle="text-shadow:;"を許可するにはどうすればいいでしょうか。
上記を子テーマから行うにはどうすればいいでしょうか。
回答2件
あなたの回答
tips
プレビュー