web-dev-qa-db-ja.com

見出しタグにidを動的に追加する

Phpを使用してワードプレスWebサイトのすべての見出しタグにid属性を動的に追加する方法を教えてください。すべての見出しタグ(h1、h2、h3、h4、h5、h6)に固有のIDを付けて、次のようにすることを望みました。<h1 id="this_is_sparta">This Is Sparta</h1>

それで私は<a href="#this_is_sparta">Go to This Is Sparta</a>を使ってそれにリンクすることができます

私は今何時間もこの問題の解決策を探しています、そして私は何も見つけることができないようですので、誰かが助けてもらえれば何でも大歓迎です!

それが手動でされなければならないなら、すべては大丈夫です、私はただこれをクライアントのためにするより簡単な方法が必要です。

5
nwong212

私はこれと同じジレンマを持っていました、そして私はこのプラグインを見つけました: ヘッダタグにIDを追加します 、そしてそれは投稿に対してうまく働きます。 (私はこのプラグインには一切所属していません).

それがページにも機能するようにするために、私はこのサポートページで説明されているコードに変更を加える必要がありました: IDを追加しない

開発者はアクティブではなく、プラグインのサポートも提供していないようです。問題がある場合は、残念ながら自分で修正する必要があります。しかし、プラグインは最初から始めるのに最適な基盤です。

次のコードでは、コードがページと投稿の両方で機能するように、 "is_single()"チェックを削除しました。さらに私はそれがOPの質問に合うように "余分な"コードのいくつかを削除しました。

//Author URI: http://stephanis.info

add_filter( 'the_content', 'add_ids_to_header_tags' );
function add_ids_to_header_tags( $content ) {

    $pattern = '#(?P<full_tag><(?P<tag_name>h\d)(?P<tag_extra>[^>]*)>(?P<tag_contents>[^<]*)</h\d>)#i';
    if ( preg_match_all( $pattern, $content, $matches, PREG_SET_ORDER ) ) {
        $find = array();
        $replace = array();
        foreach( $matches as $match ) {
            if ( strlen( $match['tag_extra'] ) && false !== stripos( $match['tag_extra'], 'id=' ) ) {
                continue;
            }
            $find[]    = $match['full_tag'];
            $id        = sanitize_title( $match['tag_contents'] );
            $id_attr   = sprintf( ' id="%s"', $id );
            $replace[] = sprintf( '<%1$s%2$s%3$s>%4$s</%1$s>', $match['tag_name'], $match['tag_extra'], $id_attr, $match['tag_contents']);
        }
        $content = str_replace( $find, $replace, $content );
    }
    return $content;
}
3
Squazz

the_content filterを使用してから、コンテンツ内のすべてのヘッダータグを見つけて、idを追加することができます。

コンテンツ内のヘッダタグを見つけるためには、正規表現かsimple_html_domのようなものを使うことができます。 これ を見て

0
Rajeev Vyas

wp-includes/formatting.phpsanitize_title_with_dashes という名前の関数があります。

<h1 id="<?php echo sanitize_title_with_dashes( get_the_title() ); ?>"><?php the_title(); ?></h1>

あなたのタイトルがThis Is Spartaの場合、出力はthis-is-spartaになります。

0
RRikesh