
Cymini sectores
Возникла задача. Я в «Итогах года» всегда публикую самые популярные посты, написанные в этом году. То есть, не тупо самые посещаемые в этом году, найти их, как раз, нет никакой проблемы. А те, что были опубликованы в этом году и имеют больше всего хитов. Как это сделать?
Первый порыв — пойти в Яндекс.Метрику. Но тут же мы натыкаемся на проблему — она не получает такой параметр как дата публикации страницы. Уже привычно иду за советом к Гроку, он говорит — скорми стандартному отчёту по посещаемости список страниц, опубликованных в этом году в виде параметров фильтра.
Выдрать такой список страниц можно, например, при помощи плагина Export All URLs. Инсталлируем плагин, выгружаем список, скармливаем отчёту. И натыкаемся на ограничение — параметров фильтра не может быть больше сорока. А я писуч, у меня может быть и сто постов за год (сейчас их 48). Спросил техподдержку Яндекс.Метрики, есть ли выход. Мне ответили, увы.
Ок, копаем дальше. Я использую плагин Post Views Counter (это его чиселку вы можете видеть в конце каждого поста). Этот плагин также добавляет чиселку в грид «Записи»:

В принципе, рабочее решение — упорядочить посты по этому полю и листать, выписывая на листочек публикации из 2025 года. Предыдущие два раза я так делал. Это тупо и медленно.
Я пошёл с вопросом в комьюнити @wordpress_ru в телеграме. Мне там посоветовали попросить нейросеть составить для меня SQL-запрос и вытащить данные из базы напрямую. Сказано-сделано. Но Грок генерирует неработающую херню, предположив, что каунтер хранит данные в wp_postmeta.
ЖПТ похож на твоего начитанного друга, у которого есть ответ на любой вопрос. А если ответа нет, он всё равно, что-нибудь нафантазирует, чтобы авторитет в твоих глазах не терять.
Неизвестный автор
Давайте разбираться. Post Views Counter хранит данные в табличке wp_post_views. Сначала я посмотрел и ничего не понял:

Почему против каждого поста единичка? Как он хранит посещения? Простите меня, пожалуйста, я не разработчик и имею право так тупить. Посмотрев на количество записей, сообразил: каждый день записан одной строчкой. Сколько в этот день было хитов, такая и будет чиселка в count. Всё, дальше уже дело техники. Пишу промт и Грок выдаёт:
SELECT
p.post_title,
COALESCE(SUM(v.count), 0) AS view_count
FROM
wp_posts p
LEFT JOIN
wp_post_views v ON p.ID = v.id
WHERE
p.post_type = 'post'
AND p.post_status = 'publish'
AND YEAR(p.post_date) = 2025
GROUP BY
p.ID, p.post_title
ORDER BY
view_count DESC
LIMIT 10;
YEAR(p.post_date) = 2025 — это год, за который мы вытаскиваем записи. Думаю, если вам потребуется кастомный период, сообразите, как этот параметр изменить.
LIMIT 10; — это количество записей, которые надо вывести.
Выполняем запрос и получаем:
post_title | view_count |
Собеседование на руководителя проектов. Софт скилы… | 2580 |
Руководитель проектного офиса | 1780 |
Техническое собеседование на руководителя проектов… | 1245 |
Как правильно ставить задачи в таск-трекере | 1060 |
Фильтрация входящих задач | 980 |
Множество проектов, срываются сроки — что делать? | 870 |
Анализ эффективности проекта | 835 |
Меня хотят уволить. Что делать? | 805 |
Три базовых инструмента руководителя проекта | 735 |
Инструменты для слаживания команды | 720 |
Ерунда какая-то. У постов куда меньше просмотров на самом деле. Давайте разбираться. Вытаскиваем стату посещений по одному посту, например, таким запросом:
SELECT * FROM `wp_post_views` WHERE `id`=13798
И обнаруживаем такие артефакты:

Обратите внимание на две последние строчки. Хитрый плагин пишет в них итоги, за каждый год и всего. Давайте изменим наш запрос.
SELECT
p.post_title,
COALESCE(v.count, 0) AS view_count
FROM
wp_posts p
LEFT JOIN
wp_post_views v ON p.ID = v.id AND v.period = '2025'
WHERE
p.post_type = 'post'
AND p.post_status = 'publish'
AND YEAR(p.post_date) = 2025
ORDER BY
view_count DESC
LIMIT 10;
Получаем табличку (линки вставил вручную):
Проверяем. Да, совпадает. Вот теперь вы восхитительны.