Multicat is a plugin for CMF Cotonti that allows a single article (Page module item) to belong to several categories at once. The plugin is implemented entirely through standard Cotonti hooks, requires no changes to the core or the Page module, and provides 100% compatibility with existing extensions.
- What is it?
- How does it work?
- Why do you need it?
- Advantages
- Installation
- Configuration
- Usage
- Admin Panel
- File Structure
- Plugin Hooks
- Plugin Functions
- Database Table
- Language Files
- Template Integration
- For Developers
- Common Issues and Solutions
- Metadata
- License
Multicat is a plugin that allows the same article to belong to several categories at once on your site.
Normally in Cotonti a page can belong to only one category (e.g. "News" or "Blog"). With Multicat a single article can simultaneously be in "News", "Promotions" and "Reviews".
Download the plugin for free: https://github.com/webitproff/cot-multicat
- During installation the plugin creates an additional database table
cot_page_multicats, which stores which categories each article belongs to. - When you edit an article, a convenient hierarchical list of category checkboxes appears, respecting access permissions. You can select as many categories as you need.
- On the site, the article is automatically displayed in all selected categories.
- The plugin's admin panel provides a dedicated section for managing links: list, statistics, cleanup, bulk operations.
- Convenience for visitors — the user does not have to look for an article in only one section. It will be found in any suitable category.
- SEO (search engine optimization) — the article gets more entry points for search engines. At the same time, duplicate URLs are not created: the article always keeps a single primary URL, while categories act as additional "entry points".
- Flexibility — handy when an article fits several topics. For example, "Phone Review" can be placed in "News", "Gadgets" and "Reviews".
- Simple installation and operation.
- Does not break old articles: if an article has only one category, everything stays as before.
- Automatic migration of existing categories on installation.
- Dedicated admin panel with a list, statistics, cleanup, and bulk operations.
- Support for Russian, English and Ukrainian UI languages.
- Works through standard Cotonti hooks — no changes to the core or the Page module.
- Suitable for any project — blog, news site, online store.
Bottom line: Multicat makes your site more convenient for visitors and more useful for search engines. Articles become more visible and managing them becomes more flexible.
Copy the multicat folder into the plugins/ directory on your server.
- In the admin panel go to Extensions.
- Find the
Multicatplugin and click Install. - During installation, the
cot_page_multicatstable is created automatically, and existing categories fromcot_pagesare migrated.
Add the tags to your templates:
- In
page.edit.tplandpage.add.tpl— add{PAGEFORM_CAT}and{PAGEFORM_CAT_HINT}right after the standard category field.
<!-- IF {PHP|cot_plugin_active('multicat')} -->
<div class="col-12">
<label for="multicat" class="form-label fw-semibold">{PHP.L.multicat_cats_edit}</label>
<div class="input-group has-validation" id="multicat">{PAGEFORM_CAT} </div>
<small class="form-text text-muted">{PHP.L.multicat_cats}. {PAGEFORM_CAT_HINT}</small>
</div>
<!-- ENDIF -->
- In
page.admin.tpl— inside thePAGE_ROWblock (e.g. after{ADMIN_PAGE_LOCAL_STATUS}) add{ADMIN_PAGE_MULTICATS}.
Important: if you do not add these tags, multiple categories will not work — there will simply be no selection form and no output in the admin area.
In the plugin configuration (Admin → Extensions → Multicat → Configuration) one option is available:
enabled— enable multiple categories (enabled by default).
- In the page form, tick the categories in the hierarchical checkbox list.
- For a new page, at least one category is required. For an existing page you can uncheck everything — then the primary category stays as it was, and multicategories are cleared.
- The first ticked category becomes the primary one and is written to
page_cat.
- In the admin page list, all categories are displayed.
- On the site, the category filter shows pages from multicategories.
Go to Extensions → Multicat → Administration (or directly admin.php?m=other&p=multicat). The Links list tab: filter, inspect, and clear links either in bulk or per page.
When a page is deleted from the Page module, all its links are removed automatically (hook page.delete.first).
The multicategory management section is at admin.php?m=other&p=multicat and consists of tabs:
| Tab | URL parameter | Purpose |
|---|---|---|
| Links list | tab=list |
List of pages with their primary category and all multicategories. Filters: category, page title, link presence. Supports pagination and bulk link clearing. |
| Add link | tab=add |
Add a single "page ↔ category" link. Tab under development. |
| Edit link | tab=edit |
Service tab. Opened from the list. Tab under development. |
| Cleanup | tab=clean |
Count and delete "orphan" records. Tab under development. |
| Statistics | tab=stats |
Total number of links, unique pages and categories. Tab under development. |
| Bulk operations | tab=mass |
Batch binding/unbinding of pages. Tab under development. |
Note: some admin panel tabs are still under development. The main stable tab is Links list.
plugins/multicat/
├── inc/
│ └── multicat.functions.php Core multicategory functions
├── lang/
│ ├── multicat.ru.lang.php Russian language file
│ ├── multicat.en.lang.php English language file
│ └── multicat.ua.lang.php Ukrainian language file
├── setup/
│ ├── multicat.install.sql Table creation + data migration
│ └── multicat.uninstall.sql Table removal on uninstall
├── tpl/
│ └── multicat.admin.tpl Admin panel template
├── multicat.admin.php Hook tools — admin panel
├── multicat.global.php Hook global — table registration
├── multicat.page.add.add.done.php Hook page.add.add.done
├── multicat.page.admin.loop.php Hook page.admin.loop
├── multicat.page.delete.first.php Hook page.delete.first
├── multicat.page.edit.import.php Hook page.edit.update.import
├── multicat.page.edit.tags.php Hook page.edit.tags
├── multicat.page.edit.update.done.php Hook page.edit.update.done
├── multicat.page.list.query.php Hook page.list.query
└── multicat.setup.php Plugin registration and settings
| File | Hook | Purpose |
|---|---|---|
multicat.global.php |
global |
Registers the cot_page_multicats table, loads the language file, defines the table alias. |
multicat.admin.php |
tools |
The plugin admin panel. |
multicat.page.add.add.done.php |
page.add.add.done |
Saves categories after a page is added. |
multicat.page.admin.loop.php |
page.admin.loop |
Displays the category list in the admin page list (tag {ADMIN_PAGE_MULTICATS}). |
multicat.page.delete.first.php |
page.delete.first |
Removes links before a page is deleted. |
multicat.page.edit.tags.php |
page.edit.tags |
Generates the hierarchical checkbox list in the edit form (tags {PAGEFORM_CAT} and {PAGEFORM_CAT_HINT}). |
multicat.page.edit.import.php |
page.edit.update.import |
Imports categories from POST and sets the first one as primary (page_cat). |
multicat.page.edit.update.done.php |
page.edit.update.done |
Saves links to the DB after a page update. |
multicat.page.list.query.php |
page.list.query |
Extends the SQL filter of the page list with multicategory support. |
The file inc/multicat.functions.php contains three core functions:
multicat_get_cats($page_id)— returns an array ofstructure_idvalues for the categories the page belongs to.multicat_get_cat_titles($page_id)— returns an array of category titles (used in the admin area).multicat_save_cats($page_id, $cats)— completely rewrites the page links: deletes old records and inserts new ones. An empty array is a valid operation (clearing all multicategories).
Important: do not confuse this with the
page_catfield in thecot_pagestable — that is the primary category of the page, which remains unchanged when working with multicategories.
The plugin creates one table: cot_page_multicats.
CREATE TABLE IF NOT EXISTS `cot_page_multicats` (
`pcat_page_id` int UNSIGNED NOT NULL,
`pcat_cat_id` mediumint UNSIGNED NOT NULL,
UNIQUE KEY `pcat_unique` (`pcat_page_id`, `pcat_cat_id`),
KEY `pcat_page_id` (`pcat_page_id`),
KEY `pcat_cat_id` (`pcat_cat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;On installation existing pages are migrated: their page_cat is matched against structure_code from cot_structure, and one record is added to the new table for each valid pair.
The plugin ships with Russian (ru), English (en) and Ukrainian (ua) language files. The files are located in the lang/ directory. The language file is loaded according to the current administrator language.
Add right after the standard category selector:
<!-- IF {PHP|cot_plugin_active('multicat')} -->
<div class="col-12">
<label class="form-label fw-semibold">{PHP.L.multicat_cats_edit}</label>
<div class="multicat-checkboxes">{PAGEFORM_CAT}</div>
<small class="form-text text-muted mt-1">{PAGEFORM_CAT_HINT}</small>
</div>
<!-- ENDIF -->Inside the PAGE_ROW block (e.g. after {ADMIN_PAGE_LOCAL_STATUS}) add:
<!-- IF {PHP|cot_plugin_active('multicat')} -->
<div class="text-muted small">{ADMIN_PAGE_MULTICATS}</div>
<!-- ENDIF -->The plugin uses standard Cotonti hooks and requires no changes to the core. All data is stored in a separate cot_page_multicats table, ensuring full compatibility with existing extensions.
- When a page is saved, the
page.edit.update.importhook takes the first ticked category and writes it topage_cat. - The
page.edit.update.donehook callsmulticat_save_cats(), which completely rewrites the links. - When a page is deleted, the
page.delete.firsthook removes all links.
To add your own logic you can use additional Cotonti hooks or override the plugin functions in your own extension.
| Issue | Solution |
|---|---|
| "At least one category must be selected" error | Make sure at least one category is ticked. For an existing page it is enough that the primary category already exists in the DB. |
| Categories are not shown | Check access permissions (cot_auth) and the presence of structure_id in the DB. |
| Template conflicts | Make sure the tags {PAGEFORM_CAT} and {PAGEFORM_CAT_HINT} are added. |
| Migration did not run | Check the SQL in setup/multicat.install.sql and run it manually. |
| The category filter does not include multicategories | Make sure the page.list.query hook is registered and the file multicat.page.list.query.php is present in the plugin root. |
- Name: Multicat
- Package: multicat
- Version: 1.7.9
- Release date: 2026-09-12
- Author: webitproff
- License: BSD
- Repository: https://github.com/webitproff/cot-multicat
- Compatibility: Cotonti v.1.0.0+, Page module, PHP 8.4+, MySQL 8.0+
BSD License. See the LICENSE file for details.
Multicat — make your site more convenient for visitors and more useful for search engines!
Multicat — это плагин для CMF Cotonti, который позволяет одной и той же статье (странице модуля Page) находиться сразу в нескольких категориях. Плагин полностью реализован через стандартные хуки Cotonti, не требует изменений в ядре или модуле Page и обеспечивает 100% совместимость с существующими расширениями.
- Что это такое?
- Как это работает?
- Зачем это нужно?
- Преимущества
- Установка
- Настройка
- Использование
- Административная панель
- Структура файлов
- Хуки плагина
- Функции плагина
- Таблица базы данных
- Языковые файлы
- Интеграция с шаблонами
- Для разработчиков
- Возможные проблемы и решения
- Метаданные
- Лицензия
Multicat — это плагин, который позволяет одной и той же статье находиться сразу в нескольких категориях на сайте.
Обычно в Cotonti страница может быть только в одной категории (например, «Новости» или «Блог»). С Multicat одна статья может одновременно быть и в «Новости», и в «Акции», и в «Обзоры».
Скачать плагин бесплатно: https://github.com/webitproff/cot-multicat
- При установке плагин создаёт дополнительную таблицу
cot_page_multicatsв базе данных. В ней хранится информация, к каким категориям относится каждая статья. - Когда вы редактируете статью, появляется удобный иерархический список чекбоксов категорий с учётом прав доступа. Можно выбрать сразу несколько.
- На сайте статья автоматически показывается во всех выбранных категориях.
- В административной панели плагина есть отдельный раздел управления связями: список, статистика, очистка мусора, массовые операции.
- Удобство для посетителей — пользователю не нужно искать статью только в одной рубрике. Он найдёт её в любой подходящей категории.
- SEO (поисковая оптимизация) — статья получает больше точек входа для поисковых систем. При этом дубликаты URL не создаются: у статьи всегда остаётся один основной адрес, а категории выступают как дополнительные «точки входа».
- Гибкость — удобно, когда статья подходит под несколько тем. Например, «Обзор телефона» можно разместить в «Новости», «Гаджеты» и «Обзоры».
- Простая установка и работа.
- Не ломает старые статьи: если у статьи только одна категория — всё остаётся, как раньше.
- Автоматическая миграция существующих категорий при установке.
- Отдельная административная панель со списком, статистикой, очисткой мусора и массовыми операциями.
- Поддержка русского, английского и украинского языков интерфейса.
- Работает через стандартные хуки Cotonti — без правок ядра и модуля Page.
- Подходит для любых проектов — блога, новостника, интернет-магазина.
Итог: Multicat делает ваш сайт удобнее для посетителей и полезнее для поисковых систем. Статьи становятся более заметными, а управление ими — гибче.
Скопируйте папку multicat в каталог plugins/ на сервере.
- В админ-панели перейдите в Расширения.
- Найдите плагин
Multicatи нажмите Установить. - При установке автоматически создастся таблица
cot_page_multicatsи будут мигрированы существующие категории изcot_pages.
Добавьте теги в шаблоны:
- В
page.edit.tplиpage.add.tpl— добавить{PAGEFORM_CAT}и{PAGEFORM_CAT_HINT}сразу после стандартного поля выбора категории. - В
page.admin.tpl— в блокеPAGE_ROW(например, после{ADMIN_PAGE_LOCAL_STATUS}) добавить{ADMIN_PAGE_MULTICATS}.
Важно: если не добавить эти теги, множественные категории работать не будут — просто не будет формы выбора и вывода в админке.
В конфигурации плагина (Админ → Расширения → Multicat → Конфигурация) доступна одна опция:
enabled— включить множественные категории (по умолчанию включена).
- В форме страницы отметьте нужные категории в иерархическом списке чекбоксов.
- Для новой страницы обязательно хотя бы одна категория. Для существующей страницы можно снять все отметки — тогда основная категория останется прежней, а мультикатегории будут очищены.
- Первая отмеченная категория становится основной и записывается в
page_cat.
- В админ-списке страниц отображаются все категории.
- На сайте фильтр по категории показывает страницы из мультикатегорий.
Перейдите в Расширения → Multicat → Администрирование (или напрямую admin.php?m=other&p=multicat). Вкладка Список связей: фильтруйте, просматривайте, чистите связи как массово, так и у отдельных страниц.
При удалении страницы из модуля Page все её связи автоматически удаляются (хук page.delete.first).
Раздел управления мультикатегориями находится по адресу admin.php?m=other&p=multicat и состоит из вкладок:
| Вкладка | Параметр URL | Назначение |
|---|---|---|
| Список связей | tab=list |
Список страниц с их основной категорией и всеми мультикатегориями. Фильтры: категория, название страницы, наличие связей. Поддерживает пагинацию, массовую очистку связей. |
| Добавить связь | tab=add |
Добавление одиночной связи «страница ↔ категория». Вкладка в стадии разработки. |
| Редактирование связи | tab=edit |
Служебная вкладка. Открывается из списка. Вкладка в стадии разработки. |
| Очистка мусора | tab=clean |
Подсчёт и удаление «мусорных» записей. Вкладка в стадии разработки. |
| Статистика | tab=stats |
Общее количество связей, уникальных страниц и категорий. Вкладка в стадии разработки. |
| Массовые операции | tab=mass |
Пакетная привязка/отвязка страниц. Вкладка в стадии разработки. |
Примечание: часть вкладок административной панели находится в стадии разработки. Основной стабильной вкладкой является Список связей.
plugins/multicat/
├── inc/
│ └── multicat.functions.php Основные функции работы с мультикатегориями
├── lang/
│ ├── multicat.ru.lang.php Русский языковой файл
│ ├── multicat.en.lang.php Английский языковой файл
│ └── multicat.ua.lang.php Украинский языковой файл
├── setup/
│ ├── multicat.install.sql Создание таблицы + миграция данных
│ └── multicat.uninstall.sql Удаление таблицы при деинсталляции
├── tpl/
│ └── multicat.admin.tpl Шаблон административной панели
├── multicat.admin.php Хук tools — административная панель
├── multicat.global.php Хук global — регистрация таблицы
├── multicat.page.add.add.done.php Хук page.add.add.done
├── multicat.page.admin.loop.php Хук page.admin.loop
├── multicat.page.delete.first.php Хук page.delete.first
├── multicat.page.edit.import.php Хук page.edit.update.import
├── multicat.page.edit.tags.php Хук page.edit.tags
├── multicat.page.edit.update.done.php Хук page.edit.update.done
├── multicat.page.list.query.php Хук page.list.query
└── multicat.setup.php Регистрация плагина и настроек
| Файл | Хук | Назначение |
|---|---|---|
multicat.global.php |
global |
Регистрация таблицы cot_page_multicats, загрузка языкового файла, определение псевдонима таблицы. |
multicat.admin.php |
tools |
Административная панель плагина. |
multicat.page.add.add.done.php |
page.add.add.done |
Сохранение категорий после добавления страницы. |
multicat.page.admin.loop.php |
page.admin.loop |
Отображение списка категорий в админ-списке страниц (тег {ADMIN_PAGE_MULTICATS}). |
multicat.page.delete.first.php |
page.delete.first |
Удаление связей перед удалением страницы. |
multicat.page.edit.tags.php |
page.edit.tags |
Генерация иерархического списка чекбоксов в форме редактирования (теги {PAGEFORM_CAT} и {PAGEFORM_CAT_HINT}). |
multicat.page.edit.import.php |
page.edit.update.import |
Импорт категорий из POST и установка первой как основной (page_cat). |
multicat.page.edit.update.done.php |
page.edit.update.done |
Сохранение связей в БД после обновления страницы. |
multicat.page.list.query.php |
page.list.query |
Расширение SQL-фильтра списка страниц с учётом мультикатегорий. |
Файл inc/multicat.functions.php содержит три основные функции:
multicat_get_cats($page_id)— возвращает массивstructure_idкатегорий, в которых находится страница.multicat_get_cat_titles($page_id)— возвращает массив названий категорий (используется в админке).multicat_save_cats($page_id, $cats)— полностью перезаписывает связи страницы: удаляет старые записи и вставляет новые. Пустой массив — валидная операция (снятие всех мультикатегорий).
Важно: не путать с полем
page_catв таблицеcot_pages— это основная категория страницы, которая остаётся неизменной при работе с мультикатегориями.
Плагин создаёт одну таблицу: cot_page_multicats.
CREATE TABLE IF NOT EXISTS `cot_page_multicats` (
`pcat_page_id` int UNSIGNED NOT NULL,
`pcat_cat_id` mediumint UNSIGNED NOT NULL,
UNIQUE KEY `pcat_unique` (`pcat_page_id`, `pcat_cat_id`),
KEY `pcat_page_id` (`pcat_page_id`),
KEY `pcat_cat_id` (`pcat_cat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;При установке выполняется миграция существующих страниц: их page_cat сопоставляется с structure_code из cot_structure, и для каждой валидной пары в новую таблицу добавляется одна запись.
Плагин поставляется с русским (ru), английским (en) и украинским (ua) языковыми файлами. Файлы располагаются в каталоге lang/. Языковой файл подключается по текущему языку администратора.
Добавить сразу после стандартного селектора категорий:
<!-- IF {PHP|cot_plugin_active('multicat')} -->
<div class="col-12">
<label class="form-label fw-semibold">{PHP.L.multicat_cats_edit}</label>
<div class="multicat-checkboxes">{PAGEFORM_CAT}</div>
<small class="form-text text-muted mt-1">{PAGEFORM_CAT_HINT}</small>
</div>
<!-- ENDIF -->В блоке PAGE_ROW (например, после {ADMIN_PAGE_LOCAL_STATUS}) добавить:
<!-- IF {PHP|cot_plugin_active('multicat')} -->
<div class="text-muted small">{ADMIN_PAGE_MULTICATS}</div>
<!-- ENDIF -->Плагин использует стандартные хуки Cotonti и не требует изменений в ядре. Все данные хранятся в отдельной таблице cot_page_multicats, что обеспечивает полную совместимость с существующими расширениями.
- При сохранении страницы хук
page.edit.update.importберёт первую отмеченную категорию и записывает её вpage_cat. - Хук
page.edit.update.doneвызываетmulticat_save_cats(), которая полностью перезаписывает связи. - При удалении страницы хук
page.delete.firstудаляет все связи.
Для добавления собственной логики можно использовать дополнительные хуки Cotonti или переопределить функции плагина в своём расширении.
| Проблема | Решение |
|---|---|
| Ошибка «необходимо выбрать хотя бы одну категорию» | Убедитесь, что отмечена хотя бы одна категория. Для существующей страницы достаточно, чтобы в БД уже была основная категория. |
| Категории не отображаются | Проверьте права доступа (cot_auth) и наличие structure_id в БД. |
| Конфликты с шаблонами | Убедитесь, что добавлены теги {PAGEFORM_CAT} и {PAGEFORM_CAT_HINT}. |
| Миграция не сработала | Проверьте SQL в setup/multicat.install.sql и выполните его вручную. |
| Фильтр по категории не подмешивает мультикатегории | Убедитесь, что хук page.list.query зарегистрирован и файл multicat.page.list.query.php присутствует в корне плагина. |
- Название: Multicat
- Пакет: multicat
- Версия: 1.7.9
- Дата выпуска: 2026-09-12
- Автор: webitproff
- Лицензия: BSD
- Репозиторий: https://github.com/webitproff/cot-multicat
- Совместимость: Cotonti v.1.0.0+, модуль Page, PHP 8.4+, MySQL 8.0+
BSD License. Подробности — в файле LICENSE.
Multicat — делайте свой сайт удобнее для посетителей и полезнее для поисковых систем!