前言
首先是要交个人网站的详情页都提交给百度、360、神马、谷歌等搜索引擎。
如果是简单的列表页,当然可以写好在放到服务器目录下。
比如博客类动态生成的就必须每天跑脚本去追加写入了。
本文采用的是laravel框架的command命令来跑脚本,大家可以适合自己项目的写法。
什么是Sitemap?
Sitemap(即站点地图)就是您网站上各网页的列表。创建并提交Sitemap有助于百度发现并了解您网站上的所有网页。您还可以使用Sitemap提供有关您网站的其他信息,如上次更新日期、Sitemap文件的更新频率等,供百度Spider参考。
百度对已提交的数据,不保证一定会抓取及索引所有网址。但是,我们会使用Sitemap中的数据来了解网站的结构等信息,这样可以帮助我们改进抓取策略,并在日后能更好地对网站进行抓取。
此外,Sitemap 与搜索排名没有关系。
sitemap文件遵循指南
- 文本文件每行都必须有一个网址。网址中不能有换行。不应包含网址列表以外的任何信息。
- 您必须书写完整的网址,包括 http。
- 每个文本文件最多可包含 50,000 个网址,并且应小于10MB(10,485,760字节)。如果网站所包含的网址超过 50,000个,则可将列表分割成多个文本文件,然后分别添加每个文件。
- 文本文件需使用 UTF-8 编码或GBK编码。
xml格式详解
<?xml version="1.0" encoding="utf-8"?>
<!-- XML文件需以utf-8编码-->
<urlset>
<!--必填标签-->
<url>
<!--必填标签,这是具体某一个链接的定义入口,每一条数据都要用<url>和</url>包含在里面,这是必须的 -->
<loc>http://www.yoursite.com/yoursite.html</loc>
<!--必填,URL链接地址,长度不得超过256字节-->
<lastmod>2009-12-14</lastmod>
<!--可以不提交该标签,用来指定该链接的最后更新时间-->
<changefreq>daily</changefreq>
<!--可以不提交该标签,用这个标签告诉此链接可能会出现的更新频率 -->
<priority>0.8</priority>
<!--可以不提交该标签,用来指定此链接相对于其他链接的优先权比值,此值定于0.0-1.0之间-->
</url>
<url>
<loc>http://www.yoursite.com/yoursite2.html</loc>
<lastmod>2010-05-01</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>
</urlset>
实战代码
sitemap组件代码
<?php
/**
* 通用生成sitemap文件
* User: WXiangQian
*/
namespace App\Http\Tools;
class CreateSiteMapXml
{
private $fileDir;
public function __construct($filePath)
{
$this->mkFolder($filePath);
$filePath = rtrim($filePath, '/') . '/';
$this->fileDir = $filePath;
}
/**
* 生成sitemaps 入口
* @param array $ary msps数组
* @param string $parent maps父标签
* @param string $type maps类型
* @return bool
*/
public function addSiteMap($ary, $parent, $type)
{
if (empty($ary)) {
return false;
}
$file = $this->fileDir . $type . ".xml";//获取最后更新文件
$content = $this->maps($ary, $parent); //生成片段 maps
$f = $this->readFile($file);
if (empty($f)) {
//获取新文件头部
$f = $this->typeMain();
} else {
$f = file_get_contents($file);
}
$nf = $this->strInsert($f, strpos($f, strrchr($f, '</')), $content);
$this->writeFile($file, $nf);
}
public function ary2maps($idAry, $loc, $cf, $pri)
{
$lastmod = date('Y-m-d');
$ary = array();
foreach ($idAry as $id) {
$ary[] = array(
'loc' => $loc . $id,
'lastmod' => $lastmod,
'changefreq' => $cf,
'priority' => $pri,
);
}
return $ary;
}
//读取文件
public function readFile($file)
{
if (empty($file)) {
return false;
}
$f = file_exists($file);
return $f ?: '';
}
//写入文件
public function writeFile($fileName, $content)
{
//echo $content;
file_put_contents($fileName, $content); //更新其值
}
/**
* 通用 maps
* @param array $ary
* @param string $parent
* @return string
*
*/
public function maps($ary, $parent): string
{
$str = '';
if (is_array($ary)) {
foreach ($ary as $mval) {
$str .= "<$parent>\r\n";
foreach ($mval as $key => $val) {
$str .= " <$key>$val</$key>\r\n";
}
$str .= "</$parent>\r\n";
}
}
return $str;
}
/**
* 指定位置前插入字符串
* @param string $str 原字符串
* @param int $i 位置
* @param string $substr 插入的字符串
* @return string
*/
public function strInsert($str, $i, $substr): string
{
$lstr = substr($str, 0, $i);
$rstr = substr($str, $i, strlen($str));
$newstr = ($lstr . $substr . $rstr);
return $newstr;
}
// sitemap type
public function typeMain(): string
{
$xml = "<?xml version='1.0' encoding='UTF-8'?>\r\n<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9' \r\n" .
"xmlns:mobile='http://www.sitemaps.org/schemas/sitemap-mobile/1'> \r\n" . "</urlset>";
return $xml;
}
// 检查目标文件夹是否存在,如果不存在则自动创建该目录
public function mkFolder($path)
{
if (!is_readable($path)) {
// is_file($path) or mkdir($path, 0777);
is_file($path) || mkdir($path, 0777) || is_dir($path);
}
}
}
调用sitemap组件
<?php
namespace App\Console\Commands;
use App\Http\Tools\CreateSiteMapXml;
use Illuminate\Console\Command;
class CreateSiteMapXmlCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'create_sitemap_xml';
/**
* The console command description.
*
* @var string
*/
protected $description = '生成sitemap.xml文件';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$idAry = [
117281450,
110532521,
105240627,
105558534,
];
$name = 'csdn';
// 服务器目录地址
$sitemaps = new CreateSiteMapXml('/Users/wxiangqian/my_project/laravel-api/sitemaps/');
$videoAry = $sitemaps->ary2maps($idAry, 'https://wxiangqian.blog.csdn.net/article/details/', 'daily', '0.8');
$sitemaps->addSiteMap($videoAry, 'url', $name);
}
}
仓库地址
https://github.com/WXiangQian/laravel-api
实战截图
相关问题
Sitemap提交后,多久能被百度处理?
Sitemap数据提交后,一般在1小时内百度会开始处理。处理完成的时间视文件大小和您设置的抓取周期而定。
提交的Sitemap都会被百度抓取并收录吗?
百度对已提交的数据,不保证一定会抓取及收录所有网址。是否收录与页面质量相关。
XML格式的 Sitemap 中,“priority”提示会影响我的网页在搜索结果中的排名吗?
不会。Sitemap 中的“priority”提示只是说明该网址相对于您自己网站上其他网址的重要性,并不会影响网页在搜索结果中的排名。
网址在 Sitemap 中的位置是否会影响它的使用?
不会。网址在 Sitemap 中的位置并不会影响百度对它的识别或使用方式。
Sitemap中提交的url能否包含中文?
因为转码问题建议最好不要包含中文。
结束语
希望本文可以帮助大家解决php生成sitemap.xml地图文件问题。👍