在DokuWiki上添加AdSense
给新安装上的DokuWiki安装了monobook模板,现在看上去和Wikipedia像极了。monobook模板有左侧边栏,这样正好那放一个120×600的AdSense,而且不影响视觉效果。我的要求要高一些,就是让AdSense只在正文页和搜索结果页中显示,在登录页、历史修订页中不显示,并且当以管理员的身份登录时也不显示,这样可以避免自己的误点。为了到达这个目的,我差不多在DokuWiki的源代码里转了一圈,可以想象这是多么富有挑战的事情。下面是我的一些记录。
添加AdSense的方法说起来很简单,就是直接把AdSense代码添加到monobook模板文件(main.php)中相应的位置。为了找到这个相应的位置,一定要对HTML和CSS很熟悉,并且还要有足够的耐心在茫茫的源代码中细细搜寻。此外,一个好用的软件工具也是必须的。我一直认为FireFox的Firebug插件相当好用,可以用它来迅速得到某一个页面元素在HTML源代码中的确切位置,以及它的属性、样式等等信息。对于修改模板一类的用途来说,Firebug这个插件很有用处。这里就不细说Firebug如何使用了,请自己摸索吧。
只是我对自己的要求没这么简单。首先,我要求当我以管理员身份登录时,不要显示AdSense广告。经过分析DokuWiki的源代码,我发现判断当前用户是否为管理员可以由$INFO['perm']这个变量来控制。当$INFO['perm']为AUTH_ADMIN(DokuWiki内部的一个常量)时,即表示当前用户为管理员。其次,我要求只在正文页面和搜索结果页面上显示AdSense,也就是说,在编辑、登录等页面上不显示AdSense。因为AdSense的计划政策中提到了“不得在非内容页面上显示AdSense”,这样做有利于更好地遵守计划政策,避免被Google警告或者封号。分析过源代码后,我发现DokuWiki使用$ACT这个全局变量变标明要执行的动作,是显示正文、搜索还是登录等等。如果是显示正文内容的话,$ACT=’show’;显示搜索结果时,$ACT=’search’。于是可以通过在模板中加入检查$ACT值的PHP语句来控制AdSense是否显示。
但这样还存在一个问题。Wiki页面中经常会出现很多还没有被创建的页面的链接,点击以后会提示你该页面还未被创建。这种页面应该也不属于内容页,放AdSense也是不太合适的。当显示这种页面时,$ACT的值仍然是’show’,因此还需要别的办法。
解决这个问题的切入点是要知道DokuWiki是怎么样判断出某个Wiki页面不存在的。我在源代码中搜索了一个多小时,终于弄明白了。DokuWiki对每一个Wiki页面都有一个ID和一个REVISION,用来标明页面和它的修订版本号。DokuWiki通过这两个值可以确定这个页面对应的文件名(DokuWiki使用平面文件系统存储所有数据,不使用数据库)。ID和REVISON的值都可以通过URL上的GET参数获得,在DokuWiki中用$ID和$REV这两个全局变量来表示。DokuWiki还提供了一个函数wikiFN($id, $rev=”),这个函数用来根据ID和REVISION计算出相应的文件名(包括路径)。DokuWiki内部就是通过检查这个文件是否存在来判断对应的Wiki页是否存在的。
经过以上的分析,现在就可以写出应该在模板文件main.php中加入的代码了:
<?php if ($INFO['perm'] != AUTH_ADMIN): global $ACT; global $ID; global $REV; $file=wikiFN($ID, $REV); if (@file_exists($file) && $ACT == 'show' || $ACT == 'search'): ?> <div> <h5>赞助商链接</h5> <div> <!-- Your AdSense code ... --> </div> </div> <?php endif; endif; ?>
刚刚接触DokuWiki就能玩儿到这种程度,自己感觉还是蛮有成就感的。