VO Data
WordPress plugin: results of the All-Russian School Olympiad (school/district stages), per-subject publication, mobile API
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. Быстрый старт
- Установите и активируйте плагин (сетевая активация не поддерживается). Таблицы в базе создаются автоматически.
- В настройках Настройки → VO Data Import проверьте сопоставление колонок Excel и выберите страницу-«дашборд» (на ней размещён шорткод
[vo_results_dashboard]). - Создайте страницы и разместите шорткоды (см. раздел 3).
- Загрузите данные через меню Результаты ВсОШ (см. раздел 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.