=== TamRank SEO – SEO Audit, Search Console & Clear Guidance ===
Contributors: tamrank
Tags: seo, xml sitemap, schema, redirects, meta tags
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.3.9
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Know exactly what to fix. Meta tags, schema, sitemap, redirects and a full SEO audit, with the fix next to every score. Surprisingly clean.

== Description ==

**TamRank SEO: Know exactly what to fix.**

TamRank is a clean, actionable WordPress SEO plugin built for people who want clarity instead of another dashboard full of noise.

= Why TamRank? =

* Know what to fix next with clear SEO priorities
* Search Console data directly inside WordPress
* SEO audit, schema, redirects and 404 monitoring in one place
* Migrate safely from Yoast SEO, Rank Math or All in One SEO
* Fully usable for free, without turning the dashboard into an upsell

= Free features =

* **A continuous SEO audit.** Every page gets a score and plain-language steps on what to fix next.
* **Meta you control per page.** Titles, descriptions and canonicals per post, page and term, a focus keyword plus four secondary keywords with live scoring, and Open Graph previews.
* **Search Console in your dashboard.** Clicks, impressions and average position, last 7 and 28 days.
* **Schema without code.** A markup builder with 14 types, reusable templates and custom JSON-LD.
* **Broken links caught early.** A 404 monitor and a redirect manager, with regex rules and $1-$9 backreferences.
* **Found by search engines.** XML and HTML sitemaps, breadcrumbs, a robots.txt editor, robots directives and IndexNow.
* **Lighter, tidier media.** Automatic WebP conversion and automatic alt text from your own pattern.

Switching over? The migration wizard imports your Yoast SEO, Rank Math or All in One SEO data, and rolls back.

= TamRank PRO =

PRO is a separate add-on, not bundled in this free plugin. It adds the AI tools, topical authority, per-post audit panels, a change tracker, index-status scanning and PageSpeed Insights. You receive it by email after purchase and install it like any other plugin. The free plugin is fully functional on its own and never downloads it for you.

== Installation ==

1. Upload the `tam-rank` folder to `/wp-content/plugins/` or install through the WordPress admin.
2. Activate the plugin via the **Plugins** screen.
3. Open **Tam Rank → Settings** to run the onboarding wizard.
4. That's it — the free plugin is fully functional. PRO features come from a separate TamRank PRO add-on (installed like any other plugin); **Settings → License** explains what the free version includes and how to add PRO.

== External services ==

TamRank communicates with `api.tamrank.com` (operated by TamRank) for the following purposes. All calls are HTTPS-only.

