MENU

代码

【歪门邪道】Typecho中在摘要线上放置广告

众所周知,个人博客这个东西向来都是干砸钱不赚钱,想弄些广告补贴收入,用户体验就会直线下滑。本文将尝试在Typecho的摘要线处添加广告。

摘要线和广告

在Typecho中,摘要线就是<!-- more -->,在网页源代码中可以看到这一行就以HTML注释的方式存在着,因此本文的目的就是尝试将广告放在摘要线下面。

关于广告的位置,我考虑了很多地方,最开始就是放在版权声明的下面,但是谷歌广告联盟很贼啊,你不把页面拖到下面,他就不算一次展示,所以平均下来我这一天还没有100次展示量呢。可是用谷歌的自动广告,它选的位置我都不喜欢。比如一打开网页在文章前面放一个广告,这固然有助于收益,但是我个人认为这个位置太具有侵略性了,人家点进来是看文章的,你给人家先放个广告,给人感觉过于的重视盈利了。其他的位置,诸如文章中间插入,在我看来完全就是不可接受的,毕竟文章还是一个整体,中间插入一个广告就非常影响阅读体验。就目前而言,本站也并非所有文章都开启了摘要线广告。原来处于「1080P番剧补全计划」、「随便写写」、「读书」分类下,那些我很在意阅读体验的文章,我都关掉了广告。毕竟我还是觉得我的个人博客还是以生活为主,盈利还是第二位的。

但有一说一CN2的线路是真的贵,要不然我也不至于通过广告来补贴点家用。

关于广告联盟,我选择谷歌AdSense,其他广告联盟应该也行,如果比较野性的话,选择TrafficJunky也不失为一种办法,可能R18的广告点击率会更高,收益也更高呢,反正我是没渴求收益到这种程度,就谷歌挺好。

关于广告类型,我在版权处使用的广告单元类型是「展示广告」,他比较适合在一个框框内自成一体。而文章中间这种类型就不太行了,我使用的是「文章内嵌广告」,在PC上更贴合一些,手机上嘛,我现在的手机坏了,疫情闹得我也出不了门,买的备用机也一直没发货,所以尚不可知。但是考虑到手机屏幕的尺寸,我觉得在手机端这两种广告区别不大。

插件存储设置

为了方便日后更换广告代码,我决定不把广告代码写死在PHP页面里,这是一方面,另一方面是PHP我也不熟悉,多行字符串我也不会弄,最后改完了整的文件看起来很不优雅。所以最终我决定使用一个啥也不干的插件,专门存储广告代码。

请在网站根目录下/usr/plugins/AdSense/Plugin.php写入如下内容,其中路径里的AdSense是插件名,可以自定义,但是要确保和下面的内容对上:

<?php 
/**
 * AdSense
 *  
 * @package AdSense 
 * @author 天空Blond
 * @version 1.0.0
 * @link https://skyblond.info
 */
    class AdSense_Plugin implements Typecho_Plugin_Interface{
        /* 激活插件方法 */
        public static function activate(){}
 
        /* 禁用插件方法 */
        public static function deactivate(){}
         
        /* 插件配置方法 */
        public static function config(Typecho_Widget_Helper_Form $form){
            $ad = new Typecho_Widget_Helper_Form_Element_Textarea('adsenseCode', NULL, '',_t('AdSense代码'), _t('推荐使用文章内嵌广告单元'));
            $form->addInput($ad);
        }
         
        /* 个人用户的配置方法 */
        public static function personalConfig(Typecho_Widget_Helper_Form $form){}
         
        /* 插件实现方法 */
        public static function render(){}
    }
?>

这个模板来自于Typecho插件开发文档,关于对上述代码的修改,也可以参照文档进行。

上面的代码做的事就是在注册一个插件设置,名字叫adsenseCode,可供输入多行文本。之后可以通过Typecho_Widget::widget('Widget_Options')->plugin('AdSense')->adsenseCode来调用这里面存储的值。

替换摘要线并显示广告

这部分本来也想用插件来实现的来着,但是插件文档似乎并没有提到有关于控制文章内容的接口。故这里直接通过修改负责显示文章的文件来达成。在我使用的主题中,负责显示的文件是网页根目录下/usr/themes/Mirages/post.php文件,其中负责显示的是echo Content::parse($this->content);这一句,我们需要修改这一句让他来显示广告。

$this->content中会包含<!--more-->,此处可以使用PHP自带的字符串替换功能来实现,同时为了让是否显示摘要线广告可控,可以利用文章的自定义字段来控制。这里我判断hideAds字段的值是否为true,是则隐藏广告,否则默认是显示。

需要注意的是如果只替换<!-- more -->,则有可能会处理掉文章中的内容,实践中摘要分割线一定是在段落(<p></p>)后,所以可以连</p>一起作为判断,进行替换。

最终替换的代码如下:

<?php 
    if(Utils::isTrue($this->fields->hideAds)){
        echo Content::parse($this->content);
    }else{
        echo str_replace("</p><!--more-->",'</p><!-- more --><br/>' . Typecho_Widget::widget('Widget_Options')->plugin('AdSense')->adsenseCode . '<br/>', Content::parse($this->content));
    }
?>

其中Utils::isTrue是我用的主题自带的函数,其实现如下:

public static function isTrue($field, $key = NULL) {
    if (is_array($field) && !empty($key)) {
        return in_array($key, $field);
    }
    return $field > 0 || strtolower($field) == 'true';
}

其实只要最后一个return语句就行了。

最后保存文件,记得在设置里填上正确的广告代码,应该就可以了。如果想关闭摘要线广告,只要设定自定义字段,名称叫hideAds并设置值为true或者大于0的整数。

如果你想默认隐藏广告,可以利用showAds来进行判断,并反转上面代码的if-else字段。

-全文完-

Read More