サポート » その他 » 自作ショートコードが表示できない

  • 解決済 yuu222

    (@yuu222)


    任意のid要素部分から次のh2タグ直前までを取得し、そのなかからh3のみを抽出し、リンクリストを作るためのショートコードを作りたいのですが、うまく動かず質問いたします。

    $content_before_h2には正しく値が格納されているように見えます。$matchesの値が空になっており、これが問題ではと思っています。

    PHP初心者で解決方法が見出せず、ご教示いただければ幸いです。
    よろしくお願いします。

    ***
    ↓ショートコード
    [extract_h3_to_link_list id=”test-h2″]
    ※idを指定した要素はショートコード前後に記述

    ↓function PHP への記述

    function extract_h3_to_link_list($atts) {
    // ショートコードで指定されたID
    $id = isset($atts['id']) ? $atts['id'] : '';
    
    // 現在の記事の本文を取得
    global $post;
    $post_content = $post->post_content;
    
    // 指定したIDが設定された要素の位置を取得
    $element_position = strpos($post_content, 'id="' . $id . '"');
    
    if ($element_position !== false) {
        // 指定したIDの要素から次に出現する <h2> タグの位置を取得
        $next_h2_position = strpos($post_content, '<h2', $element_position);
    
        if ($next_h2_position !== false) {
            // <h2> タグ直前までのコンテンツを抽出
            $content_before_h2 = substr($post_content, $element_position, $next_h2_position - $element_position);
    
            // 正規表現を使用して <h3>...</h3> の内容を抽出
            preg_match_all('/<h3>([^<]+)<\/h3>/', $content_before_h2, $matches);
    
            // リンクリストのHTMLを構築
            $link_list = '<ul>';
            foreach ($matches[1] as $item) {
                $link_list .= '<li><a href="#">' . $item . '</a></li>';
            }
            $link_list .= '</ul>';
    
    return $link_list;
        }
    }
    
    }add_shortcode('extract_h3_to_link_list', 'extract_h3_to_link_list');
    • このトピックはyuu222が4ヶ月、 2週前に変更しました。
    • このトピックはyuu222が4ヶ月、 2週前に変更しました。
2件の返信を表示中 - 1 - 2件目 (全2件中)
  • こんにちは

    $content_before_h2には正しく値が格納されているように見えます。$matchesの値が空になっており、これが問題ではと思っています。

    $content_before_h2 の値が正しいとすれば、preg_match_all() の正規表現に問題があるのではないでしょうか?h3 タグが id 属性を持っていたりしませんか?

    トピック投稿者 yuu222

    (@yuu222)

    ご返信ありがとうございます!

    h3 タグが id 属性を持っていたりしませんか?

    はい、持っています。
    持っている場合この書き方だとおかしいのでしょうか、、?
    以下に訂正し、無事表示ができました。

    // 正規表現を使用して <h3>...</h3> の内容を抽出
            preg_match_all('/<h3>([^<]+)<\/h3>/', $content_before_h2, $matches);

    preg_match_all('/<h3[^>]*>(.*?)<\/h3>/', $content_before_h2, $matches);

    ありがとうございました。

    • この返信は4ヶ月、 2週前にyuu222が編集しました。
    • この返信は4ヶ月、 2週前にyuu222が編集しました。
2件の返信を表示中 - 1 - 2件目 (全2件中)
  • このトピックに返信するにはログインが必要です。