众所周知,个人博客这个东西向来都是干砸钱不赚钱,想弄些广告补贴收入,用户体验就会直线下滑。本文将尝试在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