=== Silotree — Internal Links for the Posts You Already Wrote ===
Contributors: silotree
Tags: internal links, internal linking, seo, orphan pages, related posts
Requires at least: 5.9
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 0.3.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

More readers from posts you already wrote. Silotree finds the internal links your site is missing and writes in the ones you approve, with an undo.

== Description ==

More readers from posts you already wrote — in about ten minutes a week.

Most sites have good posts nobody can find from inside the site: nothing links to them, so readers never reach them and search engines rate them as unimportant. It happens on every kind of site — a travel blog, a gardening site, a software company's help pages, a recipe blog, a local business — once there are more than a few dozen posts.

Silotree finds those posts, works out where each one belongs, and suggests a link to it from another post, using words already in that post. You approve the ones you like, and the plugin writes them in. Every change can be reversed.

**It counts only the links you wrote.** Navigation, footers, sidebars and related-post blocks are left out of every count. On a real WordPress page most links are furniture, and counting them makes a stranded post look well connected.

**It scans on your own server, free, without an account.** Activate the plugin and it walks your posts in the background using WP-Cron. Within a few minutes it can tell you how many posts nothing links to, how deep they sit, and which links are broken — having sent nothing anywhere.

**It writes ordinary links.** No shortcodes, no wrappers, no dependency on this plugin. Deactivate Silotree and every link stays exactly where it is.

= What it does without an account =

* Every post nothing links to, with a suggested home
* Click depth measured through links people wrote, not through your menu — on a site with a static
  front page to measure from; on a blog-index home page it says so rather than inventing a number
* Broken internal links
* A Silotree sidebar in the block editor that updates as you write: posts this draft should link to (with one-click insert), older posts that should link to this one, the links already in and out, and a live link-density meter. It only reads the draft when you pause and only while the sidebar is open, so typing stays smooth on long posts. Inserting puts a link into the draft you have open; you save the post as you normally would
* The same suggestions in a box on the Classic Editor, inserting into the Visual or Text tab
* Keyword rules (Silotree → Link rules): link chosen words to a page of yours wherever they appear, at most once per post and in at most as many posts as you say, with exact-case matching and posts to leave out. Preview first, then apply; each run is one batch you can undo. Focus keywords from Yoast SEO or Rank Math can be imported as rules
* A never-link list: posts, post types, categories and words Silotree will never link from or to, on any screen or from the Silotree app
* A "Links" action under each post in your posts list, showing every link in and out of it with the words each one is on
* A prompt when you publish, offering older posts that could link to the new one. Ticking them has the plugin write those links in — your first 10 links are written free, the same as on a free account; after that, writing links is on a paid plan
* CSV export of everything it found

= What connecting to Silotree adds =

Connect the plugin to a free Silotree account and it reads your posts to suggest specific links: which post should link to which, and the words in the paragraph where the link would sit. Approve them on the Silotree site or straight from a weekly email, and this plugin writes them in.

* **Free:** the full audit, every finding as a CSV, a weekly email with links to add, and your first 10 links written free, no card needed.
* **On every plan:** links through a redirect pointed at the final address and links to deleted pages taken off with their words kept, in one click that can be undone. Fixes add no link, so they do not use up free links.
* **Languages:** link wording is tuned for English, German, French, Spanish, Italian, Dutch and Portuguese. The audit works on a site in any language.
* **Paid plans** write links without a limit, match suggestions by meaning across every post, undo any batch from Silotree or from WordPress, group every post by topic, and show the clicks each suggestion should earn — ranked from your own Search Console data if you connect it. Every paid plan has a 7-day money-back guarantee.

= Safety =

This plugin edits published writing, so it is built to be reversed:

* A WordPress revision is saved before every change, and a post is not edited at all on a site with revisions turned off
* The post is read back afterwards to confirm the link landed
* Any batch can be undone, in one click. Undo takes out exactly the links that batch added and leaves everything you have written since
* No more than six Silotree links in any one post, counting earlier batches
* Posts open in the editor are skipped rather than written underneath somebody
* It refuses rather than guesses: a paragraph that has changed since the suggestion was made, an anchor that appears twice, or text inside an existing link, heading, button, caption, code, shortcode or structured card (recipe cards from WP Recipe Maker, Tasty Recipes or Create by Mediavine among them) is declined with a reason instead of edited
* In the block editor it only writes into paragraphs, lists and quotes (including those inside groups and columns). Blocks from other plugins are never edited, so none is left invalid

