今天给博客写个sitemap给站长平台爬取使用。第一个就去神马站长平台提交sitemap,遇到问题了。
神马站长平台提示,只能提交后缀为xml文件。我博客里显示的是sitemap.html,虽然Content-type设置为application/xml; charset=UTF-8但是没什么卵用,提交看后缀抓取才看Content-type。
现在博客的url使用了urlManage进行美化。由urlManage统一去提供后缀了。那后缀修改只能改改urlManage。看下配置文件:
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'suffix' => '.html', 'rules' => [ '<action:\w+>' => '/index/<action>', '<action:\w+>-<id:\d+>' => '/post/<action>', ], ],
添加了suffix,直接改成xml也不妥。
解决方法大概就是去掉suffix,自己手动在rules里输入后缀,不过控制器和action多起来好像也很麻烦,因为每个都要写,最终还是觉得生成xml文件就行了。可能也就没办法实时显示出文章,不过博客我个人定位还是给朋友看看教程和自己拿来做做备忘用的,所以发文章后检查完了再推送百度熊掌号再生成sitemap也不麻烦。
流程应该就这些,后面应该也不会再加其他的什么了。
然后后台生成那就需要加载前台config文件才行,然后使用url助手来生成前台规则的url,方便修改了会跟随一起生效。
Controller这块
public function actionCreateSitemap()
{
   // 加载前台配置
   $config = require Yii::getAlias('@frontend/config/main.php');
   $urlManege = new UrlManager($config['components']['urlManager']);
   $urlManege->baseUrl = Yii::$app->params['setting']['frontend_domain'];
   Url::$urlManager = $urlManege;
   
   //取出数据
   $models = Articles::find()->where(['status' => 1])->orderBy(['id' => SORT_DESC])->limit(50000)->all();
   if ($models === null) {
      Yii::$app->session->setFlash('warning', '没用找到文章数据!');
      return $this->redirect(Yii::$app->request->referrer);
   }
   $content = $this->renderPartial('sitemap', ['models' => $models]);
   
   //保存到前台web根目录下sitemap.xml作为文件名
   $file = Yii::getAlias('@frontend/web');
   $status = file_put_contents($file . '/sitemap.xml', $content);
   if ($status !== false) {
      Yii::$app->session->setFlash('success', '保存成功!路径是:' . $file . '/sitemap.xml');
   } else {
      Yii::$app->session->setFlash('error', '保存失败!路径是:' . $file . '/sitemap.xml');
   }
   
   return $this->redirect(Yii::$app->request->referrer);
}还有一些问题,就是sitemap.xml这个没办法去扩展多个最多只能有5万个链接,神马站长平台只给10000,如果文章以外的页面需要生成sitemap也没办法加进来。
不够都不是什么麻烦事,以后需要了再搞好了,现在感觉可以用很久了。
然后是view页面
<?php /* @var $models \backend\modules\blog\models\Articles[] */ echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; ?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <?php foreach ($models as $model) : ?> <?= $model->generateSitemap() ?> <?php unset($model) ?> <?php endforeach; ?> </urlset>
这个generateSitemap在model里,可以很方便的生成。
public function generateSitemap()
{
   $url = Url::to(['/post/view', 'id' => $this->id]);
   $xml = "<url>\n";
   $xml .= "<loc>{$url}</loc>";
   if ($this->created_at !== $this->updated_at) {
      $last = date('Y-m-d', $this->created_at);
      $xml .= "<lastmod>{$last}</lastmod>";
   }
   
   $xml .= "<changefreq>weekly</changefreq>";
   $xml .= "<priority>0.6</priority>" . PHP_EOL;
   $xml .= "</url>" . PHP_EOL;
   
   return $xml;
}大概就这样!好了。。给这个笔记打个标签sitemap以后忘了自己也好找到。