* **Setup tips opt-in (optional, requires consent).** When you check "Yes, send the tips" on the wizard success screen, the plugin sends your site's admin email, the chosen UI language, your site URL, the plugin version and an anonymous onboarding-variant marker (used only to pick which tips series to send) to `https://api.tamrank.com/v1/sites/email-optin`. This enrolls you in a short series of educational emails about TamRank features. Unsubscribing from any email removes you from the list. No tracking pixels, no marketing blasts. Without consent this call is never made.
* **Site registration (on explicit action — not on activation).** Activating the plugin does *not* contact any server. The first time you click "Connect with Google" to link Google Search Console, the plugin requests a free API key from `https://api.tamrank.com`. To prove you control the domain before any key is issued, the plugin runs a short ownership handshake: it asks the TamRank server for a one-time token, briefly publishes that token at `https://your-site/.well-known/tamrank-challenge.txt`, and the TamRank server fetches it back to confirm the match. That token is single-use and short-lived, it is *not* the API key, and the path returns 404 when no handshake is in progress. Only your site domain, site URL and plugin version are sent. The API key is requested once, cached, and is required for TamRank's hosted SEO services (Google Search Console integration, schema validation).
* **Google Search Console data (proxied through TamRank).** When you connect Google Search Console, the OAuth authorisation and every subsequent Search Console request — impressions, clicks, average position and per-page index status — are routed through `https://api.tamrank.com/v1/search-console/...`, not called against Google directly. TamRank performs the OAuth token exchange on your behalf and returns the data, which is then cached in your WordPress database. Nothing is sent until you explicitly click "Connect with Google".
* **Automatic indexing / "Request indexing" (optional, off by default).** When automatic indexing is enabled (it is off by default) or you click "Request indexing" on a post, the post's URL — not its content — is sent to `https://api.tamrank.com/v1/search-console/index-url` (and its status checked via `.../index-status`) so the page can be submitted to search engines. This requires a connected Search Console property and never runs without one.
* **IndexNow (optional, off by default).** IndexNow is switched off on a fresh install and the plugin makes no IndexNow call until you enable it under **Settings → General**. Switching the toggle on is what triggers the network activity: at that moment the plugin creates a random site key, publishes it as a small text file at `https://your-site/<key>.txt` (so the search engines can verify you control the domain), and — if your site does not have an API key yet — runs the same one-time ownership handshake described under "Site registration" above to obtain one. After that, publishing or updating a page sends that page's URL — not its content — to `https://api.tamrank.com/v1/indexnow/submit`, which forwards it to `https://api.indexnow.org`. IndexNow shares one submission with every participating search engine (Amazon, Bing, Naver, Seznam.cz, Yandex, Yep). Pages marked noindex, pages of content types you excluded, drafts, revisions and password-protected pages are never submitted. Switching the toggle off stops every submission; the key file itself stays reachable so a verification the search engines already started can still finish — it contains a random token and nothing else, and grants no access to your site. IndexNow protocol: https://www.indexnow.org/
* **License activation (PRO add-on only).** The separately-installed TamRank PRO add-on sends its license key together with your site's API key to `https://api.tamrank.com/v1/sites/upgrade` to verify and activate the license. The free plugin has no license-key field and never makes this call; it is listed here only for completeness.
* **AI features (PRO add-on only).** Provided by the separate PRO add-on: AI meta generation, alt-text generation, internal-link suggestions and topical-authority analysis send the relevant post content to `https://api.tamrank.com/v1/...` endpoints. These features are off by default and only fire on user action. The free plugin sends no content to these endpoints.

In addition, the separate TamRank PRO add-on uses one third-party Google service directly:

* **Google PageSpeed Insights (PRO add-on only).** PageSpeed testing is a PRO feature. When you run a PageSpeed test in the PRO add-on, the URL of the page being tested is sent (using your own Google API key) to Google's PageSpeed Insights API (`https://www.googleapis.com/pagespeedonline/v5/runPagespeed`) and the resulting performance metrics are returned. This only happens on your explicit action. The free plugin does not make this call. Google's terms: https://developers.google.com/speed/docs/insights/v5/about — Google privacy policy: https://policies.google.com/privacy.

The TamRank service is operated by TamRank (Netherlands). Privacy policy: https://tamrank.com/privacy-policy/ — Terms of service: https://tamrank.com/terms-of-service/. Contact: info@tamrank.com.

== Third-party libraries ==

This plugin bundles the following minified third-party libraries. Their unminified source is available at the locations below:

* **ApexCharts** v4.7.0 (MIT) — https://github.com/apexcharts/apexcharts.js
* **D3.js** v7.9.0 (ISC) — https://github.com/d3/d3
* **Plus Jakarta Sans** font (SIL Open Font License 1.1) — https://github.com/tokotype/PlusJakartaSans

== Frequently Asked Questions ==

= Does TamRank work alongside Yoast SEO, Rank Math or All in One SEO? =

Yes for migration purposes. The onboarding wizard imports your existing SEO data from Yoast SEO, Rank Math or All in One SEO. Running both active is not recommended as they will duplicate meta output.

= Is a PRO license required? =

No. The full meta management, sitemap, schema builder, audit, 404 monitor and redirect features work for free. The separate TamRank PRO add-on adds the AI tools, topical authority, change tracker and priority engine.

= How is my data stored? =

All SEO data is stored in standard WordPress post meta and options. Custom tables are used for redirects (the PRO add-on adds its own tables for change logs, topical maps and slug synonyms). At uninstall you can optionally drop these tables via the **Privacy & Data** toggle.

