在开发 Typecho 主题时踩得那些坑

4 年前(已编辑)
1045
这篇文章上次修改于 3 年前,可能部分内容已经不适用,如有疑问可询问作者。

许久没有写技术博文了,今天比较闲来记录一下最近在折腾的东西。

最近在编写一个 typecho 上的主题,也不能说是编写,因为前端是完全搬运的,只是前端实现后端接口,再加之编写一些实现。算是从别的 CMS 上移植了一套主题,其实开始觉得简单真正做起来并不简单。一是因为 typecho 的文档太少了,官方只提供了基本的 api,其他的你还要自己去深究。第二个是 typecho 功能有限,很多时候需要自己去用另一种方式去实现。

我移植的主题是保罗自行写的一个 CMS 的前端界面,与 typecho 不同,那套 CMS 是包括个人主页,日记页,追番页,音乐页,包括点赞,等等。而 typecho 是没有提供这些方法的。所以我是通过 typecho 的独立页面来实现的。

想法总是简单的,实现确实难的。在独立页面输出文章,不能用 $this->content() 进行输出,因为 $this->content() ,只能输出当前独立页面的内容,后来想到有个获取最近发布的文章的 api,但是可惜文档并没有说得很清楚,网上的 Demo 也只是用这个来获取标题和链接,并解析成 <a> 标签的形式。在一次偶然机会,我发现了这个 api 可以输入到一个变量中,然后进行迭代,就和在 index.php 中的 $this->next() 是一样的。首先你要搞清楚 $this 这个对象里面都什么,在首次开发中用的最多的就是 var_dump($this) 了,经常能在迷途中发现出路。

那么说了这么多,到底该这么用这个接口呢。

 $this->widget('Widget_Contents_Post_Recent', 'pageSize=10')->to($posts)

以上是把最近发文 10 篇输入到$posts 这个变量中,然后你可以迭代输出你需要的值。这是网上最多的用法,其他的需要自我挖掘。

首先,'pageSize=10' 是可以不要的,这个参数如果不传,这个变量就是在 index.php$this的一部分,迭代他 while ($posts->next()) :,用$posts->title() 就可以输出每篇文章标题,和在 index.php 中的 $this->title() 是一样的,比如 $posts->content();$posts->text();

<?php while ($posts->next()) :
            ?>
            <h1 style="position: relative;"><a href="<?php $posts->permalink() ?>" style="color: #000"><?php echo date('Y-m-d', $posts->created); ?></a>
                <small>(<?php echo date('l', $posts->created); ?>)</small>
                <div class="note-title"><?php $posts->title() ?></div>
            </h1>
            <div class="paul-note" id="cid-<?php $posts->cid(); ?>">
                <div class="note-content">
                        $posts->content();
        <?php endwhile; ?>

然后是独立页面,为了做这个主题,我大概用了7 个独立页面,为了把他们联系起来,获取到每个页面用的模板是什么,在对使用哪个模板的独立页面的永久链接获取到,也是深挖了很久。这次是遍历 $this->widget('Widget_Contents_Page_List') ,放入一个变量进行遍历。

$this->widget('Widget_Contents_Page_List')->to($pages);
$works = $index_pages = $collection = array();
while ($pages->next()):
    switch ($pages->template):
        case 'page-note.php':
            $GLOBALS['note'] = $pages->permalink;
            break;
        case 'page-works.php':
            $GLOBALS['project'] = $pages->permalink;
            break;
        case 'page-bangumi.php':
            $GLOBALS['bangumi'] = $pages->permalink;
            break;
        case 'page-works_info.php':
            $works[] = $pages->permalink;
            break;
        case 'page-music.php':
            $GLOBALS['music'] = $pages->permalink;
            break;
        case 'page-say.php':
            $GLOBALS['say'] = $pages->permalink;
            $GLOBALS['say_text'] = $pages->content;
            break;
        case 'page-index.php':
            $index_pages[] = $pages->permalink;
            break;
    endswitch;
endwhile;
$GLOBALS['works'] = $works;
$GLOBALS['index'] = $index_pages;
$GLOBALS['stack'] = $pages->stack;

这样就可以拿到所有的链接了,随便提一下,stack是个好东西,几乎所有有关页面的信息都存在这个数组中。

最后附上主题链接:https://github.com/Innei/Typecho-Theme-Paul

评论区加载中...