== Installation ==

Silotree is not in the WordPress.org directory yet, so it is installed from a zip:

1. Download `silotree.zip` from your Silotree account (the WordPress step when you add a site, or **Settings → Connections**), or from https://silotree.io/downloads/silotree.zip. Leave it zipped.
2. In WordPress, go to **Plugins → Add New → Upload Plugin**, choose `silotree.zip`, press **Install Now**, then **Activate**.
3. Open **Silotree** in the admin menu (just above Appearance). The first scan starts on activation and runs in the background.
4. To have links written for you, go to **Settings → Silotree** and click **Connect to Silotree**. You sign in to Silotree, confirm, and land back in Silotree with the site connected — there is no key to copy. If your site cannot open Silotree in a browser, the same screen has a key you can paste instead.

You can also unzip it and upload the `silotree` folder to `/wp-content/plugins/`. No FTP, no database access and no configuration is needed for the local scan.

To update, upload the newer zip the same way and choose **Replace current with uploaded**; your settings, rules and undo history are kept. Step-by-step help, with screenshots: https://silotree.io/docs/install-and-update-the-plugin and https://silotree.io/docs/pair-the-plugin

== External services ==

This plugin connects to the Silotree service at https://silotree.io (or the address in the `silotree_app_url` option on a self-hosted install). SiloTree is operated by Thomas Kanze, a self-employed individual based in Costa Rica. It is used only after an administrator connects the site from **Settings → Silotree**. Until then the plugin sends nothing anywhere: the scan, the reports and the CSV export all run on your own server.

Once connected:

* **Connecting**: the site address, the address of this settings screen, a one-time code and a verifier are exchanged with silotree.io, and Silotree then calls this site's REST API once to confirm the site holds the key.
* **Admin screens** (the Silotree screen, the posts-list columns and the editor sidebar): the site's domain is sent to fetch counts, suggestions and the plan. The editor sidebar's own suggestions are worked out on this server; the draft is never sent to Silotree. Answers are cached for a few minutes, and when Silotree cannot be reached the plugin waits ten minutes before asking again.
* **Map posts**: post IDs, their public URLs and a hash of each post's content are sent so suggestions can be matched to posts.
* **Publishing a post**: the post ID, its public URL and its title are sent so Silotree can suggest links to it.
* **Related posts block**: the list of related posts is fetched from silotree.io at most every six hours (fifteen minutes after a failed try), when somebody is in wp-admin.
* **Applying and undoing links**: silotree.io calls this site's REST API (`/wp-json/silotree/v1/`), with each request signed using the site key.

The site key is never sent in either direction; requests are signed with it. Nothing is loaded from silotree.io on the pages your readers see.

Terms of service: https://silotree.io/terms — Privacy policy: https://silotree.io/privacy

== Frequently Asked Questions ==

= Where is the documentation? =

The Silotree help centre has step-by-step articles for everything below, with screenshots: https://silotree.io/docs

= Does it work without an account? =

Yes. The scan, the list of unlinked posts, click depth, broken links and the CSV export all run on your own server and are free for ever. The publish prompt works too, and writes your first 10 links free. A free account adds suggestions across the whole site and a weekly email with links to add. How the editor sidebar works: https://silotree.io/docs/editor-sidebar

= Does it only work for blogs? =

No. It works on any WordPress site with posts or pages that should point at each other — blogs, magazines, documentation, shop guides, local business sites. It only ever links your own pages to each other.

= Will it slow my site down? =

No. Nothing runs when a reader loads a page, and there is no front-end script. The scan runs in the background through WP-Cron, in batches, and stops on its own.

= What happens if I deactivate it? =

The links stay. They are ordinary WordPress links in your own words. Deleting the plugin removes its tables, its settings and its site key. By default the links in your posts are left alone; **Settings → Silotree** lets you choose instead to keep the links and remove Silotree's marks from them, or to take every Silotree link out and leave the words. Step by step: https://silotree.io/docs/uninstall-the-plugin

