Typecho插件制作实例:制作sitemap插件

### 原理介绍
sitemap插件的原理其实很简单,就是监听文章的变化(新增或者编辑),并在文章变化的时候更新sitemap文件。sitemap是各大博主用得最多的功能之一,今日TypechoDev详细介绍一下sitemap插件的实现过程~~当然,你也可以直接在typechodev.com上面下载本插件哈!

### 制作文章编辑监控钩子
首先我们用到`Typecho_Plugin::factory(‘Widget_Contents_Post_Edit’)->write`这个钩子,此个钩子就是后台在编辑文章的时候触发。

Widget_Contents_Post_Edit中:

$contents = $this->pluginHandle()->write($contents, $this);

所以,我们在这里挂我们的钩子即可:

public static function activate()
{
Typecho_Plugin::factory(‘Widget_Contents_Post_Edit’)->write = array(‘Sitemap_Plugin’, ‘generater’);
}

其中geerater函数逻辑如下:读取所有文章列表,并将文章内容写入sitemap。

public static function generater($content) {

$options = Typecho_Widget::widget(‘Widget_Options’);
$config = $options->plugin(‘Sitemap’);

require_once ‘Sitemap.php’;
$dir = __TYPECHO_ROOT_DIR__ . DIRECTORY_SEPARATOR . $config->dir;

if(!is_writable($dir))
{
@chmod($dir, 0777);
if(!is_writable($dir))
{ throw new exception(‘指定的目录不可写’); }
}

$url = $options->siteUrl . ‘/’ . ltrim($config->dir, ‘/’);
$xsl = Typecho_Common::url(‘usr/plugins/Sitemap/sitemap.xsl’, $options->siteUrl);
$sm = new Silk_Sitemap($dir, $url, true, 1000, $xsl);

$archives = Typecho_Widget::widget(“Widget_Contents_Post_Recent”,”pageSize=1000″);
$bHasNew = false;
if($archives->have()){
while($row = $archives->next()){
$sm->add($archives->permalink, “always”, 10, $archives->modified);
$bHasNew = true;
}

}
if($bHasNew) $sm->save();

return $content;
}

至此,sitemap插件中生成sitemap的部分已经制作完成。你可以试着编辑一篇文章,并去sitemap保存目录瞅瞅,应该就可以看到sitemap文件了。当然,这里你要保证sitemap保存目录有可写权限。

### 制作sitemap请求
为了安全起见,一般我们都不会直接暴露sitemap.xml文件的路径信息,所以此时我们就需要用到addRoute的知识,通过添加路由的方式来隐藏我们的sitemap.xml文件路径。

修改activate函数,添加addRoute操作如下:

public static function activate()
{
Typecho_Plugin::factory(‘Widget_Contents_Post_Edit’)->write = array(‘Sitemap_Plugin’, ‘generater’);
Helper::addRoute(‘sitemap’,’/sitemap’,’Sitemap_Action’,’action’);
}

其中Sitemap_action的逻辑很简单,直接读取sitemap.xml内容并显示:

public function action(){
$options = Typecho_Widget::widget(‘Widget_Options’);
$config = $options->plugin(‘Sitemap’);

require_once ‘Sitemap.php’;
$dir = __TYPECHO_ROOT_DIR__ . DIRECTORY_SEPARATOR . $config->dir;

$sitemap_file = $dir.’/sitemap.xml’; //简单格式
$sitemap_file_1 = $dir.’/sitemap_1.xml’; //可视格式。此格式可以优先读取

if(file_exists($sitemap_file_1)){
header(“Content-Type:application/xml”);
echo file_get_contents($sitemap_file_1);
}else if(file_exists($sitemap_file)) {
header(“Content-Type:application/xml”);
echo file_get_contents($sitemap_file);
}else{
die(“文件不存在”);
}
}

自此,当你访问`your.site.com/index.php/sitemap`的时候,就可以显示非常好看的sitemap了!
![222.png][1]

[TypechoSitemap插件代码点击下载][2]

[1]: https://www.typechodev.com/usr/uploads/2015/05/1612398340.png
[2]: http://www.typechodev.com/usr/downloads/plugin/Sitemap_typechodev.com.zip

原创文章,作者:admin,如若转载,请注明出处:https://www.typechodev.com/plugin/488.html

(0)
上一篇 2015-04-30 上午11:38
下一篇 2015-05-15 下午12:29

相关推荐

发表评论

您的电子邮箱地址不会被公开。