WordPress纯代码生成百度支持的XML站点地图(含自定义文章)

多人的饭局尽量少参加,因为难有真心的交流,多为应酬。多想什么是自己真正想要的东西,想不透就继续想。

前面老古已经分享了『WordPress 通用站点+宝塔面板创建百度支持的 xml 地图文件』,不过这个好代码教程仅适用于没有自定义文章的 WordPress 站点,而 boke112 联盟的问答文章却是自定义文章,所以需要稍作修改后才能正常使用,下面 boke112 联盟将其代码进行加工后支持自定义文章的 xml 地图好代码教程分享给大家(PS:老古使用的是阿里云 ECS 服务器,环境是 Nginx)。

一、将以下代码添加到 baidu_sitemap.php 文件(文件名可自定义),并将该文件上传到站点根目录中。

<?php
require('./wp-blog-header.php');
header("Content-type: text/xml");
header('HTTP/1.1 200 OK');
$posts_to_show = 1000; 
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">'
?>
<!-- generated-on=<?php echo get_lastpostdate('blog'); ?> Diy By 张戈博客(https://zhang.ge)-->
<url>
<loc><?php echo get_home_url(); ?></loc>
<lastmod><?php $ltime = get_lastpostmodified('GMT');$ltime = gmdate('Y-m-d\TH:i:s+00:00', strtotime($ltime)); echo $ltime; ?></lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<?php
/* 输出普通文章 POST */ 
$myposts = get_posts("numberposts=" . $posts_to_show );
foreach( $myposts as $post ) { ?>
<url>
<loc><?php the_permalink(); ?></loc>
<lastmod><?php the_time('c') ?></lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<?php } /* 普通文章循环结束 */ ?>
<?php
/* 输出问答文章 wenda */ 
$myposts = get_posts( "post_type=wendapost&numberposts=" . $posts_to_show );
foreach( $myposts as $post ) { ?>
<url>
<loc><?php the_permalink(); ?></loc>
<lastmod><?php the_time('c') ?></lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<?php } /* 问答文章循环结束 */ ?> 
<?php
/* 输出页面 */ 
$mypages = get_pages();
if(count($mypages) > 0) {
foreach($mypages as $page) { ?>
<url>
<loc><?php echo get_page_link($page->ID); ?></loc>
<lastmod><?php echo str_replace(" ","T",get_page($page->ID)->post_modified); ?>+00:00</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<?php }} /* 页面循环结束 */ ?> 
<?php
/* 输出普通文章分类 */ 
$terms = get_terms('category', 'orderby=name&hide_empty=0' );
$count = count($terms);
if($count > 0){
foreach ($terms as $term) { ?>
<url>
<loc><?php echo get_term_link($term, $term->slug); ?></loc>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<?php }} /* 普通文章分类循环结束 */?> 
<?php
/* 输出问答文章分类 */ 
$terms = get_terms('wendafenlei', 'orderby=name&hide_empty=0' );
$count = count($terms);
if($count > 0){
foreach ($terms as $term) { ?>
<url>
<loc><?php echo get_term_link($term, $term->slug); ?></loc>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<?php }} /* 问答文章分类循环结束 */?> 
<?php
/* 输出问答文章标签(可选) */ 
$terms = get_terms('wendatag', 'orderby=name&hide_empty=0' );
$count = count($terms);
if($count > 0){
foreach ($terms as $term) { ?>
<url>
<loc><?php echo get_term_link($term, $term->slug); ?></loc>
<changefreq>weekly</changefreq>
<priority>0.4</priority>
</url>
<?php }} /* 问答文章标签循环结束 */?> 
<?php
/* 输出普通文章标签(可选) */
$tags = get_terms("post_tag");
foreach ( $tags as $key => $tag ) {
$link = get_term_link( intval($tag->term_id), "post_tag" );
if ( is_wp_error( $link ) )
return false;
$tags[ $key ]->link = $link;
?>
<url>
<loc><?php echo $link ?></loc>
<changefreq>monthly</changefreq>
<priority>0.4</priority>
</url>
<?php } /* 普通文章标签循环结束 */ ?> 
</urlset>

代码特别说明:

  • 以上代码基于张戈博客分享的『WordPress 免插件生成完整站点地图(sitemap.xml)的 php 代码』一文的代码进行加工,并改正 GMT 错误。
  • 第 5 行代码中的$posts_to_show 就是显示多少篇文章,如果想要全部显示完,直接将其改为 10000 甚至更大的值。
  • 第 9 行代码意义不大,只是说明这个代码来自张戈博客。
  • 第 27-37 行代码就是输出自定义文章,其中第 29 行的 wendapost 就是自定义文章的类型,这个必须改为自己站点自定义文章对应的类型。如果有多个不同类型的自定义文章就重复添加第 27-37 行代码,记得修改自定义文章类型即可,没有自定义文章就直接删除即可。
  • 第 62-73 行代码就是输出自定义文章的分类,其中第 64 行的 wendafenlei 就是自定义文章的分类 slug,记得修改为自己站点对应的自定义文章分类 slug。如果有多个不同类型的自定义文章分类就重复 62-73 行代码(PS:记得修改对应的 slug),没有就直接删除即可。
  • 第 74-85 行代码就是输出自定义文章的标签,其中第 76 行的 wendatag 就是自定义文章的标签 slug,记得修改为自己站点对应的自定义文章标签 slug。如果有多个不同类型的自定义文章标签就重复 74-85 行代码(PS:记得修改对应的 slug),没有就直接删除即可。

二、成功添加了 baidu_sitemap.php 文件后,我们就可以直接访问该文件看看效果了。不过我们提交到百度的文件是 xml 格式文件,所以我们可以通过伪静态或纯静态的方式实现让其变成 xml 格式文件,成功之后的 xml 站点地图文件路径为:站点地址/baidu_sitemap.xml。

方法一:伪静态

因为老古的服务器用的是 Nginx,所以至二级编辑现有的配置文件,添加以下规则保存文件后平滑重启 Nginx 即可。

rewrite ^/baidu_sitemap.xml$ /baidu_sitemap.php last;

PS:根据张戈博主的好代码教程,如果你服务器用的是 Apache,只需要编辑网站根目录的 .htaccess ,加入如下规则并保存即可:

RewriteRule ^(baidu_sitemap)\.xml$ $1.php

方法二:纯静态

利用 Linux 定时任务+wget 定时生成 baidu_sitemap.xml 并存放到网站根目录就可以了!比如:

HTTP 站点:每天凌晨 1 点在网站根目录生成一个 baidu_sitemap.xml

0 1 * * * wget -O /home/wwwroot/zhang.ge/baidu_sitemap.xml http://zhang.ge/baidu_sitemap.php >/dev/null 2>&1

HTTPS 站点:每天凌晨 1 点在网站根目录生成一个 baidu_sitemap.xml

0 1 * * * wget -O /home/wwwroot/zhang.ge/baidu_sitemap.xml --no-check-certificate https://zhang.ge/baidu_sitemap.php >/dev/null 2>&1
注意:记得修改以上代码的文件名及相应路径。

当然,如果你的服务器上安装有宝塔 Linux 面板的话,就不用那么麻烦,只需要登录宝塔面板 >> 计划任务 >> 任务类型选择 Shell 脚本 >> 任务名称可随意 >> 执行周期建议每天凌晨执行 1 次即可 >> 脚本内容输入以下代码(PS:记得修改代码中的名称及路径哦) >> 点击【添加任务】按钮即可。

如果站点是 http 则添加以下代码:

wget -O /www/wwwroot/wp.yigujin.wang/sitemap.xml http://wp.yigujin.wang/sitemap.php

如果站点是 https 则添加以下代码:

wget -O /home/wwwroot/wp.yigujin.wang/sitemap.xml --no-check-certificate http://wp.yigujin.wang/sitemap.php

总结

本文的内容看起来很多,其实可以简化为两步:一是建立一个 sitemap.php 文件,另一个就是进行伪静态或静态化。如果你的 WordPress 站点没有任何类型的自定义文章,云服务器也安装有宝塔 Linux 面板,建议参考『WordPress 通用站点+宝塔面板创建百度支持的 xml 地图文件』这篇文章更简单一些。

以上就是WordPress纯代码生成百度支持的XML站点地图(含自定义文章)。部下的素质低,不是你的责任;但不能提高部下的素质,是你的责任。更多关于WordPress纯代码生成百度支持的XML站点地图(含自定义文章)请关注haodaima.com其它相关文章!

标签: WordPress