Hi!请登陆

Typecho 中在摘要线上放置广告

2020-10-23 36 10/23

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

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

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

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

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

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

<?php
/**
 * AdSense
 * @author 天空Blond
 * @version 1.0.0
 */
    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 字段。

相关推荐