Да, это возможно. Давайте начнем с чего-нибудь простого. Сначала добавьте это во вкладку «Header» нового компонента темы.
<script type="text/discourse-plugin" version="0.8.42">
</script>
Что это делает? Это специальный тип тега script, который обрабатывается Discourse. В чём преимущество? Это позволяет вам обращаться к методам API плагинов.
Вы хотите добавлять реферальный код к некоторым ссылкам. Это означает, что вам нужно изменять содержимое сообщений. Если вы посмотрите на API плагинов, то увидите, что для этого действительно есть метод.
Вы используете его следующим образом.
api.decorateCookedElement(
element => {
// выполните здесь свои действия.
// элемент, переданный здесь, — это HTML-узел обработанного сообщения
},
{
// здесь указываются опции
}
);
Это обёртка, в которую нужно поместить ваш код, чтобы он выполнялся при отображении сообщения. Давайте попробуем это сделать.
Берём ваш код и добавляем его как есть:
api.decorateCookedElement(
element => {
++ // Замените "my-affiliate-id" ниже на ваш реальный реферальный ID
++ const aid = "my-affiliate-id";
++
++ // Добавляем слэш с реферальным ID, только если в ссылке ещё нет реферального ID
++ const goglinks = document.querySelectorAll('a[href*="gog.com"]');
++ goglinks.forEach(function (el) {
++ if (!el.href.includes("pp=")) {
++ el.href = el.href.replace(/\?.*$/, "") + "?pp=" + aid;
++ }
++ });
},
{
// здесь указываются опции
}
);
Это работает? Да, но при этом выполняется лишняя работа, поскольку мы ищем ссылки в document, а не в элементе сообщения. Так как это исправить?
Помните аргумент element, который мы передали в метод? Вот когда он становится полезным.
Вместо того чтобы искать в document, мы ищем в целевом элементе. Поэтому меняем это:
const goglinks = document.querySelectorAll('a[href*="gog.com"]');
на это:
const goglinks = element.querySelectorAll('a[href*="gog.com"]');
Вот что у нас получается в итоге:
api.decorateCookedElement(
element => {
// Замените "my-affiliate-id" ниже на ваш реальный реферальный ID
const aid = "my-affiliate-id";
// Добавляем слэш с реферальным ID, только если в ссылке ещё нет реферального ID
-- const goglinks = document.querySelectorAll('a[href*="gog.com"]');
++ const goglinks = element.querySelectorAll('a[href*="gog.com"]');
goglinks.forEach(function (el) {
if (!el.href.includes("pp=")) {
el.href = el.href.replace(/\?.*$/, "") + "?pp=" + aid;
}
});
},
{
// здесь указываются опции
}
);
Теперь это работает отлично, но мы всё ещё можем немного улучшить код. Поскольку вы добавляете реферальный ID только к ссылкам, вам не нужно, чтобы этот код выполнялся, когда вы находитесь в редакторе сообщения. Вот здесь и пригодятся опции метода.
Одной из опций, которую можно передать методу, является onlyStream.
Что она делает? Она указывает методу, что этот код должен выполняться только при отображении сообщения внутри темы. Давайте добавим эту опцию.
api.decorateCookedElement(
element => {
// Замените "my-affiliate-id" ниже на ваш реальный реферальный ID
const aid = "my-affiliate-id";
// Добавляем слэш с реферальным ID, только если в ссылке ещё нет реферального ID
const goglinks = element.querySelectorAll('a[href*="gog.com"]');
goglinks.forEach(function (el) {
if (!el.href.includes("pp=")) {
el.href = el.href.replace(/\?.*$/, "") + "?pp=" + aid;
}
});
},
{
++ onlyStream: true
}
);
Итак, теперь осталось только поместить этот код в специальный тег script, о котором мы говорили ранее.
<script type="text/discourse-plugin" version="0.8.42">
api.decorateCookedElement(
element => {
// Замените "my-affiliate-id" ниже на ваш реальный реферальный ID
const aid = "my-affiliate-id";
// Добавляем слэш с реферальным ID, только если в ссылке ещё нет реферального ID
const goglinks = element.querySelectorAll('a[href*="gog.com"]');
goglinks.forEach(function (el) {
if (!el.href.includes("pp=")) {
el.href = el.href.replace(/\?.*$/, "") + "?pp=" + aid;
}
});
},
{
onlyStream: true
}
);
</script>
Затем добавьте это во вкладку «Header» вашего компонента, и всё готово. В этом примере я использовал GOG, потому что вы спрашивали именно о нём, но этот шаблон можно использовать для любой реферальной программы, если вы знаете структуру URL.