WP Manifestindependent plugin directory
manifest / content / vo-data

VO Data

WordPress plugin: results of the All-Russian School Olympiad (school/district stages), per-subject publication, mobile API

by IgB · github.com/igor-blag/vo-data

★ 0stars
0forks

Install

No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:

wp plugin install https://github.com/igor-blag/vo-data/archive/refs/heads/main.zip

Плагин WordPress для публикации и отображения информации об участии во Всероссийской олимпиаде школьников (ВсОШ) на уровне школы/района: результаты этапов, сводки, индекс объективности школьного этапа, а также API для мобильного приложения.


1. Быстрый старт

  1. Установите и активируйте плагин (сетевая активация не поддерживается). Таблицы в базе создаются автоматически.
  2. В настройках Настройки → VO Data Import проверьте сопоставление колонок Excel и выберите страницу-«дашборд» (на ней размещён шорткод [vo_results_dashboard]).
  3. Создайте страницы и разместите шорткоды (см. раздел 3).
  4. Загрузите данные через меню Результаты ВсОШ (см. раздел 4).

2. Как считается учебный год

Год хранится в базе одним числом — это второй год учебного года:

Учебный год Значение academic_year
2024/2025 2025
2025/2026 2026
2026/2027 2027
  • «Текущим» считается год по правилу: с сентября — следующий календарный год (2026 + 1 = 2027 для 2026/27), до сентября — текущий календарный год.
  • Данные всех лет хранятся в одной таблице и не перезаписывают друг друга, поэтому архив прошлых лет доступен всегда.

3. Шорт-коды для страниц сайта

Все шорт-коды принимают необязательный атрибут year (число, см. таблицу выше). Если атрибут не указан, год берётся из адреса страницы (?vo_year=2026) или используется текущий.

Важно: в URL используется параметр vo_year, а не year. year — служебная query-переменная WordPress (архивы по датам), из-за неё страница с ?year=2026 отдаёт 404. Старые ссылки с ?year=… плагин ещё понимает, но формирует уже только ?vo_year=….

3.1 Сводка по итогам районного этапа

[vo_summary year="2026"]

Карточки (выступления, победители, призёры, регион, предметы, школы) и вкладки: победители и призёры, вышедшие на регион, статистика по предметам и по школам. Единственный шорт-код, который умел год и раньше.

Вкладки переключаются без перезагрузки страницы (панели всех вкладок отрисовываются сразу, видимость переключает JS). Если JS отключён, работает обычный переход ?tab=…. Фильтры по школе и предмету отправляются серверно. Если год задан атрибутом year, параметр vo_year в ссылки не добавляется — иначе он «утекал» бы в другие шорткоды на той же странице (например, в дашборд без атрибута года).

3.2 Дашборд по предметам

[vo_results_dashboard year="2026"]

Карточки предметов с текущим этапом; каждая ведёт на страницу результатов предмета.

3.3 Результаты по предмету

[vo_results subject="Математика" year="2026"]

subject — обязательный атрибут, точное название предмета. Обычно страницы предметов создаются автоматически при импорте как дочерние к дашборду.

Пока по предмету загружен только школьный этап (список прошедших на район), под списком выводится блок «Проходной балл на районный этап» со строкой на каждую параллель (например, 7 класс — 24, 8 класс — 26). Проходной — это минимальный балл школьного этапа среди прошедших в этой параллели; считается по всем школам и классам предмета, поэтому фильтры по школе/классу на него не влияют, а призёры/победители прошлого года (ППГ) в расчёт не входят.

3.4 Индекс объективности школьного этапа (антирейтинг)

[vo_antirating year="2026"]
[vo_antirating period="all"]        «Весь период» — всегда накопительный режим

Вкладки «Общая информация» / «Методистам» / «Руководителям», тепловая карта, разбор по школам и предметам.

Накопительный режим «за весь период» (?period=all или атрибут period="all"):

  • индекс считается по всем накопленным годам сразу — чем дольше период наблюдения, тем устойчивее выводы;
  • ранги всегда считаются внутри одного учебного года и класса, поэтому результаты разных лет корректно складываются;
  • у каждой школы и у каждой пары «школа + предмет» показывается раскрывающаяся динамика по годам (индекс по каждому году);
  • если индекс ниже 50 повторяется несколько лет подряд, выводится пометка «устойчивый сигнал».

