«
»
WordPressВсе для functions.phpВсе для разработки плагиновПлагиныШорткоды

Как добавить Автоматическое оглавление в WordPress

Как добавить Автоматическое оглавление в WordPress

Недавно я добавил автоматическое оглавление в наши более длинные сообщения.  Его код довольно минимален, и, поскольку он автоматический, мне не нужно беспокоиться о его обслуживании. Я расскажу вам, что он делает, чтобы вам не приходилось копаться в нашем минимизированном коде, если вы хотите использовать его. То, что вы видите здесь, – это первый рабочий проект, разработанный специально для наших нужд. Это может быть усовершенствовано в плагин, но я прошу вас не делать этого, так как у нас есть планы. Вот как это выглядит:

2020-09-21_17-43-51

Концепция автоматического оглавления

В длинных статьях, если я хочу оглавление, я добавляю этот шорткод:

[autoc]

Вот и все. Он автоматически собирает заголовки до указанного уровня и создает ссылку на них в виде списка. Вы знаете, как это происходит: это шорткод, зарегистрированный через PHP, вся магия происходит в JS, а внешний вид исходит от CSS. Я разобью каждый язык, чтобы вы поняли, что я имею в виду.

Шорткод PHP

Этот создает div с двумя настройками в качестве атрибутов данных. В stopatуказывает уровень заголовка (от h1 до h6) , до которого вы хотите видеть в оглавлении. Я обнаружил, что, если он углубляется в каждый маленький подзаголовок, список может оказаться очень длинным, и мне не нравится этот вид. Например, я не хочу включать опрос. offsetЭто отрегулировать положение прокрутки в пикселях. На этом сайте мы хотим прокрутить на 20 пикселей выше, где он обычно прокручивается (точная вершина заголовка). Это маленькая деталь, но она лучше. Кроме того, это могло бы противостоять липкому меню, если бы оно было Оба не допускаются для более удобного использования, так как имеют значения по умолчанию.

function lwp_4644_autoc($atts) { if (empty($atts)) { $atts = array(); } if (empty($atts['stopat'])) { $atts['stopat'] = 'h4'; } if (empty($atts['offset'])) { $atts['offset'] = '20'; } return '<div class="autoc" data-stopat="'.$atts['stopat'].'" data-offset="'.$atts['offset'].'"></div>'; } add_shortcode('autoc', 'lwp_4644_autoc');

Здесь используется только одна функция WordPress, которая очень проста. Полный шорткод с параметрами не по умолчанию будет выглядеть так:add_shortcode()

[autoc stopat=h3 offset=30]

Код ядра JS

О, сердце всего этого. Он строит список всех необходимых заголовков. Реальные заголовки и версии их оглавления связаны. Этот слаг может быть позже использован для #permalinks, но я решил пропустить эту функцию. Так что он еще не манипулирует URL. Щелчки по ссылкам в списке делают анимированный переход к парному заголовку, так просто. Основное внимание было уделено автоматизации, поэтому мне не нужно вести оглавление вручную.