= Is TamRank free? =

Yes. Meta management, the XML sitemap, the schema builder, the SEO audit, the 404 monitor, redirects, WebP conversion, automatic alt text and the .htaccess editor all work in the free plugin. You get a focus keyword plus four secondary keywords per page. The separate TamRank PRO add-on adds the AI tools and the topical authority map; you never need it to run TamRank.

= How do I migrate from Yoast SEO, Rank Math or All in One SEO? =

Install TamRank and open the onboarding wizard. It detects Yoast SEO, Rank Math and All in One SEO, lets you pick the source if more than one is installed, tells you how many items it found and imports your titles, descriptions and settings. Your existing plugin's data is left untouched, so you can deactivate it once you are satisfied and go back if you are not.

= Where can I report a bug or ask a question? =

Use the support forum on this page. That is the fastest route, and the answer stays visible for anyone with the same question. For account or billing questions, use https://tamrank.com/contact/.

== Screenshots ==

1. See what needs your attention first. The dashboard puts your overall SEO score and your prioritised SEO task list on one screen, with clicks, impressions and rankings from Search Console without leaving WordPress.
2. Find your most important SEO issues across the site. The SEO audit shows a site-wide score with an Excellent, Good and Needs attention breakdown, the most common issues across your pages, and a per-page table with filter pills.
3. Know a page is ready before you publish. The SEO tab in the post editor holds the focus keyword, meta title and description, with a live optimization score and an improvement checklist that updates as you type.
4. Catch a missing alt text or a thin set of links while you are still writing. The Content tab lists every image with its alt-text status, WebP status and file size, plus your internal and external links.
5. Get structured data on every page without writing code. The schema builder shows what is active per page and which types are output, with reusable templates and a Google test straight from the overview.
6. Find broken URLs before they become an SEO problem. The 404 monitor logs every broken URL with its hit count and date, cleans up old entries automatically, and lets you create the redirect straight from the log.
7. Run only the parts of TamRank you need. Every feature has its own switch, from the SEO meta box to 404 monitoring, redirects and auto-indexing, with content types and language settings underneath.
8. Switch from Yoast SEO, Rank Math or All in One SEO without starting over. The migration wizard shows what it found and exactly what it will move over, keeps a backup, and puts a roll-back button on the final step. Your old plugin's data is left untouched.
9. See how a post will look before you share it. The Social tab holds your social title, description and image, with live previews for Facebook, X, LinkedIn and Instagram next to them.
10. Create and manage redirects directly from WordPress. One list of your 301, 302 and 307 rules with hit counts, automatic and manual entries side by side, and CSV import and export.

== Changelog ==

= 1.3.9 =
* New: the robots.txt screen opens with a status card, and it says when the sitemap line no longer matches your site address, with a button that corrects it.
* New: ask Google to crawl a page again from the editor, and from your category and tag screens.
* New: park a page out of the orphan list without taking it out of your audit.
* New: the migration plan flags redirects that send visitors to another domain before you import them.
* Changed: the dashboard no longer repeats site health per category. The SEO audit covers this page by page.
* Fixed: pages linked only from a navigation menu were reported as orphans, and the Links column showed a 0. Menu links now count.
* Fixed: a custom post type showed visitors a breadcrumb trail but handed none to Google.
* Fixed: an alt text of nothing but spaces now counts as filled, so the images panel no longer stays stuck above zero.
* Fixed: redirects imported from another SEO plugin now have their own filter and their own label, instead of sitting with the ones you typed yourself.
* Fixed: a failed roll-back in the migration wizard now stops and offers you a retry.
* Fixed: a page that already carries FAQ markup from another plugin no longer gets a second set from TamRank.
* Fixed: a page type carried over from another SEO plugin now reaches your structured data.
* Fixed: Dutch, German and French screens no longer fall back to English in places.

