ProcessWire如何实现Tags标签功能?

后端开发ProcessWire 1068

类似WordPress的Tag聚合已经成了内容网站必不可少的功能,可作为关键词扩展部署优化,ProcessWire创建标签云非常简单。

一 创建模板

首先我们需要两个模板:在templates目录下新建两个文件:tag.phptags.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"
输入字段类型 asmselectpageAutocomplete
允许从字段创建新页面 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;
	  }
	}	

Post Comment