{"id":346903,"date":"2026-07-28T12:20:48","date_gmt":"2026-07-28T12:20:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/globaldev-internal-links\/"},"modified":"2026-07-28T12:22:45","modified_gmt":"2026-07-28T12:22:45","slug":"globaldev-internal-links","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/globaldev-internal-links\/","author":18387632,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.0.2","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"GlobalDev Internal Links","header_author":"GlobalDev","header_description":"Creates contextual internal links from published content titles and can show related content when no safe inline match exists.","assets_banners_color":"758ce3","last_updated":"2026-07-28 12:22:45","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/globaldev.app\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":26,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"globaldevitus","date":"2026-07-28 12:20:29"},"1.1.1":{"tag":"1.1.1","author":"globaldevitus","date":"2026-07-28 12:22:45"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3625884,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3625884,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3625884,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3625884,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[63763,6681,1089,186,237434],"plugin_category":[55],"plugin_contributors":[272568],"plugin_business_model":[],"class_list":["post-346903","plugin","type-plugin","status-publish","hentry","plugin_tags-automatic-linking","plugin_tags-internal-links","plugin_tags-related-posts","plugin_tags-seo","plugin_tags-site-structure","plugin_category-seo-and-marketing","plugin_contributors-globaldevitus","plugin_committers-globaldevitus"],"banners":{"banner":"https:\/\/ps.w.org\/globaldev-internal-links\/assets\/banner-772x250.png?rev=3625884","banner_2x":"https:\/\/ps.w.org\/globaldev-internal-links\/assets\/banner-1544x500.png?rev=3625884","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/globaldev-internal-links\/assets\/icon-128x128.png?rev=3625884","icon_2x":"https:\/\/ps.w.org\/globaldev-internal-links\/assets\/icon-256x256.png?rev=3625884","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>GlobalDev Internal Links adds internal links while WordPress renders eligible singular content. It does not rewrite the content stored in the database and does not require an external service.<\/p>\n\n<p>The plugin first looks for complete published titles. It can also generate conservative multi-word phrases from those titles, which makes automatic linking more useful when normal articles mention a subject without repeating another article's complete headline.<\/p>\n\n<p>When no safe inline phrase exists, the optional related-content fallback can append a compact list selected from shared categories, tags, and meaningful title terms. This is useful for older or placeholder content where no suitable anchor phrase appears inside the paragraphs.<\/p>\n\n<p><strong>Controlled automatic linking:<\/strong><\/p>\n\n<ul>\n<li>Keeps full-title matching as the strongest signal.<\/li>\n<li>Generates only multi-word title phrases; it does not create arbitrary single-word anchors.<\/li>\n<li>Uses taxonomy and title-term relevance to resolve ambiguous phrases.<\/li>\n<li>Skips a phrase when multiple destinations remain equally ambiguous.<\/li>\n<li>Keeps one stable canonical destination when duplicate published titles exist.<\/li>\n<li>Never links an item to itself.<\/li>\n<li>Uses each inline destination no more than once on the same page.<\/li>\n<li>Skips headings, existing links, scripts, styles, code, preformatted content, form controls, and buttons.<\/li>\n<li>Leaves the stored WordPress editor content unchanged.<\/li>\n<\/ul>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Set a maximum number of inline links per item.<\/li>\n<li>Set a minimum target-title word count.<\/li>\n<li>Enable or disable smart multi-word title phrases.<\/li>\n<li>Enable or disable visible inline-link highlighting.<\/li>\n<li>Enable a related-content fallback when no inline phrase can be linked.<\/li>\n<li>Choose how many fallback related links to show.<\/li>\n<li>Choose which public post types are scanned and used as destinations.<\/li>\n<li>Exclude specific post or page IDs.<\/li>\n<li>Cache targets and matching phrases for performance.<\/li>\n<li>Clear the cache automatically when relevant content or settings change.<\/li>\n<li>Manually clear the cache after imports, migrations, or direct database changes.<\/li>\n<li>Use a responsive explanatory dashboard under Settings &gt; Internal Links.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/globaldev-internal-links<\/code>, or install the ZIP through Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Activate GlobalDev Internal Links.<\/li>\n<li>Go to Settings &gt; Internal Links.<\/li>\n<li>Choose the eligible post types and configure the linking rules.<\/li>\n<li>Review important frontend pages after enabling automatic linking.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20modify%20post%20content%20in%20the%20database%3F\"><h3>Does this modify post content in the database?<\/h3><\/dt>\n<dd><p>No. Links are added dynamically through the <code>the_content<\/code> filter. The content stored in the WordPress editor remains unchanged.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20open%20or%20resave%20every%20post%3F\"><h3>Do I need to open or resave every post?<\/h3><\/dt>\n<dd><p>No. The plugin builds its index from published content automatically. Opening or resaving every post is not required.<\/p><\/dd>\n<dt id=\"why%20did%20exact-title%20links%20disappear%20after%20importing%20duplicate%20posts%3F\"><h3>Why did exact-title links disappear after importing duplicate posts?<\/h3><\/dt>\n<dd><p>Version 1.1.0 keeps one stable canonical destination for each duplicate published title. Older versions removed all destinations sharing the duplicate title, which could eliminate otherwise valid links.<\/p><\/dd>\n<dt id=\"what%20are%20smart%20title%20phrases%3F\"><h3>What are smart title phrases?<\/h3><\/dt>\n<dd><p>They are conservative multi-word phrases generated from a published title. For example, a longer title can provide a shorter natural phrase already present in another article. Single common words are not generated as anchors.<\/p><\/dd>\n<dt id=\"how%20does%20the%20plugin%20choose%20between%20destinations%20sharing%20a%20phrase%3F\"><h3>How does the plugin choose between destinations sharing a phrase?<\/h3><\/dt>\n<dd><p>It compares shared categories, tags, post type, and meaningful title terms. The phrase is skipped when the best destination is not clearly better than the alternatives.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20no%20inline%20phrase%20exists%3F\"><h3>What happens when no inline phrase exists?<\/h3><\/dt>\n<dd><p>When the related-content fallback is enabled, the plugin can append a list of related published items based on shared categories, tags, and title terms. It does not insert invented words into the article body.<\/p><\/dd>\n<dt id=\"will%20unrelated%20placeholder%20text%20receive%20inline%20links%3F\"><h3>Will unrelated placeholder text receive inline links?<\/h3><\/dt>\n<dd><p>Not unless it contains a safe title phrase. Placeholder text with no meaningful phrase may receive the related-content fallback when real taxonomy or title relationships exist.<\/p><\/dd>\n<dt id=\"which%20content%20is%20scanned%3F\"><h3>Which content is scanned?<\/h3><\/dt>\n<dd><p>Only the queried singular frontend item from the public post types selected under Settings &gt; Internal Links. Archive loops, excerpts, administration screens, related-item widgets, and excluded items are not scanned.<\/p><\/dd>\n<dt id=\"can%20the%20same%20inline%20destination%20be%20linked%20repeatedly%3F\"><h3>Can the same inline destination be linked repeatedly?<\/h3><\/dt>\n<dd><p>No. Each inline destination can be used only once on the same rendered page.<\/p><\/dd>\n<dt id=\"does%20it%20require%20a%20remote%20service%20or%20account%3F\"><h3>Does it require a remote service or account?<\/h3><\/dt>\n<dd><p>No. Indexing, matching, and related-content scoring take place locally on the WordPress site.<\/p><\/dd>\n<dt id=\"what%20does%20clearing%20the%20cached%20index%20do%3F\"><h3>What does clearing the cached index do?<\/h3><\/dt>\n<dd><p>It removes the cached destinations and matching phrases. WordPress rebuilds them automatically on the next eligible frontend page view. Manual clearing is optional but useful after a bulk import, migration, duplicate cleanup, or direct database change.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Replaced direct query-string notice inspection with scoped WordPress Settings API notices and a user-specific transient for cache-clear confirmation.<\/li>\n<li>Removed the exclusionary <code>post__not_in<\/code> index query and now applies configured exclusions while processing returned IDs.<\/li>\n<li>Resolved the nonce-verification and exclusionary-query warnings reported by Plugin Check without changing frontend linking behavior.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Fixed duplicate-title handling by keeping one canonical destination instead of removing every duplicate from the index.<\/li>\n<li>Added conservative multi-word title-phrase matching for normal article wording.<\/li>\n<li>Added relevance scoring based on categories, tags, post type, and meaningful title terms.<\/li>\n<li>Added ambiguity protection so tied generated phrases are skipped rather than linked arbitrarily.<\/li>\n<li>Added an optional related-content fallback when no inline phrase can be linked.<\/li>\n<li>Added a configurable related-link count.<\/li>\n<li>Updated cache structure and validation for target, phrase, and taxonomy data.<\/li>\n<li>Updated the settings dashboard and documentation to explain exact, phrase, and fallback behavior.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fixed compatibility with themes and page builders that call <code>the_content<\/code> while traditional main-loop flags are false.<\/li>\n<li>Moved automatic linking to a late content-filter priority.<\/li>\n<li>Improved title matching across repeated spaces, line breaks, and non-breaking spaces.<\/li>\n<li>Added optional frontend highlighting for generated links.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Corrected dashboard branding and plugin-specific wording.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Kept WordPress and third-party admin notices outside the custom dashboard.<\/li>\n<li>Retained and clarified the manual cache control.<\/li>\n<li>Added cache and linking status summaries.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added Unicode-aware matching, stricter option validation, post-type enforcement, cache API fixes, and repository-oriented hardening.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Creates contextual internal links from published titles and can show related content when no safe inline phrase exists.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/346903","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=346903"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/globaldevitus"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=346903"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=346903"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=346903"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=346903"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=346903"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=346903"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}