{"id":1064,"date":"2026-01-08T23:01:56","date_gmt":"2026-01-08T15:01:56","guid":{"rendered":"http:\/\/longzhuplatform.com\/?p=1064"},"modified":"2026-01-08T23:01:56","modified_gmt":"2026-01-08T15:01:56","slug":"boost-navigation-create-a-wordpress-html-sitemap","status":"publish","type":"post","link":"http:\/\/longzhuplatform.com\/?p=1064","title":{"rendered":"Boost Navigation: Create a WordPress HTML Sitemap"},"content":{"rendered":"<p><\/p> <div> <p>You\u2019ve been there. It\u2019s late, your client\u2019s just asked for \u201ca quick sitemap page,\u201d and you\u2019re stuck choosing between two bad ideas: install yet another bloated SEO plugin that drags your backend into molasses, or roll your sleeves up for some custom PHP that could break the moment WordPress blinks.<\/p> <p>Here\u2019s the truth: most site owners just need an HTML sitemap that does its job quietly, cleanly, and without causing chaos. One that:<\/p> <ul> <li>Loads fast and keeps your database lean.<\/li> <li>Automatically hides drafts and private pages.<\/li> <li>Doesn\u2019t need you to moonlight as a developer to set up.<\/li> <\/ul> <p>But here\u2019s the part no one mentions: your HTML and XML sitemaps should be speaking the same language. When you tweak one, the other should fall in line. Exclude something from Google? It should disappear from your public sitemap too \u2013 no loose ends.<\/p> <p>SEOPress handles all of this out of the box, even on the free plan. You get dev-level control with everyday simplicity. No bloat. No maintenance migraines. Just a sitemap that actually does what it\u2019s supposed to.<\/p> <p>That\u2019s exactly what we\u2019ll be showing you in this guide: how to build a blazing-fast, no-fuss HTML sitemap that won\u2019t break your site, your brain, or your bedtime \u2013 complete with setup steps, pro tips, and the pitfalls to avoid. Let\u2019s get into it.<\/p> <h2 id=\"html-vs-xml-sitemaps\">HTML vs XML sitemaps<\/h2> <p>Think of sitemaps as navigation tools, just aimed at two very different audiences. XML sitemaps are built for search engines. They\u2019re structured, data-rich files that help bots understand how to crawl your site efficiently. HTML sitemaps, on the other hand, are designed for real people. They\u2019re straightforward link directories that help users find their way around.<\/p> <p>Here\u2019s how they differ at a foundational level:<\/p> <p><strong>XML Sitemaps:<\/strong><\/p> <ul> <li>Machine-readable files.<\/li> <li>Contain metadata like last updated dates.<\/li> <li>Submitted via tools like Google Search Console.<\/li> <li>Not visible to visitors browsing your site.<\/li> <\/ul> <p><strong>HTML Sitemaps:<\/strong><\/p> <ul> <li>Designed for humans, with clean, clickable links.<\/li> <li>Help users explore large or complex websites.<\/li> <li>Offer accessibility support, including screen reader compatibility.<\/li> <li>Usually published as a standard web page, such as \/sitemap.<\/li> <\/ul> <figure id=\"attachment_1687106\" aria-labelledby=\"figcaption_attachment_1687106\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1687106\" src=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/1-wordpress-html-sitemap-comparison-scaled.png\" alt=\"WordPress HTML and XML sitemap comparison\" width=\"2560\" height=\"1440\" srcset=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/1-wordpress-html-sitemap-comparison-scaled.png 2560w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/1-wordpress-html-sitemap-comparison-768x432.png 768w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/1-wordpress-html-sitemap-comparison-1536x864.png 1536w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/1-wordpress-html-sitemap-comparison-2048x1152.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" title=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe\" \/><figcaption id=\"figcaption_attachment_1687106\" class=\"wp-caption-text mt-3 mb-5 fst-italic\">WordPress HTML and XML sitemap comparison<\/figcaption><\/figure> <p>Now, let\u2019s clear up a common myth: HTML sitemaps won\u2019t directly improve your SEO rankings. That\u2019s not their role. What they <em>do<\/em> offer is better crawl support and a smoother experience for users, especially valuable if you\u2019re running:<\/p> <ul> <li>Large eCommerce stores with deep product hierarchies.<\/li> <li>Content-rich sites where users could easily get disoriented.<\/li> <li>Websites that need to meet accessibility standards (like WCAG).<\/li> <\/ul> <p>Take note: WordPress started auto-generating XML sitemaps back in version 5.5, but it doesn\u2019t touch HTML sitemaps. You\u2019ll need to handle those yourself. And unless you\u2019re using a plugin that unifies both under one engine, managing them can quickly become a manual chore.<\/p> <p>\ud83d\udccc Here\u2019s the takeaway: XML sitemaps are essential for search engines. HTML sitemaps are essential for users. Set them up to run off the same engine, and you\u2019ll save time while keeping everything aligned.<\/p> <p>Let\u2019s dig into the best plugins for doing exactly that.<\/p> <h2 id=\"wordpress-html-sitemap-plugins-that-wont-bloat-your-site\">WordPress HTML sitemap plugins that won\u2019t bloat your site<\/h2> <p>One of the most common concerns among WordPress users is adding another bloated SEO plugin. And rightly so. Many site owners have seen performance take a nosedive after stacking on one too many all-in-one tools.<\/p> <p>It\u2019s why many explicitly reject heavy SEO suites like RankMath to seek a more \u201clightweight option\u201d.<\/p> <p>Your plugin choice, and how it handles architecture, makes a big difference. You\u2019ve got two main routes:<\/p> <ul> <li><strong>Standalone options<\/strong> like Simple Sitemap or WP Sitemap Page keep things lightweight but treat HTML and XML sitemaps as separate jobs. You\u2019ll need a separate solution for XML sitemaps \u2013 whether that\u2019s WordPress core sitemaps or another plugin \u2013 doubling your configuration work and increasing the chance of inconsistencies.<\/li> <li><strong>SEO suite bundles<\/strong> can actually streamline things if built well. The better ones run a single database query to handle both HTML and XML.<\/li> <\/ul> <p>So how do the major SEO plugins handle HTML sitemaps?<\/p> <ul> <li><strong>Yoast<\/strong>: Dropped HTML sitemap support back in version 1.6.<\/li> <li><strong>Rank Math<\/strong>: Offers a basic shortcode in the free version, but with no pagination. Large sites (2,000+ pages) risk PHP memory issues. Also, no Gutenberg block support.<\/li> <li><strong>AIOSEO<\/strong>: Keeps HTML sitemaps behind a $49\/year paywall. You do get tidy accordion layouts, but at a cost for something that should be standard.<\/li> <li><strong>SEOPress<\/strong>: Offers full HTML sitemap support in the free tier. Built-in pagination after 1,000 items to keep memory in check. <em>And<\/em> automatically honors your noindex settings.<\/li> <\/ul> <p><strong>\ud83d\ude80 Here\u2019s where SEOPress stands apart<\/strong>: it builds HTML sitemaps on the fly using <code>WP_Query<\/code>, rather than storing them in your database. That means no cached bloat or performance trade-offs. For anyone prioritizing speed and scalability, that kind of efficiency can mean the difference between long-term site health and having to plan a migration later down the line.<\/p> <h3 id=\"why-your-html-and-xml-sitemaps-should-share-the-same-engine\">Why your HTML and XML sitemaps should share the same engine<\/h3> <p>Your HTML and XML sitemaps are simply two formats of the same underlying data. The most robust setups get this and run both from a single, unified configuration.<\/p> <p>Let\u2019s say you\u2019re managing a WooCommerce store and want to keep draft products out of search results. With separate sitemap tools, you\u2019d have to manually update XML exclusions, then repeat those settings for your HTML sitemap. Miss one step, and you end up with inconsistencies \u2013 products visible to users but hidden from Google, or the other way around.<\/p> <p>SEOPress solves this with a smart, all-in-one sitemap module:<\/p> <ul> <li>Set your exclusion rules once. XML and HTML follow the same logic.<\/li> <li>Update your noindex meta tags, and both sitemaps respond automatically.<\/li> <li>Tweak pagination or change the sort order, and it\u2019s reflected everywhere.<\/li> <li>No need to double-handle sitemap settings ever again.<\/li> <\/ul> <p>It\u2019s clean architecture: one engine means a single query, one exclusion list, one update cycle. That reduces errors, simplifies site maintenance, and guarantees alignment between what users and search engines see.<\/p> <p>This approach also gives you a head start with AI-driven indexing. As LLMs like ChatGPT begin parsing HTML sitemaps to understand site structure, keeping your machine-readable and human-readable formats in sync ensures consistency across traditional search crawlers and newer AI tools alike.<\/p> <p><strong>The bottom line?<\/strong> The only time you\u2019re forced to choose between flexibility and performance is when you\u2019re juggling multiple sitemap systems. Merge them, and the friction vanishes.<\/p> <h2 id=\"create-an-html-sitemap-in-wordpress-using-seopress-free\">Create an HTML sitemap in WordPress using SEOPress Free<\/h2> <p>Setting up an HTML sitemap with SEOPress is straightforward. There\u2019s no fiddling with complex settings or writing custom queries \u2013 just a quick toggle and you\u2019re good to go.<\/p> <p>Create your HTML sitemap with WordPress and SEOPress<em>.<\/em><\/p> <p>Here\u2019s how to do it from start to finish:<\/p> <p><strong>Enable the HTML Sitemap Module<\/strong><\/p> <p>In your WordPress dashboard, go to <strong>SEO \u2192 XML\/HTML Sitemap<\/strong>. You\u2019ll land on the sitemap settings screen, where you\u2019ll find several tabs. In the <strong>General<\/strong> tab, tick <strong>Enable<\/strong> <strong>HTML Sitemap<\/strong>, and hit <strong>Save changes<\/strong>.<\/p> <figure id=\"attachment_1687107\" aria-labelledby=\"figcaption_attachment_1687107\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1687107\" src=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/2-wordpress-html-sitemap-enable-seopress.png\" alt=\"Enable WordPress HTML Sitemap in SEOPress\" width=\"1017\" height=\"407\" srcset=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/2-wordpress-html-sitemap-enable-seopress.png 1017w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/2-wordpress-html-sitemap-enable-seopress-768x307.png 768w\" sizes=\"auto, (max-width: 1017px) 100vw, 1017px\" title=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe1\" \/><figcaption id=\"figcaption_attachment_1687107\" class=\"wp-caption-text mt-3 mb-5 fst-italic\">Enable WordPress HTML Sitemap in SEOPress<\/figcaption><\/figure> <p>That\u2019s all it takes to activate your sitemap. But where SEOPress really excels is in the fine-tuned control it gives you.<\/p> <p><strong>Control what shows: exclude pages and posts<\/strong><\/p> <p>When you\u2019re managing client sites with private or outdated content, the ability to control what appears in your HTML sitemap is non-negotiable. SEOPress makes it easy.<\/p> <p>Under the <strong>HTML Sitemap<\/strong> settings, you\u2019ll find the following:<\/p> <p><strong>Sorting options<\/strong><\/p> <ul> <li>By published date \u2013 newest or oldest first.<\/li> <li>By last modified date \u2013 useful for dynamic content.<\/li> <li>Alphabetically by title.<\/li> <li>Menu order \u2013 ideal for structured content.<\/li> <\/ul> <figure id=\"attachment_1687108\" aria-labelledby=\"figcaption_attachment_1687108\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1687108\" src=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/3-wordpress-html-sitemap-settings.png\" alt=\"Sorting options for WordPress HTML Sitemaps in SEOPress\" width=\"812\" height=\"594\" srcset=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/3-wordpress-html-sitemap-settings.png 812w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/3-wordpress-html-sitemap-settings-168x123.png 168w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/3-wordpress-html-sitemap-settings-768x562.png 768w\" sizes=\"auto, (max-width: 812px) 100vw, 812px\" title=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe2\" \/><figcaption id=\"figcaption_attachment_1687108\" class=\"wp-caption-text mt-3 mb-5 fst-italic\">Sorting options for WordPress HTML Sitemaps in SEOPress<\/figcaption><\/figure> <p><strong>Exclusion tools:<\/strong><\/p> <ul> <li><strong>Omit specific post IDs<\/strong> \u2013 simply enter them comma-separated (e.g. 42, 156, 789).<\/li> <li><strong>Hide entire post types<\/strong> \u2013 just choose the custom post types (CPTs) you want removed.<\/li> <li><strong>Remove taxonomies<\/strong> \u2013 go to the <strong>Post Types<\/strong> tab to remove tags, categories, or custom taxonomies.<\/li> <\/ul> <figure id=\"attachment_1687109\" aria-labelledby=\"figcaption_attachment_1687109\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1687109\" src=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/4-wordpress-html-sitemap-post-types.png\" alt=\"Exclude post types from your WordPress HTML Sitemap in SEOPress\" width=\"1088\" height=\"630\" srcset=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/4-wordpress-html-sitemap-post-types.png 1088w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/4-wordpress-html-sitemap-post-types-768x445.png 768w\" sizes=\"auto, (max-width: 1088px) 100vw, 1088px\" title=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe3\" \/><figcaption id=\"figcaption_attachment_1687109\" class=\"wp-caption-text mt-3 mb-5 fst-italic\">Exclude post types from your WordPress HTML Sitemap in SEOPress<\/figcaption><\/figure> <p>\ud83d\udca1<em>Pro tip<\/em>: SEOPress automatically excludes nonindexed content to make things easy, so be sure to double-check your page or post\u2019s indexing settings if something isn\u2019t showing up in your sitemap.<\/p> <p>If you\u2019re running a membership site, you can easily exclude your members-only post types. Or if you\u2019re working on a WooCommerce store, hide the long list of product tags that don\u2019t need public visibility. The interface includes clear checkboxes for each post type and taxonomy, so exclusions take just seconds.<\/p> <p>\ud83d\udccc <strong>Example:<\/strong><\/p> <p>Imagine you\u2019re managing a law firm\u2019s site with <strong>500 blog posts, 50 practice area pages<\/strong>, and<strong> 200 attorney profiles<\/strong>. You want users to find attorneys and practice areas quickly, without wading through dated blog content. In SEOPress, you would:<\/p> <ul> <li>Keep \u201cPages\u201d and the \u201cAttorney\u201d CPT visible.<\/li> <li>Enter old blog post IDs in the exclusion field.<\/li> <li>Set the sort order to <strong>alphabetical<\/strong> for easy navigation.<\/li> <li>Click <strong>save<\/strong>, and your sitemap is updated on the spot.<\/li> <\/ul> <h3 id=\"choose-your-display-format\">Choose your display format<\/h3> <p>SEOPress offers two ways to display your sitemap, catering to both modern block editor users and classic WordPress workflows:<\/p> <p><strong>Option 1: Gutenberg Block<\/strong><\/p> <ul> <li>Create a new page titled \u201cSitemap\u201d.<\/li> <li>Add the <strong>SEOPress HTML Sitemap<\/strong> block.<\/li> <\/ul> <figure id=\"attachment_1687110\" aria-labelledby=\"figcaption_attachment_1687110\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1687110\" src=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/5-wordpress-html-sitemap-block.png\" alt=\"WordPress HTML Sitemap block in SEOPress\" width=\"640\" height=\"465\" srcset=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/5-wordpress-html-sitemap-block.png 640w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/5-wordpress-html-sitemap-block-168x123.png 168w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" title=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe4\" \/><figcaption id=\"figcaption_attachment_1687110\" class=\"wp-caption-text mt-3 mb-5 fst-italic\">WordPress HTML Sitemap block in SEOPress<\/figcaption><\/figure> <ul> <li>Customize display settings in the block sidebar.<\/li> <\/ul> <figure id=\"attachment_1687111\" aria-labelledby=\"figcaption_attachment_1687111\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1687111\" src=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/6-wordpress-html-sitemap-block-customization-crop.png\" alt=\"Customize WordPress HTML Sitemap block in SEOPress\" width=\"800\" height=\"600\" srcset=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/6-wordpress-html-sitemap-block-customization-crop.png 800w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/6-wordpress-html-sitemap-block-customization-crop-768x576.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" title=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe5\" \/><figcaption id=\"figcaption_attachment_1687111\" class=\"wp-caption-text mt-3 mb-5 fst-italic\">Customize WordPress HTML Sitemap block in SEOPress<\/figcaption><\/figure> <p><strong>Option 2: Shortcode<\/strong> (works anywhere)<\/p> <p><code>[seopress_html_sitemap]<\/code><\/p> <p>The shortcode accepts parameters for advanced users:<\/p> <p><code> [seopress_html_sitemap cpt=\"post,page\"]<\/code><\/p> <p><strong>Advanced shortcode examples:<\/strong><\/p> <ul> <li>Show only products:<br \/><code>[seopress_html_sitemap cpt=\"product\"].<\/code><\/li> <li>Display with wrapper div:<br \/><code>[seopress_html_sitemap].<\/code><\/li> <li>Multiple instances: Use different parameters on various pages for department-specific sitemaps.<\/li> <\/ul> <p>\ud83d\udca1<em>Pro tip<\/em>: Add the shortcode to your 404 page template. Visitors who hit dead links get instant navigation options instead of frustration.<\/p> <figure id=\"attachment_1687112\" aria-labelledby=\"figcaption_attachment_1687112\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1687112\" src=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/7-wordpress-html-sitemap-shortcode.png\" alt=\"html WordPress sitemap shortcode\" width=\"1262\" height=\"748\" srcset=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/7-wordpress-html-sitemap-shortcode.png 1262w, https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/7-wordpress-html-sitemap-shortcode-768x455.png 768w\" sizes=\"auto, (max-width: 1262px) 100vw, 1262px\" title=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe6\" \/><figcaption id=\"figcaption_attachment_1687112\" class=\"wp-caption-text mt-3 mb-5 fst-italic\">html WordPress sitemap shortcode<\/figcaption><\/figure> <h3 id=\"keep-your-sitemap-out-of-google-while-still-crawlable\">Keep your sitemap out of Google (while still crawlable)<\/h3> <p>Ranking #2 in Google should be good news\u2026 until you find out it\u2019s your HTML sitemap taking the spotlight instead of your homepage. Thankfully, there\u2019s a quick fix for this all-too-common issue.<\/p> <p><strong>Why it matters:<\/strong><\/p> <ul> <li>Sitemap pages in search results look sloppy and unpolished.<\/li> <li>They weaken your keyword strategy by splitting relevance.<\/li> <li>Users landing on a plain list miss the content you actually want them to see.<\/li> <\/ul> <p><strong>The solution:<\/strong><\/p> <p>SEOPress makes this easy to manage. When you publish your sitemap page:<\/p> <ol> <li>Open the page in WordPress.<\/li> <li>Scroll down to the SEOPress meta box.<\/li> <li>Go to the <strong>Advanced<\/strong> tab and tick <strong>Do not display this page in search engine results<\/strong><em>.<\/em><\/li> <li>Hit <strong>Update<\/strong><em>.<\/em><\/li> <\/ol> <figure id=\"attachment_1687113\" aria-labelledby=\"figcaption_attachment_1687113\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1687113\" src=\"https:\/\/www.seopress.org\/wp-content\/uploads\/2025\/09\/8-wordpress-html-sitemap-noindex.png\" alt=\"Noindex a page from your WordPress HTML Sitemap in SEOPress\" width=\"661\" height=\"315\" title=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe7\" \/><figcaption id=\"figcaption_attachment_1687113\" class=\"wp-caption-text mt-3 mb-5 fst-italic\">Noindex a page from your WordPress HTML Sitemap in SEOPress<\/figcaption><\/figure> <p>That\u2019s it. SEOPress adds a noindex tag to the page while still allowing search engines to crawl all the links inside it. So your sitemap stays useful for bots, without cluttering up the search results.<\/p> <p>The best part? This setting works hand-in-hand with the HTML sitemap module. SEOPress remembers your noindex choice even if you turn the sitemap off and back on again later.<\/p> <div class=\"alert alert-info\">\ud83d\udca1<em>Pro tip<\/em>: After adding the noindex tag, head to <strong>Google Search Console<\/strong> and run the URL through the <strong><em>URL Inspection<\/em><\/strong> tool. Look for the message <em>\u201cExcluded by \u2018noindex\u2019 tag\u201d<\/em> \u2013 that\u2019s confirmation that Google can crawl the page, but won\u2019t show it in search results.<\/div> <h3 id=\"scaling-multilingual-sites-catalogs-and-edge-cases\">Scaling: multilingual sites, catalogs, and edge cases<\/h3> <p>Running a large site comes with its own set of technical hurdles. SEOPress is built to tackle them head-on, smoothly and reliably.<\/p> <p><strong>Automatic pagination:<\/strong><\/p> <p>Once your XML sitemap hits <strong>1,000 items<\/strong>, SEOPress splits it automatically. That keeps things efficient, avoids memory issues (especially on shared hosting), and ensures fast loading for search engines.<\/p> <p>For example, <strong>10,000 products<\/strong> would be spread across <strong>10 XML sitemap files<\/strong>, instead of one overloaded file that might time out.<\/p> <p><strong>Multilingual magic:<\/strong><\/p> <p>Using WPML, Polylang, or TranslatePress? SEOPress instantly detects your setup. Your French sitemap will only show French URLs. German shows German \u2013 without you lifting a finger.<\/p> <p>\ud83d\udccc <strong>Example:<\/strong><\/p> <p>On a WPML-powered site with English, Spanish, and French content:<\/p> <ul> <li><code>example.com\/sitemap <\/code><br \/>serves English only.<\/li> <li><code>example.com\/es\/mapa-del-sitio <\/code><br \/>serves Spanish.<\/li> <li><code>example.com\/fr\/plan-du-site <\/code><br \/>serves French.<\/li> <\/ul> <p>Each sitemap respects that language\u2019s exclusions and noindex settings to the letter.<\/p> <p><strong>Multisite considerations:<\/strong><\/p> <p>If you\u2019re running a <strong>WordPress network<\/strong>, SEOPress lets you enable HTML sitemaps <strong>site-by-site<\/strong> or across the <strong>whole network<\/strong>. Each site keeps its own exclusion settings, but everything runs off the same lean, consistent codebase.<\/p> <p><strong>Large catalog handling:<\/strong><\/p> <ul> <li><strong>Smart queries<\/strong> keep your database responsive.<\/li> <li><strong>Caching headers<\/strong> cut down on server strain.<\/li> <li><strong>Hierarchical layout options<\/strong> make even huge inventories easy to browse.<\/li> <\/ul> <p><strong>The edge cases others miss? SEOPress covers them:<\/strong><\/p> <ul> <li>Custom post type archives display correctly.<\/li> <li>Password-protected pages stay hidden.<\/li> <li>Scheduled posts don\u2019t appear until they go live.<\/li> <li>Trashed items are ignored (surprisingly, not everyone gets this right).<\/li> <li>Private posts only show when they should.<\/li> <li>Sticky posts keep their place.<\/li> <li>Empty custom taxonomies stay out of sight.<\/li> <\/ul> <p>With all of this happening quietly in the background, you can stay focused on your content, not your sitemap.<\/p> <h2 id=\"code-snippets-for-when-plugins-arent-an-option\">Code snippets for when plugins aren\u2019t an option<\/h2> <p>Sometimes you can\u2019t install another plugin. Maybe you\u2019ve got agency restrictions, client preferences, or you\u2019re just a minimalist. Here\u2019s a basic PHP solution for desperate times:<\/p> <p><code><span style=\"font-weight: 400;\">\/\/ Add to a child theme's functions.php or a snippets plugin<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">function<\/span> <span style=\"font-weight: 400;\">custom_html_sitemap()<\/span> <span style=\"font-weight: 400;\">{<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">$out<\/span> <span style=\"font-weight: 400;\">=<\/span> <span style=\"font-weight: 400;\">'<\/span><span style=\"font-weight: 400;\">;<\/span><\/code><\/p> <p>\u00a0<\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">\/\/ Pages<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">$pages<\/span> <span style=\"font-weight: 400;\">=<\/span> <span style=\"font-weight: 400;\">get_pages(<\/span><span style=\"font-weight: 400;\">array<\/span><span style=\"font-weight: 400;\">(<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'sort_column'<\/span> <span style=\"font-weight: 400;\">=&gt;<\/span> <span style=\"font-weight: 400;\">'menu_order,post_title'<\/span><span style=\"font-weight: 400;\">,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'post_status'<\/span> <span style=\"font-weight: 400;\">=&gt;<\/span> <span style=\"font-weight: 400;\">'publish'<\/span><span style=\"font-weight: 400;\">,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">));<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">foreach<\/span> <span style=\"font-weight: 400;\">($pages<\/span> <span style=\"font-weight: 400;\">as<\/span> <span style=\"font-weight: 400;\">$page)<\/span> <span style=\"font-weight: 400;\">{<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">$out<\/span> <span style=\"font-weight: 400;\">.=<\/span> <span style=\"font-weight: 400;\">sprintf(<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'<\/p> <li>%s<\/li> <p>'<\/span><span style=\"font-weight: 400;\">,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">esc_url(get_permalink($page-&gt;ID)),<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">esc_html(get_the_title($page-&gt;ID))<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">);<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">}<\/span><\/code><\/p> <p>\u00a0<\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">\/\/ Recent posts<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">$recent_posts<\/span> <span style=\"font-weight: 400;\">=<\/span> <span style=\"font-weight: 400;\">get_posts(<\/span><span style=\"font-weight: 400;\">array<\/span><span style=\"font-weight: 400;\">(<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'posts_per_page'<\/span><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">=&gt;<\/span> <span style=\"font-weight: 400;\">50<\/span><span style=\"font-weight: 400;\">,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'post_status'<\/span><span style=\"font-weight: 400;\"> \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">=&gt;<\/span> <span style=\"font-weight: 400;\">'publish'<\/span><span style=\"font-weight: 400;\">,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'orderby'<\/span><span style=\"font-weight: 400;\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">=&gt;<\/span> <span style=\"font-weight: 400;\">'date'<\/span><span style=\"font-weight: 400;\">,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'order'<\/span><span style=\"font-weight: 400;\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">=&gt;<\/span> <span style=\"font-weight: 400;\">'DESC'<\/span><span style=\"font-weight: 400;\">,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'post_type'<\/span><span style=\"font-weight: 400;\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">=&gt;<\/span> <span style=\"font-weight: 400;\">'post'<\/span><span style=\"font-weight: 400;\">,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'ignore_sticky_posts'<\/span> <span style=\"font-weight: 400;\">=&gt;<\/span> <span style=\"font-weight: 400;\">true,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">));<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">foreach<\/span> <span style=\"font-weight: 400;\">($recent_posts<\/span> <span style=\"font-weight: 400;\">as<\/span> <span style=\"font-weight: 400;\">$p)<\/span> <span style=\"font-weight: 400;\">{<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">$out<\/span> <span style=\"font-weight: 400;\">.=<\/span> <span style=\"font-weight: 400;\">sprintf(<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">'<\/p> <li>%s<\/li> <p>'<\/span><span style=\"font-weight: 400;\">,<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">esc_url(get_permalink($p-&gt;ID)),<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">esc_html(get_the_title($p-&gt;ID))<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">);<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">}<\/span><\/code><\/p> <p>\u00a0<\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">$out<\/span> <span style=\"font-weight: 400;\">.=<\/span> <span style=\"font-weight: 400;\">''<\/span><span style=\"font-weight: 400;\">;<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">return<\/span> <span style=\"font-weight: 400;\">$out;<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">}<\/span><\/code><\/p> <p><code><span style=\"font-weight: 400;\">add_shortcode(<\/span><span style=\"font-weight: 400;\">'custom_sitemap'<\/span><span style=\"font-weight: 400;\">,<\/span> <span style=\"font-weight: 400;\">'custom_html_sitemap'<\/span><span style=\"font-weight: 400;\">);<\/span><\/code><\/p> <p><strong>Usage:<\/strong> Add <code>[[custom_sitemap]]<\/code> to any page.<\/p> <p><strong>Critical limitations:<\/strong><\/p> <ul> <li>Zero exclusion control without additional coding.<\/li> <li>No automatic noindex respect.<\/li> <li>Breaks if you change theme.<\/li> <li>No pagination. It will timeout on large sites.<\/li> <li>You\u2019re responsible for all maintenance.<\/li> <\/ul> <p>Honestly? Unless you\u2019re comfortable debugging PHP, stick with SEOPress.<\/p> <h2 id=\"making-html-sitemaps-work-for-your-wordpress-sites\">Making HTML sitemaps work for your WordPress sites<\/h2> <p>Building an HTML sitemap shouldn\u2019t mean managing clunky plugins or diving into complex code. SEOPress\u2019s unified sitemap engine delivers the speed and control developers expect, with the ease of setup that everyone appreciates.<\/p> <p><strong>Here\u2019s what makes it different:<\/strong><\/p> <ul> <li><strong>One update<\/strong> powers both HTML and XML sitemaps so that everything stays in sync.<\/li> <li><strong>On-demand generation<\/strong> keeps your database lean.<\/li> <li><strong>Built-in<\/strong> <strong>pagination<\/strong> handles large sites with ease.<\/li> <li><strong>Smart noindex rules<\/strong> help you stay out of unwanted search results.<\/li> <\/ul> <p>It doesn\u2019t matter whether you\u2019re running a <strong>small portfolio site<\/strong> or a <strong>multilingual WooCommerce store<\/strong> with <strong>thousands of SKUs<\/strong>, the setup stays the same: switch it on, choose what to exclude, drop it onto any page. You\u2019re live in minutes.<\/p> <p>No hoops to jump through, no surprise charges. The HTML sitemap module is included <strong>free<\/strong> with SEOPress, giving you fast, accessible navigation from day one. <strong>Try SEOPress\u2019s sitemap free<\/strong>.<\/p> <div class=\"author-bio small my-5\"> <div class=\"d-flex pt-4 border-top\"> <div class=\"d-flex me-4\"> <img src=\"https:\/\/secure.gravatar.com\/avatar\/6e6eb6c9bb559c9e68a7f30d190821684d6d345940ad4e127d949a6424987ba7?s=80&amp;d=mm&amp;r=g\" srcset=\"https:\/\/secure.gravatar.com\/avatar\/6e6eb6c9bb559c9e68a7f30d190821684d6d345940ad4e127d949a6424987ba7?s=160&amp;d=mm&amp;r=g 2x\" class=\"avatar avatar-80 photo rounded-circle\" height=\"80\" width=\"80\" loading=\"lazy\" decoding=\"async\" title=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe8\" alt=\"Boost Navigation: Create a WordPress HTML Sitemap\u63d2\u56fe8\" \/> <\/div> <div class=\"flex-grow-1\"> <span class=\"author-title\"><br \/> <span class=\"author-heading\"><br \/> By <span class=\"text-primary fw-bold\">Benjamin Denis<\/span> <\/span><br \/> <\/span><\/p> <p class=\"author-description\"> CEO of SEOPress. 15 years of experience with WordPress. Founder of WP Admin UI &amp; WP Cloudy plugins. Co-organizer of WordCamp Biarritz 2023 &amp; WP BootCamp. WordPress Core Contributor. <\/p> <\/p><\/div> <\/p><\/div> <\/p><\/div> <\/p><\/div> <p>Featured Stories,Sitemaps#Boost #Navigation #Create #WordPress #HTML #Sitemap1767884516<\/p> ","protected":false},"excerpt":{"rendered":"<p>You\u2019ve been there. It\u2019s late, your client\u2019s just asked for \u201ca quick sitemap page,\u201d and you\u2019re stuck choosing between two bad ideas: install yet another bloated SEO plugin that drags your backend into molasses, or roll your sleeves up for some custom PHP that could break the moment WordPress blinks. Here\u2019s the truth: most site [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1065,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[381,383,384,382,385,168],"class_list":["post-1064","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-green-sea","tag-boost","tag-create","tag-html","tag-navigation","tag-sitemap","tag-wordpress"],"acf":[],"_links":{"self":[{"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=\/wp\/v2\/posts\/1064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1064"}],"version-history":[{"count":0,"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=\/wp\/v2\/posts\/1064\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=\/wp\/v2\/media\/1065"}],"wp:attachment":[{"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1064"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/longzhuplatform.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}