I saw this and was thrilled:
Then I installed it, and realized that it still only works for Amazon. Would it be hard to add support for ShareASale? Maybe even a “generic” rewrite where you regex an URL and do a replacement?
I saw this and was thrilled:
Then I installed it, and realized that it still only works for Amazon. Would it be hard to add support for ShareASale? Maybe even a “generic” rewrite where you regex an URL and do a replacement?
Я знаю, что это из '16, но я не могу найти ответ на этот вопрос и ищу что-то похожее. Существует ли плагин, который позволяет выполнять «общую» переписку URL-адреса, отправленного участниками сообщества, например, добавлять партнерский тег или изменять ссылку, отправленную пользователем, на партнерскую?
Насколько мне известно, нет, но мне интересно узнать, есть ли какие-то новости по этому вопросу ![]()
Сегодня это должно быть возможно в компоненте темы, в зависимости от того, как должны выглядеть ссылки.
Можете ли вы привести пример базовой ссылки и пример того, как она будет выглядеть как партнерская ссылка?
Это обсуждение было завершено преждевременно. Возможно, мне придется переосмыслить монетизацию нашего сообщества.
В моем случае мне нужно добавить префикс к URL-адресу.
http://merchantxyz.com/....
и преобразовать его в…
https://tracker.adagency123.com/t/t?a=12345678&as=87654321&t=2&tk=1&url=https://merchantxyz.com/...
Есть несколько тем, затрагивающих эту проблему, но было ли готовое решение для продакшена?
К сожалению, я так не думаю. Скорее всего, это был бы отличный кандидат для работы на Marketplace.
Возможно ли реализовать это через настройку темы? Я рассматриваю возможность модификации этого JSFiddle, но какой был бы правильный способ внедрения этого в экземпляр Discourse — если это вообще возможно?
// Замените "my-affiliate-id" ниже на ваш реальный партнерский ID
const aid = 'my-affiliate-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
}
})
Да, это возможно. Давайте начнем с чего-нибудь простого. Сначала добавьте это во вкладку «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.
Вау, какой фантастический и познавательный урок!
JSFiddle был просто примером, который я нашёл. Наш новый потенциальный партнёр использует префикс https://, а не идентификатор партнёра в конце. Они работают на платформе adtraction.com.
Опубликовал здесь свою модифицированную версию для использования другими.
<script type="text/discourse-plugin" version="0.8.42">
api.decorateCookedElement(
element => {
const affiliate = 'https://their-ad-network.com/...';
const affiliate_links = element.querySelectorAll('a[href*="potentialparterwebsite.com"]');
affiliate_links.forEach(function(el) {
if (!el.href.startsWith(affiliate)) {
el.href = affiliate + encodeURIComponent(el.href);
}
});
},
{
onlyStream: true
}
);
</script>
Теперь код добавляет URL рекламной сети в начало, который отслеживает клики, а затем дополняет партнёрской ссылкой.
Хотя это элегантно работает для ссылок, созданных вручную, например, при привязке слова к https://website, похоже, что это не захватывает ссылки, автоматически генерируемые парсером Discourse. Иными словами:
Это работает: Google
Но это не работает: Google.com
Можно ли улучшить скрипт, чтобы он также захватывал автоматически генерируемые ссылки?