= Does it conflict with Rank Math or Yoast? =

No, they do different jobs. Keep your SEO plugin for titles, schema and sitemaps. Silotree can import their focus keywords as keyword rules you preview first: https://silotree.io/docs/keyword-rules

= Which editors are supported? =

The block editor and the classic editor, including blocks nested in groups, columns and quotes. Links are written into paragraphs, lists and quotes only; headings and blocks from other plugins are left alone. Content is only ever changed by wrapping a phrase that is already in your post, and anything it cannot place with certainty is refused with a reason rather than edited. Posts built with Elementor, Divi, Beaver Builder, Bricks, Oxygen, WPBakery, Avada or Thrive Architect are read but never written to, and the refusal names the builder. The full list of what it will and won't edit: https://silotree.io/docs/what-the-plugin-edits

= It says it cannot reach Silotree. What do I do? =

Press **Check connection** on **Settings → Silotree**. Most often a security plugin or firewall is blocking `/wp-json/silotree/`, or the host blocks outgoing requests. Every message and its fix: https://silotree.io/docs/plugin-cant-reach-silotree

= A link was not added. Why? =

Silotree refuses a link rather than guess, and always says why: a page builder, words that changed, someone editing the post, or revisions turned off. Every reason and what to do: https://silotree.io/docs/link-didnt-land

= Does it work on multisite? =

Yes. On a multisite, WordPress filters the HTML that anyone but a super admin saves, which would strip embeds from a post. Silotree checks that the only change it is making is its own link and saves exactly that, so your embeds are left alone.

== Screenshots ==

1. The Silotree screen: how many posts nothing links to, how many link nowhere, broken internal links, and average click depth through your own writing — all worked out on your server, with no account
2. The Silotree sidebar while you write: the posts this draft should link to, each with the sentence and the words that would become the link, and a live link-density meter
3. The prompt when you publish, offering the older posts that should link to the new one and the sentence in each where the link would sit
4. A "Links in" column on your posts list, sortable so the posts nothing points at come to the top, and a "Links" action under each post
5. Keyword rules: preview every sentence a rule would change before anything is written, then apply it as one batch you can undo
6. Every link in and out of a post, with the words each one sits on
7. The same suggestions in the Classic Editor

== Changelog ==

= 0.3.0 =
* A live sidebar in the block editor, a Silotree box in the Classic Editor, keyword rules with Yoast SEO and Rank Math import, a never-link list, and a links-in-and-out report for every post.
* Broken links can be fixed from Silotree: a redirected link is pointed at its final address, and a dead one is unlinked with its words kept. Both can be undone.
* Admin pages stay fast when Silotree cannot be reached: the plugin waits before asking again.
* Links are only written into paragraph-like blocks, so third-party blocks are never left "invalid".
* The local link graph updates when a post is saved, trashed or deleted, and large sites are sent in batches past 2,000 posts.
* A redesigned Settings → Silotree screen, with clear states for every step.

= 0.2.0 =
* One-click connect from Settings → Silotree, with the key entered by hand as a fallback, and a button to make a new key.
* Requests between the site and Silotree are signed and cannot be replayed; the key itself never travels.
* Nothing is sent to Silotree until the site is connected.
* Undo removes exactly the links a batch added, and keeps everything written since.
* Several links to one post in one batch now all land; a changed paragraph is refused instead of the whole post.
* Never links inside headings, buttons, captions, navigation, shortcodes or recipe cards.
* Backslashes in posts are preserved, nested blocks are edited without duplicating markup, and embeds survive on multisite.
* A post is not edited on a site with revisions turned off, or while somebody has it open.
* The related-posts table works on MySQL 8.

= 0.1.0 =
* First release: local scan, orphan and dead-end reports, click depth, broken links, anchor grouping, CSV export, editor panel, publish prompt, and cloud apply with per-batch undo.

== Upgrade Notice ==

= 0.3.0 =
Editor sidebar, keyword rules, one-click broken-link fixes and faster admin pages. Recommended for every site.

= 0.2.0 =
Safer writing and undo, and one-click connect. Recommended for every connected site.

= 0.1.0 =
First release.
