Добавляем рекомендации постов и блок "Поделиться в соц. сетях"

Инструкция по добавлению механизма рекомендаций постов и блока "Поделиться в соц. сетях".

Добавляем рекомендации постов и блок "Поделиться в соц. сетях"
Дата публикации
26.05.24
Дата обновления
16.05.26
Время чтения
4 мин.

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

РезультатРезультат

Добавляем рекомендации постов

Тут всё просто, мы решили захардкодить в frontmatter каждой статьи массив со ссылками на другие статьи, схожие по тематике.

Только вместо ссылок мы использовали slug постов.

recommendations: ["collabic", "vk-feed"]

У нас уже был компонент PostPreview для отображения описания поста. Он используется на главной странице. Поэтому мы просто переиспользовали его.

В компоненте поста, мы получаем список данных о рекомендованных постах:

const recommendations = post.recomendations.map((s) => getPostBySlug(s));

И передаём их в компонент PostPreview, который рендерим после тела статьи:

{recommendations.map((r) => (
    <PostPreview
    key={r.slug}
    title={r.title}
    coverImage={r.coverImage}
    date={r.date}
    slug={r.slug}
    excerpt={r.excerpt}
    />
))}

В результате блок рекомендаций выглядит следующим образом:

Блок рекомендацийБлок рекомендаций

Добавляем блок "Поделиться в соц. сетях"

Для кнопок соц. сетей мы использовали готовое решение - пакет react-share.

Установим его:

npm i react-share

Далее всё просто, импортим оттуда кнопки и иконки:

"use client";

import { TelegramIcon, TelegramShareButton } from "react-share";

И передаём в них базовые данные о посте:

const ICON_SIZE = 40;

<TelegramShareButton url={url} title={post.title}>
  <TelegramIcon
    size={ICON_SIZE}
    className="rounded-3xl grayscale hover:grayscale-0"
  />
</TelegramShareButton>

С кнопками соц. сетей всё просто. Но нам хотелось ещё добавить возможность использовать нативный механизм "поделиться" на мобильных устройствах и просто удобно копировать ссылку на статью на десктопах.

Поэтому мы решил сделать свою кнопку.

С разметкой там всё просто, поэтому остановлюсь только на интересном, а именно на использовании navigator.share API.

Сначала подготовим данные:

const shareData = {
  title: post.title,
  text: post.description,
  url: post.url,
};

Затем вызовем navigator.share:

const handler = async () => {
  try {
    await navigator.share(shareData);
  } catch (e) {
    // Тут нужен фоллбек на копирование ссылки
    writeToClipboard(post.url);
  }
};

Нужно учитывать что navigator.share может быть недоступен по множеству причин, поэтому я добавил фоллбек на запись ссылки в clipboard.

Но и запись в clipboard может быть недоступен по множеству причин, поэтому и это надо учитывать.

const writeToClipboard = async (text: string) => {
  try {
    await navigator.clipboard.writeText(text);
  } catch (error) {
    console.error((error as Error).message);
  }
};

РезультатРезультат

А вот так этот блок выглядит при включенном Ad Block:

Заблокированный результатЗаблокированный результат

Не очень конечно, думаем что с блокировщиками рекламы тоже предстоит разобраться со временем.

На этом всё! 🎉

В живую результат статьи можно увидеть ниже 🙂

Расскажите о вашем проекте

Связаться иначе

Часто задаваемые вопросы

В frontmatter каждой статьи задаётся массив recommendations со slug похожих материалов. На странице поста slug'и превращаются в данные через getPostBySlug, а карточки рисует переиспользованный PostPreview.

В статье — только slug постов. Сейчас на сайте поддерживается расширенный формат: {type: post, slug: ...}, а также service, tool и work — см. компонент рекомендаций на живых страницах блога.

react-share — готовые кнопки и иконки (Telegram, VK и др.). Установка: npm i react-share. Кнопки помечают "use client", так как работают в браузере.

Через navigator.share: передаются title, text и url статьи. Если API недоступен или пользователь отменил диалог — срабатывает запасной вариант с копированием ссылки в буфер обмена.

В примере статьи — writeToClipboard с navigator.clipboard.writeText. И его стоит оборачивать в try/catch: в старых браузерах, без HTTPS или при запрете доступа к clipboard копирование тоже может не сработать.

Блокировщики режут скрипты и виджеты, похожие на трекеры или шаринг-трекеры. В статье показан такой случай — интерфейс остаётся, но иконки могут не загрузиться. Полного обхода без договорённостей с блокировщиками нет.

Добавляйте UTM-метки к ссылкам при ручном шаринге или в рассылках. Удобно собрать ссылку в UTM-генераторе; просмотры — в Яндекс Метрике или Google Analytics.

Вам может быть интересно

Добавляем поиск по тегам в статический блог на Next.js
Добавляем поиск по тегам в статический блог на Next.js

Добавляем поиск по тегам в статический блог на Next.js

5 мин.

Инструкция по добавлению простейшего поиска по тегам в статическом Next.js блоге...

Пост#туториалы#nextjs
Добавляем пагинацию в статический блог на Next.js
Добавляем пагинацию в статический блог на Next.js

Добавляем пагинацию в статический блог на Next.js

4 мин.

Инструкция по добавлению пагинации постов в статическом блоге на Next.js...

Пост#туториалы#nextjs
Как посчитать время чтения текста (и добавить индикатор на сайт)
Как посчитать время чтения текста (и добавить индикатор на сайт)

Как посчитать время чтения текста (и добавить индикатор на сайт)

4 мин.

Инструкция по добавлению индикатора времени чтения текста на сайт...

Пост#туториалы
Добавляем кнопку для сбора пожертвований (донатов) к блогу
Добавляем кнопку для сбора пожертвований (донатов) к блогу

Добавляем кнопку для сбора пожертвований (донатов) к блогу

6 мин.

Инструкция по добавлению кнопки для сбора пожертвований (донатов) к блогу...

Пост#туториалы
Автопостинг в VK через RSS feed
Автопостинг в VK через RSS feed

Автопостинг в VK через RSS feed

4 мин.

Заметили в настройках сообщества в VK интересную настройку, связанную с фидами. И понеслось...

Пост#соцсети#фиды
Добавляем Telegram Widgets в React-приложение
Добавляем Telegram Widgets в React-приложение

Добавляем Telegram Widgets в React-приложение

3 мин.

Инструкция по добавлению Telegram Widgets в React-приложение с помощью написанного мной npm-пакета react-telegram-widgets...

Пост#react#инструменты
Добавляем sitemap.xml в Next.js приложение
Добавляем sitemap.xml в Next.js приложение

Добавляем sitemap.xml в Next.js приложение

9 мин.

Инструкция по добавлению sitemap.xml в Next.js приложение...

Пост#nextjs#seo
Подключение счётчика Яндекс Метрики к Next.js приложению
Подключение счётчика Яндекс Метрики к Next.js приложению

Подключение счётчика Яндекс Метрики к Next.js приложению

13 мин.

Инструкция по добавлению счётчика Яндекс Метрики к Next.js блогу...

Пост#nextjs#yandex
UTM-генератор
UTM-генератор

UTM-генератор

Соберите UTM-метки для ссылки за минуту: пресеты, сохранение существующих параметров и кнопка копирования.

Инструмент#seo#utm