这是一个老早老早就有企划的二次开发,但是一直太忙了没有很好的抽出时间去研究,或者说之前在帮一个朋友做,bug发现原来的思路太麻烦,完全有更加简单的办法。其实严格来说typecho的二次开发真心简单得吓人,我已经决定好给它打上各种自己diy的东西后,当成一个php框架用了。所以回到正题,目前这篇文章还是积分系统和收费阅读,积分的获取还仅仅只能依靠手动充值来实现
,我正好有一个收费的阅读网站要用到。
暂时为止,现在还是以最简单的方式实现功能,可能存在未知的bug(我php水平真的很菜),所以发现之后及时在评论留言,但是功能扩展性看来会很强,所以无需担心之后的升级。如果看了还是不会,又强烈需要的话,可以来博客的交流群,找我帮你配置好。关于typecho支付宝的接口,我这些天也会制作
,弄好了就会继续开新的文章。
那么,教程开始
数据库部分:
1.首先在数据库中增加两个字段,分别是typecho_contents和typecho_users表,都是在最后增加一个字段,按照我的截图来。
typecho_contents增加price(文章价格)字段,放在最后,类型为int,长度11,不允许为空,默认为0
typecho_users增加account(用户账户积分)字段,放在最后,类型为int,长度11,不允许为空,默认为0
2.新建一个数据库typecho_read,代码如下,我的是mysql5.5,其它版本可能会不同,但是参考这个就对了。
CREATE TABLE IF NOT EXISTS `typecho_read` (
`rid` int(11) unsigned NOT NULL,
`uid` int(11) DEFAULT '0',
`pid` int(11) DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
这个数据表主要用于记录购买的用户和对应的文章,方便查询和使用。
typecho文件部分:
1.文章编辑接口新增字段price,参考typecho实现文章增加表单,具体操作,新增一个叫做price的字段,用来添加和编辑,注意的就是,在/admin/write-post.php合适位置,加上如下代码。
<section class="typecho-post-option">
<label for="token-input-price" class="typecho-label"><?php _e('文章价格'); ?></label>
<p><input id="price" name="price" type="text" value="<?php $post->price(); ?>" class="w-100 text" /></p>
<p class="description">输入积分数量,默认为0,设置大于0整数后则开始收费</p>
</section>
2.在用户编辑接口,新增字段account,具体文件在/var/Widget/Users/Edit.php。
110行下面添加:
/** 用户账户 */
$account = new Typecho_Widget_Helper_Form_Element_Text('account', NULL, NULL, _t('用户积分'), _t('用户积分用于抵扣付费文章,由管理员进行调控.')
. '<br />' . _t('如果你将此项留空, 将默认为0.'));
$form->addInput($account);
153行下面添加:
$account->value($this->account);
216行改为如下:
$user = $this->request->from('name', 'mail', 'screenName', 'password', 'url', 'group', 'account');
247行改为如下:
$user = $this->request->from('mail', 'screenName', 'password', 'url', 'group', 'account');
操作完上述步骤后,用户添加编辑里面就会出现积分账户的输入框,可以设置积分,并且会在数据库存储,而调用这个积分的标签为
<?php $user->account(); ?>
typecho模板部分:
1.在function.php中加入如下代码,用来在模板层面上实现积分阅读,作者加分,用户扣分的功能,这里特别复杂,可能有bug,如果我发现会立刻补充修改。
/** 判断文章是否支付 */
function post_read($uid,$pid){
$cid = $archive->cid;
$db = Typecho_Db::get();
$prefix = $db->getPrefix();
$row = $db->fetchRow($db->select()->from('table.read')->where('uid = ?', $uid)->where('pid = ?', $pid));
return sizeof($row);
}
/** 文章开始支付 */
function post_buy($uid,$pid,$account,$price,$concent,$aid,$buy,$Uaccount){
$account = (int)$account;
$price = (int)$price;
$Ye = $account - $price;
$Ze = $Uaccount + $price;
$db = Typecho_Db::get();
$prefix = $db->getPrefix();
$row = $db->fetchRow($db->select()->from('table.contents')->where('authorId = ?', $uid)->where('cid = ?', $pid));
$i = sizeof($row);
if($price == 0||$i != 0){
echo $concent;
}else{
if($buy==1){
if($account < $price){
echo "<p>余额不足,请联系管理员充值<p>";
}else{
if(post_read($uid,$pid) !=0){
echo $concent;
}else{
//添加阅读记录
$db->query($db->insert('table.read') ->rows(array('uid' => $uid, 'pid' => $pid)));
//用户扣除积分
$db->query($db->update('table.users')->rows(array('account' =>(int)$Ye ))->where('uid = ?', $uid));
//文章作者添加积分
$db->query($db->update('table.users')->rows(array('account' =>(int)$Ze))->where('uid = ?', $aid));
//$db->query($db->update('table.users')->rows(array('account' => (int) $row['account'] + (int)$price))->where('uid = ?', $aid));
//返回阅读页面
$s = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$url = str_replace('?buy=1', '', $s);
echo "<script>window.location.href=\"".$url."\";</script>";
}
}
}else{
if(post_read($uid,$pid) !=0){
echo $concent;
}else{
echo "<p>阅读此文章需要".$price."积分,请<a href=\"?buy=1\">确认支付</a><p>";
}
}
}
}
2.在文章模板post.php,头部加入以下代码,主要是让用户对这篇文章的购买进行确认
$buy = 0;
if(isset($_GET['buy'])){
$buy = $_GET['buy'];
}
另外文章内容调用标签由<?php $this->content(); ?>替换如下
<?php post_buy($this->user->uid,$this->cid,$this->user->account,$this->price,$this->content,$this->author->uid,$buy,$this->author->account); ?>
到这里,积分系统和文章收费阅读完全以最简单方式实现,至于支付宝充值接口,就几天后的另一篇文章见吧。
演示网站:暂无(我搭建好就摆这里)
部分截图:
更多的typecho二次开发&&模板开发需求,不是太难的,可以来博客群联系我,价格好说。
规则之树版权所有,转载请注明来源,标明作者及原文链接
前台注册的会员跳转到了后台界面这个怎么处理?
@sevens
typecho的模式就是这样,普通用户的的入口和管理员的入口是相同的,只是功能区开的不一样
在文章模板post.php,头部加入以下代码后,无效果啊大大
在文章模板post.php,头部加入以下代码指的是哪里
@仓鼠
就是头部引入header.php文件的php标签里面
google进来的,cloudflare页面规则设置有教程吗?我也是用tyoecho,一样的主题
@Beyond
和cdn没啥关系吧,cdn一般只是缓存js和php导致代码失效
@不暇
这是我的站: https://here.sy 可能整站缓存了,你这个邮件回复的插件是哪个啊,不错哦
@Beyond
邮件回复是LoveKKComment这个插件。
用cdn的话,一般都是被缓存导致的,不过我建议是直接下载打包zip,不要下载最新稳定版。
为什么点击确认支付是Database Query Error
@icbug
数据库的表可能没有建立全
给个思路,其实不用每一篇文章扣分,判断用户的会员到期时间一个值就可以了~。
这样就很简单咯~
期待你出个插件,我来买。
@大佬
emmm,这是搞vip系统,我尝试下吧。
不过除了充值,还可以通过介绍会员注册获取积分,每个注册会员50分等,或者发文过审核后获得积分,这样如何?
@shuzaitou
这个其实在我的设想之内,目前主要的问题是没时间去做
@不暇
优秀的东西都是值得一等的