web-dev-qa-db-fra.com

Ajouter dynamiquement un identifiant aux balises de titre

Comment ajouter un attribut id dynamiquement à chaque balise de titre d'un site web wordpress utilisant php? Je voulais faire en sorte que, pour chaque balise de titre (h1, h2, h3, h4, h5, h6), j'ai un identifiant unique attaché de sorte qu'il ressemble à ceci: <h1 id="this_is_sparta">This Is Sparta</h1>

Donc, je peux y accéder en utilisant <a href="#this_is_sparta">Go to This Is Sparta</a>

Je cherche une solution à ce problème depuis des heures et je n'arrive pas à trouver quoi que ce soit. Si quelqu'un peut aider, rien ne serait apprécié!

Si cela doit être fait manuellement, tout va bien, il me faut simplement un moyen plus simple de le faire pour un client.

5
nwong212

J'ai eu ce même dilemme, et j'ai trouvé ce plugin: Ajouter des identifiants aux balises d'en-tête , et cela fonctionne très bien pour les publications. (Je ne suis en aucun cas affilié au plugin).

Pour que cela fonctionne aussi pour les pages, j'ai dû modifier le code, comme expliqué sur cette page de support: Ne pas ajouter d'identifiant

Il semble que le développeur ne soit pas actif et n'offre aucune assistance pour le plug-in. Si vous rencontrez des problèmes, vous devez les résoudre vous-même, malheureusement. Mais le plugin est un bon point de départ.

Dans le code suivant, j'ai supprimé la vérification "is_single ()" afin que le code fonctionne sur les pages et les publications. De plus, j'ai enlevé une partie du code "extra" pour l'adapter à la question de 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

Vous pouvez utiliser le filtre the_content, puis rechercher toutes les balises d'en-tête dans le contenu et ajouter des identifiants.

Pour rechercher des balises d'en-tête dans le contenu, vous pouvez utiliser des expressions Regex ou quelque chose comme simple_html_dom. Regardez this

0
Rajeev Vyas

Il existe une fonction dans wp-includes/formatting.php appelée sanitize_title_with_dashes que vous pouvez utiliser.

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

Si votre titre est This Is Sparta, la sortie sera this-is-sparta.

0
RRikesh