Под заголовком есть переключатель «Весь период / 2024/25 / 2025/26 / …» — он позволяет сравнивать накопленную картину с отдельными годами.

3.5 Просмотр архива по ссылке

Атрибут year не обязателен: открыв любую страницу с одним из шорт-кодов с параметром ?vo_year=2026, вы увидите данные за 2025/26 учебный год:

https://example.ru/results/?vo_year=2026

Ссылки между страницами плагина (дашборд → предмет → антирейтинг → результаты) автоматически переносят выбранный год, пока не наступит «текущий» — у текущего года адреса чистые.

Примечание: антирейтинг считается только там, где в данных за тот же год есть и балл школьного этапа, и балл районного этапа у одних и тех же участников. Если за прошлый год загружены только итоги (победители/призёры), индекс будет недоступен — это нормально.


4. Загрузка данных (админка «Результаты ВсОШ»)

Данные загружаются из Excel-файлов (.xlsx/.xls) по страницам, соответствующим этапам. На каждой странице предмет определяется автоматически (по ячейке, заданной в настройках).

Меню Этап Что пишется в базу
Школьный этап: прошедшие school_stage список участников, прошедших на район (балл школьного этапа)
Предварительные результаты district_prelim баллы районного этапа (предварительно)
Районный этап: итоги district_final итоговые баллы + статус (Победитель/Призёр/Участник)
Региональный этап regional_stage ручной отбор прошедших на регион (см. раздел 5)

При импорте плагин сам создаёт предмет и его страницу, если их ещё нет, обновляет статус этапа и уведомляет подписчиков (мобильное приложение).

4.1 Импорт данных за прошлый учебный год

На странице Районный этап: итоги есть галочка «Импортировать данные за прошлый учебный год». Она нужна, когда результаты прошлого сезона не были загружены вовремя и их нужно добавить задним числом:

  • записи попадут в vo_results с годом прошлого учебного года (например, сейчас, в 2026/27, это 2026 = 2025/26);
  • затем они автоматически отобразятся через ?vo_year=2026 или [vo_* year="2026"];
  • назначение — первоначальное наполнение и добавление итогов прошедшего года.

Ограничение: такой режим доступен только для итогов районного этапа. Прошлогодние «школьный этап» и «предварительные результаты» через интерфейс не загружаются.

4.2 Победители/призёры прошлого года в списке прошедших на район

Чтобы в списке прошедших на районный этап (школьный этап, school_stage) отображались победители и призёры прошлого года, загрузите итоги районного этапа в первый год работы с плагином. В дальнейшем лауреаты прошлого года подставляются автоматически — им поднимается класс на +1.

Учитываются только те, кто продолжает учиться: выпускной 11 класс прошлого года исключается (иначе появлялся бы несуществующий «12 класс»). Благодаря этому удалять выпускников из базы больше не нужно — архив прошлых лет сохраняется целиком.


5. Отбор на региональный этап

Страница Результаты ВсОШ → Региональный этап: выберите предмет (и при необходимости класс), отметьте участников, которые прошли на регион, либо укажите, что прошедших нет. Результаты отметок сразу видны на публичных страницах (звёздочка * и строка «Прошедшие на региональный этап»).


5.1 Публикация результатов по предметам

По умолчанию данные предмета видны публике сразу после импорта. Если списки загружены заранее (до даты тура), предмет можно снять с публикации и открыть позже:

  • Где: Результаты ВсОШ → (главная), колонка «Публикация» в таблице за актуальный учебный год.
  • Снятый предмет: пропадает с дашборда, страница предмета показывает «результаты ещё не опубликованы», его нет в сводке [vo_summary] и в API мобильного приложения.
  • Публикация: кнопка «Опубликовать» открывает данные и отправляет уведомление подписчикам; снятие уведомлений не отправляет.
  • Состояние «снят» сохраняется при повторном импорте этого же предмета и года.
  • [vo_antirating] флаг публикации не учитывает — это отдельный аналитический инструмент.

6. Главная страница админки и обслуживание

