sitemap.xml(网站地图)是搜索引擎了解网站结构的重要文件,它能帮助搜索引擎更有效地抓取和索引网站内容。虽然使用插件生成sitemap.xml非常方便,但通过纯代码实现可以避免插件依赖,减少服务器负载,并实现更精细的控制。本文将介绍如何在WordPress中通过添加代码文件来自动生成sitemap.xml。
实现步骤
1. 创建sitemap.php文件
首先,在您的WordPress网站根目录下创建一个名为 sitemap.php 的新文件。将以下代码复制并粘贴到该文件中。
<?php
/**
* WordPress Sitemap Generator
* 生成包含首页、文章、页面、分类和标签的sitemap.xml
*/
require('./wp-blog-header.php');
header("Content-type: text/xml; charset=UTF-8");
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">';
?>
<!-- 网站首页 -->
<url>
<loc><?php echo esc_url(get_home_url()); ?></loc>
<lastmod><?php $ltime = get_lastpostmodified('GMT'); $ltime = gmdate('Y-m-dTH:i:s+00:00', strtotime($ltime)); echo $ltime; ?></lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<?php
/* 文章页 */
$myposts = get_posts( "numberposts=" . $posts_to_show );
foreach( $myposts as $post ) {
setup_postdata($post);
?>
<url>
<loc><?php the_permalink(); ?></loc>
<lastmod><?php the_time('c'); ?></lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<?php
wp_reset_postdata();
} /* 文章循环结束 */
?>
<?php
/* 页面 */
$mypages = get_pages();
if(count($mypages) > 0) {
foreach($mypages as $page) {
?>
<url>
<loc><?php echo esc_url(get_page_link($page->ID)); ?></loc>
<lastmod><?php echo str_replace(" ", "T", $page->post_modified); ?>+00:00</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<?php
}
} /* 单页面循环结束 */
?>
<?php
/* 分类目录 */
$terms = get_terms(array('taxonomy' => 'category', 'hide_empty' => false));
$count = count($terms);
if($count > 0){
foreach ($terms as $term) {
$term_link = get_term_link($term);
if (is_wp_error($term_link)) continue;
?>
<url>
<loc><?php echo esc_url($term_link); ?></loc>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<?php
}
} /* 分类循环结束 */
?>
<?php
/* 标签页(可选,可根据需要注释掉) */
$tags = get_terms(array('taxonomy' => 'post_tag', 'hide_empty' => false));
foreach ( $tags as $tag ) {
$link = get_term_link($tag);
if (is_wp_error($link)) continue;
?>
<url>
<loc><?php echo esc_url($link); ?></loc>
<changefreq>monthly</changefreq>
<priority>0.4</priority>
</url>
<?php
} /* 标签循环结束 */
?>
</urlset>
代码说明与改进:
- 安全性: 使用
esc_url()对输出的URL进行转义,防止潜在的安全风险。 - 兼容性: 更新了
get_terms()函数的调用方式,以适配更新的WordPress版本。 - 结构优化: 在文章循环中正确使用了
setup_postdata()和wp_reset_postdata()以确保模板标签正常工作。 - 移除非标准元素: 移除了原代码中百度移动适配的命名空间(
xmlns:mobile),因为这不是Sitemaps.org的标准协议。如需移动适配,建议使用其他标准方法。 - 注释: 增加了代码注释,便于理解和维护。
创建并编辑好文件后,将其上传到您WordPress安装的根目录(即与 wp-config.php 文件同级)。
2. 配置访问规则(伪静态)
为了让 sitemap.php 能通过 https://您的域名/sitemap.xml 这样的固定URL访问,需要配置服务器的重写规则(伪静态)。
通用方法(修改.htaccess文件):
如果您使用的是Apache服务器,请编辑网站根目录下的 .htaccess 文件(如果不可见,请在文件管理器设置中显示隐藏文件)。在WordPress现有规则之前添加以下规则:
# Sitemap Rewrite Rule
RewriteRule ^sitemap.xml$ /sitemap.php [L]
宝塔面板(Nginx环境):
如果您使用宝塔面板并选择了Nginx服务器,操作更为简便:
- 登录宝塔面板,进入您网站的“设置”。
- 点击“伪静态”选项卡。
- 在伪静态规则的下拉菜单中,选择“wordpress”规则,然后保存。
- 重启Nginx服务使规则生效。
WordPress的默认伪静态规则通常已经包含了处理此类请求的能力。如果添加上述Apache规则或选择WordPress规则后仍无法访问,您可能需要手动在Nginx配置中添加类似的重写指令,或咨询主机提供商。
3. 测试与验证
完成以上步骤后,请按顺序进行测试:
- 禁用其他Sitemap插件: 确保所有其他生成sitemap的插件已停用,避免冲突。
- 访问sitemap: 在浏览器中打开
https://您的域名/sitemap.xml。 - 检查内容: 页面应显示格式良好的XML代码,包含您网站的首页、文章、页面等URL信息。
- 提交搜索引擎: 确认无误后,可以将此sitemap.xml的URL提交到Google Search Console、Bing Webmaster Tools等搜索引擎站长平台。
至此,您已经成功为WordPress网站创建了一个轻量级、无插件依赖的自动网站地图生成功能。这种方法生成的sitemap.xml完全自主可控,且不包含任何第三方资源链接。