如何在我的网站上禁用或隐藏不需要的 Disqus 广告?

How do I disable or hide the unwanted Disqus ads on my website?

Imagine that one day, suddenly, random ads started appearing on your website...

Recently Disqus started forcing unwanted ads inside of the Disqus comments,在您不知情的情况下在您的网站上展示那些讨厌的广告。他们似乎只针对每日流量 "big enough" 的网站或使用其他一些任意标准,因此广告不会出现在所有网站上,而是只出现在相对繁忙的网站上。

这样 Disqus "forces" 您可以升级到付费订阅计划 - 对于付费用户,这些广告成为可选的(即您可以在 Disqus 管理面板中禁用它们)。

不想付钱怎么办?如何禁用这些广告? 有没有简单、快速的解决方案?

至少在我们有时间切换到另一个评论系统之前。

截至撰写本文时,流行的 AdBlock 浏览器扩展似乎已成功拦截广告。但是,并非所有网站访问者都使用 adblock。

这是隐藏广告的快速 jQuery-based 解决方案:

(function($){
    setInterval(() => {
        $.each($('iframe'), (arr,x) => {
            let src = $(x).attr('src');
            if (src && src.match(/(ads-iframe)|(disqusads)/gi)) {
                $(x).remove();
            }
        });
    }, 300);
})(jQuery);

只需在 jQuery 加载后将其插入您的网站,在出现 Disqus 评论的每个页面上。该代码会定期检查您的网站上是否存在 Disqus 广告,并删除它们的容器。你知道,以防万一他们会尝试 re-appear.

您可以使用 CSS 隐藏广告 iframe(请注意@DanielGale 所说的是正确的 - 这将是一场猫捉老鼠的游戏,您的 CSS 选择器将不得不进行调整):

iframe[src*="ads-iframe"] { display: none; }

您可以为 WordPress 站点安装此插件:https://wordpress.org/plugins/remove-disqus-ads/

你可以在原版中做到这一点 javascript

document.addEventListener('DOMContentLoaded', function () {
    let disqus = document.getElementById('disqus_thread');

    let remove_ads = setInterval(() => {
        let iframes = document.getElementsByTagName('iframe');

        for (var iframe in iframes) {
            if (typeof iframes[iframe].src === 'undefined') {
                continue;
            }

            if (iframes[iframe].src.match(/(ads-iframe)|(disqusads)/gi)) {
                iframes[iframe].style.display = 'none';
                disqus.style.width = '100%';
            }
        }
    }, 500);

    setTimeout(function () {
        clearInterval(remove_ads);
    }, 5000);
});

禁用 “赞助商” 标签的 Disqus 部分

广告]

你的问题将通过这个插件解决:

https://github.com/Muneebkh2/ads-disabler-disqus

If you have any other query let me know ?

谢谢。

Disqus 随着时间的推移发生了变化,因为有人提出了这个问题。现在,在 2021 年,Disqus 使用 iframes 以及难以区分的 class 名称和 ID。我发现当它显示广告时,它显示 最少 3 个 iframe,第二个 iframe 是评论部分本身,第一个 iframe 和第二个之后的 iframe 是广告。 Disqus 开发人员也很聪明,在 初始加载时,Disqus 仅加载 1 个 iframe,作为评论部分本身,并且在 delay ~0.5 -1s 它加载广告。所以你 不能再用普通的 CSS 删除它们,因为你的 CSS 通常会在 Disqus 广告加载之前加载,所以我们必须编写一个函数延迟,等待广告加载。然后删除。

这是我在 JQuery 中的代码示例,适用于不同的站点:

const disqus = jQuery('#disqus_thread');

disqus.ready(function() {
  setTimeout(function() {
    if (disqus.children().length >= 3) {
      const comments = disqus.find('iframe:nth-child(2)').detach();
      disqus.empty().append(comments);
    }
  }, 2000);
});

我正在搜索 disqus_thread ID。然后函数等待 2s。通常 1.5s 是 Disqus 广告加载所需的最长时间。所以 2s 是等待广告加载的安全点。然后我检查 disqus div 有多少 children 元素。如果小于 3,则表示 Disqus 没有加载广告,因此我们不必删除任何元素。但是如果有 3 个或更多 children,我们保存第 2 个 child 即评论部分,然后删除 disqus 中的所有元素 div,并重新附加评论部分。

这不是理想的解决方案。但到目前为止,它在多个网站上对我有用。

在花了大约 40 分钟并尝试了不同的方法后,我使用以下 jquery 代码片段找到了解决方案。我们知道 disqus 在评论的上方和下方都有广告部分,所有这些都在 iframe 中,id 以“dsq-app1320”开头(只有 4 位数字变化)所以代码片段是

$(window).on('load', function () {
    $("iframe[id^='dsq-app']").each(function (i, el) {
        if(i===0 || i===2) {
            el.remove();
        };
    });
});

我能够使用这个简单的 CSS 条目删除添加:

div#disqus_thread iframe[sandbox] {
        max-height: 0px !important;
}

之所以有效,是因为广告是在具有 'sandbox' 属性的 iframe 中投放的。

更新: 2021 年 12 月

截至 2021 年,许多以前的解决方案都不起作用。这是我想出的一个简单的解决方案:

Disqus 广告部分带有一个 iframe 标签,该标签具有属性 sandbox。因此,您只需将任何 iframe 元素的显示设置为已定义 sandboxnone

iframe[sandbox]:not([sandbox=""]) {
    display: none !important;
}

注意: 如果您的网站中定义了具有 sandbox 属性的任何其他 iframe 标签,请小心。这可能会删除所有这些。