ProcessWire如何实现Tags标签功能?
类似WordPress的Tag聚合已经成了内容网站必不可少的功能,可作为关键词扩展部署优化,ProcessWire创建标签云非常简单。
一 创建模板
首先我们需要两个模板:在templates
目录下新建两个文件:tag.php
和tags.php
,tags
用来展示所有标签的聚合(标签云),tag
展示标签详细,该标签的内容聚合,模板文件建好之后记得到后台setup->templates中添加它们.
使用tags
模板创建一个页面,页面名称(path)输入"topic
",标题输入"专题
"
到这里我们已经创建了tags模板文件,并用这个模板文件创建了一个存放标签云的页面,叫"专题
",地址是"/topic/
",这里一定要牢记,后面要用到!
接下来我们创建模板 tag
,并设置为 tags
的子模板,在前面我们已经创建了两个文件,但是还没输入任何内容,接下来我们要往这两个模板中添加内容:
tag.php
模板:
<?php $thisTag = $page->title; $tagPages = $pages->find("tags.title=$thisTag"); foreach ($tagPages as $tp){ // iterate over the pages with that tag echo " <div class='teaser'> <h3>{$tp->title}</h3> <p>{$tp->summary}</p> <a href='{$tp->url}'>Read more...</a> </div>"; }
模板 tags
设置为 tag
的父模板,tags.php
模板的内容:
<?php $tags = $pages->get("/tags/")->children->find("sort=title"); echo "<ul>"; foreach($tags as $tag){ //iterate over each tag echo "<li><a href='{$tag->url}'>{$tag->title}</a></li>"; // and generate link to that page } echo "</ul>";
二 创建字段
创建字段 tags
类型:page
然后我们要做以下设定:
输入->
页面父对象 -> "专题
"(页面名称为tags的页面,用来存放tags的父页面)
页面模板 -> "tag
"
输入字段类型 asmselect
或 pageAutocomplete
允许从字段创建新页面 yes
三 注意事项
英文默认创建tag的时候会以英文名为tag页面的名称,其他语言建议安装pageidAsName.module
模块或者使用钩子在setupNew的时候将ID作为tag页的名称:
$this->pages->addHookBefore('setupNew', $this, 'hookSetupNew'); public function hookSetupNew(HookEvent $event) { $page = $event->arguments[0]; if(!strlen(trim($page->name)) && $page->id != 1) { $page->name = $this->pages->find("include=all, sort=-id, limit=1")->first()->id+1; } }