{"id":323649,"date":"2026-06-14T04:15:47","date_gmt":"2026-06-14T04:15:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/relatedly\/"},"modified":"2026-06-14T04:15:30","modified_gmt":"2026-06-14T04:15:30","slug":"relatedly","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/relatedly\/","author":13827860,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.7","stable_tag":"2.0.7","tested":"7.0","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Relatedly","header_author":"Krafty Sprouts Media, LLC","header_description":"Advanced related posts engine with inline display, end-of-content lists, RSS integration, floating sidebar, and multiple themes with intelligent matching.","assets_banners_color":"","last_updated":"2026-06-14 04:15:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/kraftysprouts.com\/portfolio\/relatedly\/","header_author_uri":"https:\/\/kraftysprouts.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":35,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.7":{"tag":"2.0.7","author":"iamkingsleyf","date":"2026-06-14 04:15:30"}},"upgrade_notice":{"2.0.0":"<p>Major rebuild. Settings and tracking data are preserved. Deactivate v1.x and activate v2.0.0 \u2014 no manual migration needed.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.0.7"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings page \u2014 General tab","2":"Inline related post \u2014 Simple theme","3":"End-of-content related posts \u2014 List theme","4":"Floating sidebar widget","5":"Statistics dashboard","6":"Theme customization options"}},"plugin_section":[262246],"plugin_tags":[3576,267024,3671,3668,1089],"plugin_category":[],"plugin_contributors":[267025],"plugin_business_model":[],"class_list":["post-323649","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-content-recommendation","plugin_tags-post-suggestions","plugin_tags-related-articles","plugin_tags-related-content","plugin_tags-related-posts","plugin_contributors-iamkingsleyf","plugin_committers-iamkingsleyf"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/relatedly.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Relatedly automatically displays related posts to keep readers engaged and reduce bounce rate. It matches posts by categories, tags, or both, and offers multiple display styles to fit any theme.<\/p>\n\n<p><strong>Key Features:<\/strong><\/p>\n\n<ul>\n<li><strong>Inline related posts<\/strong> \u2014 insert related posts between paragraphs at a configurable interval<\/li>\n<li><strong>End-of-content related posts<\/strong> \u2014 append a related posts section after post content<\/li>\n<li><strong>8 inline themes<\/strong> \u2014 Simple, Minimal, Featured, Quote, Badge, Callout, Gradient, Card<\/li>\n<li><strong>6 end-of-content themes<\/strong> \u2014 List, Simple List, Masonry, Carousel, Timeline, Compact<\/li>\n<li><strong>RSS feed integration<\/strong> \u2014 add related posts to your RSS feed with UTM tracking<\/li>\n<li><strong>Click &amp; impression tracking<\/strong> \u2014 built-in analytics dashboard<\/li>\n<li><strong>Email reports<\/strong> \u2014 scheduled weekly or monthly performance reports<\/li>\n<li><strong>Floating sidebar<\/strong> \u2014 optional floating related posts widget<\/li>\n<li><strong>CSS custom properties<\/strong> \u2014 all colours are user-configurable without touching code<\/li>\n<li><strong>Performance-first<\/strong> \u2014 pool-based queries ordered by date (no <code>ORDER BY RAND()<\/code>), transient caching, conditional asset loading<\/li>\n<li><strong>Developer-friendly<\/strong> \u2014 PSR-4 autoloading, template override system, action\/filter hooks<\/li>\n<\/ul>\n\n<p><strong>Developer Filters:<\/strong><\/p>\n\n<ul>\n<li><code>relatedly_inline_labels<\/code> \u2014 modify the inline label pool<\/li>\n<li><code>relatedly_end_content_labels<\/code> \u2014 modify the end-content label pool<\/li>\n<li><code>relatedly_excluded_elements<\/code> \u2014 add custom HTML elements to exclude from inline insertion<\/li>\n<li><code>relatedly_rss_utm_parameters<\/code> \u2014 modify UTM parameters for RSS links<\/li>\n<li><code>relatedly_rss_output_format<\/code> \u2014 customise RSS inline post HTML<\/li>\n<li><code>relatedly_rss_end_content_format<\/code> \u2014 customise RSS end-content post HTML<\/li>\n<li><code>relatedly_register_themes<\/code> \u2014 register custom themes via ThemeRegistry<\/li>\n<\/ul>\n\n<p><strong>Template Overrides:<\/strong><\/p>\n\n<p>Place template files in <code>your-theme\/relatedly\/inline\/simple.php<\/code> (etc.) to override any theme template without modifying plugin files.<\/p>\n\n<h3>Support<\/h3>\n\n<ul>\n<li><a href=\"https:\/\/kraftysprouts.com\/docs\/relatedly\/\">Documentation<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.org\/support\/plugin\/relatedly\/\">Support Forum<\/a><\/li>\n<li><a href=\"https:\/\/kraftysprouts.com\/contact\/\">Contact<\/a><\/li>\n<\/ul>\n\n<h3>Credits<\/h3>\n\n<p>Built by <a href=\"https:\/\/kraftysprouts.com\">Krafty Sprouts Media, LLC<\/a>.<\/p>\n\n<p>Third-party libraries included in this plugin:\n* <a href=\"https:\/\/github.com\/Choices-js\/Choices\">Choices.js<\/a> \u2014 MIT License\n* <a href=\"https:\/\/github.com\/atomiks\/tippyjs\">Tippy.js<\/a> \u2014 MIT License\n* <a href=\"https:\/\/github.com\/floating-ui\/floating-ui\">Popper.js<\/a> \u2014 MIT License\n* <a href=\"https:\/\/github.com\/sweetalert2\/sweetalert2\">SweetAlert2<\/a> \u2014 MIT License\n* <a href=\"https:\/\/github.com\/flatpickr\/flatpickr\">Flatpickr<\/a> \u2014 MIT License\n* <a href=\"https:\/\/github.com\/chartjs\/Chart.js\">Chart.js<\/a> \u2014 MIT License\n* <a href=\"https:\/\/github.com\/DataTables\/DataTables\">DataTables<\/a> \u2014 MIT License<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin collects the following data when click tracking is enabled:<\/p>\n\n<ul>\n<li>Source post ID (the post the visitor was reading)<\/li>\n<li>Clicked post ID (the related post that was clicked)<\/li>\n<li>Display type (inline, end_content, or floating)<\/li>\n<li>Event type (click or impression)<\/li>\n<li>IP address<\/li>\n<li>User agent string<\/li>\n<li>Timestamp<\/li>\n<\/ul>\n\n<p>This data is stored in the <code>wp_relatedly_clicks<\/code> table in your WordPress database. It is used solely for the statistics dashboard and email reports. It is never transmitted to external servers.<\/p>\n\n<p><strong>To disable data collection:<\/strong> Go to Relatedly \u2192 Settings \u2192 General and uncheck \"Enable Click Tracking\".<\/p>\n\n<p><strong>Data retention:<\/strong> Rows older than 90 days are automatically deleted by a monthly scheduled task. The retention period is configurable in Settings.<\/p>\n\n<p><strong>GDPR:<\/strong> This plugin integrates with WordPress's built-in personal data tools (Tools \u2192 Export Personal Data \/ Erase Personal Data).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>relatedly<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress<\/li>\n<li>Go to <strong>Relatedly \u2192 Settings<\/strong> to configure display options<\/li>\n<li>Related posts will appear automatically on single post pages<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20slow%20down%20my%20site%3F\"><h3>Does this plugin slow down my site?<\/h3><\/dt>\n<dd><p>No. Relatedly uses a pool-based query strategy \u2014 it fetches 30 posts ordered by date (using the database index), caches the pool per post with a configurable TTL, and shuffles in PHP. This avoids the expensive <code>ORDER BY RAND()<\/code> pattern used by many related post plugins.<\/p><\/dd>\n<dt id=\"can%20i%20customise%20the%20look%20of%20related%20posts%3F\"><h3>Can I customise the look of related posts?<\/h3><\/dt>\n<dd><p>Yes. Each theme's colours are configurable via CSS custom properties in the settings. Use <strong>Appearance \u2192 Customize \u2192 Additional CSS<\/strong> in WordPress for site-wide styling beyond the built-in colour options.<\/p><\/dd>\n<dt id=\"can%20i%20override%20templates%20in%20my%20theme%3F\"><h3>Can I override templates in my theme?<\/h3><\/dt>\n<dd><p>Yes. Create a <code>relatedly\/<\/code> folder in your theme directory and place template files there. For example, <code>your-theme\/relatedly\/inline\/simple.php<\/code> will override the Simple inline theme template.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20custom%20post%20types%3F\"><h3>Does it work with custom post types?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Settings \u2192 General<\/strong> and select which post types to enable.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20rss%20feeds%3F\"><h3>Does it work with RSS feeds?<\/h3><\/dt>\n<dd><p>Yes. Enable RSS integration in <strong>Settings \u2192 RSS Feed<\/strong>. Related posts are added inline and at the end of each feed item, with configurable UTM parameters for tracking.<\/p><\/dd>\n<dt id=\"is%20click%20tracking%20gdpr%20compliant%3F\"><h3>Is click tracking GDPR compliant?<\/h3><\/dt>\n<dd><p>The plugin stores IP addresses and user agents in a custom database table. This is disclosed in the Privacy section below. You can disable tracking entirely in <strong>Settings \u2192 General<\/strong>. The plugin integrates with WordPress's built-in personal data export and erasure tools.<\/p><\/dd>\n<dt id=\"how%20do%20i%20disable%20related%20posts%20on%20specific%20posts%3F\"><h3>How do I disable related posts on specific posts?<\/h3><\/dt>\n<dd><p>Use the <code>relatedly_excluded_elements<\/code> filter or disable the plugin for specific post types in Settings \u2192 General.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.7<\/h4>\n\n<ul>\n<li>Fix UTF-8 BOM in Floating Variant class files (rewritten through editor with proper file header docblocks)<\/li>\n<li>Fix MissingTranslatorsComment \u2014 phpcs:ignore moved above the translators comment so it sits directly before printf()<\/li>\n<li>Fix InterpolatedNotPrepared warnings \u2014 SQL extracted to $sql variable so phpcs:ignore lands on the flagged line<\/li>\n<li>Fix NoCaching false positives \u2014 phpcs:ignore extended to cover the query call lines in DataProvider<\/li>\n<li>Fix OutputNotEscaped in floating sidebar variant label<\/li>\n<li>Fix PreparedSQL.NotPrepared in DataProvider query calls<\/li>\n<\/ul>\n\n<h4>2.0.6<\/h4>\n\n<ul>\n<li>Fix UTF-8 BOM in Floating Variant class files \u2014 rewritten through editor, also adds proper file header docblocks<\/li>\n<li>Fix MissingTranslatorsComment \u2014 move phpcs:ignore above the translators comment so it sits directly before printf()<\/li>\n<li>Fix InterpolatedNotPrepared warnings \u2014 extract SQL strings to $sql variable so phpcs:ignore lands on the correct line<\/li>\n<li>Fix NoCaching false positives \u2014 extend phpcs:ignore to cover the query call lines in DataProvider<\/li>\n<\/ul>\n\n<h4>2.0.5<\/h4>\n\n<ul>\n<li>Fix stable tag mismatch between readme.txt and plugin header<\/li>\n<li>Fix str_ends_with() replaced with substr() for PHP 7.4 \/ WordPress 5.0 compatibility<\/li>\n<li>Fix table name escaping in all direct DB queries (esc_sql())<\/li>\n<li>Add targeted phpcs:ignore for false-positive nonce\/escaping\/prefix sniffs in templates and stream-wrapper file ops<\/li>\n<li>Normalize mixed line endings in Floating Variant class files<\/li>\n<\/ul>\n\n<h4>2.0.4<\/h4>\n\n<ul>\n<li>Fix escaping compliance: replace pre-built HTML attribute strings with individual scalar values escaped at output time across all 19 templates<\/li>\n<\/ul>\n\n<h4>2.0.3<\/h4>\n\n<ul>\n<li>Remove languages\/.gitkeep and dev markdown files from distribution package<\/li>\n<li>Include composer.json when vendor\/ is bundled<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Restore Plugin URI to https:\/\/kraftysprouts.com\/portfolio\/relatedly\/<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>WordPress.org review compliance: wire email report scheduling, remove custom CSS field, update premium upsell copy<\/li>\n<li>Remove bundled jQuery \u2014 use WordPress core jQuery for DataTables<\/li>\n<li>Upgrade SweetAlert2 to a privacy-safe release<\/li>\n<li>Remove load_plugin_textdomain() \u2014 translations load automatically on WordPress.org<\/li>\n<li>Update Plugin URI and contributors list<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Complete rebuild \u2014 PSR-4 architecture, no CDN dependencies, pool-based queries<\/li>\n<li>All third-party libraries bundled locally (Choices.js, Tippy.js, SweetAlert2, Flatpickr, Chart.js, DataTables)<\/li>\n<li>Declarative options schema replaces 360-line procedural sanitizer<\/li>\n<li>CSS custom properties replace inline styles on every element<\/li>\n<li>PHP template files replace HTML string concatenation<\/li>\n<li>PHPUnit test suite added<\/li>\n<li>GDPR data export\/erasure hooks added<\/li>\n<li>Batched impression tracking (one AJAX request per container)<\/li>\n<li>Monthly tracking data pruning cron added<\/li>\n<\/ul>\n\n<h4>1.9.15<\/h4>\n\n<ul>\n<li>Namespace refactor completed (ksm_relatedly \u2192 relatedly)<\/li>\n<li>Table schema version tracking added<\/li>\n<\/ul>\n\n<h4>1.9.13<\/h4>\n\n<ul>\n<li>Option and hook prefix changed from ksm_relatedly_ to relatedly_<\/li>\n<\/ul>\n\n<h4>1.8.8<\/h4>\n\n<ul>\n<li>Critical fix: boolean options no longer reset to defaults on page load<\/li>\n<\/ul>\n\n<h4>1.8.5<\/h4>\n\n<ul>\n<li>Label management system \u2014 disable individual default labels from admin UI<\/li>\n<\/ul>\n\n<h4>1.8.4<\/h4>\n\n<ul>\n<li>RSS end-content related posts added<\/li>\n<li>UTM parameter customization added<\/li>\n<\/ul>\n\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Floating sidebar added (5 variants)<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Statistics dashboard, click tracking, email reports added<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Advanced related posts engine with inline display, end-of-content lists, RSS integration, and multiple themes.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/323649","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=323649"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/iamkingsleyf"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=323649"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=323649"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=323649"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=323649"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=323649"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=323649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}