=== 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.10
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, plugin version, WordPress version, PHP version, site language, the TamRank interface language and environment type (production or staging) are sent, so support can see your setup and staging sites are not counted against your site limit. 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.10 =
* New: category and tag SEO now migrates along, from Yoast SEO, Rank Math and All in One SEO. Titles, descriptions and the noindex setting move over, and the roll-back takes them back out.
* New: Opportunities & signals, a new dashboard section that puts what is moving on your site in front of you as cards. It opens with the 404s found since the previous scan; more signals follow.
* New: your XML sitemap covers every language of a multilingual site, instead of the default language only. Tested with Polylang. On a setup that gives each language its own domain, every domain keeps its own language. Without a language plugin nothing changes.
* Fixed: your sitemap no longer lists the template types a page builder registers. Elementor templates and its global kit, its floating buttons, and Royal Elementor Addons' templates and mega menus are building blocks rather than pages, and each of them had a sitemap of its own in the index.
* Changed: TamRank stays quiet about any page type another plugin already puts on the page, not just FAQ markup as in 1.3.9. The schema panel says what it is leaving alone, and a button per type takes it back.
* Changed: this includes breadcrumbs. Next to Yoast SEO, Rank Math or All in One SEO the breadcrumb markup was on the page twice; from now on it comes from the other plugin only.
* Fixed: a .htaccess file TamRank cannot read is no longer treated as missing. Saving and restoring server rules now stop before the first write.
* Fixed: rolling back a migration deleted a setting you had deliberately switched off, instead of putting it back.
* Fixed: starting a migration twice at once could leave redirects behind that the roll-back should have removed.
* Fixed: ticking off a task on the dashboard, or adding one, now sticks. The change was sent but never saved, and the screen did not say so.
* Changed: every task on the dashboard now opens the page it is about. "Fix" on a row lands in the editor with the cursor in the field, "Fix all pages" opens the audit filtered on that issue, a broken link points at its own row in the 404 monitor, and the sitemap and alt-text tasks open the settings card they mean. The audit scrolls straight to the filtered table and marks it for a moment, so you land on the list you asked for instead of at the top of the page.
* Fixed: the internal-links task claimed the pages it counts are isolated. It counts the opposite: pages that link nowhere themselves. The description now says what the list is and what to do about it.
* Changed: when a site registers for an API key it now also sends its WordPress version, PHP version, site language, the TamRank interface language and environment type (production or staging), so support sees your setup at once and a staging site is not counted as a live one.
* Security: registering for an API key now proves the request came from this site. The key goes to the install that started the registration and to nothing else, so someone watching the moment it happens cannot claim it.
* Fixed: the editor no longer accepts a slug a page already uses. Posts and pages share one address space, so a post could silently end up unreachable.
* Fixed: and it now says so. When a slug you type is taken, the editor names the page holding it and shows the address your page ended up on.
* Fixed: error messages read as text again instead of "[object Object]", everywhere a request can fail.
* Changed: the dashboard no longer waits up to thirty seconds on Search Console. A slow connection left the screen blank; it now gives up after five seconds and shows the figures from the last successful fetch.
* Fixed: switching 404 monitoring off now really stops the logging. The setting only hid the screen, while every 404 kept writing a row. Redirects you set up keep working either way.
* Security: a burst of made up addresses can no longer flood your redirect suggestions. TamRank generates at most a hundred new ones a day, and the daily clean up now really removes the ones it set aside a month ago.
* Security: that daily limit now also holds when the requests arrive at the same moment. Visits landing together could each see the same free slot and pass the limit as a group; the slot is now claimed in one step.
* Improved: your sitemap is served from cache. The index and the ones for posts, pages and images were rebuilt from scratch on every single request, which on a large site is a lot of work per visitor. Publishing or changing a page still refreshes them right away.
* Security: analysing a page again no longer fetches it from your own site without limit. There is now half a minute between two fetches of the same page, and the editor says so instead of appearing to do nothing.
* New: on a multilingual site your homepage title, blog title, fallback description and organisation name can be translated per language. They show up in the string translation screen of WPML or Polylang, so every language gets its own wording instead of the one you typed first.
* Fixed: your image sitemap listed a translated image twice. Translating an image makes a second entry for the same file, and both ended up in the list.

= 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.10 =
Category and tag SEO migrates along from Yoast SEO, Rank Math and All in One SEO, roll-back included. A new Opportunities and signals section, plus a sitemap covering every language. One behaviour change: TamRank leaves a page type another plugin already writes alone, breadcrumbs included.

= 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.
