=== XML Sitemap to HTML ===
Tags: xml, sitemap, html sitemap, shortcode, search
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 3.3.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Display one or more XML sitemaps as an accessible, searchable HTML list or table.

== Description ==

XML Sitemap to HTML turns standard XML sitemaps and sitemap indexes into a human-readable HTML sitemap. Add the sitemap URLs once, create a shortcode with the built-in generator, and place it in any post or page.

= Features =

* Combines multiple XML sitemaps
* Follows nested sitemap indexes automatically
* Searchable list and responsive table layouts
* Human-readable titles generated from URL slugs
* Optional URL and last-modified output
* Configurable title capitalization and slug separator
* Configurable transient cache
* Duplicate URL removal
* Accessible labels, status updates, and keyboard-friendly tables
* Server-side shortcode generator with copy button
* Backward compatibility with XS2H XML Sitemap to HTML 1.x

== Installation ==

1. Upload the `xml-sitemap-to-html` folder to `/wp-content/plugins/`, or install the ZIP from **Plugins → Add New → Upload Plugin**.
2. Activate **XML Sitemap to HTML**.
3. Open **Settings → XML Sitemap to HTML**.
4. Enter one absolute XML sitemap URL per line.
5. Choose the slug separator and cache duration, then click **Save settings**.
6. Configure the output in the **Shortcode generator** and copy the generated shortcode into a page or post.

== Usage ==

The shortest shortcode uses all saved sitemaps and the default settings:

`[sitemap-html]`

A complete example:

`[sitemap-html ids="all" search="true" separator="-" layout="table" show_url="true" show_lastmod="true" case="title" cache_ttl="3600"]`

= Parameters =

* `ids`: `all` or a comma-separated list of the IDs shown in the generator.
* `search`: `true` or `false`.
* `separator`: Up to two slug characters to replace with spaces.
* `layout`: `list` or `table`.
* `show_url`: `true` or `false`.
* `show_lastmod`: `true` or `false`.
* `case`: `title`, `upper`, `lower`, `ucfirst`, or `none`.
* `cache_ttl`: Cache duration in seconds. Use `0` to bypass the cache.

== Backward Compatibility ==

Upgrading from **XS2H XML Sitemap to HTML 1.x** does not require users to recreate their settings or edit existing content:

* The legacy options `xs2h_sitemap_urls`, `xs2h_slug_separator`, and `xs2h_cache_ttl` are copied when the corresponding 3.x options do not yet exist. Meaningful legacy values also replace untouched 3.3.1 defaults, recovering data after an intermediate 3.3.1 installation.
* The legacy shortcode `[xs2h-sitemap-html]` remains registered with all former attributes and defaults.
* Legacy shortcode IDs remain 1-based. For example, `ids="1,2"` still selects the first and second saved sitemaps.
* Legacy title generation continues to replace underscores in addition to the selected separator.
* The 3.x shortcode `[sitemap-html]` retains its 0-based IDs from version 3.3.1.
* URL positions and duplicates are preserved when settings are saved, so generated numeric IDs do not shift unexpectedly.
* Saved 3.x settings are mirrored to the legacy option names, making a rollback less likely to lose later configuration changes.
* A compatibility bootstrap retains the former main plugin filename so an existing activation reference remains loadable after an update.

The compatibility layer never overwrites non-default 3.x settings.

== Frequently Asked Questions ==

= Can I use a sitemap index? =

Yes. Sitemap indexes are followed recursively with safeguards against loops and excessive nesting.

= Why is a sitemap not loaded? =

The URL must use HTTP or HTTPS and return a successful response containing valid XML. WordPress safe HTTP rules can reject private or unsafe destinations.

= How are titles generated? =

The plugin uses the final URL path segment, URL-decodes it, replaces the configured separator with spaces, collapses repeated whitespace, and applies the selected capitalization.

= How do I bypass cached data? =

Set the global cache duration or the shortcode's `cache_ttl` parameter to `0`. Existing transient rows expire according to their original lifetime, but they are not read while caching is disabled.

= Is PHP mbstring required? =

No. The plugin uses mbstring when available and falls back to standard PHP string functions otherwise.

== Changelog ==

= 3.3.2 =

* Added lossless migration from all XS2H 1.x option names.
* Restored the legacy `[xs2h-sitemap-html]` shortcode with its 1-based ID behavior.
* Preserved the 3.3.1 `[sitemap-html]` shortcode and 0-based IDs.
* Added a legacy bootstrap for installations that still reference the former main plugin filename.
* Added top and bottom save controls to the settings panel.
* Fixed the admin stylesheet path and moved generator behavior to a dedicated script.
* Improved the settings guide, parameter documentation, mobile layout, and accessibility.
* Localized the live result count instead of hard-coding it in JavaScript.
* Added HTTP status validation, safe remote requests, gzip support, XML network isolation, recursion limits, and loop protection.
* Added a fallback for servers without mbstring.
* Updated compatibility metadata for WordPress 7.1.

= 3.3.1 =

* Introduced the `[sitemap-html]` shortcode, streamlined settings, and a redesigned generator.

= 1.2 =

* Original XS2H release with multiple sitemaps, live search, list/table layouts, and a server-side generator.

== Upgrade Notice ==

= 3.3.2 =

Compatibility release for XS2H 1.x and XML Sitemap to HTML 3.3.1 installations. Existing settings and shortcodes are retained.
