{"id":401672,"date":"2026-11-12T15:19:21","date_gmt":"2026-11-12T15:19:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/link-angel-automatic-internal-linking\/"},"modified":"2026-11-12T15:19:13","modified_gmt":"2026-11-12T15:19:13","slug":"link-angel-automatic-internal-linking","status":"publish","type":"plugin","link":"https:\/\/ru.wordpress.org\/plugins\/link-angel-automatic-internal-linking\/","author":1861220,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.3","stable_tag":"1.0.3","tested":"7.1.4","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"Link Angel \u2014 Automatic Internal Linking","header_author":"Locker Forge","header_description":"Adds internal links to your content automatically. Works the moment it is activated (zero-config title linking), with keyword rules, per-post control and safe HTML handling.","last_updated":"2026-11-12 15:19:13","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/lockerforge.com\/tip-jar\/","header_plugin_uri":"","header_author_uri":"https:\/\/lockerforge.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":70,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.3":{"tag":"1.0.3","author":"ravenx25","date":"2026-11-12 15:19:13","revision":3798643}},"upgrade_notice":{"1.0.3":"<p>Automatic linking keeps working while the title index refreshes, index coverage is always shown, more page caches are purged, and claims in the readme match the code.<\/p>","1.0.2":"<p>Cenobites gets its own default rule, linking to its own page.<\/p>","1.0.1":"<p>Renamed to Link Angel. One shared limit of 3 links per page, full-name default rules.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3798642,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3798642,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3798642,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3798642,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.3"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Keyword rules screen.","2":"Settings screen.","3":"Per-post Link Angel box."}},"plugin_section":[],"plugin_tags":[7625,6681,472,6503,186],"plugin_category":[55,57],"plugin_contributors":[290135],"plugin_business_model":[],"class_list":["post-401672","plugin","type-plugin","status-publish","hentry","plugin_tags-auto-link","plugin_tags-internal-links","plugin_tags-keywords","plugin_tags-linking","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_category-taxonomy","plugin_contributors-ravenx25","plugin_committers-ravenx25"],"banners":{"banner":"https:\/\/ps.w.org\/link-angel-automatic-internal-linking\/assets\/banner-772x250.png?rev=3798642","banner_2x":"https:\/\/ps.w.org\/link-angel-automatic-internal-linking\/assets\/banner-1544x500.png?rev=3798642","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/link-angel-automatic-internal-linking\/assets\/icon-128x128.png?rev=3798642","icon_2x":"https:\/\/ps.w.org\/link-angel-automatic-internal-linking\/assets\/icon-256x256.png?rev=3798642","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Link Angel turns mentions in your posts into internal links, so every new article is connected into your site's link graph without manual work.<\/p>\n\n<p>Link Angel is from <a href=\"https:\/\/lockerforge.com\/downloads\/link-angel\/\">Locker Forge<\/a>, where the product page covers support and updates.<\/p>\n\n<p><strong>Zero-config automatic mode.<\/strong> Activate the plugin and it starts linking exact mentions of your published post and page titles to those posts. Safe guards are built in: titles must have at least two words and six characters, titles made only of common words (like \"About Us\") are ignored, duplicate titles are never used, the front page and password-protected posts are excluded, and at most three links are added per page in total. There is no setup wizard.<\/p>\n\n<p><strong>Keyword rules.<\/strong> Add your own keyword to URL rules with comma-separated variants for synonyms (for example \"Ghostface, Ghost Face\"). Rules take priority over automatic links. Targets can be full URLs or site paths such as <code>\/freddy-krueger\/<\/code>.<\/p>\n\n<p><strong>Default rules.<\/strong> On activation a small default rule set is added, but only for rules whose target page is published on your site, so no dead links are created. Two example sets ship side by side: horror names \u2014 Michael Myers, Jason Voorhees, Freddy Krueger, Chucky (Charles Lee Ray), Ghostface (Ghost Face), Pinhead and Cenobites \u2014 and neutral site pages \u2014 Getting Started, Frequently Asked Questions (FAQ), Contact Us and Privacy Policy. Common human names are only linked as full names, so a bare \"Michael\" or \"Jason\" is never linked. Edit or delete any default rule under Link Angel &gt; Keyword Rules.<\/p>\n\n<p><strong>One shared link limit.<\/strong> Keyword-rule links and automatic title links draw from one budget: 3 links per page in total by default, adjustable under Link Angel &gt; Settings.<\/p>\n\n<p><strong>Safe HTML handling.<\/strong><\/p>\n\n<ul>\n<li>Links only the first occurrence of each keyword, up to one shared maximum per page.<\/li>\n<li>Never links inside headings, existing links, image alt text or other attributes, code, captions or buttons.<\/li>\n<li>Never links the output of shortcodes that WordPress expands after Link Angel runs. HTML that is already rendered before that point, such as dynamic blocks, is treated like normal post text (see the FAQ).<\/li>\n<li>Never links a page to itself and never adds a second link to a page that is already linked.<\/li>\n<li>Case-insensitive, whole-word matching that understands typographic quotes and HTML entities.<\/li>\n<li>Leaves your HTML byte-for-byte untouched apart from the inserted links.<\/li>\n<\/ul>\n\n<p><strong>Per-post control.<\/strong> A meta box on every post lets you disable auto-linking on that post, stop other posts from auto-linking to it, and add post-specific rules.<\/p>\n\n<p><strong>Settings.<\/strong> Max links per page (shared by keyword and automatic links), open in a new tab, rel attributes, rule priority order, post types, CSS class and skip classes.<\/p>\n\n<p><strong>Privacy.<\/strong> Link Angel makes no external HTTP requests, contains no tracking or telemetry and stores nothing about your visitors. There are no front-end ads or upsells.<\/p>\n\n<p><strong>Made by <a href=\"https:\/\/lockerforge.com\/downloads\/link-angel\/\">Locker Forge<\/a><\/strong> \u2014 lean WordPress plugins and theme suites, built and supported by the developer.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>link-angel<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the zip from Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Activate the plugin. Automatic title linking starts as soon as the first background build of the title index finishes, usually within a minute (it needs WP-Cron or a server cron job; the Keyword Rules screen also has a \"Rebuild title index\" button that queues a fresh background build).<\/li>\n<li>Optional: add keyword rules under Link Angel &gt; Keyword Rules and adjust Link Angel &gt; Settings.<\/li>\n<\/ol>\n\n<p>If you use a page cache, clear it after activating so cached pages pick up the new links. When you change rules or settings, Link Angel asks LiteSpeed Cache, WP Rocket, W3 Total Cache and SiteGround Optimizer (whichever is active) to purge their whole page cache. Other page caches are not purged automatically; clear them by hand, or hook the <code>linkangel\/purge_page_cache<\/code> action.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20have%20to%20configure%20anything%3F\"><h3>Do I have to configure anything?<\/h3><\/dt>\n<dd><p>No. Automatic mode is on by default. Keyword rules are an optional extra layer.<\/p><\/dd>\n<dt id=\"will%20it%20link%20inside%20my%20headings%20or%20existing%20links%3F\"><h3>Will it link inside my headings or existing links?<\/h3><\/dt>\n<dd><p>No. Headings (h1 to h6), existing links, code and pre blocks, captions, buttons, form fields, scripts and styles are always skipped, as are all HTML attributes such as image alt text.<\/p><\/dd>\n<dt id=\"how%20are%20shortcodes%20handled%3F\"><h3>How are shortcodes handled?<\/h3><\/dt>\n<dd><p>Link Angel runs on <code>the_content<\/code> at priority 10, before WordPress expands shortcodes at priority 11. Shortcodes still in the content at that point, and everything between their opening and closing tags, are protected while linking and restored unchanged, so the output WordPress generates for them afterwards is not linked.<\/p>\n\n<p>This protection covers shortcode tags only. Anything already rendered to HTML before priority 10 is treated like normal post text and can receive links: dynamic blocks (WordPress renders them at priority 9), and shortcodes or markup that another plugin or theme expands on an earlier filter. Headings, existing links, code, captions, buttons and skip classes are still respected inside that HTML. To keep such output link-free, give its wrapper the <code>no-linkangel<\/code> class, add <code>data-linkangel=\"off\"<\/code>, or wrap it in <code>&lt;!-- linkangel:off --&gt;<\/code> and <code>&lt;!-- linkangel:on --&gt;<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20part%20of%20a%20post%20free%20of%20links%3F\"><h3>Can I keep part of a post free of links?<\/h3><\/dt>\n<dd><p>Yes. Wrap it in <code>&lt;!-- linkangel:off --&gt;<\/code> and <code>&lt;!-- linkangel:on --&gt;<\/code>, or give an element the class <code>no-linkangel<\/code> (configurable), or add <code>data-linkangel=\"off\"<\/code> to it.<\/p><\/dd>\n<dt id=\"how%20do%20i%20stop%20linking%20on%20one%20post%3F\"><h3>How do I stop linking on one post?<\/h3><\/dt>\n<dd><p>Tick \"Disable auto-linking on this post\" in the Link Angel box in the editor sidebar.<\/p><\/dd>\n<dt id=\"does%20it%20slow%20my%20site%20down%3F\"><h3>Does it slow my site down?<\/h3><\/dt>\n<dd><p>Your titles are kept in one cached index, grouped by their first word. For each word on a page, Link Angel checks only the indexed titles that begin with that word, so the matching work grows mainly with the length of the page rather than with the number of posts. It is not completely independent of site size: each linked page view loads the whole index in one database read (bigger on sites with many titles), and words that begin many titles (for example \"The\") have more candidates to check.<\/p>\n\n<p>The index is rebuilt in the background (WP-Cron) when posts are published, updated or deleted, never during a visitor's page view. While a rebuild is pending, the previous index keeps working, so new or renamed titles are linked once the rebuild finishes. If the index is missing or a rebuild is overdue, Link Angel shows a notice in the admin. Page views do not store anything; at most they queue that background job when one is due.<\/p><\/dd>\n<dt id=\"does%20it%20phone%20home%20or%20track%20anything%3F\"><h3>Does it phone home or track anything?<\/h3><\/dt>\n<dd><p>No. There are no external requests and no tracking of any kind.<\/p><\/dd>\n<dt id=\"how%20do%20i%20translate%20it%3F\"><h3>How do I translate it?<\/h3><\/dt>\n<dd><p>The text domain is <code>link-angel-automatic-internal-linking<\/code>. A template is included at <code>languages\/link-angel-automatic-internal-linking.pot<\/code>. To regenerate it run <code>wp i18n make-pot . languages\/link-angel-automatic-internal-linking.pot --slug=link-angel-automatic-internal-linking<\/code> from the plugin folder with WP-CLI.<\/p><\/dd>\n<dt id=\"developer%20hooks\"><h3>Developer hooks<\/h3><\/dt>\n<dd><ul>\n<li><code>linkangel\/should_process<\/code> (bool, WP_Post) decides whether a post is processed.<\/li>\n<li><code>linkangel\/linked_content<\/code> (array, WP_Post) filters the result.<\/li>\n<li><code>linkangel\/default_rules<\/code> (array) changes the default rule set added on activation.<\/li>\n<li><code>linkangel\/auto_target_types<\/code> and <code>linkangel\/stopwords<\/code> tune automatic mode.<\/li>\n<li><code>linkangel\/auto_index_limit<\/code> (int) sets how many posts the title index reads, newest first. The default is 20,000, which keeps memory use bounded on very large sites; return 0 to index every eligible post. When the ceiling applies, the Keyword Rules screen shows the coverage (\"covers X of Y eligible posts\") and Link Angel screens show a partial-coverage notice.<\/li>\n<li><code>linkangel\/auto_index_batch<\/code> (int) sets how many posts each index-build query reads (default 2000).<\/li>\n<li><code>linkangel\/purge_page_cache<\/code> (action, array of purged cache names) fires after rule or settings changes, for other cache integrations.<\/li>\n<li><code>linkangel\/tip_url<\/code> and the <code>LINKANGEL_TIP_URL<\/code> constant set the optional tip link.<\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Text domain corrected to <code>link-angel-automatic-internal-linking<\/code> to match the plugin slug on WordPress.org (was <code>linkangel<\/code>).<\/li>\n<li>Title index lifecycle: the last valid index is no longer deleted when posts change. It keeps serving page views while a rebuild runs in the background (WP-Cron), and is replaced only after the new index has been built and written in full. Rebuilds never run inside a visitor's page view or an admin request (the \"Rebuild title index\" button now schedules the background rebuild and says so; while a build holds the lock it reports \"busy\" instead) and are serialised by an atomic database lock. If no index exists yet, linking pauses only until the first background build lands, and an admin notice now reports whenever automatic linking is degraded (index missing or a refresh pending\/overdue).<\/li>\n<li>Title index coverage: the index is now built in batches. Its ceiling (20,000 posts by default, newest first, to keep memory bounded) is no longer silent: the Keyword Rules screen shows the coverage (\"covers X of Y eligible posts\") and, when the ceiling caps the build, Link Angel screens show a partial-coverage notice. The <code>linkangel\/auto_index_limit<\/code> filter changes the ceiling (0 = none). The opt-out check uses a NOT EXISTS subquery.<\/li>\n<li>Wording: the shortcode protection is described exactly (shortcodes expanded after Link Angel runs are protected; already-rendered HTML such as dynamic blocks can be linked), and the performance FAQ now describes the first-word lookup honestly.<\/li>\n<li>Page caches: rule and settings changes now also purge WP Rocket, W3 Total Cache and SiteGround Optimizer (in addition to LiteSpeed Cache) when active, and the readme says which caches are not purged.<\/li>\n<li>Admin CSS is now loaded on Link Angel screens only.<\/li>\n<li>Rule writes are verified: if a rule cannot be saved, toggled or deleted because the database write failed, the screen now shows an error instead of \"saved\".<\/li>\n<li>Keywords longer than 200 characters are cut by characters, never in the middle of a multibyte character.<\/li>\n<li>Code documentation: the URL normaliser's docblock now states that query strings are kept (behaviour unchanged).<\/li>\n<li>New setting \"Leave REST API responses unlinked\" (on by default, matching earlier versions), so headless sites can opt in to linked REST content.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Default rules: Cenobites now has its own rule pointing to its own page (\/cenobites\/), separate from the Pinhead rule (\/pinhead\/). Like every default rule, it is only added when that page is published on your site.<\/li>\n<li>WordPress.org packaging: Locker Forge branding throughout, and neutral example rules (Getting Started, Frequently Asked Questions, Contact Us, Privacy Policy) added alongside the original horror examples in the default rule set.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>The plugin is now called Link Angel, with the linkangel slug, text domain and prefixes. No functional changes beyond the items below.<\/li>\n<li>One shared link limit: keyword-rule links and automatic title links now share a single per-page budget, 3 by default and adjustable in Settings. The separate automatic-link limit and the 10-link keyword limit are gone.<\/li>\n<li>Default rules: the Pinhead and Michael Myers rules point to their pages instead of search results, and default rules use full names (Michael Myers, Jason Voorhees, Freddy Krueger) so bare first names or surnames are not linked. Default rules are only added when their target page exists.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: zero-config title linking, keyword rules with variants, per-post control and settings.<\/li>\n<\/ul>","raw_excerpt":"Adds internal links to your content automatically \u2014 keyword rules, automatic title linking, and per-post control, with zero configuration.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/401672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=401672"}],"author":[{"embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ravenx25"}],"wp:attachment":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=401672"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=401672"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=401672"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=401672"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=401672"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=401672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}