NodeBB and ads - A never ending story
-
A few days ago I opened up an issue on GitHub and the forum related to problems with JavaScript and NodeBB.
To be more specific DFP, and an Anti-AdBlock script. However, @julian closed the issue, with the following argument:Showing advertising via DFP is not a core functionality of NodeBB, and so it would be up to whoever implements the script to debug it. There's no plugin for DFP as far as I know, let me know if I am wrong.
I agree, this is correct. DFP support might not be a core functionality of NodeBB, but what else we can do? Use the non working AdSense plugin for example, which supports only 1 ad network? Despite that something is more than wrong if 2 scripts which work elsewhere just fine do not work with NodeBB.
However, lets focus on the ads. As mentioned earlier DFP support is not a core feature - I agree on that. But a forum software which has no ad features at all? How can this comply to the goal of the devs? Don't you want your software broadly used? If I would have known that NodeBB would be so ad unfriendly I would have never chosen it. Even though I really do enjoy its UX and performance, just like the spirit and work behind it. Webmasters like me have to look how to pay server bills, ourselves and other stuff.
I know no forum which has no ads by the way. Except the few product ones like Microsoft or Steam.
It will be annoying and stressful for the developers to identify the issue, but at the same time it should be rewarding as well as they know that such a fix could mean potentially more users and so a bigger reach for the project. And yes, this fix would allow a 100% perfect integration of ads (a few lines in the Custom HTML is needed as well).
Not only to mention that this would finally allow a "professional" use case for NodeBB, instead of some LEET kiddies having issues with a shitty hoster.
-
Anti-AdBlock script
No, no, no. Never use any adblock prevention measures. Make your ads unobtrusive, static, and safe. Then, simply ask your users to whitelist your site. Running a script that defeats adblocking will just piss off people.
DFP support might not be a core functionality of NodeBB, but what else we can do?
You can ask people for help in getting the stuff working on this forum. If a real issue is found that can be fixed, we can help resolve that issue. The reason your Github issue was closed is because at the moment, the core devs would rather focus on things like widget system overhauls and the core plugins. I believe julian wants to keep ad functionality out of core and in the plugin space, since displaying ads is a very specific and volatile scope due to the many different and changing networks. That's why adsense is accomplished with a plugin.
I know no forum which has no ads by the way. Except the few product ones like Microsoft or Steam.
Well you must not be looking very hard. There are tons of small forums all around which operate on sponsor money without ads.
It will be annoying and stressful for the developers to identify the issue, but at the same time it should be rewarding as well as they know that such a fix could mean potentially more users and so a bigger reach for the project.
I agree that working advertisements will certainly make NodeBB more attractive, but you have to understand that there are many other things which should be prioritized over that, especially when considering that some ads do work.
Now that we've got that out of the way, answer a few questions, please, so we can help you more easily:
- What script did you use to use?
- What did it used to do?
- What doesn't it do now?
- What errors do you get in your browser or the server log?
- Where did you get the script?
- How can I reproduce this or test it myself?
-
FYI at somepoint I managed to get DFP working with the below script.
google DFP widget ad code
google DFP widget ad code. GitHub Gist: instantly share code, notes, and snippets.
Gist (gist.github.com)
Part of it goes into the custom script part and part of it goes into a sidebar widget. You have to edit the ad ids and what not.
-
@PitaJ regular visitors do so, but what with one time visitors?
In my use case it was absolutely the right decision and I would do it anytime again.
Even my users support me with that decision.
And no worries about my ad quality, I use AdX (yes I have "premium" access).Nonetheless I got my own solution for that now. However, I still think that the old script and DFP sync rendering not working are somehow related.
The issue with DFP is related to something at the core and therefore should be properly investigated before it would be too much to get it working again and lets not even talk about small forums. The majority of webmasters still relies on classical banner advertisments.
Before answering a few questions, I would also like to tag @baris. The issue is not that the ads do not show up or anything like that. Actually I even got them reloading a way it suits the Google ToS.
- The code which is not working is the so called synchronous rendering of ads, which is done with this function:
googletag.pubads().enableSyncRendering();
In baris example it would look like this:
<script type='text/javascript'> googletag.cmd.push(function() { googletag.defineSlot('/80273159/nodebbtest', [160, 600], 'div-gpt-ad-1451410127852-0').addService(googletag.pubads()); googletag.pubads().enableSingleRequest(); googletag.pubads().enableSyncRendering(); googletag.enableServices(); }); </script>
- This function does what it is named like. Synchronous ad rendering. For those who cannot imagine what it does:
Without this function whitespaces on the site will appear and then will be filled with the ads, causing the content to be pushed down.
On a desktop PC this is quite okay, but on a mobile device it is unacceptable.
With this function the site will load just nicely and no content or whatsover will be "pushed" down.
-
Unfortunately using the synchronous rendering results in the DOM structure to break, causing the forum to dissapear and just the ads to show up. It is basically like the page would only load the ads, but has no content.
-
None. Even my Google Account Manager looked into it. Nothing was triggered at all.
-
DFP of course.
-
Just select to render ads synchronously and place the code on the site. Basically as @baris suggested it down below.
-
Do you have ajaxify disabled? There's no way to do that currently with ajaxify enabled, due to the ad script calling
document.write()
-
What exactly is not possible @yariplus? Realoding ads? If you mean that, I have to dissapoint you. They work just fine
Here a little how to for DFP users:
Open uppublic/src/ajaxify.js
function renderTemplate(url, tpl_url, data, callback) {
Belowapp.refreshTitle(data.title);
googletag.pubads().refresh();
This will work just fine and complies with Google ToS. -
I apologise I am not very familiar with DFP.
The problem you describe here:
synchronous rendering results in the DOM structure to break, causing the forum to disappear and just the ads to show up. It is basically like the page would only load the ads, but has no content.
is the result of a script callingdocument.write()
after a page has loaded.Since ajaxify asynchronously loads the widget data, I assume something in the widget script must be calling
document.write()
. -
Don't know if the problem is the same, but a few years ago I did a custom ad network (because I didn't like DFP) to serve custom banners and Adsense ads. And I had a problem with
document.write()
too.The problem was solved overriding the
document.write
function. Kinda tricky, but worked: before loading the adsense ad, thedocument.write
function is replaced with a custom function that inserts the content into an element, instead of writing it to the dom directly. After inserting the content, the originaldocument.write
function is restored.
That is, a one time function replacement.Here is some code:
var originalFunction = document.write; overrideDocumentWriteFunction = function(container) { document.write = function(content) { container.innerHTML = content; document.write = originalFunction; }; };
And I used it like this:
var div = document.getElementById('adPlacement'); overrideDocumentWriteFunction(div); var script = document.createElement('script'); script.type = 'text/javascript'; script.innerHTML = '{adsense script content}' document.body.appendChild(script);
This way the
document.write
function was customized to ensure the Adsense script worked after the page was loaded.I haven't tried DFP on NodeBB but maybe this helps.
-
@AOKP so is your only problem with sync rendering?