Содержание статьи в сайтбаре с фиксацией при прокрутке

Здравствуйте, друзья. Недавно у меня появилась необходимость создать на сайте содержание статьи в сайтбаре. Заметил я эту фишку в справке сервиса PageSpeed Insights. Вся идея в том, что содержание находится всегда перед глазами, не в начале статьи, как это бывает обычно, а в сайтбаре и сопровождает посетителя при прокрутке.

содержание в сайтбаре, пример

Сначала я подумал про html и css, многие так делают содержание в статьях. Но это не тот случай, здесь нужна автоматизация. Нужно определить объём статьи и пункты содержания автоматически, присвоив якоря и сформировать содержание. А для этого уже нужна функция, которая поможет реализовать нужные условия.

Чтобы сэкономить время и не изобретать велосипед, я решил «загуглить» нужную информацию. После нескольких уточняющих запросов, я нашёл статью Тимура Камаева «Оглавление для больших постов», в которой есть готовое решение. Я лишь добавил небольшой скриптик для фиксации оглавления в сайтбаре.

Функция формирования содержания статьи на сайте

В статье Тимура представлен код функции и вспомогательные коды и стили, которые позволяют выводить содержание в теле статьи через шорткод, автоматически и отдельно в сайтбаре. Всё это добро вы найдёте по ссылке выше. Не привожу код здесь, так как функция периодически дополняется новыми возможностями.

Функцию нужно добавить в ваш файл functions.php, предварительно сделав его резервную копию. А лучше работать с этим файлом в дочерней теме или через плагин.

Размещение функции необходимо сделать в самом конце вашего файла, после завершения кода предыдущей функции.

вставка кода

У этого кода есть множество настроек, которые позволяют тонко настроить работу функции. Я хочу обратить внимание на основные, которые задают условие для показа оглавления.

Настройки эти вы найдёте в начале функции, вам нужно будет изменить значение символов и подпунктов в зависимости от объёма ваших статей. По умолчанию содержание отображается в статьях, где есть хотя бы 2 подзаголовка (h) и 2000 символов в статье.

настройка функции

Ознакомьтесь с настройками детально, они помогут разобраться в работе функции и лучшим образом настроить содержание статей на вашем сайте.

Код для вывода содержания в сайтбаре

После того как основная функция добавлена, и вы разобрались с настройками, нужно добавить функцию, которая будет показывать содержание статьи в сайтбаре, для тех статей, которые соответствуют вашим настройкам.

Код нужно разместить в файле functions.php, ниже основной функции:

## вывод содержания в сайдбаре
add_action('wp_head', 'sidebar_contents');
function sidebar_contents(){ 
if( ! is_singular() ) return;
global $post;
$args = array();
$args['selectors'] = array('h2','h3');
//$args['margin'] = 50;
//$args['to_menu'] = false;
//$args['title'] = false;
 $GLOBALS['kc_contents'] = Kama_Contents::init( $args )->make_contents( $post->post_content );
}
// затем в сайдбаре выводим: echo $GLOBALS['kc_contents'];

Вывод содержания в сайтбаре

Далее, в код сайтбара нужно добавить вот эту строчку:

echo $GLOBALS['kc_contents'];

Только вставка где попало, не сработает. В вашей теме сайтбар может быть реализован отдельным файлом sidebar.php или sidebar-right.php, а может быть, в составе шаблона отдельной записи single.php. В современных шаблонах чаще используются отдельные файлы.

Обычно в этом файле кодируется вся структура сайтбара. Вам необходимо открыть этот файл в редакторе, проанализировать и добавить перед закрытием последнего блока ДИВ (</div>) этот код:

<?php echo $GLOBALS['kc_contents']; ?>

Сохраняйте файл и проверяйте. Содержание статьи должно появиться в сайтбаре, для статей, которые соответствуют настройкам по объёму и количеству подзаголовков.

Только содержание сейчас не будет фиксироваться при прокрутке, оно будет оставаться на своём месте. Для того чтобы содержание смещалось и было видно при прокрутке нужно наш код дополнить.

Как зафиксировать содержание статьи в сайтбаре

Первым делом нужно код вызова содержания обернуть в блок ДИВ с идентификатором id=»fixblock».

<div id="fixblock">
<?php echo $GLOBALS['kc_contents']; ?>
</div>

Далее, открываете файл подвала footer.php и перед закрытием тега БОДИ (</body>) вставляете код скрипта:

