SEO Forum — SEO‑плагин для модуля форумов Cotonti
Автор: webitproff
Дата: 2026‑07‑04
Copyright: © webitproff, 2025‑2026
Репозиторий
Лицензия: BSD 3‑Clause License
1. Назначение плагина
SEO Forum — это комплексное SEO‑решение для модуля «Форумы» Cotonti.
Плагин автоматически формирует все необходимые мета‑теги (title, description, keywords), социальные карточки (Open Graph, Twitter Cards), структурированные данные Schema.org (DiscussionForumPosting), а также добавляет блок «Похожие темы», время чтения, информацию об авторе и гибко управляет каноническими URL.
Плагин работает на всех страницах форума:
- список постов темы;
- одиночный пост (с корректным canonical при активном
forums_singlepost); - список тем раздела;
- главная страница форума;
- страницы отдельных категорий (секций).
2. Основные возможности
- Умные мета‑описания
meta name="description" формируется по схеме: Название категории. Текст описания. Текст описания обрезается без разрыва слов — до ближайшей точки, запятой, восклицательного или вопросительного знака после 160‑го символа, а если знак не найден — до последнего пробела. - Open Graph и Twitter Cards
Автоматически выводятся og:title, og:description, og:image, og:url, og:type, og:site_name, og:locale, а также twitter:card, twitter:title, twitter:description, twitter:image. - Структурированные данные Schema.org
Генерируется JSON‑LD типа DiscussionForumPosting с полями headline, description (до 2000 символов из текста поста), keywords, author, publisher, datePublished, dateModified, image, mainEntityOfPage. - Управление каноническими URL
Для одиночного поста (при активном плагине forums_singlepost) канонический URL указывает на страницу конкретного поста, а не на всю тему. Для остальных страниц каноникал строится корректно (тема, раздел, категория, главная форума). - Похожие темы
На странице темы выводится блок «Похожие темы» (до 3 тем, настраивается). Каждая тема показывает изображение (из вложений attacher или плейсхолдер), заголовок, описание (с умной обрезкой) и автора. - Время чтения и автор темы
Рассчитывается время чтения первого поста (200 слов/мин, минимум 1 мин). Отображается автор темы (или автор конкретного поста для одиночной страницы). - Переопределение заголовков и мета‑тегов
На страницах списка тем, разделов и главной форума устанавливаются кастомные title, description, keywords в соответствии с настройками категорий или общими настройками плагина. - Локализация
Полная поддержка русского и английского языков. Предусмотрены дефолтные строки для пустых мета‑тегов.
3. Структура файлов
plugins/seoforums/
├── inc/
│ └── seoforums.functions.php — functions (keyword extraction, reading time, image retrieval)
├── lang/
│ ├── seoforums.ru.lang.php — Russian translation and stop words
│ └── seoforums.en.lang.php — English translation and stop words
├── seoforums.setup.php — plugin registration and configuration
├── seoforums.forums.posts.main.php — SEO tags for post list and single post (Open Graph, Twitter, Schema.org, canonical)
├── seoforums.forums.posts.tags.php — template tags (related topics, reading time, author)
├── seoforums.header.tags.php — override of meta tags in <head> for all forum pages
└── seoforums.global.php — (optional) additional global actions
4. Как это работает
Умная обрезка описаний
При формировании meta description и описаний в микроразметке применяется алгоритм:
- Берётся исходный текст (описание темы или текст поста).
- Если его длина больше 160 символов, ищется точка, запятая,
! или ? в диапазоне от 160 до 250 символов. - Если знак найден — текст обрезается до него включительно (без разрыва слова).
- Если знак не найден — обрезаем до последнего пробела перед 160‑м символом, сохраняя целостность слова.
- В начало добавляется название категории с точкой:
Категория. Описание….
Интеграция с forums_singlepost
При активном плагине forums_singlepost на странице одиночного поста:
og:url и canonical ссылаются на сам пост, а не на тему.meta description и JSON-LD description формируются из текста конкретного поста.- Автор в микроразметке соответствует автору поста, а не первому сообщению темы.
- Изображение подбирается из вложений поста, а если их нет — из темы.
Похожие темы
Блок RELATED_TOPICS выводится в шаблоне форума. Для каждой похожей темы:
- Проверяется, есть ли описание (
ft_desc) — если нет, берётся текст первого поста. - Описание умно обрезается (по тому же алгоритму, что и
meta description) и дополняется названием категории. - Изображение получается из вложений
attacher первого поста, либо используется плейсхолдер. - Автор определяется по
ft_firstposterid.
5. Требования
- Cotonti CMF версии 1.0 или новее (протестировано на 0.9.26+)
- PHP 8.4 или выше
- MySQL 8.0+ (или MariaDB с поддержкой InnoDB)
- Модуль forums должен быть установлен и активирован
- Рекомендуемые плагины:
attacher — для извлечения изображений из постовurleditor — для SEO‑дружественных URL
6. Установка
- Скопируйте папку
seoforums в директорию plugins/ вашего сайта. - Перейдите в Админ‑панель → Расширения и установите плагин SEO Forum.
- Настройте конфигурацию:
placeholderlogo — путь к маленькому логотипу для микроразметки (например, themes/index36/img/logo.webp)placeholderimagedefault — путь к большой картинке‑плейсхолдеру для тем без изображенияmaxrelatedpostsperpage — количество похожих тем (0 — отключить блок)
В шаблоне header.tpl убедитесь, что присутствуют теги {HEADER_META_DESCRIPTION}, {HEADER_META_KEYWORDS} и {PHP.out.meta}. пример:
<!--
/********************************************************************************
* File: header.tpl
* Extension: Core'
* Description: HTML template for header.tpl.
* Compatibility: CMF/CMS Cotonti Siena v0.9.26[](https://github.com/Cotonti/Cotonti)
* Dependencies:
* Bootstrap 5.3.+[](https://getbootstrap.com/);
* Font Awesome Free 7.1[](https://fontawesome.com/)
* Theme: Index36
* Version: 1.0.2
* Created: 01 Feb 2026
* Updated: 04 July 2026
* Copyright (c) 2026 webitproff | https://github.com/webitproff
* Source: https://github.com/webitproff/index36-cotonti-theme
* Demo : https://freelance-script.abuyfile.com/
* Help and support: https://abuyfile.com/ru/forums/cotonti/original/skins/index36
* License: BSD (Free distribution with saving Copyright (c) 2026 webitproff)
********************************************************************************/
-->
<!-- BEGIN: HEADER -->
<!DOCTYPE html>
<!-- IF {HTML_LANG} -->
<html lang="{HTML_LANG}" data-bs-theme="light">
<!-- ELSE -->
<html lang="{PHP.usr.lang}" data-bs-theme="light">
<!-- ENDIF -->
<!-- main header -->
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- IF {I18N_HEADER_META_TITLE} -->
<title>{I18N_HEADER_META_TITLE}</title>
<!-- ELSE -->
<title>{HEADER_TITLE} <!-- IF {MARKET_HEADER_XTRA_DEMO_COUNTRY} -->{MARKET_HEADER_XTRA_DEMO_COUNTRY_NAME} <!-- ENDIF --></title>
<!-- ENDIF -->
<!-- IF {I18N_HEADER_META_DESCRIPTION} -->
<meta name="description" content="{I18N_HEADER_META_DESCRIPTION}" />
<!-- ELSE -->
<!-- IF {HEADER_META_DESCRIPTION} -->
<meta name="description" content="{HEADER_META_DESCRIPTION}" />
<!-- ENDIF -->
<!-- ENDIF -->
<!-- IF {HEADER_BASEHREF} -->
{HEADER_BASEHREF}
<!-- ENDIF -->
<!-- IF {HEADER_CANONICAL_URL} -->
<link rel="canonical" href="{HEADER_CANONICAL_URL}" />
<!-- ENDIF -->
<!-- IF {ALTERNATE_TAGS} -->
{ALTERNATE_TAGS}
<!-- ENDIF -->
<link rel="shortcut icon" href="favicon.ico" />
<link rel="icon" href="{PHP.cfg.themes_dir}/{PHP.theme}/img/icon.webp" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png" />
<!-- IF {PHP.out.meta} -->
{PHP.out.meta}
<!-- ENDIF -->
<script>
(function () {
const storedTheme = localStorage.getItem('theme');
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
const defaultTheme = storedTheme || (prefersDark ? 'dark' : 'light');
document.documentElement.setAttribute('data-bs-theme', defaultTheme);
})();
</script>
{HEADER_HEAD}
</head>
<body>
В шаблоне forums.posts.tpl добавьте блок RELATED_TOPICS (пример есть в документации) и теги {TOPIC_READ_TIME}, {TOPIC_AUTHOR} при необходимости. например, после формы для ответов, вставить:
<!-- IF {PHP|cot_plugin_active('seoforums')} -->
<!-- BEGIN: RELATED_TOPICS -->
<div class="container mb-4 mt-5">
<h3 class="h4 mt-3">{PHP.L.seoforums_related}</h3>
<div class="row g-3">
<!-- BEGIN: RELATED_ROW -->
<div class="col-12 col-md-6 col-lg-4">
<a href="{RELATED_TOPIC_ROW_URL}" class="card border-0 shadow-sm text-decoration-none h-100 overflow-hidden">
<!-- Image cropped to 1200:630 aspect ratio -->
<div class="related-img-wrapper" style="aspect-ratio: 1200 / 630; width: 100%; overflow: hidden;">
<img src="{RELATED_TOPIC_ROW_IMAGE}"
alt="{RELATED_TOPIC_ROW_TITLE}"
class="related-img"
style="width: 100%; height: 100%; object-fit: cover; object-position: center;">
</div>
<!-- Card content -->
<div class="card-body">
<h5 class="fs-6 fw-semibold mb-1 text-body">{RELATED_TOPIC_ROW_TITLE}</h5>
<!-- IF {RELATED_TOPIC_ROW_DESC} -->
<p class="text-muted small mb-1">{RELATED_TOPIC_ROW_DESC}</p>
<!-- ENDIF -->
<p class="text-muted small mb-0">{RELATED_TOPIC_ROW_AUTHOR}</p>
</div>
</a>
</div>
<!-- END: RELATED_ROW -->
</div>
</div>
<!-- END: RELATED_TOPICS -->
<!-- ENDIF -->
- Очистите системный кэш.
7. Рекомендации
- Для корректной вставки изображений из постов установите плагин
attacher. - Настройте стоп‑слова в языковом файле, чтобы улучшить качество извлечения ключевых слов.
- Если вы используете forums_singlepost для раздельных шаблонов одиночных постов, плагин автоматически подстроит канонические URL и мета‑теги.
- При большом количестве постов убедитесь, что таблицы
cot_forum_topics, cot_forum_posts и cot_structure имеют необходимые индексы.
8. Поддержка
помощь и обсуждение
9. Лицензия
BSD 3‑Clause License.
Автор: webitproff, Copyright © 2025‑2026.
Репозиторий: https://github.com/webitproff/cot-seoforums