=== Hreflang Master ===
Contributors: yodsira
Tags: hreflang, multilingual, seo, alternate links, x-default
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

hreflang link tags without WPML: URL-to-language pairs, automatic rel=alternate output with x-default, and a reciprocity validator. Works with any multilingual setup - or none.

== Description ==

Google Search Console keeps complaining about hreflang, but WPML costs $99+/year and Polylang only maps its own content? Hreflang Master does the one thing multilingual SEO needs - correctly, independently:

* **Direct URL mapping.** Pairs of "page URL - language - target URL". The output is plain <link rel="alternate" hreflang> tags, no redirects, no URL rewriting.
* **x-default included.** Mark any target as the default version; the tag is emitted automatically.
* **Reciprocity validator.** A -> B without B -> A is the most common hreflang mistake - the built-in validator lists every one-sided pair, missing self-references and duplicate languages.
* **Cache-friendly by design.** Tags depend only on the URL - identical for every visitor. No cookies, no sessions, no cache-splitting.

The Pro version adds unlimited pairs, CSV bulk import, one-click import of Polylang/WPML translations, hreflang entries in the WP core sitemap plus a dedicated sitemap-hreflang.xml with xhtml:link alternates, and a test mode that highlights problems without touching output.

== Installation ==

1. Upload the `hreflang-master` folder to `/wp-content/plugins/` or install the ZIP via Plugins - Add New.
2. Activate, then open Tools - Hreflang Master.
3. Add pairs for your language versions (the free version allows 10).

== Frequently Asked Questions ==

= I disabled the plugin - why do cached pages still show the tags? =

The tags live in cached HTML. Purge your page cache (LiteSpeed, WP Super Cache, etc.) after uninstalling.

= Which URL format should I use? =

Absolute URLs are safest; relative paths are resolved against the site URL automatically. Trailing slashes are normalized away.

== Changelog ==

= 1.0.0 =
* Initial release: pairs CRUD, head output with x-default, reciprocity validator.
