对于希望能被百度所收录的站点,百度提供了多种文章提交方式。用户可以视需求选择提交sitemap,利用api提交数据,或者采用自动推送的方式。API提交和手动提交共享配额,每日至多提交10万条有价值的内容,sitemap提交配额不与其他方式共享,具体配额以站点页面显示数据为准。配额不可累计,当日有效。
关于api推送
进入百度站长平台(已改名百度搜索资源平台),选择左侧的普通收录,可以看到百度关于api推送的介绍。api推送可以通过多种方式实现,百度分别提供了curl、post、php、ruby的推送方式,因为typecho基于php,所以博主准备选用php的方式推送。
$urls = array(
'http://www.example.com/1.html',
'http://www.example.com/2.html',
);
$api = 'http://data.zz.baidu.com/urls?site=您的站点的专属代码';
$ch = curl_init();
$options = array(
CURLOPT_URL => $api,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => implode("\n", $urls),
CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
echo $result;
百度提供了现成的代码,我们需要做的是考虑一次推送多少条文章地址,如何获取到这些地址并且推入数组。需要注意的是$api变量代表的提交地址,不同的域名提交地址肯定不一样。如果在站长平台里同时管理着多个站点,注意推送的时候确认改代码是否对应当前需要推送的站点,否则会引起预期外的错误。
获取需要推送的文章地址
网上有很多typecho生成sitemap.xml文件的代码,实现提取文章地址,并且按照xml文件格式的要求组装标签。因为我们仅需要一个文章地址数组,所以代码要简单的多:
$db = Typecho_Db::get();
$options = Typecho_Widget::widget('Widget_Options');
$limit = 20;
$articles = $db->fetchAll(
$db->select()->from('table.contents')
->where('table.contents.status = ?', 'publish')
->where('table.contents.created < ?', $options->gmtTime)
->where('table.contents.type = ?', 'post')
->limit($limit)
->order('table.contents.created', Typecho_Db::SORT_DESC)
);
$push_urls=[];
foreach ($articles as $article) {
$type = $article['type'];
$routeExists = (NULL != Typecho_Router::get($type));
$article['pathinfo'] = $routeExists ? Typecho_Router::url($type, $article) : '#';
$article['permalink'] = Typecho_Common::url($article['pathinfo'], $options->index);
array_push($push_urls,$article['permalink']);
}
$urls = $push_urls;
从开源代码中整理了提取文章地址的部分,其中$limit限制的提交文章的数量,仅用于测试效果,这里填写了20。
完整代码
将代码整理成一个页面模板文件,并且保存于主题根目录,新建一个文章推送页面,选择“百度推送页”模板,点击发布。访问该模板,页面会向百度推送最新的20篇文章。
<?php
/**
* 百度推送页
*
* @package custom
*/
$db = Typecho_Db::get();
$options = Typecho_Widget::widget('Widget_Options');
$limit = 20;
$articles = $db->fetchAll(
$db->select()->from('table.contents')
->where('table.contents.status = ?', 'publish')
->where('table.contents.created < ?', $options->gmtTime)
->where('table.contents.type = ?', 'post')
->limit($limit)
->order('table.contents.created', Typecho_Db::SORT_DESC)
);
$push_urls=[];
foreach ($articles as $article) {
$type = $article['type'];
$routeExists = (NULL != Typecho_Router::get($type));
$article['pathinfo'] = $routeExists ? Typecho_Router::url($type, $article) : '#';
$article['permalink'] = Typecho_Common::url($article['pathinfo'], $options->index);
array_push($push_urls,$article['permalink']);
}
$urls = $push_urls;
$api = 'http://data.zz.baidu.com/urls?site=您的站点的专属代码';
$ch = curl_init();
$options = array(
CURLOPT_URL => $api,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => implode("\n", $urls),
CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
echo $result;
?>
推送成功后,页面会打印如下信息,2980是当天的剩余配额,说明博主的站点每日配额为3000条,success显示了推送成功的数量。因为每日的配额有限,而重复刷新会不断消耗配额,如果通过页面模板的方式,该页面不适合展示在主页面上,否则可能因用户的重复访问导致站点配额的异常消耗。
{"remain":2980,"success":20}