質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

957閲覧

PHPのsubstr_replace()でhtml文字列に追加したstyle="text-shadow: ;"のみが適用されない

ry0xi

総合スコア4

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/08/02 10:39

編集2021/08/02 12:16

よろしくお願いします。

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:;"を許可するにはどうすればいいでしょうか。
上記を子テーマから行うにはどうすればいいでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/08/02 10:49

HTMLに直接書いて反映されるなら、phpで出力したテキストと 比較するだけでは?
ry0xi

2021/08/02 10:54

開発者ツールなどでstyle="text-shadow: 0 0 4px white;"を直接タグに追加すると適用されるのですが、PHPのsubstr_replaceでtext-shadow:0 0 4px white;の部分だけ省略されてしまい、出力できないのです。
guest

回答2

0

ベストアンサー

ソースコードを追った方が早い案件

safecss_filter_attr

php

1add_filter('safe_style_css',function($allowed_attr){ 2 return array_merge($allowed_attr,['text-shadow']); 3));

投稿2021/08/03 00:33

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ry0xi

2021/08/03 04:04

ありがとうございます。 上記コードを子テーマのfunctions.phpに記述すると無事に適用されました。 「ソースコードを追う」というのは具体的にどういう風に行うのでしょうか? リストに追加できるフィルターフックがあると見越して、該当ページでapply_filtersで検索して探す感じですか?
KazuhiroHatano

2021/08/03 04:50

公式のコードリファレンスでソースコードを見て処理を追ってみる感じです https://developer.wordpress.org/reference/functions/wp_kses/ フィルタフックを見つけるのが目的であれば apply_filtersを検索するのが手っ取り早いことも多いですが どのタイミングでそのフィルタが適用されているかというのを ソースコードの処理を追って知っていると どういうことはできてどういうことはできない ということが正確にわかるようになります
guest

0

ごめんなさい、どこが引っかかっているかちょっとわかりません

PHP

1$page_header_title_html = '<h1 class="page-header-title">ページタイトル</h1>'; 2$new_page_header_title_html = substr_replace($page_header_title_html, ' style="color: #272424; text-shadow: 0 0 4px red;"', strpos($page_header_title_html, '>'), 0); 3$new_page_header_title_html .= $added_style; 4print $new_page_header_title_html;

普通に動作しますよね?

投稿2021/08/02 11:09

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/08/02 11:10

どうしても改善しない場合は、DOMDocumentで処理するとか・・・
ry0xi

2021/08/02 11:34

1度環境を変えて試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問