{"id":302337,"date":"2026-04-28T08:52:38","date_gmt":"2026-04-28T08:52:38","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/hreflang-customizer\/"},"modified":"2026-08-22T10:07:16","modified_gmt":"2026-08-22T10:07:16","slug":"hreflang-customizer","status":"publish","type":"plugin","link":"https:\/\/ast.wordpress.org\/plugins\/hreflang-customizer\/","author":18767423,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.1","requires":"5.8","requires_php":"7.0","requires_plugins":null,"header_name":"Hreflang Customizer","header_author":"Hopeleaf Technologies","header_description":"Easily generate hreflang tags on any WordPress site \u2014 no translation plugin required. Works standalone or with Weglot.","assets_banners_color":"0d0491","last_updated":"2026-08-22 10:07:16","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/ko-fi.com\/jemssaliya","header_plugin_uri":"https:\/\/seo-hreflang.com\/","header_author_uri":"https:\/\/hopeleaftechnologies.com\/","rating":5,"author_block_rating":0,"active_installs":30,"downloads":556,"num_ratings":2,"support_threads":1,"support_threads_resolved":1,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.0":{"tag":"1.1.0","author":"jems007","date":"2026-08-22 08:59:51"},"1.2.0":{"tag":"1.2.0","author":"jems007","date":"2026-08-22 09:32:12"},"1.2.1":{"tag":"1.2.1","author":"jems007","date":"2026-08-22 10:07:16"}},"upgrade_notice":{"1.2.1":"<p>Fixes a corrupted 1.2.0 download package. Contains all 1.2.0 features: per-page hreflang control, audit tool, and XML sitemap support.<\/p>","1.2.0":"<p>Big feature release: per-page hreflang control, site-wide audit tool with CSV export, and XML sitemap support. Recommended for all users.<\/p>","1.1.0":"<p>Major free release. Standalone mode, redesigned UI, improved security. Recommended for all users.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3517036,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3517037,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3517034,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500-es.png":{"filename":"banner-1544x500-es.png","revision":3517042,"resolution":"1544x500","location":"assets","locale":"es","width":1544,"height":500},"banner-1544x500-es_ES.png":{"filename":"banner-1544x500-es_ES.png","revision":3517041,"resolution":"1544x500","location":"assets","locale":"es_ES","width":1544,"height":500},"banner-1544x500-rtl.png":{"filename":"banner-1544x500-rtl.png","revision":3517040,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3517043,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-es.png":{"filename":"banner-772x250-es.png","revision":3517045,"resolution":"772x250","location":"assets","locale":"es","width":772,"height":250},"banner-772x250-es_ES.png":{"filename":"banner-772x250-es_ES.png","revision":3517044,"resolution":"772x250","location":"assets","locale":"es_ES","width":772,"height":250},"banner-772x250-rtl.png":{"filename":"banner-772x250-rtl.png","revision":3517046,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3517047,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.0","1.2.0","1.2.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3517039,"resolution":"1","location":"assets","locale":"","width":1771,"height":910},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3517038,"resolution":"2","location":"assets","locale":"","width":1770,"height":911}},"screenshots":{"1":"Settings page \u2014 searchable language card grid with sidebar tag panel.","2":"Selected languages shown as tag chips with the hreflang code badge.","3":"System status page with environment diagnostics.","4":"Per-page Hreflang Settings meta box with language override and custom URL mapping.","5":"Hreflang Audit page with summary cards and per-URL issue breakdown."}},"plugin_section":[],"plugin_tags":[2993,163963,261250,99,186],"plugin_category":[48,55],"plugin_contributors":[261251],"plugin_business_model":[],"class_list":["post-302337","plugin","type-plugin","status-publish","hentry","plugin_tags-hreflang","plugin_tags-hreflang-tags","plugin_tags-international-seo","plugin_tags-multilingual","plugin_tags-seo","plugin_category-language-tools","plugin_category-seo-and-marketing","plugin_contributors-jems007","plugin_committers-jems007"],"banners":{"banner":"https:\/\/ps.w.org\/hreflang-customizer\/assets\/banner-772x250.png?rev=3517047","banner_2x":"https:\/\/ps.w.org\/hreflang-customizer\/assets\/banner-1544x500.png?rev=3517043","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/hreflang-customizer\/assets\/icon.svg?rev=3517034","icon":"https:\/\/ps.w.org\/hreflang-customizer\/assets\/icon.svg?rev=3517034","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/hreflang-customizer\/assets\/screenshot-1.png?rev=3517039","caption":"Settings page \u2014 searchable language card grid with sidebar tag panel."},{"src":"https:\/\/ps.w.org\/hreflang-customizer\/assets\/screenshot-2.png?rev=3517038","caption":"Selected languages shown as tag chips with the hreflang code badge."}],"raw_content":"<!--section=description-->\n<p><strong>Hreflang Customizer<\/strong> is a free plugin that generates hreflang tags for your WordPress pages automatically. It works on any site \u2014 no multilingual plugin is required.<\/p>\n\n<p>Hreflang tags tell search engines which language and region each page targets. This prevents duplicate-content issues across multilingual or multi-regional sites and helps the right version of your page rank in the right country.<\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li>\u2705 Works <strong>without<\/strong> any translation plugin \u2014 standalone mode out of the box<\/li>\n<li>\u2705 Also integrates with <strong>Weglot<\/strong> for translated URL mapping<\/li>\n<li>\u2705 Searchable language picker with 180+ languages and regional variants<\/li>\n<li>\u2705 Selected languages shown as removable tag chips with language codes<\/li>\n<li>\u2705 Language list cached via WordPress Transients API (no repeated API calls)<\/li>\n<li>\u2705 <strong>NEW: Per-page hreflang control<\/strong> \u2014 override languages, map custom URLs, or disable tags on any page or post<\/li>\n<li>\u2705 <strong>NEW: Site-wide Hreflang Audit<\/strong> \u2014 detect invalid locales, duplicates, missing x-default and self-reference issues<\/li>\n<li>\u2705 <strong>NEW: XML sitemap support<\/strong> \u2014 dedicated \/hreflang-sitemap.xml plus Yoast SEO sitemap integration<\/li>\n<li>\u2705 Clean, modern admin UI \u2014 fully responsive<\/li>\n<li>\u2705 No upsells, no premium tier \u2014 100% free<\/li>\n<\/ul>\n\n<h4>How It Works<\/h4>\n\n<p><strong>Standalone mode:<\/strong> Select your target language codes in the settings page. The plugin outputs one <code>&lt;link rel=\"alternate\" hreflang=\"...\"&gt;<\/code> tag per selected code in the <code>&lt;head&gt;<\/code> of every page, pointing to the canonical URL of that page.<\/p>\n\n<p><strong>Weglot mode:<\/strong> If Weglot is installed and active, the plugin maps Weglot's translated URLs to your selected hreflang codes automatically.<\/p>\n\n<h4>Per-Page Hreflang Control (v1.2.0)<\/h4>\n\n<p>Every page, post and public custom post type gets a <strong>Hreflang Settings<\/strong> meta box in the editor where you can:<\/p>\n\n<ul>\n<li>Disable hreflang tags entirely on that page (useful for login, policy or thank-you pages)<\/li>\n<li>Limit output to a subset of your global languages \u2014 perfect when a post only exists in some languages<\/li>\n<li>Map each language to a <strong>custom URL<\/strong> \u2014 ideal for ccTLD or subdomain setups (e.g. example.de, fr.example.com)<\/li>\n<li>Set a custom <strong>x-default URL<\/strong> for that specific page<\/li>\n<\/ul>\n\n<h4>Hreflang Audit Tool (v1.2.0)<\/h4>\n\n<p>Go to <strong>Hreflang &gt; Audit<\/strong> and click <em>Run Audit<\/em>. The plugin checks every public URL for:<\/p>\n\n<ul>\n<li>Invalid locale codes (wrong format, underscores instead of hyphens)<\/li>\n<li>Missing self-referencing tags<\/li>\n<li>Missing x-default fallback<\/li>\n<li>Duplicate locale declarations<\/li>\n<li>Relative (non-absolute) URLs<\/li>\n<li>Mixed http\/https protocols<\/li>\n<\/ul>\n\n<p>Results are shown with pass\/warning\/error badges and can be <strong>exported to CSV<\/strong> for client reports.<\/p>\n\n<h4>XML Sitemap Support (v1.2.0)<\/h4>\n\n<ul>\n<li>A dedicated sitemap at <code>\/hreflang-sitemap.xml<\/code> lists every URL with its <code>xhtml:link<\/code> hreflang annotations \u2014 the method Google recommends for large sites<\/li>\n<li>Automatic <strong>Yoast SEO integration<\/strong>: hreflang alternates are appended to every Yoast sitemap entry<\/li>\n<li>The sitemap is announced in your robots.txt automatically<\/li>\n<\/ul>\n\n<h4>Example Output<\/h4>\n\n<pre><code>&lt;link rel=\"alternate\" href=\"https:\/\/yoursite.com\/about\/\" hreflang=\"en-AU\" \/&gt;\n&lt;link rel=\"alternate\" href=\"https:\/\/yoursite.com\/about\/\" hreflang=\"en-GB\" \/&gt;\n&lt;link rel=\"alternate\" href=\"https:\/\/yoursite.com\/\" hreflang=\"x-default\" \/&gt;\n<\/code><\/pre>\n\n<h4>Third-Party Service<\/h4>\n\n<p>This plugin optionally fetches an extended language list from <strong>https:\/\/app.seo-hreflang.com\/api\/languages<\/strong> to supplement its built-in language database. The request is made at most once every 12 hours. No personal data, user data, or site content is transmitted \u2014 the request contains no body payload. The result is cached locally using the WordPress Transients API.<\/p>\n\n<p>If the external service is unavailable, the plugin automatically falls back to its built-in list of 180+ languages and continues to work normally.<\/p>\n\n<ul>\n<li>Service URL: https:\/\/app.seo-hreflang.com\/<\/li>\n<li>Privacy Policy: https:\/\/seo-hreflang.com\/privacy-policy\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>In your WordPress dashboard, go to <strong>Plugins &gt; Add New<\/strong><\/li>\n<li>Search for <strong>Hreflang Customizer<\/strong><\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong><\/li>\n<li>Go to <strong>Hreflang &gt; Settings<\/strong> and select your target languages<\/li>\n<li>Click <strong>Save Languages<\/strong> \u2014 hreflang tags will appear in your site's <code>&lt;head&gt;<\/code> immediately<\/li>\n<\/ol>\n\n<p>Alternatively, download the zip and upload via <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20translation%20plugin%3F\"><h3>Do I need a translation plugin?<\/h3><\/dt>\n<dd><p>No. The plugin works standalone. It outputs hreflang tags pointing to your current page URLs. If you also use Weglot, it will automatically map Weglot's translated URLs instead.<\/p><\/dd>\n<dt id=\"which%20translation%20plugins%20are%20supported%3F\"><h3>Which translation plugins are supported?<\/h3><\/dt>\n<dd><p>Currently Weglot is fully supported in addition to standalone mode. Support for WPML, TranslatePress and Polylang is planned for a future release.<\/p><\/dd>\n<dt id=\"what%20is%20x-default%3F\"><h3>What is x-default?<\/h3><\/dt>\n<dd><p>x-default is a special hreflang value that tells Google which page to show when no other language matches the user's browser language. When selected, it points to your site's home URL.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20make%20external%20requests%3F\"><h3>Does the plugin make external requests?<\/h3><\/dt>\n<dd><p>Yes, optionally. It requests a language list from https:\/\/app.seo-hreflang.com\/api\/languages and caches the result for 12 hours. If the server is unreachable, the built-in language list is used. No user or site data is sent.<\/p><\/dd>\n<dt id=\"can%20i%20control%20hreflang%20on%20individual%20pages%3F\"><h3>Can I control hreflang on individual pages?<\/h3><\/dt>\n<dd><p>Yes! Since v1.2.0 every page and post has a \"Hreflang Settings\" meta box where you can disable tags, select a subset of languages, map custom URLs per language, or set a custom x-default.<\/p><\/dd>\n<dt id=\"how%20do%20i%20check%20if%20my%20hreflang%20setup%20is%20correct%3F\"><h3>How do I check if my hreflang setup is correct?<\/h3><\/dt>\n<dd><p>Go to Hreflang &gt; Audit and click \"Run Audit\". The plugin validates all your public URLs against 7 common hreflang mistakes and lets you export the results as CSV.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20support%20xml%20sitemaps%3F\"><h3>Does the plugin support XML sitemaps?<\/h3><\/dt>\n<dd><p>Yes. A dedicated hreflang sitemap is available at \/hreflang-sitemap.xml, and if you use Yoast SEO, hreflang annotations are added to Yoast's sitemaps automatically.<\/p><\/dd>\n<dt id=\"what%20are%20the%20minimum%20requirements%3F\"><h3>What are the minimum requirements?<\/h3><\/dt>\n<dd><p>WordPress 5.8 or higher and PHP 5.6.20 or higher.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Maintenance release \u2014 re-packaged 1.2.0 to resolve a corrupted distribution zip on WordPress.org. No functional changes.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: Per-page hreflang override meta box \u2014 disable tags, select a language subset, map custom URLs per language, and set a custom x-default on any page, post or public custom post type<\/li>\n<li>New: Hreflang Audit tool (Hreflang &gt; Audit) \u2014 validates all public URLs against 7 rules: invalid locales, underscore locales, missing self-reference, missing x-default, duplicates, relative URLs, and mixed protocols<\/li>\n<li>New: CSV export of audit results<\/li>\n<li>New: Dedicated XML sitemap at \/hreflang-sitemap.xml with xhtml:link hreflang annotations<\/li>\n<li>New: Yoast SEO sitemap integration \u2014 hreflang alternates added to every Yoast sitemap entry<\/li>\n<li>New: Sitemap announced in robots.txt automatically<\/li>\n<li>Improvement: Front-end tag output now fully respects per-page overrides in both standalone and Weglot modes<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Plugin is now fully free \u2014 no premium tier<\/li>\n<li>Added standalone mode: hreflang tags work without any translation plugin<\/li>\n<li>Added Weglot integration for translated URL mapping<\/li>\n<li>Completely redesigned admin UI with searchable language grid<\/li>\n<li>Language codes now shown as badge chips on selected tags<\/li>\n<li>Built-in static language fallback (180+ languages) when API is unavailable<\/li>\n<li>Added \"Buy me a coffee\" donate link<\/li>\n<li>Fixed: CSS\/JS now loads reliably on all server configurations<\/li>\n<li>Fixed: all WordPress.org security requirements (sanitize, escape, validate)<\/li>\n<li>Removed: premium\/pro version references<\/li>\n<li>Removed: Select2 dependency<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Easily add hreflang tags to any WordPress site. Works standalone \u2014 no translation plugin required.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/302337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=302337"}],"author":[{"embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jems007"}],"wp:attachment":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=302337"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=302337"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=302337"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=302337"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=302337"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=302337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}