質問の回答にならないのですが、HTML5からは「暗黙的なセクショニング」というのがあり、明示的に書かなくても、大丈夫な仕様になっているみたいです。
HTML5の仕様とは関係なく、「それぞれの見出しごとに<section>で囲うことができる方法」を知りたいという場合、すいません答えを持ち合わせおりませんが・・・
一応参考情報として書かせて頂きました。
参考URL:https://developer.mozilla.org/ja/docs/Web/HTML/Sections_and_Outlines_of_an_HTML5_document#Implicit_Sectioning
こんにちは、
記法もどきの処理をすると簡単ではないかと思います。
投稿本文に
###
<h1>見出し</h1>
<p>テキスト</p>
###
<h1>見出し</h1>
<p>テキスト</p>
###
<h1>見出し</h1>
<p>テキスト</p>
で、functions.phpの最初(<?php
の前)に貼り付けてみてください
<?php
add_filter( 'the_content','my_section_notation',9 );
function my_section_notation( $content ) {
$notation = '###';
$result = '';
if ( preg_match( '!^'.$notation.'!m', $content ) ) {
$sections = explode( $notation, $content );
foreach( $sections as $key=>$val ) {
if ( ! empty( $val ) ) {
$result .= "<section>\n\n{$val}\n\n</section>";
}
}
return $result;
}
return $content;
}
?>
###は、何でもいいですが、投稿にはこの目的以外で出現しないパターンの文字
コードの意味がわからないときには、何かとトラブルの元になるかもしれないので、(テストもぜんぜんしていないので)使わないほうがいいかもしれないですが、ヒントになればと思い書き込みます
- 本文の最初は必ず
<section>
で始まってよい
- 途中の
<h1>
の前は必ず</p>
で終わっている
- 本文の最後は必ず
</section>
で終わってよい
という条件が必要なので、nobita さんのものほど汎用にはならないと思いますが、もう一つのヒントということで。</p>
と<h1>
の間に何かあると削除されますので、ご注意を。
add_filter('the_content', 'add_sectioning_tag');
function add_sectioning_tag($content) {
$content = preg_replace("/\/p>.*?<h1/is", '/p></section><section><h1', $content);
$content = '<section>' . $content . '</section>';
return $content;
}
トピック投稿者
egah
(@egah)
回答ありがとうございます。
Hosoya Takashi様
暗黙的なセクショニングというものがあったのですね、初めて知りました。
<section>を明示せずとも仕様としては問題ないようですが、
HTMLのコードに統一性を持たせたいので今回は<section>を明示する方向で行きたいと思います。
教えていただき、ありがとうございます。
nobita様
なるほど、こんな方法もあったのですね。
ただ、このコードの意味はまだ自分には理解できず、意図しない動作が怖いため、
申し訳ありませんが今回はその方法は使わないでおきます。
非常に勉強になります、ありがとうございます。
kjmtsh様
こういう置換方法がありましたか。
私の作ろうとしているブログの場合、形式が決まっているので
汎用性はあまり必要なく、この方法がピッタリのようです。
大変参考になりました。ありがとうございます。
これを基に自分なりに考えた結果、
<h1>の前が</p>以外で終わる可能性も考慮に入れて、
2つ目以降の<h1>についてまず置換した後、1つ目の<h1>を置換し、
末尾に</section>をつける、という方法にしました(コードが不恰好ではありますが)。
ただし、記事を投稿する際には必ず<h1>の見出しから始める必要がありますが、
私のブログの形式に限っては問題なしです。
add_filter('the_content', 'add_sectioning_tag');
function add_sectioning_tag($content) {
$content = preg_replace("/.<h1/is", '</section><section><h1', $content);
$content = preg_replace("/^<h1/is", '<section><h1', $content);
$content = $content . '</section>';
return $content;
}
お三方とも迅速な回答をくださり、誠にありがとうございました。