The SeoArticle plugin enhances the SEO capabilities of the Cotonti CMF's Pages module by adding meta tags, Open Graph, Twitter Card, Schema.org structured data, keyword extraction, reading time estimation, and related articles functionality.
Cotonti CMF v.0.9.26 beta on PHP v.8.2.25
plugins/seoarticle/
├── inc/
│ └── seoarticle.functions.php # Functions for keyword extraction and reading time estimation
├── lang/
│ └── seoarticle.ru.lang.php # Russian translations and stop words for keyword extraction
│ └── seoarticle.en.lang.php # English translations and stop words for keyword extraction
├── seoarticle.header.tags.php # Overrides HEADER_META_DESCRIPTION and HEADER_META_KEYWORDS
├── seoarticle.page.main.php # Adds Open Graph, Twitter Card, and Schema.org meta tags
├── seoarticle.page.tags.php # Defines page tags (e.g., PAGE_READ_TIME, PAGE_AUTHOR, RELATED_ROW_*)
└── seoarticle.setup.php # Plugin configuration and setup
- seoarticle.setup.php: Defines plugin metadata (name, version, author) and dependencies.
- seoarticle.header.tags.php: Overrides
{HEADER_META_DESCRIPTION}
and{HEADER_META_KEYWORDS}
for meta tags, ensuring single-line descriptions and keyword extraction. - seoarticle.page.main.php: Generates Open Graph, Twitter Card, and Schema.org meta tags, including title, description, keywords, author, and image.
- seoarticle.functions.php: Contains
cot_extract_keywords
(extracts keywords with stop words filtering) andcot_estimate_read_time
(estimates reading time, handles HTML/BBCode). - seoarticle.ru.lang.php: Provides Russian translations for labels (e.g., "Related articles") and stop words for keyword extraction.
- seoarticle.en.lang.php: Provides English translations for labels (e.g., "Related articles") and stop words for keyword extraction.
- seoarticle.page.tags.php: Adds tags like
{PAGE_READ_TIME}
,{PAGE_AUTHOR}
, and{RELATED_ROW_*}
for related articles (See seoarticle.page.tags.php ).
- Meta Tags:
- Generates
<meta name="description">
and<meta name="keywords">
based onpage_metadesc
,page_keywords
, or extracted frompage_text
. - Ensures single-line descriptions without line breaks.
- Generates
- Open Graph and Twitter Card:
- Adds
og:title
,og:description
,og:image
,twitter:card
, etc., for social media sharing.
- Adds
- Schema.org:
- Includes structured data for articles (
headline
,description
,keywords
,author
,image
).
- Includes structured data for articles (
- Keyword Extraction:
- Automatically extracts keywords from
page_text
usingcot_extract_keywords
ifpage_keywords
is empty. - Supports stop words (e.g., "и, в, на") defined in
seoarticle.ru.lang.php
.
- Automatically extracts keywords from
- Reading Time Estimation:
- Calculates reading time with
cot_estimate_read_time
(200 words/minute, minimum 1 minute). - Handles HTML and BBCode in
page_text
.
- Calculates reading time with
- Related Articles:
- Displays related articles with title, description, and image (
page_link_main_image
).
- Displays related articles with title, description, and image (
- Author Information:
- Shows author name from
cot_users
or "Unknown author" if not found.
- Shows author name from
- Cotonti CMF (tested with Siena).
- Pages module enabled.
- MySQL/MariaDB database.
-
Download the Plugin:
-
Clone or download the repository from GitHub:
git clone https://github.com/webitproff/seoarticle.git
-
Or download the ZIP and extract to
/plugins/seoarticle/
.
-
-
Copy Files:
-
Place the
seoarticle
folder in/plugins/
of your Cotonti installation:public_html/plugins/seoarticle/
-
-
Install the Plugin:
- Go to Administration → Extensions in the Cotonti admin panel.
- Find SeoArticle in the list and click Install.
- The plugin will register itself using
seoarticle.setup.php
.
-
Configure Extra Fields:
- Go to Administration → Structure → Pages → Extra fields.
- Add an extra field for images:
- Code:
link_main_image
- Type: URL
- Description: Main image for Open Graph and related articles
- Code:
- Ensure
page_metadesc
,page_metatitle
, andpage_keywords
are available (default in Cotonti).
-
Update Templates:
-
Open
/themes/cleancot/header.tpl
and ensure it includes:<meta name="description" content="{HEADER_META_DESCRIPTION}" /> <meta name="keywords" content="{HEADER_META_KEYWORDS}" />
also add the code below if it is not in this template:
<!-- IF {PHP.out.meta} -->{PHP.out.meta}<!-- ENDIF -->
-
Open
/themes/cleancot/page.tpl
(download theme) and add:<!-- IF {PHP|cot_plugin_active('seoarticle')} --> <!-- IF {RELATED_PAGES} --> <div class="related"> <!-- BEGIN: MAIN.RELATED_PAGES.RELATED_ROW --> <a href="{RELATED_ROW_URL}"> <div class="position-relative overflow-hidden rounded-5 shadow-bottom" style="aspect-ratio: 2 / 1;"> <!-- Условие Cotonti: проверка наличия главного изображения через экстраполяцию --> <!-- IF {RELATED_ROW_LINK_MAIN_IMAGE} --> <!-- Главное изображение страницы из Cotonti, адаптивное с обрезкой --> <img src="{RELATED_ROW_LINK_MAIN_IMAGE}" alt="{RELATED_ROW_TITLE}" class="img-fluid object-fit-cover"> <!-- Альтернатива: если главного изображения нет --> <!-- ELSE --> <!-- Дефолтное изображение из темы Cotonti --> <img src="{PHP.cfg.themes_dir}/{PHP.cfg.defaulttheme}/img/cotonti-cleancot.webp" alt="{PAGE_TITLE}" class="img-fluid object-fit-cover"> <!-- Конец условия изображения --> <!-- ENDIF --> </div> <h3 class="h5 mb-0">{RELATED_ROW_TITLE}</h3> <p>{RELATED_ROW_DESC}</p> </a> <!-- END: MAIN.RELATED_PAGES.RELATED_ROW --> </div> <!-- ENDIF --> <!-- ENDIF -->
-
and
<!-- IF {PHP|cot_plugin_active('seoarticle')} -->
{PAGE_READ_TIME}
<!-- ENDIF -->
-
Clear Cache:
- go to Administration → Cache → Clear cache.
-
Test the Plugin:
- Create or edit a page in Administration → Pages.
- Fill
page_metadesc
,page_keywords
,page_metatitle
, andpage_link_main_image
(optional). - View the page and check:
<meta name="description">
and<meta name="keywords">
in<head>
.- Open Graph and Schema.org tags.
- Reading time (
{PAGE_READ_TIME}
), author ({PAGE_AUTHOR}
), and related articles.
-
Use Meta Fields:
- Always fill
page_metadesc
,page_keywords
, andpage_metatitle
in the page editor for precise SEO control. - Use
page_link_main_image
for better social media previews.
- Always fill
-
Stop Words:
-
Extend stop words in
/plugins/seoarticle/lang/seoarticle.ru.lang.php
for better keyword extraction:$L['seoarticle_stop_words'] = 'и,в,на,с,по,для,это,как,что,а,у,к,от,до,при,о,без,если';
-
-
Database Optimization:
- Ensure indexes on
cot_pages
(page_id
,page_ownerid
,page_cat
) andcot_users
(user_id
) for faster queries.
- Ensure indexes on
-
Testing:
- Use browser developer tools to verify meta tags and structured data.
- Test related articles by creating multiple pages in the same category.
-
Template Conflicts:
- Ensure
{HEADER_META_DESCRIPTION}
and{HEADER_META_KEYWORDS}
are not duplicated inheader.tpl
to avoid multiple meta tags. - Check
<head>
for duplicate<meta name="description">
or<meta name="keywords">
.
- Ensure
-
Extra Fields:
- If
page_link_main_image
is not configured, the plugin falls back to/images/default.jpg
. Set a valid default image inseoarticle.page.main.php
if needed.
- If
-
Performance:
- Keyword extraction (
cot_extract_keywords
) may be slow for very longpage_text
. Limit text length or cache results if necessary.
- Keyword extraction (
-
Language Support:
- The plugin includes only Russian translations (
seoarticle.ru.lang.php
). Add other languages (e.g.,seoarticle.en.lang.php
) for multilingual sites.
- The plugin includes only Russian translations (
-
Dependencies:
- Requires the Pages module. Ensure it is enabled before installation.
- Database queries assume
cot_users
andcot_structure
tables are intact.
BSD License. See LICENSE for details.
webitproff 22 April 2025
-
Userarticles for CMF Cotonti The plugin for CMF Cotonti displays a list of users with the number of their articles and a detailed list of articles for each user.
-
Export to Excel via PhpSpreadsheet for CMF Cotonti Exporting Articles to Excel from the Database in Cotonti via PhpSpreadsheet.Composer is not required for installation.
-
Import from Excel via PhpSpreadsheet for CMF Cotonti The plugin for importing articles from Excel for all Cotonti-based websites.Composer is not required for installation.
-
The CleanCot theme for CMF Cotonti Modern Bootstrap theme on v.5.3.3 for Cotonti Siena v.0.9.26 without outdated (legacy) mode. Only relevant tags!
#############
#############
Плагин SeoArticle расширяет SEO-возможности модуля Pages в Cotonti CMF, добавляя мета-теги, Open Graph, Twitter Card, структурированные данные Schema.org, извлечение ключевых слов, оценку времени чтения и функционал связанных статей.
Cotonti CMF v.0.9.26 beta на PHP v.8.2.25
plugins/seoarticle/
├── inc/
│ └── seoarticle.functions.php # Функции для извлечения ключевых слов и оценки времени чтения
├── lang/
│ └── seoarticle.ru.lang.php # Русские переводы и стоп-слова для извлечения ключевых слов
│ └── seoarticle.en.lang.php # Английские переводы и стоп-слова для извлечения ключевых слов
├── seoarticle.header.tags.php # Переопределяет HEADER_META_DESCRIPTION и HEADER_META_KEYWORDS
├── seoarticle.page.main.php # Добавляет мета-теги Open Graph, Twitter Card и Schema.org
├── seoarticle.page.tags.php # Определяет теги страницы (например, PAGE_READ_TIME, PAGE_AUTHOR, RELATED_ROW_*)
└── seoarticle.setup.php # Конфигурация и установка плагина
- seoarticle.setup.php: Определяет метаданные плагина (название, версия, автор) и зависимости.
- seoarticle.header.tags.php: Переопределяет
{HEADER_META_DESCRIPTION}
и{HEADER_META_KEYWORDS}
для мета-тегов, обеспечивая описание в одну строку и извлечение ключевых слов. - seoarticle.page.main.php: Генерирует мета-теги Open Graph, Twitter Card и Schema.org, включая заголовок, описание, ключевые слова, автора и изображение.
- seoarticle.functions.php: Содержит
cot_extract_keywords
(извлекает ключевые слова с фильтрацией стоп-слов) иcot_estimate_read_time
(оценивает время чтения, обрабатывает HTML/BBCode). - seoarticle.ru.lang.php: Предоставляет русские переводы для меток (например, «Связанные статьи») и стоп-слова для извлечения ключевых слов.
- seoarticle.en.lang.php: Предоставляет английские переводы для меток (например, «Related articles») и стоп-слова для извлечения ключевых слов.
- seoarticle.page.tags.php: Добавляет теги, такие как
{PAGE_READ_TIME}
,{PAGE_AUTHOR}
и{RELATED_ROW_*}
для связанных статей (см. seoarticle.page.tags.php).
- Мета-теги:
- Генерирует
<meta name="description">
и<meta name="keywords">
на основеpage_metadesc
,page_keywords
или извлечённых изpage_text
. - Обеспечивает описание в одну строку без переносов.
- Генерирует
- Open Graph и Twitter Card:
- Добавляет
og:title
,og:description
,og:image
,twitter:card
и др. для шаринга в соцсетях.
- Добавляет
- Schema.org:
- Включает структурированные данные для статей (
headline
,description
,keywords
,author
,image
).
- Включает структурированные данные для статей (
- Извлечение ключевых слов:
- Автоматически извлекает ключевые слова из
page_text
с помощьюcot_extract_keywords
, еслиpage_keywords
пусто. - Поддерживает стоп-слова (например, «и, в, на»), определённые в
seoarticle.ru.lang.php
илиseoarticle.en.lang.php
.
- Автоматически извлекает ключевые слова из
- Оценка времени чтения:
- Рассчитывает время чтения с помощью
cot_estimate_read_time
(200 слов/минута, минимум 1 минута). - Обрабатывает HTML и BBCode в
page_text
.
- Рассчитывает время чтения с помощью
- Связанные статьи:
- Отображает связанные статьи с заголовком, описанием и изображением (
page_link_main_image
).
- Отображает связанные статьи с заголовком, описанием и изображением (
- Информация об авторе:
- Показывает имя автора из
cot_users
или «Неизвестный автор», если автор не найден.
- Показывает имя автора из
- Cotonti CMF (протестировано на Siena).
- Модуль Pages включён.
- База данных MySQL/MariaDB.
-
Скачайте плагин:
-
Клонируйте или скачайте репозиторий с GitHub:
git clone https://github.com/webitproff/seoarticle.git
-
Или скачайте ZIP и распакуйте в
/plugins/seoarticle/
.
-
-
Скопируйте файлы:
-
Поместите папку
seoarticle
в/plugins/
вашей установки Cotonti:public_html/plugins/seoarticle/
-
-
Установите плагин:
- Перейдите в Администрирование → Расширения в админ-панели Cotonti.
- Найдите SeoArticle в списке и нажмите Установить.
- Плагин зарегистрируется с помощью
seoarticle.setup.php
.
-
Настройте дополнительные поля:
- Перейдите в Администрирование → Структура → Страницы → Дополнительные поля.
- Добавьте дополнительное поле для изображений:
- Код:
link_main_image
- Тип: URL
- Описание: Главное изображение для Open Graph и связанных статей
- Код:
- Убедитесь, что поля
page_metadesc
,page_metatitle
иpage_keywords
доступны (по умолчанию в Cotonti).
-
Обновите шаблоны:
-
Откройте
/themes/cleancot/header.tpl
и убедитесь, что он содержит:<meta name="description" content="{HEADER_META_DESCRIPTION}" /> <meta name="keywords" content="{HEADER_META_KEYWORDS}" />
-
также добавьте код, если его нет в шаблоне header.tpl:
<!-- IF {PHP.out.meta} -->{PHP.out.meta}<!-- ENDIF -->
-
Откройте
/themes/cleancot/page.tpl
(скачатть тему) и добавьте:<!-- IF {PHP|cot_plugin_active('seoarticle')} --> <!-- IF {RELATED_PAGES} --> <div class="related"> <!-- BEGIN: MAIN.RELATED_PAGES.RELATED_ROW --> <a href="{RELATED_ROW_URL}"> <div class="position-relative overflow-hidden rounded-5 shadow-bottom" style="aspect-ratio: 2 / 1;"> <!-- Условие Cotonti: проверка наличия главного изображения через экстраполяцию --> <!-- IF {RELATED_ROW_LINK_MAIN_IMAGE} --> <!-- Главное изображение страницы из Cotonti, адаптивное с обрезкой --> <img src="{RELATED_ROW_LINK_MAIN_IMAGE}" alt="{RELATED_ROW_TITLE}" class="img-fluid object-fit-cover"> <!-- Альтернатива: если главного изображения нет --> <!-- ELSE --> <!-- Дефолтное изображение из темы Cotonti --> <img src="{PHP.cfg.themes_dir}/{PHP.cfg.defaulttheme}/img/cotonti-cleancot.webp" alt="{PAGE_TITLE}" class="img-fluid object-fit-cover"> <!-- Конец условия изображения --> <!-- ENDIF --> </div> <h3 class="h5 mb-0">{RELATED_ROW_TITLE}</h3> <p>{RELATED_ROW_DESC}</p> </a> <!-- END: MAIN.RELATED_PAGES.RELATED_ROW --> </div> <!-- ENDIF --> <!-- ENDIF -->
и в тело статьи:
<!-- IF {PHP|cot_plugin_active('seoarticle')} -->
{PAGE_READ_TIME}
<!-- ENDIF -->
-
Очистите кэш:
- Перейдите в Администрирование → Кэш → Очистить кэш.
-
Протестируйте плагин:
- Создайте или отредактируйте страницу в Администрирование → Страницы.
- Заполните
page_metadesc
,page_keywords
,page_metatitle
иpage_link_main_image
(опционально). - Просмотрите страницу и проверьте:
<meta name="description">
и<meta name="keywords">
в<head>
.- Теги Open Graph и Schema.org.
- Время чтения (
{PAGE_READ_TIME}
), автора ({PAGE_AUTHOR}
) и связанные статьи.
-
Используйте мета-поля:
- Всегда заполняйте
page_metadesc
,page_keywords
иpage_metatitle
в редакторе страниц для точного SEO-контроля. - Используйте
page_link_main_image
для улучшения превью в соцсетях.
- Всегда заполняйте
-
Стоп-слова:
-
Расширьте стоп-слова в
/plugins/seoarticle/lang/seoarticle.ru.lang.php
для улучшения извлечения ключевых слов:$L['seoarticle_stop_words'] = 'и,в,на,с,по,для,это,как,что,а,у,к,от,до,при,о,без,если';
-
-
Оптимизация базы данных:
- Убедитесь, что индексы на
cot_pages
(page_id
,page_ownerid
,page_cat
) иcot_users
(user_id
) созданы для ускорения запросов.
- Убедитесь, что индексы на
-
Тестирование:
- Используйте инструменты разработчика браузера для проверки мета-тегов и структурированных данных.
- Протестируйте связанные статьи, создав несколько страниц в одной категории.
-
Конфликты шаблонов:
- Убедитесь, что
{HEADER_META_DESCRIPTION}
и{HEADER_META_KEYWORDS}
не дублируются вheader.tpl
, чтобы избежать множественных мета-тегов. - Проверьте
<head> 6B36 code> на наличие дублирующихся
<meta name="description">
или<meta name="keywords">
.
- Убедитесь, что
-
Дополнительные поля:
- Если
page_link_main_image
не настроено, плагин использует/images/default.jpg
. Укажите действительное изображение по умолчанию вseoarticle.page.main.php
, если нужно.
- Если
-
Производительность:
- Извлечение ключевых слов (
cot_extract_keywords
) может быть медленным для длинныхpage_text
. Ограничьте длину текста или кэшируйте результаты при необходимости.
- Извлечение ключевых слов (
-
Поддержка языков:
- Плагин включает переводы на русский (
seoarticle.ru.lang.php
) и английский (seoarticle.en.lang.php
). Добавьте другие языки для мультиязычных сайтов.
- Плагин включает переводы на русский (
-
Зависимости:
- Требуется модуль Pages. Убедитесь, что он включён перед установкой.
- Запросы к базе данных предполагают наличие таблиц
cot_users
иcot_structure
.
BSD License. См. LICENSE для деталей.
webitproff, 22 апреля 2025