<script type="text/javascript">
function getTopOffset(e) {
 var y = 0;
 do { y += e.offsetTop; } while (e = e.offsetParent);
 return y;
}
var block = document.getElementById('fixblock'); /* fixblock - значение атрибута id блока */
if ( null != block ) {
 var topPos = getTopOffset( block );
 window.onscroll = function() {
 var newcss = (topPos < window.pageYOffset) ?
    'top:20px; position: fixed;' : 'position:static;';
 block.setAttribute( 'style', newcss );
 }
}
</script>

Сохраняйте файл и проверяйте. Сейчас содержание должно фиксироваться и двигаться вслед за статьёй.

Видеоинструкция

Вот так вот можно быстро сделать содержание для статей сайта. Для маленьких статей это неактуально, а вот для объёмных — очень удобный навигатор.

Друзья, у меня на сегодня всё, всем желаю удачи и хорошего настроения!

С уважением, Максим Зайцев

Понравилась статья? Поделиться с друзьями:
Комментарии: 16
  1. Кирилл

    Отличный материл! Всё доходчиво изложено. Надо будет взять на вооружение.

    1. Максим Зайцев (автор)

      Содержание действительно хорошую карту кликов показывает, попробуйте!

  2. Евгения

    Максим, здравствуйте! А функция «Содержание» не способствует переоптимизации сайта? Ведь в подзаголовках находятся ключевики, и с помощью содержания они дублируются. Что скажете?

    1. Максим Зайцев (автор)

      Здравствуйте, Евгения. Пункты содержания закрыты от индексации, и не являются фактором переоптимизации. Поисковики способны отличить полезные ссылки от SEO-халтуры.

  3. Иван

    Реализация вышеуказанной фишки подойдет для объемных статей. Я не вижу смысла добавлять подобную фишку на своих сайтах, так как объем статей менее 10 000 знаков.

    1. Максим Зайцев (автор)

      Да, именно для объёмных статей, с достаточно большим количеством разделов. На маленьких статьях в содержании смысла нет.

  4. Марат

    Привет Максим. Хорошая фишка с содержанием в сайдбаре, но я пока использую плавающий блок Adsense в сайдбаре.
    Для создания оглавления статьи стал использовать плагин Table of Contents Plus.
    P.S. Ошибка в слове: Видеоинструкция.

    1. Максим Зайцев (автор)

      Марат, привет. Спасибо за поправку ;-) Я Адсенс не использую в фиксированном виджете, так как получал предупреждение на одном из своих сайтов за это. А плагин Table of Contents Plus отличное решение без лишних заморочек с кодом, я знаю много людей, кто использует его и довольны на все 100%.

      1. Марат

        Ошибся я, не Adsense, а РСЯ :)

        1. Максим Зайцев (автор)

          А, тогда имеет смысл, РСЯ разрешает такие фишки. И они хорошо работаю.

          1. Сергей

            Максим, подскажите. Можно ли размещать над блоком РСЯ рекламный блок Адсенс, например, блок ссылок? Допустим, после текста статьи будет располагаться блок ссылок Гугла, а сразу за ним внизу блок РСЯ. Так можно? Спасибо.

          2. Максим Зайцев (автор)

            Да, Сергей так можно. Единственное условие, чтобы пользователю было понятно, что это реклама. Можно после ссылок сделать маленькую надпись «Реклама», если ссылки будут слишком близко к рекламным блокам РСЯ.

  5. Марк

    Здравствуйте, Максим.
    Спасибо за информацию, все очень подробно описали.

    Однако есть один вопрос, как в добавок ко всему этому сделать так, чтобы при прокрутке страницы подсвечивался активный пункт H2 в содержании сайдбара. Так же как это реализовано на первом сайте, что показан в видео (developers.google.com)

    1. Максим Зайцев (автор)

      Здравствуйте, Марк. Честно говоря, так и не нашёл пример. А реализация может быть достигнута присвоением класса активному элементу и настройкой стилей для него.

  6. Борис

    Ребетя какую чушь вы пишите?! :(
    где сам скрипт?! сам скрипт не прикреплен, и та часть кода — которая приведена на сайте — еще и скриншотом — не содержит все что необходимо.

    Я просто в шоке, пуликуете статью — так раскрывайте тему.

    1. Максим Зайцев (автор)

      Здравствуйте, Борис! Я не знаю как Вы читали статью, но все коды и скрипты приведены в тексте и доступны для скачивания. Прежде чем впадать в шок и стараться обесценить чей-то труд потрудитесь изучить материал и применить его на практике.

Добавить комментарий