= 1.3.8.2 =
* Improved: pages built with a page builder (Avada, Divi, WPBakery) load at full speed again. The plugin no longer fetches the page from itself on every visit to collect schema material.
* Improved: on sites running Avada, TamRank now reads the questions straight from your FAQ or accordion element, instead of making up headings and buttons of its own.
* Improved: if your theme or another plugin already puts FAQ schema on a page, TamRank leaves it alone instead of placing a second version beside it.
* New: your pages now carry the full set of sharing tags, so a link posted on Facebook, LinkedIn or WhatsApp shows your title, description and image with the right dimensions. Moving over from another SEO plugin no longer costs you tags you had.
* Improved: your structured data tells search engines more about a page: when it was written and last changed, its language, how long it is and who wrote it, plus the search box they can offer straight in the results. Coming from Yoast, the page type you set there is now carried over as well.
* Improved: the content analysis in the editor is quicker and lighter. It reads the page you are working on instead of asking your site for a fresh copy after every pause in typing.

= 1.3.8.1 =
* Fixed: pages and posts could not be saved or published while TamRank was active. It happened when the address (slug) in the TamRank box was already taken by another page, and it ended in a blank error screen with nothing on it to explain what went wrong. Switching the plugin off was the only way around it.
* Fixed: a redirect TamRank filed by itself, after you sent a page to the trash or changed its address, kept sending visitors away once real content lived at that address again. Restore a page from the trash, rebuild it under the old address or import it from another SEO plugin, and visitors now get the page instead of the redirect. A redirect you typed in yourself is left alone and keeps firing, so nothing you set up on purpose changes.
* Fixed: saving a page could file a redirect for a revision address that has never been public.

= 1.3.8 =
* Improved: the migration wizard is rebuilt. Four steps, one screen each, with the full plan and the rollback visible before anything runs.
* New: migrate from All in One SEO, next to Yoast SEO and Rank Math. You pick the source if more than one is installed.
* New: robots.txt and XML sitemap settings migrate along, with a keep-or-replace choice for your own robots rules.
* New: brand details migrate along (name, logo, social profiles, share image). Existing TamRank data is never overwritten.
* New: a site-wide fallback share image for pages without one of their own. Empty by default.
* New: LocalBusiness schema with opening hours, address, service area and a live preview.
* New: merchant fields in the product schema (shipping, returns, condition). Shipping is read from your WooCommerce shipping zones; returns and condition are your own settings and start out empty.
* New: 451 as a redirect status next to 410. Redirects with either status migrate along from Yoast and Rank Math.
* New: a main switch for the XML sitemap.
* Changed: date archives are noindex by default after this update, switchable in Settings next to a switch for author archives.
* Fixed: WooCommerce products had no Offer node in their automatic schema markup, so price and availability were missing.
* Fixed: double canonical tags on pages with a custom canonical URL, and unfilled variables in social titles and descriptions.

= 1.3.7 =
* New: an HTML sitemap and breadcrumbs for your visitors, as a block, a widget, a shortcode or a template tag. Both use the same data as your XML sitemap, so what a visitor reads matches what Google reads.
* New: IndexNow. Publishing or updating a page tells Bing, Yandex, Naver, Seznam, Amazon and Yep straight away instead of waiting for the next crawl. Off until you switch it on.
* New: the full set of robots directives per page, post and term: noarchive, nosnippet, noimageindex, notranslate, max-snippet, max-image-preview and max-video-preview.
* New: automatic alt text. New uploads get their alt text from a pattern you choose, and you can run that pattern across the images already in your library. It only fills what is still empty, and a run can be undone. Off by default.
* New: RSS feed optimisation. Put a line of text before and after every item in your feed, so sites that republish it link back to the original. Off by default.
* New: regex redirects. One rule can cover a whole set of old addresses, with $1 to $9 in the target filling in what the pattern captured. Every pattern is checked before it is saved.
* New: the migration wizard imports your redirects from Yoast and Rank Math as well, and the rollback removes them again.
* Changed: step two of the setup wizard has been redesigned.
* Changed: the Internal links card on the dashboard shows a status instead of a percentage, so pages without a contextual link no longer read as a failing score.
* Fixed: date archives ran into a fatal error and returned a blank page.
* Fixed: the BreadcrumbList in your structured data listed drafts, private, trashed, password protected and noindex pages as steps in the path.
* Fixed: the BreadcrumbList in your structured data showed &amp; and &#8217; where a visitor reads & and an apostrophe.
* Fixed: the X-Robots-Tag header could contradict the robots meta tag on pages with their own settings.
* Fixed: saving your settings could empty a stored PageSpeed key, AI switch, writing style or brand profile, and the "Settings saved" confirmation did not appear.
* Fixed: the settings page jumped back to General after saving instead of staying on the tab you were working in.
* Fixed: the category selection in the migration wizard did nothing on every second visit.
* Fixed: bulk actions asked for confirmation through the browser dialog instead of TamRank's own.
* Fixed: the robots directives are now written into the single robots tag WordPress outputs itself instead of a second tag beside it, so the two can no longer contradict each other.
* Fixed: a pattern typed while Match is still set to Exact is refused with an explanation instead of being stored as a rule that can never fire.
* Fixed: FAQ schema listed every question twice, and a page whose only question shaped heading was a call to action could still become an FAQ.
* Fixed: content analysis raised a PHP warning on the featured image of an unpublished post.
* Fixed: "Not analyzed yet" on the dashboard was untranslated in Dutch, German and French.
* Removed: llms.txt. Google's own guidance states you don't need AI text files to appear in its AI features, and measurements across 137,210 domains found 97% of these files were never fetched at all. After updating, /llms.txt returns "not found" like any other unused address.

