Создание домашней страницы с пользовательским фильтром

Могу ли я создать динамическую главную страницу, например такую:

  • 10 недавно активных тем (на этой неделе)
  • 5 самых последних созданных тем (сегодня)
  • 5 более новых тем (на этой неделе)
  • 5 тем с наибольшим количеством ответов (на этой неделе)
  • 5 тем с наибольшим количеством лайков (на этой неделе)
  • 5 самых последних созданных тем (вчера или сегодня)

В Discourse есть компонент темы «Filtered Topics List», с помощью которого можно создать главную страницу такого вида, но, на мой взгляд, его недостаток в том, что он работает только с определённым временным диапазоном, поэтому мне пришлось бы ежедневно менять этот диапазон.

То есть сейчас это работает на основе указания дат, например:

activity-before:YYYY-MM-DD — темы с последним обновлением до указанной даты
activity-after:YYYY-MM-DD — темы с последним обновлением после указанной даты
created-before: YYYY-MM-DD — темы, созданные до указанной даты
created-after:YYYY-MM-DD — темы, созданные после указанной даты

Но тогда мне постоянно придётся менять даты. Есть ли в форуме какая-либо альтернатива?

Кроме того, главная проблема этого компонента заключается в том, что он повторяет темы в каждом сорте.

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

Да, это усложнение при использовании нескольких списков тем: компоненту необходимо сопоставлять каждый список и удалять дубликаты. Это не очень сложно, но, насколько я знаю, это не реализовано ни в одном из доступных компонентов.

Не совсем только на ответах и лайках, но да, просто пытаюсь создать динамично выглядящую главную страницу.

Значит, компонент, который сможет удалять дубликаты тем из любого из полей, справится с задачей?

Да, добавить функцию «скрыть дубликаты» к Filtered Topic Lists было бы не слишком сложно, если @gormus заинтересован. Действие findFilteredTopics можно доработать так, чтобы оно сохраняло все идентификаторы тем в список, а затем удаляло дубликаты.

Недостаток в том, что если вы запросите список из 10 тем, то после удаления дубликатов можете получить только 5… но это можно частично избежать, например, подгружая немного больше тем, чем указано в настройках.

Я уже добавлял фильтрованные списки на домашние страницы нескольких проектов и должен предупредить: чтобы наполнить несколько списков «самое свежее» с перекрывающимися фильтрами, вам изначально нужна очень активная сообщество. Однако, когда ваше сообщество действительно активно, у вас также будет гораздо более богатый набор контента для создания динамичной домашней страницы. В таком случае блок с разными списками может выглядеть скорее статичным и не особенно привлекательным визуально.

Однако, если посмотреть под другим углом, можно рассмотреть вариант с одним или двумя списками с ручным фильтром по времени. Это может даже казаться пользователям более динамичным. Например, как на этом изображении:

Это функция, которую я заимствовал из темы Central, и она доступна здесь как компонент блока: Manuel Kostka / Discourse / Blocks / Top Topics · GitLab

Верно, это может сработать, но на самом деле я хотел разместить на странице несколько фильтров.

Да, это действительно работает. Если @gormus заинтересован :))

Сегодня я выпустил обновление, которое немного поможет в этом: FEATURE: allow date-based filters to accept a day count by awesomerobot · Pull Request #33197 · discourse/discourse · GitHub (вы получите его при следующем обновлении Discourse).

Это позволит вам указывать желаемое количество дней в фильтрах activity/created-before/after, так что вы сможете использовать:

activity-after:7 — темы, активные за последние 7 дней
created-after:1 — темы, созданные более суток назад

Также можно использовать 0 для сегодняшнего дня (то есть после полуночи).

Черт, это быстро. Спасибо!!

Привет, @awesomerobot, просто хотел сообщить, что я внес необходимые изменения, и теперь всё работает отлично. Спасибо :))