=== Tino SEO & GEO ===
Contributors: trytino
Tags: seo, geo, schema, structured data, ai
Requires at least: 5.6
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.11.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Connect your WordPress to Tino to publish SEO + GEO articles with structured data, AI bot access and IndexNow.

== Description ==

Tino writes and publishes SEO + GEO articles and helps you rank on Google and in AI assistants (ChatGPT, Gemini, Perplexity). This plugin connects your WordPress to your Tino dashboard with a secure key and takes care of:

* Publishing the articles you approve in Tino (no duplicates).
* Outputting the structured data (JSON-LD Article + FAQPage) in the `<head>`, so it always reaches Google and AI assistants even if you run security plugins.
* Allowing the relevant AI bots (GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, Google-Extended and others) in your robots.txt.
* Notifying IndexNow (Bing/Yandex) about each new article to speed up discovery.

It does not use your account password: it authenticates with its own API key that you can regenerate at any time.

== External services ==

This plugin connects to external services only when the corresponding feature is enabled. What it sends, when and where:

= IndexNow (search engine notification of new or updated URLs) =

When you publish or update an article, the plugin notifies IndexNow so that compatible search engines (Microsoft Bing, Yandex and others) discover the change sooner. It sends the public URL of the post, your site host name and a random verification key that the plugin itself hosts on your site. It does NOT send the article content or any personal data. This happens only if IndexNow is enabled in Settings -> Tino (on by default; you can turn it off there).

* Service: IndexNow - https://www.indexnow.org/
* Endpoint: https://api.indexnow.org/indexnow
* Documentation: https://www.indexnow.org/documentation - the data (public URLs) is shared with the participating search engines; e.g. Microsoft Bing privacy policy: https://www.microsoft.com/privacy

= Tino (connection with your Tino account) =

The plugin does not send data to Tino on its own. It exposes a private REST endpoint that your Tino dashboard calls, authenticated with the API key you generate in Settings -> Tino, to publish the articles you approve. You control the key and can regenerate or disconnect it whenever you want.

* Service: Tino - https://trytino.com
* Terms: https://trytino.com/terminos
* Privacy: https://trytino.com/privacidad

== Installation ==

1. Install and activate the plugin.
2. Go to Settings -> Tino and copy your API Key.
3. In your Tino dashboard, paste the key and click Connect.

== Frequently Asked Questions ==

= Do I need to give my WordPress username and password? =

No. The plugin generates its own key; Tino connects using only that key.

= Does it work with Wordfence or other security plugins? =

Yes. The schema is output in the `<head>` from the plugin itself, without relying on the open REST API or on application passwords.

== Changelog ==

= 1.11.0 =
* Fix: the article's structured data now says which page it belongs to. Tino builds the schema on its
  server, where the final permalink is not known yet, so the Article node was published without a
  URL, without mainEntityOfPage and without the featured image. Search engines saw a description of
  an article that never said which page it described. The plugin now fills those in from WordPress
  itself, which is the only place that knows them. Your theme's or SEO plugin's own schema is left
  untouched: nothing is merged, only anchored.

= 1.10.0 =
* New: the questions Tino writes for the pages you already have are now published as a VISIBLE
  "Frequently asked questions" block inside the page, and only after you approve that page in your
  Tino dashboard. Until you approve it, nothing on your site changes.
* Fix: the question block is no longer declared in the page head when it is not on the page. Google's
  structured data policy requires FAQ questions and answers to be visible on the page, so declaring
  them invisibly put your site at risk of a manual action for no measured gain. The markup is now
  emitted only alongside the visible block, so it always matches what a reader sees.
* Your content is still never rewritten: the block is rendered by the plugin on top of your page, so
  removing it is one click and leaves your text exactly as you wrote it.
* New: Tino can now delete an article it published (it moves the post to the trash). Until now,
  deleting an article in Tino left an orphan draft behind in WordPress.

= 1.9.0 =
* New: your business entity (Organization / LocalBusiness) is now also declared in the head of your
  HOME page, not only inside each article. The home page is where an AI learns what a business is;
  until now that node — name, official profiles, what the business is best at, the area it serves —
  only travelled with the articles. It carries the same @id as the articles, so engines merge the
  pieces into one entity instead of several similar ones.
* Nothing visible changes: it mirrors what your site already says, and Tino only sends what it can
  back with your own pages. New route tino/v1/entidad (POST / GET / DELETE): every field is
  length-capped and stripped of markup, URLs must be http(s), and anything else is discarded.
  Removing it is one call, and uninstalling the plugin deletes it.

= 1.8.0 =
* New: Tino can now make the pages you ALREADY have citable — your services and your "about us" —
  without touching a single visible word of them. It adds a machine-readable question block in the
  page head, and removing it is one click. Your content is never rewritten: only your own words
  decide what the page says.
* Works with any kind of page: WooCommerce products, custom post types and normal pages alike.

