-
投稿者投稿
-
2024年9月25日 8:45 PM #141881
【お使いの Snow Monkey のバージョン】 27.2.2
【お使いの Snow Monkey Blocks のバージョン】22.1.0
【お使いの Snow Monkey Editor のバージョン】10.0.4
【お使いのブラウザ】Chrome
【当該サイトのURL】### 実現したいこと
お世話になっております。
SEOを考慮して、アコーディオンブロックのタイトルにh2を付けたいのですが、
方法があれば教えていただければ幸いです。
よろしくお願い申し上げます。♥ 0いいねをした人: 居ません2024年9月28日 10:40 AM #141920返信遅くなりすみません!外出先で返信しようと思っていたらパソコンがまさかの電池切れだったため、ひとまず実現に必要な技術だけ書いておきます!
あとでコードを書いてみようと思っていますが、お急ぎであれば下記を参考に書いてみてください。
アコーディオンアイテムの HTML の書き換えなので、
render_block_snow-monkey-blocks/accordion-item
フックを使います。上記トピックでは単純な置換なので str_replace() を使っていますが、今回は開始タグと終了タグの書き換えが必要であり、入れ子を考慮すると単純な置換は難しいので HTML API を使って置換するのが良いと思います。
2024年9月28日 2:41 PM #141927書いてみました!WordPress の HTML API で書き換えられるのは属性だけでタグは書き換えられなかったので、PHP の DOMDocument と DOMXPath を使ってみました。
add_filter( 'render_block_snow-monkey-blocks/accordion-item', function( $block_content ) { $doc = new \DOMDocument; $doc->loadXML( $block_content ); $xpath = new \DOMXPath( $doc ); $divsToReplace = $xpath->query( "//div[contains(@class, 'smb-accordion__item__title')]" ); foreach ( $divsToReplace as $div ) { $h2 = $doc->createElement( 'h2', $div->nodeValue ); foreach ( $div->attributes as $attr ) { $h2->setAttribute( $attr->name, $attr->value ); } $div->parentNode->replaceChild( $h2, $div ); } return $doc->saveXML(); } );
render_block_{ブロック名}
フックが実行されるのはフロントだけで、エディター上では下記変わらないのでご注意ください。2024年9月28日 5:42 PM #141934お世話になっております。ご教授いただきましてありがとうございます!
ご返信いただいたコードをMy Snowmonkeyへ記述することですぐにh2の挿入が叶いました。大変助かりました。本当にありがとうございます。
♥ 0いいねをした人: 居ません2024年9月28日 6:03 PM #141935恐れ入ります、h2の挿入は叶いましたがアコーディオンの右側のarrowアイコンが消えてしまったようです。こちら出現させられますでしょうか。
♥ 0いいねをした人: 居ません2024年9月30日 12:33 PM #141959あーほんとですね…。僕が DOMDocument に詳しくなく、入れ子を維持したままタグの置換をおこなう方法がよくわからなかったので、
preg_replace()
を使ってspan.smb-accordion__item__title__label
をh2.smb-accordion__item__title__label
に置換するコードを書いてみました。入れ子の深いところをh2
に置換するので HTML にこれで良いのかよくわかりませんが、とりあえず置換はうまくいきました。add_filter( 'render_block_snow-monkey-blocks/accordion-item', function( $block_content ) { return preg_replace( '|<span class="smb-accordion__item__title__label">(.+?)</span>|ms', '<h2 class="smb-accordion__item__title__label">$1</h2>', $block_content ); } );
ただ、Snow Monkey Blocks のアップデート等により、クラス名が変わったり
span
に属性が追加されたりすると、この置換処理は効かなくなるので、その点はご注意ください。2024年9月30日 6:22 PM #141973お忙しいところご対応いただきましてありがとうございます!
>>Snow Monkey Blocks のアップデート等により、クラス名が変わったり span に属性が追加されたりすると、この置換処理は効かなくなるので、その点はご注意ください。
メンテナンス性を考えると、先にご教示いただきました「PHP の DOMDocument と DOMXPath使用のコード」の方が良いでしょうか?
その場合、矢印は何かしら擬似でつけるという方法も考えます。どちらもSnow Monkey Blocks のアップデートに影響が出る可能性が同じなら、
矢印が付いている後のコードを使用させていただきたいと考えております。♥ 0いいねをした人: 居ません2024年9月30日 8:34 PM #1419752024年10月7日 5:05 PM #142084お世話になっております。
入力済みのアコーディオンを編集したところ、以下のエラーが出てしまいました。お忙しいところ恐れ入りますが、ご確認いただければ幸いです
Warning: DOMDocument::loadXML(): Opening and ending tag mismatch: br line 3 and p in Entity, line: 3 in XXX/wp-content/plugins/my-snow-monkey/my-snow-monkey.php on line 204
Warning: DOMDocument::loadXML(): Opening and ending tag mismatch: p line 3 and div in Entity, line: 4 in XXX/wp-content/plugins/my-snow-monkey/my-snow-monkey.php on line 204
Warning: DOMDocument::loadXML(): Premature end of data in tag div line 2 in Entity, line: 5 in XXX/wp-content/plugins/my-snow-monkey/my-snow-monkey.php on line 204
♥ 0いいねをした人: 居ません2024年10月8日 10:00 AM #1420912024年10月8日 12:29 PM #142093ご返信ありがとうございます。
こちらのコードを使ってみまして、エラーは出なくなりましたがいかがでしょうか。// アコーディオンのタイトルをh2にする add_filter( 'render_block_snow-monkey-blocks/accordion-item', function( $block_content ) { // <br> を <br /> に置き換え $block_content = str_replace('<br>', '<br />', $block_content); $doc = new \DOMDocument; // XMLエラーを避けるための設定(警告を抑える) libxml_use_internal_errors(true); $doc->loadXML( $block_content ); // XPathを使用して div 要素を検索・置換 $xpath = new \DOMXPath( $doc ); $divsToReplace = $xpath->query( "//div[contains(@class, 'smb-accordion__item__title')]" ); foreach ( $divsToReplace as $div ) { $h2 = $doc->createElement( 'h2', $div->nodeValue ); foreach ( $div->attributes as $attr ) { $h2->setAttribute( $attr->name, $attr->value ); } $div->parentNode->replaceChild( $h2, $div ); } return $doc->saveXML(); } );
♥ 0いいねをした人: 居ません2024年10月9日 11:03 AM #1421112024年10月11日 8:36 AM #142146お世話になります。
編集してもエラーは出ないのですが、
ソースを確認すると、h2の中身(タイトル部分)が、「&#x〜」になってしまっていました。アコーディオンのタイトルをh2にするのは以下を使った方が良いでしょうか。
その場合、アップデート時に気が付かずいつの間にかh2では無くなっている可能性がありますよね・・・add_filter( ‘render_block_snow-monkey-blocks/accordion-item’, function( $block_content ) { return preg_replace( ‘|<span class=”smb-accordion__item__title__label”>(.+?)</span>|ms’, ‘<h2 class=”smb-accordion__item__title__label”>$1</h2>’, $block_content ); }
♥ 0いいねをした人: 居ません2024年10月11日 10:11 AM #142148これどうですかね?
♥ 0いいねをした人: 居ません2024年10月31日 10:10 AM #142478お世話になります。
ご報告が遅くなりまして申し訳ございません。
「PHP の DOMDocument と DOMXPath使用のコード」で、「日本語を含むHTMLの一部分を文字列として生成」を使い、さらに擬似で開くボタンをつけることで解決しました!
お忙しいところありがとうございました。♥ 0いいねをした人: 居ません -
投稿者投稿
- トピック「アコーディオンブロックのタイトルにh2を付ける方法」には新しい返信をつけることはできません。