Включить кнопку «Нравится» для незарегистрированных посетителей

Возможно ли сделать так, чтобы кнопка «Нравится» не открывала форму входа? В моей сценарии она должна работать без авторизации…

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

Есть ли какие-то идеи для альтернативных элементов управления, таких как «звёзды» или кнопка «ОК», чтобы незарегистрированные пользователи могли взаимодействовать?

Ничего, что связано с Discourse, всё касается учётных записей пользователей. Если пользователь не вошёл в систему, нечего записывать.

Может кто-нибудь описать лучшие практики кастомизации Like-Control? Я новичок в этом стеке технологий, мои знания о Discourse ограничены опытом работы с PHP, но не с указанными выше технологиями.

Можете уточнить?

Я имею в виду, что вы можете изменить внешний вид кнопки, но за пределами этого выбор очень ограничен.

Я имел в виду функциональную кастомизацию: я хочу изменить логику, чтобы кнопка «Нравится» работала без входа в систему. Но я не знаю модульную структуру Discourse. Посоветуете ли вы плагин или прямое изменение в PHP? И где можно внести изменения, не нарушив целостность кода? Что произойдет с измененным фрагментом кода при обновлениях и т.д.?

Ядро Discourse написано не на PHP.

Вам придётся создать очень-очень кастомный плагин, чтобы заставить это работать, но тогда это будет нарушением GDPR.

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

Привет, Бхану, ты думаешь, что я многому научусь из этого ответа, чтобы решить проблему?

Я попытался ответить на вопросы, которые вы подняли в сообщении выше. Мой совет: не пытайтесь модифицировать основные функции, если не хотите навсегда вывести из строя свои обновления.

Ок. Спасибо, Бхану. Теперь я знаю, чего не стоит делать :wink:

Я вижу определённую ценность в клоне функции StackOverflow, где анонимные клики по кнопкам голосования сохраняются в базу данных, но не публикуются напрямую.

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

Знает ли кто-нибудь способ (лучшие практики)
a) функциональной кастомизации кнопки «Нравится» или
b) создания дополнительного элемента управления, который считает клики по нему (максимум 1 с IP-адреса), где сумма кликов может отображаться в админ-панели?

Если бы это было только на JavaScript, я бы не спрашивал, но решение должно обеспечивать сохранение данных…

Это не совсем тема поддержки, сейчас этим никто не занимается. То, о чём вы просите, довольно сложно и определённо не то, чем мы сможем вам легко помочь.

Если вы не знакомы с JavaScript и Ruby, то для реализации решения, скорее всего, понадобятся деньги :money_with_wings:.

Если у вас есть бюджет и эта функция действительно важна для вас, возможно, стоит создать тему в канале Marketplace?

В качестве альтернативы я бы посоветовал начать заново в канале Development, поскольку вам, скорее всего, придётся создать какой-то плагин.

А, значит, в данном случае лучшая практика для изменений логики — это плагины? Понятно. Хорошо, что я это узнал. Спасибо!

Если вы планируете заняться этим самостоятельно, см.:

Руководство для начинающих по созданию плагинов Discourse (1) (2) (3) (4) (5) (6) (7)

Также ознакомьтесь с руководством в канале dev-install, чтобы настроить окружение для разработки и начать работу.

Интересный факт: @sam ещё тогда выступал за эту функцию, и он был прав!

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