{"id":364821,"date":"2026-09-07T07:39:47","date_gmt":"2026-09-07T07:39:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/article-relationship-graph-for-yarpp\/"},"modified":"2026-10-13T11:03:52","modified_gmt":"2026-10-13T11:03:52","slug":"article-relationship-graph-for-yarpp","status":"publish","type":"plugin","link":"https:\/\/kaa.wordpress.org\/plugins\/article-relationship-graph-for-yarpp\/","author":9263475,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.17","stable_tag":"1.0.17","tested":"7.1.3","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Article Relationship Graph for YARPP","header_author":"Ignormatyk","header_description":"Adds an interactive graph of related articles below singular posts using YARPP's local table cache.","assets_banners_color":"","last_updated":"2026-10-13 11:03:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":196,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["installation","faq","changelog","description"],"tags":{"1.0.15":{"tag":"1.0.15","author":"xpil","date":"2026-09-07 07:39:35","revision":3684388},"1.0.16":{"tag":"1.0.16","author":"xpil","date":"2026-10-13 09:21:15","revision":3743366},"1.0.17":{"tag":"1.0.17","author":"xpil","date":"2026-10-13 11:03:52","revision":3743669}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.15","1.0.16","1.0.17"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[13224,2509,1089,18208,11164],"plugin_category":[],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-364821","plugin","type-plugin","status-publish","hentry","plugin_tags-content-discovery","plugin_tags-graph","plugin_tags-related-posts","plugin_tags-visualization","plugin_tags-yarpp","plugin_committers-xpil"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/article-relationship-graph-for-yarpp.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=installation-->\n<ol>\n<li>Install and activate Yet Another Related Posts Plugin.<\/li>\n<li>In YARPP's settings, select the table-based cache.<\/li>\n<li>Upload the <code>article-relationship-graph-for-yarpp<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP from the Plugins screen.<\/li>\n<li>Activate Article Relationship Graph for YARPP.<\/li>\n<li>Open a supported singular post. The graph appears below the post content after graph data has been built.<\/li>\n<\/ol>\n\n<p>The first graph build is scheduled when the plugin is activated. On larger sites it may take some time to complete.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20is%20no%20graph%20displayed%3F\"><h3>Why is no graph displayed?<\/h3><\/dt>\n<dd><p>Confirm that YARPP is active and configured to use its table cache. Then run <code>wp yarpp-graph rebuild<\/code> and check the result with <code>wp yarpp-graph status<\/code>.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20call%20an%20external%20service%3F\"><h3>Does this plugin call an external service?<\/h3><\/dt>\n<dd><p>No. The REST request, graph data, JavaScript, CSS, and D3.js library are served by your WordPress installation. No account, API key, or remote connection is required.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20number%20of%20nodes%3F\"><h3>Can I change the number of nodes?<\/h3><\/dt>\n<dd><p>The maximum is 16 nodes: the current article and up to 15 YARPP matches. Developers can lower the limit with the <code>article_relationship_graph_node_limit<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20supported%20post%20types%3F\"><h3>Can I change the supported post types?<\/h3><\/dt>\n<dd><p>Yes. Developers can use the <code>article_relationship_graph_post_types<\/code> filter to provide the supported post types.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.17<\/h4>\n\n<ul>\n<li>Automatically synchronise matching configuration changes with debouncing and hourly drift detection.<\/li>\n<li>Regenerate YARPP relationships in bounded batches before activating a fingerprinted generation.<\/li>\n<li>Preserve publication work, reject obsolete generations, and recover interrupted rebuilds with bounded retries.<\/li>\n<\/ul>\n\n<h4>1.0.16<\/h4>\n\n<ul>\n<li>Fix YARPP table-cache warm-up before graph rebuilds.<\/li>\n<li>Match graph articles and ordering to the current YARPP website results.<\/li>\n<li>Display new relationships immediately, without waiting for a graph rebuild.<\/li>\n<li>Allow up to 15 related articles plus the current article; the node-limit filter still caps total nodes.<\/li>\n<\/ul>\n\n<h4>1.0.15<\/h4>\n\n<ul>\n<li>Clarify narrowly scoped checker exceptions for generated SQL placeholders and local database operations.<\/li>\n<\/ul>\n\n<h4>1.0.14<\/h4>\n\n<ul>\n<li>Resolve the final prepared-query and direct-database checker findings with documented, narrowly scoped exceptions.<\/li>\n<\/ul>\n\n<h4>1.0.13<\/h4>\n\n<ul>\n<li>Resolve remaining prepared-query argument and checker compatibility findings.<\/li>\n<li>Document intentional direct database operations for local graph storage and cleanup.<\/li>\n<li>Update readme compatibility metadata for WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>Harden database queries with prepared table identifiers and value placeholders.<\/li>\n<li>Refine atomic lock updates and public graph lookups for plugin-check compatibility.<\/li>\n<li>Keep uninstall table cleanup explicit and limited to plugin-owned tables.<\/li>\n<li>Add the tested-up-to header and keep the short description within the directory limit.<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li>Rename plugin display name.<\/li>\n<li>Release version 1.0.11.<\/li>\n<\/ul>\n\n<h4>1.0.10<\/h4>\n\n<ul>\n<li>Protect active graph generation on rebuild failures.<\/li>\n<li>Release version 1.0.10.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Bound public graph neighborhoods to fifteen nodes.<\/li>\n<li>Release version 1.0.9.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Resolve graph post types lazily.<\/li>\n<li>Release version 1.0.8.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Avoid no-op rebuild lock refresh failures.<\/li>\n<li>Release version 1.0.7.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Make rebuild lock ownership atomic.<\/li>\n<li>Release version 1.0.6.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Rebuild the graph when supported posts leave publication.<\/li>\n<li>Query edges only for surviving graph nodes.<\/li>\n<li>Release version 1.0.5.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Centralize graph post eligibility policy.<\/li>\n<li>Build client-safe graph API responses.<\/li>\n<li>Extract an ownership-aware rebuild lock.<\/li>\n<li>Report background rebuild outcomes.<\/li>\n<li>Validate graph REST request bounds.<\/li>\n<li>Release version 1.0.4.<\/li>\n<\/ul>\n\n<h4>Development history before 1.0.4<\/h4>\n\n<ul>\n<li>Initial import of the YARPP Article Graph plugin.<\/li>\n<li>Add an atomic plugin deployment workflow.<\/li>\n<li>Fix plugin version parsing in the deployer.<\/li>\n<li>Correct the deploy version header matcher.<\/li>\n<li>Add a portable PHP unit test foundation.<\/li>\n<\/ul>\n\n<!--section=description-->\n<p>Adds a symmetrical graph of YARPP-related articles below singular posts.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Displays a symmetrical, non-directional graph of the website's current YARPP related articles.<\/li>\n<li>Uses YARPP's table cache and respects the site's publicly viewable post types.<\/li>\n<li>Provides keyboard-friendly zoom controls and links to each article.<\/li>\n<li>Rebuilds graph data after supported posts are published and on a daily schedule.<\/li>\n<li>Includes a WP-CLI command for manual rebuilds and status checks.<\/li>\n<\/ul>\n\n<p>The graph is rendered locally in the browser with the included D3.js library. It does not send post content, visitor information, or analytics to an external service.<\/p>\n\n<h3>Requirements<\/h3>\n\n<p><a href=\"https:\/\/wordpress.org\/plugins\/yet-another-related-posts-plugin\/\">Yet Another Related Posts Plugin (YARPP)<\/a> must be active and configured to use its table cache.<\/p>\n\n<p>The plugin is an extension for YARPP and does not replace it. YARPP is a separate project and is not bundled with this plugin.<\/p>\n\n<h3>Rebuilding<\/h3>\n\n<p>The graph rebuilds daily, after publication changes, and automatically when relationship-relevant YARPP configuration changes. Matching weights, thresholds, taxonomy requirements\/exclusions, eligible post types, ordering, and persistent cache capacity are tracked; templates, CSS and thumbnails are not. Saves coalesce for 90 seconds, with an hourly consistency check as a fallback.<\/p>\n\n<p>Rebuilds refresh every eligible graph article using YARPP in batches of 25. The previous stored graph remains available until a complete replacement is activated with its configuration fingerprint. Interrupted jobs preserve pending work and retry automatically. Large sites should run WP-Cron through a system scheduler. Safe refresh requires InnoDB options, relationship-cache and graph-edge tables; unsupported engines fail safely without replacing the graph. The integration is audited against YARPP 5.30.11. Custom matching-filter changes cannot be detected from stored settings, and an individual article matching query can still be expensive. See docs\/configuration-sync.md in the source repository for implementation details.<\/p>\n\n<p>Rebuild manually with:<\/p>\n\n<p>wp yarpp-graph rebuild<\/p>\n\n<p>Inspect the most recent rebuild outcome with:<\/p>\n\n<p>wp yarpp-graph status<\/p>\n\n<p>The graph includes up to 15 related articles plus the current article (16 nodes). Membership and ordering follow YARPP's website settings; reverse-only and second-degree matches are not added. Developers can lower the total server-side node limit with the article_relationship_graph_node_limit filter and can change supported post types with article_relationship_graph_post_types.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin does not collect, store, or transmit personal data. It does not use cookies, tracking pixels, third-party requests, or analytics. Graph data is generated from public WordPress posts and the local YARPP table cache.<\/p>\n\n<h3>Technical notes<\/h3>\n\n<p>Graph connection weights and metrics are stored in two local custom database tables and are removed when the plugin is uninstalled. Deactivating the plugin preserves the tables so a later reactivation does not require data loss. The included D3.js library is distributed under its BSD 3-Clause license; see <code>assets\/vendor\/D3-LICENSE.txt<\/code>.<\/p>","raw_excerpt":"Adds a symmetrical graph of YARPP-related articles below singular posts.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/364821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=364821"}],"author":[{"embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/xpil"}],"wp:attachment":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=364821"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=364821"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=364821"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=364821"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=364821"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=364821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}