在开发 Typecho 主题时踩得那些坑
许久没有写技术博文了,今天比较闲来记录一下最近在折腾的东西。
最近在编写一个 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
是个好东西,几乎所有有关页面的信息都存在这个数组中。