Как автоматически добавлять идентификаторы к заголовкам с помощью functions.php в WordPress

#wordpress

#wordpress

Вопрос:

Мне интересно, как я мог бы реализовать уникальные идентификаторы для каждого элемента заголовка в сообщении (исключая страницы) в WordPress. То есть, если два заголовка идентичны, они должны получить разные идентификаторы. Идентификаторы также должны быть описательными. Пунктирная версия фактического текста заголовка великолепна.

Я нашел этот код в Интернете:

 // This function adds nice anchor with id attribute to our h2 tags for reference
// @link: http://www.w3.org/TR/html4/struct/links.html#h-12.2.3

function anchor_content_h2($content) {

    // Pattern that we want to match
    $pattern = '/<h2>(.*?)</h2>/';

    // now run the pattern and callback function on content
    // and process it through a function that replaces the title with an id 
    $content = preg_replace_callback($pattern, function ($matches) {
                $title = $matches[1];
                $slug = sanitize_title_with_dashes($title);
                return '<h2 id="' . $slug . '">' . $title . '</h2>';
            }, $content);
    return $content;
}

add_filter('the_content', 'anchor_content_h2');
  

Меня беспокоит то, что два одинаковых заголовка получат одинаковый идентификатор. Это также работает только для H2-элементов. Есть ли лучший способ делать то, что я хочу, или такого рода вещи вообще неразумно реализовывать?

Ответ №1:

Существует множество способов сделать это, но если вы используете post_name, вы получите уникальное, пунктирное и описательное значение. https://codex.wordpress.org/Class_Reference/WP_Post#Member_Variables_of_WP_Post

На моем месте я бы, скорее всего, вставил приведенный ниже код в соответствующий файл шаблона.

 the_title( '<h2 class="' . get_post_field( 'post_name', get_post() ) . '">', '</h2>'  );
  

РЕДАКТИРОВАТЬ — Значит, каждый раздел h2 не привязан к сообщению? Вы могли бы просто добавить $ slug с уникальным идентификатором.

 $slug = sanitize_title_with_dashes($title) . '-' . uniqid();
  

Комментарии:

1. Я не уверен, что это то, что я хочу сделать. Моя цель — чтобы каждый заголовок H2 в сообщении имел свой собственный уникальный и описательный идентификатор. Я не понимаю, как это поможет в этом? Чего мне здесь не хватает?

2. Ах, иметь ум программиста. Спасибо, это сработает. Чувствую себя немного глупо, но я пойду на это 🙂

Ответ №2:

Изменена функция, чтобы она работала со всеми уровнями заголовков (h1-h6).

 function dt_anchor_content_h1_h6 ($content) {
    // Pattern that we want to match
    $pattern = "~<h(1|2|3|4|5|6)[^>]*>(.*?)</h(1|2|3|4|5|6)>~";

    // now run the pattern and callback function on content
    // and process it through a function that replaces the title with an id
    $content = preg_replace_callback($pattern, function ($matches) {
        $title = $matches[2];
        $slug = sanitize_title_with_dashes($title);
        return "<h{$matches[1]} id='$slug-" . uniqid() ."'>" . $title . "</h{$matches[1]}>";
    }, $content);
    return $content;
}
add_filter('the_content', 'dt_anchor_content_h1_h6');