WordPress模板插件定制

您现在的位置是:首页 > WordPress教程WordPress教程

WordPress生成网站地图?这几招包教包会,别再瞎折腾了!

查看 WP集市 的更多文章WP集市 2025-08-21 【WordPress教程】 1851人已围观

WordPress生成网站地图?这几招包教包会,别再瞎折腾了!

做WordPress站的兄弟,是不是总被SEO插件提示“网站地图未生成”?别慌,这玩意儿真不难,今天手把手教你,两种方法,从纯小白到半吊子程序员都能看懂,看完不会你来找我(开玩笑的,找我也没用,多看两遍肯定会)。

先说为啥要搞这玩意儿

简单说,网站地图就是给搜索引擎爬虫画的“导航图”,告诉它“我这站有哪些页面、啥时候更新的”,爬得快收录就快。尤其新站,没外链没权重,有个sitemap能少走半个月弯路。行了,不扯理论,直接上干货。

方法一:插件法(新手首选,无脑操作)

不想写代码?怕改坏网站?用插件!90%的人都这么干,别觉得用插件low,工具就是拿来用的,我自己小站也用插件,效率第一。

推荐插件:Yoast SEO(最主流,功能全)或Google XML Sitemaps(轻量,专注sitemap),这里以Yoast为例,毕竟用的人多,问题好搜。

步骤

  1. 后台→插件→安装插件,搜“Yoast SEO”,点安装→启用。别告诉我搜不到,拼音打错了吧?

  2. 启用后左边菜单会多一个“SEO”,点进去→常规→功能标签(在上面一排,不是左边的功能)。

  3. 往下拉,找到“XML站点地图”,后面有个“查看站点地图”按钮,点它!齐活!

![示意图:Yoast SEO站点地图位置](别找了,我没图,自己摸索,界面就那么大,找不到就是眼神问题)

踩坑提示:启用后点“查看”没反应?先禁用其他SEO插件(比如All in One SEO),冲突了!之前帮朋友建站,他装了仨SEO插件,结果哪个都出不来sitemap,删到剩一个就好了,别学他,插件不是越多越好。

方法二:手动代码法(适合折腾党,自定义拉满)

不想用插件?或者插件生成的sitemap不符合需求(比如想排除标签页、草稿)?那就自己写代码,其实不难,跟着抄就行,记得先备份主题!

核心思路:用WordPress的钩子(hook)注册sitemap,再生成XML文件,最后通过URL访问。

具体步骤

  1. 打开主题文件夹(后台→外观→主题文件编辑器,选你当前用的主题),找到functions.php(小心!这文件改错了网站会白屏,先复制内容到记事本备份,出事了粘贴回去)。

  2. functions.php里加代码,别直接糊,先在记事本写好,检查没红波浪线(就是语法错误)再复制。

代码示例(复制这段,别改参数,先用着):

// 注册站点地图索引
function custom_sitemap_init() {
    add_rewrite_rule(
        'sitemap_index\.xml$',
        'index.php?sitemap=index',
        'top'
    );
    add_rewrite_rule(
        '([^/]+?)-sitemap\.xml$',
        'index.php?sitemap=$matches[1]',
        'top'
    );
}
add_action('init', 'custom_sitemap_init');

// 生成站点地图内容
function custom_sitemap_render() {
    if (!isset($_GET['sitemap'])) return;

    $sitemap = sanitize_text_field($_GET['sitemap']);
    header('Content-Type: text/xml; charset=utf-8');
    echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";

    if ($sitemap === 'index') {
        // 索引文件,包含所有子sitemap
        echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
        echo '  <sitemap><loc>' . home_url('post-sitemap.xml') . '</loc></sitemap>' . "\n"; // 文章sitemap
        echo '  <sitemap><loc>' . home_url('page-sitemap.xml') . '</loc></sitemap>' . "\n"; // 页面sitemap
        echo '</sitemapindex>';
    } elseif ($sitemap === 'post') {
        // 文章sitemap,输出所有已发布文章
        $posts = get_posts(['post_type' => 'post', 'posts_per_page' => -1, 'post_status' => 'publish']);
        echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
        foreach ($posts as $post) {
            echo '  <url>' . "\n";
            echo '    <loc>' . get_permalink($post) . '</loc>' . "\n";
            echo '    <lastmod>' . get_the_modified_date('Y-m-d', $post) . '</lastmod>' . "\n";
            echo '  </url>' . "\n";
        }
        echo '</urlset>';
    } elseif ($sitemap === 'page') {
        // 页面sitemap,输出所有已发布页面
        $pages = get_pages(['post_status' => 'publish']);
        echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
        foreach ($pages as $page) {
            echo '  <url>' . "\n";
            echo '    <loc>' . get_permalink($page) . '</loc>' . "\n";
            echo '    <lastmod>' . get_the_modified_date('Y-m-d', $page) . '</lastmod>' . "\n";
            echo '  </url>' . "\n";
        }
        echo '</urlset>';
    }
    exit; // 必须exit,不然会输出多余HTML
}
add_action('template_redirect', 'custom_sitemap_render');

解释

  • add_rewrite_rule:重写URL,让域名/sitemap_index.xml能访问到,不然直接访问会404。

  • template_redirect:在页面加载前输出XML,避免被主题HTML干扰。

访问方法:保存代码后,去后台→设置→固定链接,啥都别动,点“保存更改”(更新rewrite规则,这步忘了能卡你半小时,别问我怎么知道的),然后访问域名/sitemap_index.xml,能看到XML文件就成功了!

进阶:排除不需要的页面(比如标签、草稿)

插件法:Yoast里→SEO→搜索外观→ taxonomies(分类法),把“标签”设为“noindex”,sitemap里就不会有了。
代码法:在上面的$posts = get_posts(...)里加条件,比如排除草稿:'post_status' => 'publish'(已经加了),排除特定ID:'post__not_in' => [123, 456](123是页面ID,在后台页面列表能看到)。

说到排除,想起之前给客户做站,他非要把“联系我们”排除,说怕被垃圾邮件骚扰,我劝了半天“sitemap只是告诉爬虫有这个页,收不收录看内容”,他不听,最后还是给他加了代码排除,客户是上帝嘛,虽然我觉得没必要。

总结

新手用插件(Yoast一步到位),折腾党用代码(自定义灵活),生成后提交到百度/Google站长平台,齐活!别纠结“用插件影响速度”,现在服务器配置都够,插件那点开销忽略不计;也别纠结“代码写得好不好”,能生成XML就行,爬虫没那么挑。

总之啊,网站地图这东西,有就行,别追求完美,我现在维护的站,有的用插件有的用代码,看心情(不是),看需求来。行了,去试试吧,搞不定评论区问,我看到会回(不保证及时,毕竟程序员也要摸鱼)。

Tags:

WordPress模板插件定制