アコーディオンブロックのタイトルにh2を付ける方法

0
いいねをした人: 居ません
  • このトピックには14件の返信、2人の参加者があり、最後にreadにより1ヶ月前に更新されました。
15件の投稿を表示中 - 1 - 15件目 (全15件中)
  • 投稿者
    投稿
  • #141881
    read
    参加者
    16

    【お使いの Snow Monkey のバージョン】 27.2.2
    【お使いの Snow Monkey Blocks のバージョン】22.1.0
    【お使いの Snow Monkey Editor のバージョン】10.0.4
    【お使いのブラウザ】Chrome
    【当該サイトのURL】

    ### 実現したいこと

    お世話になっております。
    SEOを考慮して、アコーディオンブロックのタイトルにh2を付けたいのですが、
    方法があれば教えていただければ幸いです。
    よろしくお願い申し上げます。

    0
    いいねをした人: 居ません
    #141920
    アバター画像キタジマ タカシ
    参加者
    2426

    返信遅くなりすみません!外出先で返信しようと思っていたらパソコンがまさかの電池切れだったため、ひとまず実現に必要な技術だけ書いておきます!

    あとでコードを書いてみようと思っていますが、お急ぎであれば下記を参考に書いてみてください。

    アコーディオンアイテムの HTML の書き換えなので、render_block_snow-monkey-blocks/accordion-item フックを使います。

    上記トピックでは単純な置換なので str_replace() を使っていますが、今回は開始タグと終了タグの書き換えが必要であり、入れ子を考慮すると単純な置換は難しいので HTML API を使って置換するのが良いと思います。

    1
    いいねをした人:
    #141927
    アバター画像キタジマ タカシ
    参加者
    2426

    書いてみました!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_{ブロック名} フックが実行されるのはフロントだけで、エディター上では下記変わらないのでご注意ください。

    1
    いいねをした人:
    #141934
    read
    参加者
    16

    お世話になっております。ご教授いただきましてありがとうございます!
    ご返信いただいたコードをMy Snowmonkeyへ記述することですぐにh2の挿入が叶いました。

    大変助かりました。本当にありがとうございます。

    0
    いいねをした人: 居ません
    #141935
    read
    参加者
    16

    恐れ入ります、h2の挿入は叶いましたがアコーディオンの右側のarrowアイコンが消えてしまったようです。こちら出現させられますでしょうか。

    0
    いいねをした人: 居ません
    #141959
    アバター画像キタジマ タカシ
    参加者
    2426

    あーほんとですね…。僕が DOMDocument に詳しくなく、入れ子を維持したままタグの置換をおこなう方法がよくわからなかったので、preg_replace() を使って span.smb-accordion__item__title__labelh2.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 に属性が追加されたりすると、この置換処理は効かなくなるので、その点はご注意ください。

    1
    いいねをした人:
    #141973
    read
    参加者
    16

    お忙しいところご対応いただきましてありがとうございます!

    >>Snow Monkey Blocks のアップデート等により、クラス名が変わったり span に属性が追加されたりすると、この置換処理は効かなくなるので、その点はご注意ください。

    メンテナンス性を考えると、先にご教示いただきました「PHP の DOMDocument と DOMXPath使用のコード」の方が良いでしょうか?
    その場合、矢印は何かしら擬似でつけるという方法も考えます。

    どちらもSnow Monkey Blocks のアップデートに影響が出る可能性が同じなら、
    矢印が付いている後のコードを使用させていただきたいと考えております。

    0
    いいねをした人: 居ません
    #141975
    アバター画像キタジマ タカシ
    参加者
    2426

    メンテナンス性を考えると、先にご教示いただきました「PHP の DOMDocument と DOMXPath使用のコード」の方が良いでしょうか?

    そうですね、文字列置換ではないのでその方が多少リスクは低いとは思います。

    1
    いいねをした人:
    #142084
    read
    参加者
    16

    お世話になっております。
    入力済みのアコーディオンを編集したところ、以下のエラーが出てしまいました。

    お忙しいところ恐れ入りますが、ご確認いただければ幸いです

    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
    いいねをした人: 居ません
    #142091
    アバター画像キタジマ タカシ
    参加者
    2426

    あー Opening and ending tag mismatch: br とあるので br が閉じてないのだと思います。<br /> じゃなくて <br> になっているのかなと。多分 WordPress のデフォルトが <br> なのだと思うので、DOMDocument::loadXML() する前に str_replace()<br><br /> にするとかが必要なのかもしれません。

    1
    いいねをした人:
    #142093
    read
    参加者
    16

    ご返信ありがとうございます。
    こちらのコードを使ってみまして、エラーは出なくなりましたがいかがでしょうか。

    // アコーディオンのタイトルを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
    いいねをした人: 居ません
    #142111
    アバター画像キタジマ タカシ
    参加者
    2426

    僕も DOMDocumentDOMXPath は使ったことがないのでこれで問題ないと断言はできないのですが、エラーがでていないのであればひとまず大丈夫なのではないかと思います。アコーディオンの中身を書き換えたときにまたエラーがでるようなら調整が必要かもしれません。

    1
    いいねをした人:
    #142146
    read
    参加者
    16

    お世話になります。
    編集してもエラーは出ないのですが、
    ソースを確認すると、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
    いいねをした人: 居ません
    #142148
    アバター画像キタジマ タカシ
    参加者
    2426

    これどうですかね?

    0
    いいねをした人: 居ません
    #142478
    read
    参加者
    16

    お世話になります。
    ご報告が遅くなりまして申し訳ございません。
    「PHP の DOMDocument と DOMXPath使用のコード」で、「日本語を含むHTMLの一部分を文字列として生成」を使い、さらに擬似で開くボタンをつけることで解決しました!
    お忙しいところありがとうございました。

    0
    いいねをした人: 居ません
15件の投稿を表示中 - 1 - 15件目 (全15件中)
  • トピック「アコーディオンブロックのタイトルにh2を付ける方法」には新しい返信をつけることはできません。

ドキュメント

Snow Monkey の設定方法やマニュアルを掲載しています。

ドキュメント

フォーラム

Snow Monkey の使い方やカスタマイズについてのご質問・ご要望等はサポートフォーラムで行っています。サポートフォーラムは誰でも閲覧できますが、書き込みできるのは Snow Monkey 購入者のみとなります。

サポートフォーラム

よくあるご質問

Snow Monkey のサービスについて不明な点がある場合は、まずはよくあるご質問をご確認ください。

よくあるご質問

お問い合わせ

よくあるご質問を見ても解決しなかった場合、試用版の申請については問い合わせフォームからお願いいたします。

お問い合わせ

Snow Monkey は Gutenberg ブロックエディターに対応した 100%GPL の WordPress テーマです。拡張性を意識した開発をおこなっており、カスタマイザーとブロックでスピーディーにサイトを立ち上げるだけでなく、CSS やフックを駆使した高度なカスタマイズにも柔軟に対応できます。