Typecho开发技巧小记

开个贴占位,慢慢更新。

1. typehco 插件的执行实际上是有优先权的,多个插件实现一样的钩子总要有个谁先谁后吧,看官方源码:

$weight = 0;

if (strpos($component, '_') > 0) {
    $parts = explode('_', $component, 2);
    list($component, $weight) = $parts;
    $weight = intval($weight) - 10;
}

默认权重为10,用户可以自定义权重(10-1000...),越小的越大。

Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx_10 = array(xxx)

关于顺序,查看:fix #152
这里引用原话:

增加了插件优先级定义的支持,多个插件之间可以自行约定执行顺序,范例
Typecho_Plugin::factory('admin/menu.php')->navBar_1000 = array('HelloWorld_Plugin', 'render');
这个插件的执行优先级就是1000,默认的执行顺序是10,越大的数字越靠后执行

所以结论就是你没有办法让你的插件比别人先执行,除非你的插件权重比别人的小。但如果两个插件都没加权重,则先激活的那个先执行。

2.切换 IP 来源获取

如果你的网站使用了 CloudFlare 一类的 CDN 服务使得部分插件无法正常记录用户 IP 地址的话,可以在 config.inc.php 声明这个静态变量,替换成服务商对应的用户 IP 头就可以了!CloudFlare 现在默认提供的是 HTTP_X_FORWARDED_FOR 头传送用户真实 IP 地址,所以我直接填入头的名称就可以了!

define('__TYPECHO_IP_SOURCE__', 'HTTP_X_FORWARDED_FOR');

3.自定义 Gravatar 源

使用自己的 Gravatar 源,例如 V2EX 提供的源。

define('__TYPECHO_GRAVATAR_PREFIX__', 'https://cdn.v2ex.com/gravatar/');

4.Typecho Debug

config.inc.php插入如下代码后,在编写插件或模板遇到问题时会输出更详细的报错信息(还要确认 PHP 的 display_errors 是否为 On)

define('__TYPECHO_DEBUG__', true);

4.Typecho文章阅读次数统计功能

function get_post_view($archive){
    $cid    = $archive->cid;
    $db     = Typecho_Db::get();
    $prefix = $db->getPrefix();
    if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
        $db->query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT(10) DEFAULT 0;');
        echo 0;
        return;
    }
    $row = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid));
    if ($archive->is('single')) {
 $views = Typecho_Cookie::get('extend_contents_views');
        if(empty($views)){
            $views = array();
        }else{
            $views = explode(',', $views);
        }
if(!in_array($cid,$views)){
       $db->query($db->update('table.contents')->rows(array('views' => (int) $row['views'] + 1))->where('cid = ?', $cid));
array_push($views, $cid);
            $views = implode(',', $views);
            Typecho_Cookie::set('extend_contents_views', $views); //记录查看cookie
        }
    }
    echo $row['views'];
}

调用

<?php get_post_view($this) ?>

5.Typecho博客统计信息调用代码

<section class="widget">
    <h3><?php _e('数据统计'); ?></h3>
    <ul>
        <?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?>
        <li><?php _e('文章数量:'); ?><?php $stat->publishedPostsNum() ?></li>
        <li><?php _e('分类数量:'); ?><?php $stat->categoriesNum() ?></li>
        <li><?php _e('评论数量:'); ?><?php $stat->publishedCommentsNum() ?></li>
        <li><?php _e('页面数量:'); ?><?php echo $stat->publishedPagesNum + $stat->publishedPostsNum; ?></li></ul></section>

6.修改typecho前台获取文章所有字段

比如自己在contents表里面添加了自定义字段,但在前端无法用$this-> 来获取。

修改 var/Widget/Abstract/Contents.php 大约第255行的select()函数:

按如下修改:

return $this->db->select('table.contents.*')->from('table.contents');

就可以在前台使用 $this-> 去访问自己添加的数据库字段了。

7.typecho修改首页文章排序

typecho 默认是按照时间来排序的,可以在 var/Widget/Archive.php 里面搜索execute()函数,将函数最后的$select->order('table.contents.created') 中的 created 字段改成你想要的的排序字段即可。

8.typecho添加前台删除

将下面的代码放到 post.php 中即可

<?php Typecho_Widget::widget('Widget_Security')->to($security); ?>
<a href="<?php $security->index('/action/contents-post-edit?do=delete&cid='.$this->cid); ?>" onclick="javascript:return p_del()">删除文章</a>
<script>
function p_del() {
    var msg = "您真的确定要删除吗?";
    if (confirm(msg)==true){
        return true;
    }else{
        return false;
    }
}
</script>

post.php 页面成功删除文章后,因为文章不存在了,所以页面自动跳到了 404 页面,解决方案可以自行修改为 ajax 版本。

给TA打赏
共{{data.count}}人
人已打赏
建站教程技术活

TpCache之修复阅读次数

2021-1-23 15:53:00

建站教程技术活

JOE主题添加 github 个人项目展示

2021-1-24 22:32:00

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