• 解決済 egah

    (@egah)


    <article>
        <section>
            <h1>見出し</h1>
            <p>テキスト</p>
        </section>
        <section>
            <h1>見出し</h1>
            <p>テキスト</p>
        </section>
    </article>

    上記のような<article>で囲まれた1つの記事の本文の中に
    複数の<section>が存在するHTMLにしたいのですが、
    本文の表示部分を

    <section>
        <?php the_content(); ?>
    </section>

    のようにしても、生成されるHTMLは当然ながら

    <article>
        <section>
            <h1>見出し</h1>
            <p>テキスト</p>
            <h1>見出し</h1>
            <p>テキスト</p>
        </section>
    </article>

    のようになってしまいます。
    1つの記事を書くたびに<section>を手書きで入力するのは大変骨が折れるので、
    それぞれの見出しごとに<section>で囲うことができる方法を探しています。
    get_the_contentで本文を取得して<section>で囲うコードを書けば何とかなるかと思うのですが、
    PHPの知識がほぼ皆無なため悩んでおります(現在急いで勉強中です)。
    直接の解決法ではなくとも、類似の事案をご存知の方はぜひ教えて頂ければ幸いです。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • 質問の回答にならないのですが、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;
    }
    ?>

    ###は、何でもいいですが、投稿にはこの目的以外で出現しないパターンの文字

    コードの意味がわからないときには、何かとトラブルの元になるかもしれないので、(テストもぜんぜんしていないので)使わないほうがいいかもしれないですが、ヒントになればと思い書き込みます

    1. 本文の最初は必ず<section>で始まってよい
    2. 途中の<h1>の前は必ず</p>で終わっている
    3. 本文の最後は必ず</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;
    }

    お三方とも迅速な回答をくださり、誠にありがとうございました。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「記事本文内の見出しごとにsectionタグを付けたい」には新たに返信することはできません。