• ショートコードで、指定した<h2>配下の<h3>〜<h6>のタイトルタグのリスト表示をしたいと思っています。

    例えば、以下のようなHTMLの場合に

    <h2>h2-1</h2>
     <h3>h2-1 h3-1</h3>
     <h3>h2-1 h3-2</h3>
     <h3>h2-1 h3-3</h3>
     <h2>h2-2</h2>
     <h3>h2-2 h3-1</h3>
     <h3>h2-2 h3-2</h3>
     <h3>h2-2 h3-3</h3>
     <h2>h2-3</h2>
     <h3>h2-3 h3-1</h3>
     <h3>h2-3 h3-2</h3>
     <h3>h2-3 h3-3</h3>

    [test_code h2_index=”2″]とすると、

    <h3>h2-2 h3-1</h3>
     <h3>h2-2 h3-2</h3>
     <h3>h2-2 h3-3</h3>

    と表示させるようにしたいです。

    以下のコードは作成中なのですが、現時点でも$h2_index_contentは指定した<h2>配下の、<h2>を除いたタイトル行のリストとなるはずなのですが、確認すると$h2_index_contentには上記の一番初めのhtmlと同様に記事内全ての<h2>と<h3>のタイトルが表示されてしまいます(なぜか<h4>以下は表示されない)

    function _test_code( $atts ) {
        $args = shortcode_atts( array(
            'h2_index' => '',
        ), $atts );
    
        $post = get_post();
        $content = $post->post_content;
        $headers = array();
        preg_match_all( '/<([hH][1-6]).*?>(.*?)<\/[hH][1-6].*?>/u', $content, $headers );
        
    
    // $h2_indexが空でなかった場合、$headersの値を$h2_indexで指定した内容のみに変更する
    if ($args['h2_index'] !== ''){ //$this->atts表記を$args変更 
        // h2_index の引数を取得
        $h2_index = intval($args['h2_index']); //$this->atts表記を$args変更
    
        //$headers[0][](タグ全部) のh2タグが$h2_index番目から次のh2までを抜き出す
        if ($h2_index > 0 && $h2_index <= count($headers[0])) {
            // h2_indexが有効な範囲にある場合の処理
        
            $count_h2 = 0;  // h2タグのカウントを初期化
            $h2_index_content = '';  // 抜き出したh2タイトルhtml行を格納する変数
    
            //$headers[0](タイトルタグ全部を配列で格納した変数) を順番に処理する
            foreach ($headers[0] as $tag) {
    
                // 今持っているタグがh2タグだったら、$count_h2にカウントを増やす
    
                if (preg_match('/<h2\b[^>]*>/', $tag)) { //今持ってるタグがh2かどうか
                    $count_h2++; //h2なら$count_h2に1足す
                }
                
                if ($count_h2 > $h2_index) { //指定していたh2の順番より今持っているh2タグの順番の方が後ろの場合
                    break;
                } elseif ($count_h2 == $h2_index && !preg_match('/<h2\b[^>]*>/', $tag) ) { //h2タグカウンタが指定した順番と一致していて、h2タグではない(=h3〜h6)場合
                    $h2_index_content .= $tag;
                } 
    		}
    	}
    
        // 配列の内容を表示する
        $h2_index_content = $headers[0][$h2_index] . ' ' . $headers[1][$h2_index] . ' ' . $headers[2][$h2_index];
    
        // ヘッダーの内容を表示する
        $matches_string = var_export($headers, true);
        $output = '<pre>' . $matches_string . '</pre>';
    
        // $h2_index_content も表示する
        $output .= '<div>' . $h2_index_content . '</div>';
    
        return $output;
    	
    }
    
    }
    add_shortcode('test_code', '_test_code');

    PHP初心者で、大変恐縮なのですが、ご教示いただけますと幸いです。
    よろしくお願いします。

  • トピック「ショートコードを用いたPHPコードがうまく表示できない」には新たに返信することはできません。