質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2733閲覧

LION MEDIAの投稿ページ目次の対象から<h4>~<h6>を除外したい

Hirokichi

総合スコア7

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/02/02 20:28

前提・実現したいこと

WordpressでLION MEDIAというテーマを利用していますが、実装されている投稿ページの目次生成機能の対象が<h1><h6>となっているところ、<h4><h6>を除外し、<h1><h3>だけを表示されるようにしたいです。

使用している親テーマ:LION MEDIA
http://lionmedia.fit-jp.com/

発生している問題・エラーメッセージ

functions.phpの3706行目~3808行目を修正すれば実現できると考えていますが、うまくいきません。素人質問で申し訳ありませんがよろしくお願いします。

該当のソースコード

////////////////////////////////////////////////// //オリジナル目次を作成 ////////////////////////////////////////////////// function get_outline_info($content) { // 目次のHTMLを入れる変数を定義します。 $outline = ''; // 記事内のh1?h6タグを検索します。 if (preg_match_all('/<h([1-6])>(.*?)</h\1>/', $content, $matches, PREG_SET_ORDER)) { // 記事内で使われているh1?h6タグの中の、1?6の中の一番小さな数字を取得します。 // ※以降ソースの中にある、levelという単語は1?6のことを表します。 $min_level = min(array_map(function($m) { return $m[1]; }, $matches)); // スタート時のlevelを決定します。 // ※このレベルが上がる毎に、<ul></li>タグが追加されていきます。 $current_level = $min_level - 1; // 各レベルの出現数を格納する配列を定義します。 $sub_levels = array('1' => 0, '2' => 0, '3' => 0, '4' => 0, '5' => 0, '6' => 0); // 記事内で見つかった、hタグの数だけループします。 foreach ($matches as $m) { $level = $m[1]; // 見つかったhタグのlevelを取得します。 $text = $m[2]; // 見つかったhタグの、タグの中身を取得します。 // li, ulタグを閉じる処理です。2ループ目以降に中に入る可能性があります。 // 例えば、前回処理したのがh3タグで、今回出現したのがh2タグの場合、 // h3タグ用のulを閉じて、h2タグに備えます。 while ($current_level > $level) { $current_level--; $outline .= '</li></ul>'; } // 同じlevelの場合、liタグを閉じ、新しく開きます。 if ($current_level == $level) { $outline .= '</li><li class="outline__item">'; } else { // 同じlevelでない場合は、ul, liタグを追加していきます。 // 例えば、前回処理したのがh2タグで、今回出現したのがh3タグの場合、 // h3タグのためにulを追加します。 while ($current_level < $level) { $current_level++; $outline .= sprintf('<ul class="outline__list outline__list-%s"><li class="outline__item">', $current_level); } // 見出しのレベルが変わった場合は、現在のレベル以下の出現回数をリセットします。 for ($idx = $current_level + 0; $idx < count($sub_levels); $idx++) { $sub_levels[$idx] = 0; } } // 各レベルの出現数を格納する配列を更新します。 $sub_levels[$current_level]++; // 現在処理中のhタグの、パスを入れる配列を定義します。 // 例えば、h2 -> h3 -> h3タグと進んでいる場合は、 // level_fullpathはarray(1, 2)のようになります。 // ※level_fullpath[0]の1は、1番目のh2タグの直下に入っていることを表します。 // ※level_fullpath[1]の2は、2番目のh3を表します。 $level_fullpath = array(); for ($idx = $min_level; $idx <= $level; $idx++) { $level_fullpath[] = $sub_levels[$idx]; } $target_anchor = 'outline__' . implode('_', $level_fullpath); // 目次に、<a href="#outline_1_2">1.2 見出し</a>のような形式で見出しを追加します。 $outline .= sprintf('<a class="outline__link" href="#%s"><span>%s.</span> %s</a>', $target_anchor, implode('.', $level_fullpath), $text); // 本文中の見出し本体を、<h3>見出し</h3>を<h3 id="outline_1_2">見出し</h3> // のような形式で置き換えます。 $content = preg_replace('/<h([1-6])>/', '<h\1 id="' . $target_anchor . '">', $content, 1); } // hタグのループが終了後、閉じられていないulタグを閉じていきます。 while ($current_level >= $min_level) { $outline .= '</li></ul>'; $current_level--; } } return array('content' => $content, 'outline' => $outline); } //目次を作成します。 function add_outline($content) { // 目次関連の情報を取得します。 $outline_info = get_outline_info($content); $content = $outline_info['content']; $outline = $outline_info['outline']; if ($outline != '') { // 目次を装飾します。 $decorated_outline = sprintf(' <div class="outline"> <span class="outline__title">目次</span> <input class="outline__toggle" id="outline__toggle" type="checkbox" checked="checked"> <label class="outline__switch" for="outline__toggle"></label> %s </div>', $outline); // カスタマイザーで目次を非表示にする以外が選択された時&個別非表示が1以外の時に目次を追加します。 if ( get_option('fit_post_outline') != 'value2' && get_post_meta(get_the_ID(), 'outline_none', true) != '1' && is_single() ) { $shortcode_outline = '[outline]'; if (strpos($content, $shortcode_outline) !== false) { // 記事内にショートコードがある場合、ショートコードを目次で置換します。 $content = str_replace($shortcode_outline, $decorated_outline, $content); } else if (preg_match('/<h[1-6].*>/', $content, $matches, PREG_OFFSET_CAPTURE)) { // 最初のhタグの前に目次を追加します。 $pos = $matches[0][1]; $content = substr($content, 0, $pos) . $decorated_outline . substr($content, $pos); } } } return $content; } add_filter('the_content', 'add_outline');

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

// 記事内のh1?h6タグを検索します。 if (preg_match_all('/<h([1-6])>(.*?)</h\1>/', $content, $matches, PREG_SET_ORDER)) {

ここの1-61-3に変えればどうですか?

投稿2018/02/03 03:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hirokichi

2018/02/03 03:07

ご回答ありがとうございます!! 教えていただいた // 記事内のh1?h6タグを検索します。 if (preg_match_all('/<h([1-6])>(.*?)</h\1>/', $content, $matches, PREG_SET_ORDER)) { の[1-6]を[1-3]に変更すると以下のようなエラーメッセージが出てしまうのです。。。 エラーメッセージ wp-content/themes/lionmedia/functions.php ファイルの3713行目のエラーのため、PHP コードの変更をロールバックしました。修正し、もう一度保存してください。 syntax error, unexpected ' if' (T_STRING) これも理解できず、困ってしまっている状況です。。。
退会済みユーザー

退会済みユーザー

2018/02/03 03:41

管理画面から編集しようとしてますか? テーマの編集は管理画面ではなくFTPなどを使って行うようにしてください。 もし、編集ミスがあった場合には管理画面にログイン出来なくなったりするので。 とりあえず6を3に変えるだけなら構文エラーなわけがないのでエラーになる理由は分かりません。
Hirokichi

2018/02/04 03:00

管理画面から変更しようとしていました。 コメントいただいたようにFTPで変更したらうまくいきました!! 本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問