Результаты ВсОШ → (главная):

  • статистика загрузок по предметам за последний загруженный год;
  • Публикация по предметам — в таблице статистики у каждого предмета есть кнопка «Снять с публикации» / «Опубликовать» (см. раздел 5.1);
  • Экспорт лауреатов — выгрузка победителей и призёров выбранного года в CSV;
  • Обслуживание данных:
    • точечное удаление результатов по предмету и учебному году (например, чтобы перезалить ошибочный импорт).

Удаления записей выпускников больше нет: данные прошлых лет сохраняются полностью, а выпускники не попадают в списки текущего года за счёт фильтра по классу (см. раздел 4.2).


7. Настройки и резервное копирование

  • Настройки → VO Data Import: сопоставление ячеек и колонок Excel (предмет, шапка таблицы, ФИО, пол, класс, школа, баллы, статус, СНИЛС) и выбор страницы-дашборда.
  • Резервное копирование (там же): создание ZIP-архива всех таблиц плагина в папку Backups/ и восстановление из него. Восстановление полностью заменяет текущие данные.
  • Опасная зона: полное удаление всех таблиц и данных плагина (с деактивацией). Действие необратимо.

8. API для мобильного приложения

Базовый адрес: https://site.ru/wp-json/vo-data/v1/

Маршрут Метод Назначение
/subjects GET список предметов с текущим этапом
/results/{id} GET результаты по ID предмета
/subscribe POST подписка/отписка на предмет (action, subject_id, initData)
/my-subscriptions GET список подписок пользователя

Все маршруты работают по текущему учебному году. При импорте новых данных плагин отправляет уведомления подписчикам.


9. Кэширование

Публичные шорт-коды кэшируются (transients на 12 часов), чтобы не нагружать базу. Кэш недействителен:

  • после любого импорта (увеличивается версия кэша, отдельно сбрасывается кэш дашборда нужного года);
  • после изменения отбора на региональный этап.

Если данные изменили вручную в базе, кэш сбрасывается при следующем импорте; также можно подождать истечения 12 часов.


10. Структура плагина

vo-data.php                        — главный файл, подключение модулей
includes/
  vo-data-activator.php            — создание таблиц при активации
  vo-data-ajax-handler.php         — AJAX-импорт из Excel
  vo-data-settings.php             — страница настроек + бэкапы
  vo-data-helpers.php              — учебный год, кэш, медиана, рекомендации
  vo-data-shortcode.php            — [vo_results], [vo_results_dashboard]
  vo-data-antirating.php           — [vo_antirating]
  vo-data-summary.php              — [vo_summary]
  vo-data-api.php                  — REST API для мобильного приложения
  vo-data-backup-handler.php       — логика резервного копирования
  admin/
    admin-init.php                 — меню, скрипты, экспорт CSV
    admin-page-main.php            — статистика и обслуживание
    admin-page-regional.php        — отбор на региональный этап
    admin-page-import.php          — универсальная страница импорта
js/                                — скрипты админки и публичной части
templates/                         — PHP-шаблоны вывода шорт-кодов

Основные таблицы: vo_schools, vo_subjects, vo_participants, vo_results (год, класс, баллы ШЭ/РЭ, статус, признак прошедшего на регион), vo_stage_types, vo_competition_status (текущий этап по предмету и году), vo_subscriptions (подписки из приложения).


11. FAQ

Можно ли добавить данные за прошлый учебный год? Да. Через страницу «Районный этап: итоги» с галочкой «Импортировать данные за прошлый учебный год» — записи сохранятся с корректным academic_year и появятся в архиве ([vo_summary year="…"] / ?vo_year=…).

Почему на антирейтинге за прошлый год «недостаточно данных»? Индексу нужны пары «балл ШЭ + балл РЭ» за один и тот же год у одних и тех же участников. Итоги, загруженные задним числом, содержат только баллы РЭ — этого для индекса мало. В накопительном режиме «весь период» в расчёт автоматически попадают только те годы, где такие пары есть.

Что делать, если импортировал ошибочные данные за год? На главной странице админки (раздел «Обслуживание данных») удалите записи по предмету и году и перезалейте файл.

Почему у текущего года в адресах нет ?vo_year=…? Параметр добавляется только для не текущих (архивных) лет, чтобы основные адреса оставались чистыми для SEO.