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了!
Typecho插件制作实例:制作sitemap插件

TypechoSitemap插件代码点击下载


版权声明:未经书面授权禁止转载、摘编、复制或建立镜像。对既成事实本站将保留所有的权利。