;(function($) { $(document).ready(function(){ var $autoc = $(".autoc"); var $content = $autoc.parent(); var stopAt = $autoc.data("stopat"); var hs = []; switch(stopAt){ case "h6": hs.push("h6"); case "h5": hs.push("h5"); case "h4": hs.push("h4"); case "h3": hs.push("h3"); case "h2": hs.push("h2"); } hs = hs.join(); var $heads = $content.find(hs); if($heads.length === 0){ return; } var toc = ""; toc += "<h2>Table of Contents</h2><ul>"; $heads.each(function(){ var $this = $(this); var tag = $this[0].tagName; var txt = $this.text(); var slug = slugify(txt); $this.attr("data-linked",slug); toc += '<li class="autoc-level-'+tag+'">'; toc += '<a href="#" data-linkto="'+slug+'">'+txt+"</a></li>"; }); toc += "</ul>"; $autoc.append(toc); $(".autoc ul").on("click", "a", function(e){ e.preventDefault(); $([document.documentElement, document.body]).animate({ scrollTop: $content.find('[data-linked="'+$(this) .attr("data-linkto")+'"]').offset() .top - parseInt($autoc.attr("data-offset"), 10) }, 2000); }); }); function slugify(text){ return text.toString().toLowerCase() .replace(/s+/g, "-") // Replace spaces with - .replace(/[^w-]+/g, "") // Remove all non-word chars .replace(/--+/g, "-") // Replace multiple - with single - .replace(/^-+/, "") // Trim - from start of text .replace(/-+$/, ""); // Trim - from end of text } })(jQuery);

Как видите, jQuery является зависимостью, но, конечно, то же самое можно было бы сделать и без него. Наш сайт уже имеет его, так почему бы не использовать его? Это было проще.

Немного CSS

С несколькими уровнями основные заголовки должны быть понятны вместе со своими детьми.

.autoc ul{ margin-left: 45px; padding-left: 0; border-left: 1px solid #c4cbdb; } .autoc li { padding-left: 20px; list-style: none; margin-bottom: 0px; } .autoc .autoc-level-H3{ padding-left: 40px; } .autoc .autoc-level-H4{ padding-left: 60px; } .autoc .autoc-level-H2:before{ content: ""; display: block; height: 0; width: 8px; border-bottom: 1px dashed #c4cbdb; /* Adjust the Y value for your site */ transform: translateX(-15px) translateY(19px); } .autoc .autoc-level-H3:before{ content: ""; display: block; height: 0; width: 30px; border-bottom: 1px dashed #c4cbdb; /* Adjust the Y value for your site */ transform: translateX(-35px) translateY(19px); } .autoc .autoc-level-H4:before{ content: ""; display: block; height: 0; width: 50px; border-bottom: 1px dashed #c4cbdb; /* Adjust the Y value for your site */ transform: translateX(-55px) translateY(19px); } @media(max-width: 767px) { .autoc ul{ margin-left: 0; } .autoc .autoc-level-H2:before, .autoc .autoc-level-H3:before, .autoc .autoc-level-H4:before{ /* Adjust the margin-top value for your site */ margin-top: -3px; position: absolute; } }

Единственной проблемой здесь было оформить неупорядоченный список, не похожий на наши обычные списки. Тем не менее, вам нужно настроить некоторые значения для вашей конкретной ситуации. Те, которые требуют вашего внимания, имеют над ними комментарий, они зависят от размера шрифта и соответствуют вертикальной позиции пунктирной линии. Мы определяем стили только для уровней h2-h3-h4. Поскольку h1 является заголовком статьи, и мы не используем h5-h6, и даже если бы мы использовали, мы не хотим, чтобы они были в оглавлении.

Добавление автоматического оглавления на ваш сайт

Ознакомьтесь с этими методами добавления фрагментов PHP-кода в WordPress. CSS входит в вашу дочернюю тему, но в нативном настройщике тоже есть место. Надеюсь, у вашей дочерней темы уже есть файл custom.js для JS, но если нет, вы можете создать его и затем загрузить через PHP:

function custom_scripts() { wp_enqueue_script( 'custom-script', get_stylesheet_directory_uri().'/custom.js', array('jquery'), false, true ); } add_action('wp_enqueue_scripts', 'custom_scripts');

 Дайте нам знать, если это полезное дополнение к нашему или вашему сайту!

Источник записи: https://letswp.io

Связанные записи
WordPressWP Migrate DB ProПлагины

Перемещение корневой установки WordPress в подкаталог для установки и наоборот

GeneratePressWordPressWordPress темы

GeneratePress - Как добавить локальные шрифты в лучшую тему для WordPress

WordPressВсе для functions.phpПлагины

Исправление карты сайта Rank Math WPBakery - не обычное дело

WordPressWordPress темы

Лучшие темы WordPress 2020: лучшие 50 (пересмотрено)