= 1.7.0 =
* New: articles published by Tino now declare in the page head that their text was generated by an
  AI model, using the IPTC digital source type vocabulary, so that automated checkers can detect it.
  This is what Article 50(2) of the EU AI Act requires, and it applies from 2 December 2026.
  The marker is added ONLY to posts Tino published: marking the rest of the site would falsely
  declare human-written pages as machine-generated.
* Nothing changes for readers: the declaration is machine-readable only and is not displayed.

= 1.6.2 =
* Fix: the plugin reported the wrong version number to the Tino dashboard. The version lives in the
  file header and in an internal constant, and only the header had been updated, so the dashboard
  believed sites were running an older release than they were.

= 1.6.1 =
* Fix: uninstalling the plugin no longer deletes your Tino API key. Reinstalling is a normal support
  action, and deleting the key silently disconnected the site — Tino kept the old key, could no
  longer publish, and nothing said so until someone noticed articles had stopped appearing.

= 1.6.0 =
* New: the plugin counts visits that arrive from an AI assistant (ChatGPT, Perplexity, Gemini,
  Copilot, Claude), so you can finally see whether being cited by an AI brings anyone to your site.
* Privacy first: only a per-day counter per assistant is stored. No IP, no user agent, no tracking
  cookie, no identifier — nothing that would require consent.
* Honest by design: a lot of AI traffic arrives with no referrer and is indistinguishable from
  direct. The number is reported as a FLOOR ("at least this many"), never as a total, and the note
  travels with the data so it cannot be shown without it.
* The plugin now opts itself into WordPress auto-updates, so fixes and improvements reach your site
  without anyone having to click Update.

= 1.5.0 =
* New: search-engine verification from the Tino dashboard. Reading how often an AI answer cites your
  pages requires the site to be verified in Bing Webmaster Tools, and verifying requires a tag in the
  <head>. Until now that meant doing it by hand for every site; the plugin can now place it for you.
* The new tino/v1/verify route accepts ONLY a well-formed verification code (hexadecimal) and stores
  it as an option. It cannot be used to inject anything else into your site's head.
* The tag is printed on every page (Bing looks for it on the home page) and only when a valid code
  is stored, so nothing changes for sites that do not use this.

= 1.4.0 =
* IndexNow submissions are now VERIFIED instead of fire-and-forget. Until 1.3.0 the ping was sent
  with 'blocking' => false, so the response was never read: an invalid key, a 4xx or a network error
  looked exactly like a success and articles silently never reached Bing/Copilot via IndexNow. The
  request now waits for the response, and the result (HTTP code and reason) is stored per URL.
* New: the last IndexNow submissions (URL, timestamp, HTTP code, outcome) are kept in a small
  rotating log and exposed in the tino/v1/status response as indexnow_state, so the Tino dashboard
  — and you — can see whether pings are actually landing instead of assuming they do.
* Submissions can be disabled from Settings; a disabled submission is also logged with its reason,
  never silently skipped.

= 1.3.0 =
* IMPORTANT: the plugin folder is now "tino-seo-geo", matching the WordPress.org directory. Until
  1.2.2 the ZIP served from trytino.com created a folder called "tino", which WordPress treated as a
  DIFFERENT plugin: updates from the directory were never offered, and installing both at once
  crashed the site with a fatal error. If you installed from trytino.com before, deactivate and
  delete the old "tino" plugin and reconnect with your API key. The plugin now detects a duplicate
  copy and disables itself instead of taking the site down.
* AI crawler access is now fixed even when the site has a PHYSICAL robots.txt. WordPress's robots_txt
  filter only applies to the virtual file, so on sites with a real robots.txt in the web root the
  plugin's Allow rules never reached the served file. The plugin now detects that case and, on
  request, prepends its own marked block. The edit is additive: none of your existing rules are
  touched (in robots.txt the most specific group wins, so a per-bot "Allow: /" already overrides a
  general "Disallow: /"), it is idempotent, and the original file is backed up as
  robots.txt.tino-backup before the first write.
* New REST route POST tino/v1/robots to apply that fix, and the tino/v1/status response now reports
  whether robots.txt is virtual or physical, whether it is writable, and whether the block is
  already in place.

= 1.2.2 =
* Plugin Check compliance: the Settings -> Tino page now enqueues its CSS and JS via wp_add_inline_style() and wp_add_inline_script() on the admin_enqueue_scripts hook (loaded only on that page). Removed the inline <style>/<script> blocks and inline event handlers.

= 1.2.1 =
* Plugin Check compliance: output escaping, wp_parse_url(), wp_delete_file(), sanitized server input, English readme.
* Brand logo shown in the Settings -> Tino header.

= 1.2.0 =
* Blog page management from the plugin (endpoint /tino/v1/blog): the "Activate blog" button in Tino now works with the plugin connection (previously only with Application Passwords).

= 1.1.0 =
* The SEO slug curated in Tino is applied when the post is created (clean URL).
* Outputs `<meta name="description">` in the `<head>` (with the curated meta description), avoiding duplicates when Yoast, Rank Math, SEOPress or AIOSEO are present.

= 1.0.0 =
* Initial version: connection via API key, article publishing, schema in `<head>`, AI bot access and IndexNow.