= 1.3.6 =
* New: built-in .htaccess editor with backup before every write, a sandbox parse-test before saving and a fail-safe self-check after saving that restores the previous version unless the site verifiably still responds (Apache/LiteSpeed only; read-only on nginx). Respects DISALLOW_FILE_EDIT/DISALLOW_FILE_MODS and is super-admin-only on multisite.
* Changed: the content score is now a weighted average per category instead of a flat sum of sub-checks, so the category label is the single source of truth and the maximum is a real 100. Keyword checks no longer pass for free when no focus keyword is set; they are marked not applicable and the remaining categories are renormalised. Existing pages can shift a few points.
* Fixed: hardcoded credit total in the API client and license manager, an IndexNow label on a Search Console submission, a dead rollback deep link in the migration banner and an AJAX endpoint without a caller.
* Fixed: FAQ schema now recognises class-based accordions and no longer picks up a call-to-action heading as a question.
* UI: refined tooltip system, empty-state pass (icon + guidance + one clear action) and motion/feedback polish across the admin.
* Hardening: security and schema should-fixes from the wp.org pre-submission audit.

= Earlier versions =
1.3.6 was the first TamRank release published on WordPress.org. Everything before it was pre-release development; the full history is at https://tamrank.com/changelog/.

== Upgrade Notice ==

= 1.3.9 =
Your robots.txt screen opens with a one line verdict and says when its sitemap line points at your old address. Ask Google to crawl a page again from the editor. Menu links now count, so pages are no longer wrongly called orphans. Migrated pages keep the page type they had. No breaking changes.

= 1.3.8.2 =
Pages built with Avada, Divi or WPBakery load at full speed again. Your FAQ schema now comes from your own accordion and no longer doubles up. Shared links carry the full set of tags, your structured data says more about each page, and the content analysis in the editor is lighter.

= 1.3.8.1 =
Fixes two problems that could stop you publishing. Pages that refused to save while TamRank was active, and a redirect the plugin filed itself that kept firing over a page you had put back online. Redirects you typed in yourself are untouched. Recommended for everyone on 1.3.7 or 1.3.8.

= 1.3.8 =
Rebuilt migration wizard, All in One SEO as a source, robots.txt, sitemap and brand settings that move along, a site-wide fallback share image, LocalBusiness schema, WooCommerce merchant fields and a 451 status. One behaviour change: date archives go to noindex by default, switchable in Settings.

= 1.3.7 =
Fixes a fatal error on date archives and breadcrumb data that listed drafts, private and noindex pages. Adds an HTML sitemap and breadcrumbs, IndexNow, the full robots directives, automatic alt text, RSS optimisation, regex redirects and redirect import. No breaking changes.
