#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');