typecho 根据登录用户或作者输出最近文章

在 typecho 开发的时候经常会有需求,比如:

当用户登录的时候显示,用户信息以及用户最近文章。用户未登录的时候显示文章作者的信息及最新文章。那么接下来我们看看如何实现吧!

判断登录

这个算是比较基础的语法知识了。

if($this->user->hasLogin()){
// 用户登录了则做一些事情
   echo $this->user->uid; // 获取用户uid
   echo $this->user->mail; // 获取用户邮箱
}

获取文章作者信息

echo $this->author->uid; // 获取用户uid
echo $this->author->mail; // 获取用户邮箱

那么拿到 uid 能干嘛呢?

/**输出作者文章总数,可以指定*/
function allpostnum($id, $ret = 0){
    $db = Typecho_Db::get();
    $postnum=$db->fetchRow($db->select(array('COUNT(authorId)'=>'allpostnum'))->from ('table.contents')->where ('table.contents.authorId=?',$id)->where('table.contents.type=?', 'post'));
    $postnum = $postnum['allpostnum'];
    if ($ret) return $postnum;
    if($postnum=='0')
    {
        return '暂无文章';
    }
    else{
        return '文章 '.$postnum.' 篇';
    }
}

/**输出作者人气*/
function allviewnum($id){
    $db = Typecho_Db::get();
    $postnum=$db->fetchRow($db->select(array('Sum(views)'=>'allviewnum'))->from ('table.contents')->where ('table.contents.authorId=?',$id)->where('table.contents.type=?', 'post'));
    $postnum = $postnum['allviewnum'];
    if($postnum=='0')
    {
        return '暂无访问';
    }
    elseif ($postnum>=10000) {
        return ' 1万+访问';
    }
    elseif ($postnum<10000 && $postnum>5000) {
        return ' 5K+访问';
    }
    else{
        return ' '.$postnum.' °c 访问';
    }

}


/**输出作者评论总数,可以指定*/
function commentnum($id){
    $db = Typecho_Db::get();
    $commentnum=$db->fetchRow($db->select(array('COUNT(authorId)'=>'commentnum'))->from ('table.comments')->where ('table.comments.authorId=?',$id)->where('table.comments.type=?', 'comment'));
    $commentnum = $commentnum['commentnum'];
    return $commentnum;
}

那么如何输出对应的最新文章信息呢?请往下看!
我们用一种更灵活的方法来实现~

在主题内新建一个文件夹叫Widget,然后新建一个文件Widget_Contents_Post_Recent_User.php,内容如下:

/**
 * 执行函数
 *
 * @access public
 * @return void
 */
class Widget_Contents_Post_Recent_User extends Widget_Abstract_Contents
{
    /**
     * 执行函数
     *
     * @access public
     * @return void
     */
    public function execute()
    {
        $this->parameter->setDefault(array('pageSize' => $this->options->postsListSize));
        $uid = $this->parameter->uid;
        $select = $this->select();
        if ($uid) $select->where('table.contents.authorId = ?',$uid);
        $this->db->fetchAll($select
            ->where('table.contents.status = ?', 'publish')
            ->where('table.contents.created < ?', $this->options->time)
            ->where('table.contents.type = ?', 'post')
            ->order('table.contents.created', Typecho_Db::SORT_DESC)
            ->limit($this->parameter->pageSize), array($this, 'push'));
    }
}

然后我们在functions.php 里面引入文件

require_once 'Widget/Widget_Contents_Post_Recent_User.php';

如何使用呢?请看:
输入参数为 作者的 uid 和 输出的文章数 $this->options->JAuthorStatus是我自己的参数,你可以替换成文章数:1,2,3...等等

            <?php $this->widget('Widget_Contents_Post_Recent_User@aside__', 'pageSize=' . $this->options->JAuthorStatus . '&uid=' . $this->user->uid)->to($hot);?>
<?php if ($hot->have()) : ?>
<?php while ($hot->next()) : ?>
   <?php $hot->title(); ?> 
   <?php $hot->permalink(); ?>
   ...
<?php endwhile; ?>
<?php endif; ?>

给TA打赏
共{{data.count}}人
人已打赏
技术活

博客接入又拍云CDN,UPYUN 配置指南

2020-12-22 16:15:00

前端/移动技术活

github 的黑夜模式小猫咪动画源码

2020-12-24 11:01:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索