{"id":389772,"date":"2026-11-01T15:14:31","date_gmt":"2026-11-01T15:14:31","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ruhler-review-pins\/"},"modified":"2026-11-01T15:41:15","modified_gmt":"2026-11-01T15:41:15","slug":"ruhler-review-pins","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/ruhler-review-pins\/","author":23565850,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.4","requires_php":"8.0","requires_plugins":null,"header_name":"Ruhler Review Pins","header_author":"Ruhler","header_description":"Visual website feedback -- signed-in reviewers pin comments directly on a page and track them from a Review Pins dashboard. Review is off until an administrator turns it on in Review Pins > Settings.","assets_banners_color":"868c9d","last_updated":"2026-11-01 15:41:15","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","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":"ruhler","date":"2026-11-01 15:41:15","revision":3778209}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3778209,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3778209,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3778209,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3778209,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3778209,"resolution":"1","location":"assets","locale":"","width":1440,"height":960},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3778209,"resolution":"2","location":"assets","locale":"","width":1440,"height":960},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3778209,"resolution":"3","location":"assets","locale":"","width":1440,"height":1000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3778209,"resolution":"4","location":"assets","locale":"","width":1440,"height":1000}},"screenshots":{"1":"Leave feedback on a specific page element with a numbered review pin.","2":"Read page feedback and resolve or reopen a comment.","3":"Manage feedback from the WordPress dashboard.","4":"Add reviewers and manage optional private review links."}},"plugin_section":[],"plugin_tags":[15354,107,108,23351,110],"plugin_category":[42,44,53],"plugin_contributors":[281336],"plugin_business_model":[],"class_list":["post-389772","plugin","type-plugin","status-publish","hentry","plugin_tags-annotations","plugin_tags-comments","plugin_tags-feedback","plugin_tags-proofing","plugin_tags-review","plugin_category-contact-forms","plugin_category-discussion-and-community","plugin_category-ratings-and-reviews","plugin_contributors-ruhler","plugin_committers-ruhler"],"banners":{"banner":"https:\/\/ps.w.org\/ruhler-review-pins\/assets\/banner-772x250.png?rev=3778209","banner_2x":"https:\/\/ps.w.org\/ruhler-review-pins\/assets\/banner-1544x500.png?rev=3778209","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ruhler-review-pins\/assets\/icon-128x128.png?rev=3778209","icon_2x":"https:\/\/ps.w.org\/ruhler-review-pins\/assets\/icon-256x256.png?rev=3778209","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ruhler-review-pins\/assets\/screenshot-1.png?rev=3778209","caption":"Leave feedback on a specific page element with a numbered review pin."},{"src":"https:\/\/ps.w.org\/ruhler-review-pins\/assets\/screenshot-2.png?rev=3778209","caption":"Read page feedback and resolve or reopen a comment."},{"src":"https:\/\/ps.w.org\/ruhler-review-pins\/assets\/screenshot-3.png?rev=3778209","caption":"Manage feedback from the WordPress dashboard."},{"src":"https:\/\/ps.w.org\/ruhler-review-pins\/assets\/screenshot-4.png?rev=3778209","caption":"Add reviewers and manage optional private review links."}],"raw_content":"<!--section=description-->\n<p>Turn \u201cthat section needs changing\u201d into feedback your team can act on.<\/p>\n\n<p>Ruhler Review Pins lets reviewers leave comments directly on the page elements they mean. A numbered pin marks each location, so your team can see what needs attention without matching emails and screenshots to the right part of the website.<\/p>\n\n<p>Use it to review a new website, proof content before launch, or collect feedback on existing pages. Leave a comment about a specific element or the whole page, resolve it when the work is done, and reopen it when it needs another look.<\/p>\n\n<h4>A clear path from feedback to follow-through<\/h4>\n\n<ul>\n<li>Pin comments directly to page elements, using a mouse or keyboard.<\/li>\n<li>Collect general feedback about an entire page.<\/li>\n<li>Track open and resolved comments in the WordPress dashboard.<\/li>\n<li>Give reviewers dedicated accounts with limited permissions.<\/li>\n<li>Optionally issue expiring, revocable sign-in links to eligible reviewer accounts.<\/li>\n<li>Keep feedback on your WordPress site, with no external service or telemetry.<\/li>\n<\/ul>\n\n<h4>Off until you turn it on<\/h4>\n\n<ul>\n<li><strong>Review is off on a fresh install.<\/strong> An administrator turns it on in <strong>Review Pins \u2192 Settings<\/strong>, and chooses whether review is available in all environments or only in non-production environments (local, development, staging \u2014 as reported by <code>wp_get_environment_type()<\/code>; WordPress treats an unset environment type as production).<\/li>\n<li>While review is off, no review controls, scripts, or styles are added to your pages and the review API refuses requests. Existing feedback stays available to managers in the dashboard.<\/li>\n<li><strong>Review links are off by default<\/strong> and are a separate setting (see below).<\/li>\n<\/ul>\n\n<h4>Who can do what<\/h4>\n\n<ul>\n<li><strong>Review Pins Reviewer<\/strong> \u2014 use Review Mode: place pins, read comments on the pages they review, and resolve or reopen comments. Reviewers are kept out of wp-admin except their own profile page.<\/li>\n<li><strong>Review Pins Manager<\/strong> \u2014 everything a reviewer can do, plus the feedback dashboard: resolve, reopen, trash, restore, and permanently delete feedback.<\/li>\n<li><strong>Administrators<\/strong> can use Review Mode and manage feedback.<\/li>\n<li><strong>Editors<\/strong> can use Review Mode (place pins, read, resolve, and reopen feedback) but cannot open the feedback dashboard or trash, restore, or delete feedback. Assign the Review Pins Manager role to people who should manage feedback.<\/li>\n<li><strong>Only administrators<\/strong> can change settings and issue or revoke review links.<\/li>\n<li>Reviewers only see feedback for pages they are allowed to view. Feedback on private or draft pages is hidden from people who cannot read those pages, and their titles and addresses are not shown to them.<\/li>\n<\/ul>\n\n<h4>Review links (optional)<\/h4>\n\n<p>Reviewers can always sign in with a normal WordPress password. If an administrator enables <strong>review links<\/strong>, they can also issue a private sign-in link to a reviewer from <strong>Review Pins \u2192 Reviewer Access<\/strong>:<\/p>\n\n<ul>\n<li>Links can only be issued to <strong>dedicated accounts whose single role is Review Pins Reviewer<\/strong> and which have no other capabilities. Accounts with any additional role or privilege (including managers, editors, and administrators) are refused, both when a link is issued and every time it is used.<\/li>\n<li>A link expires 7 days after it is issued, or at the end of a review-window date you set. Issuing a new link replaces the old one; links can be revoked at any time.<\/li>\n<li>Sessions started from a link end on their next request once the link is revoked, replaced, or expired, the account gains another role or capability, or review or review links are turned off.<\/li>\n<li>The link is shown to the administrator once and is never stored in readable form. Issuing and revoking links is recorded in an activity log (without the link itself).<\/li>\n<li><strong>Two-factor authentication.<\/strong> Review links are refused for accounts that use the <a href=\"https:\/\/wordpress.org\/plugins\/two-factor\/\">Two Factor<\/a> plugin (tested with version 0.17.0); those reviewers sign in with their password and second factor as usual. Enabling two-factor on an account also ends its existing review-link sessions. Other two-factor plugins are not detected and their compatibility is not verified: review-link sign-in does not use a password and does not run WordPress's <code>authenticate<\/code> filters (so it bypasses plugins that act only there, such as login-attempt limiters), although it does fire the standard <code>wp_login<\/code> action. If your site uses another two-factor plugin, keep review links off or use the <code>ruhler_rp_allow_review_link_login<\/code> filter to refuse them.<\/li>\n<\/ul>\n\n<h4>Feedback dashboard<\/h4>\n\n<p><strong>Review Pins \u2192 Feedback<\/strong> lists comments with Open, Resolved, All, and Trash views, 20 per page. From here managers can go to a comment on its page, resolve or reopen it, move it to the Trash, restore it, or delete it permanently from the Trash.<\/p>\n\n<ul>\n<li><strong>Trash expiry:<\/strong> like other WordPress content, trashed feedback is permanently deleted by WordPress after <code>EMPTY_TRASH_DAYS<\/code> (30 days by default). If your site sets <code>EMPTY_TRASH_DAYS<\/code> to 0, trashing deletes immediately.<\/li>\n<li><strong>Unassigned feedback (administrators only):<\/strong> feedback saved by earlier development builds whose page cannot be identified reliably is kept as <em>Unassigned<\/em> instead of appearing on the homepage. Only administrators can see it, in the dashboard's Unassigned view, to review or delete it.<\/li>\n<\/ul>\n\n<h4>WP-CLI<\/h4>\n\n<pre><code>wp ruhler-review-pins status | list | show | resolve | reopen | trash | restore | delete | add-reviewer | remove-reviewer. WP-CLI commands are administrative tools and keep working while review is off. Status changes and deletions must be attributed to a real user (`--user` or `--actor`). Account creation and role changes also require an explicit actor with WordPress's applicable `create_users` and\/or `promote_users` capabilities and permission to assign the target role. `remove-reviewer` removes Review Pins access and roles but never deletes the WordPress account or its content. `add-reviewer` never replaces an existing account's roles and refuses accounts with other roles or privileges.\n<\/code><\/pre>\n\n<h4>Requirements and limits<\/h4>\n\n<ul>\n<li>WordPress 6.4 or later and PHP 8.0 or later. The minimum combination was exercised in a disposable runtime; WordPress 7.1 and PHP 8.4 were also tested during release-candidate validation.<\/li>\n<li>Feedback is tied to each page's address. Both plain (<code>?page_id=123<\/code>) and pretty permalinks are supported. Tracking parameters (such as <code>utm_*<\/code>), preview arguments, and this plugin's own parameters are ignored when matching a page. Changing a page's address or your permalink settings can separate existing feedback from that page.<\/li>\n<li><strong>Multisite is not supported<\/strong> in this version.<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>Review Pins stores, for each comment: the comment text, the page address, the on-page location and a short excerpt of the page text there, the reviewer's user account, and who resolved it and when. When review links are used it also stores a hashed link token (never the link itself) and a log of when links were issued or revoked and by whom. This data is visible to administrators and review managers, is kept until deleted (see the FAQ), and is never sent to third parties. A suggested privacy-policy section is added to <strong>Settings \u2192 Privacy<\/strong>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin and activate it.<\/li>\n<li>Go to <strong>Review Pins \u2192 Settings<\/strong>, turn on review, and choose the environments where it should be available.<\/li>\n<li>Give each reviewer their own account with the <strong>Review Pins Reviewer<\/strong> role (or <strong>Review Pins Manager<\/strong> for people who will manage feedback).<\/li>\n<li>Reviewers sign in, open a page, and select <strong>Review this page<\/strong>.<\/li>\n<li>Optional: turn on review links in Settings and issue links from <strong>Review Pins \u2192 Reviewer Access<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20reviewers%20leave%20a%20comment%3F\"><h3>How do reviewers leave a comment?<\/h3><\/dt>\n<dd><p>Select <strong>Review this page<\/strong>, then <strong>Make comment<\/strong> and click the part of the page you mean, or use the arrow keys to move through the page's content and press Enter. To comment on the whole page, use <strong>Add page comment<\/strong>. Press Escape to cancel.<\/p><\/dd>\n<dt id=\"can%20visitors%20see%20the%20feedback%3F\"><h3>Can visitors see the feedback?<\/h3><\/dt>\n<dd><p>No. Review controls and feedback are only shown to signed-in users with review access, only while review is available, and only for pages they are allowed to view.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20data%20when%20i%20deactivate%20or%20uninstall%3F\"><h3>What happens to data when I deactivate or uninstall?<\/h3><\/dt>\n<dd><p>Deactivating keeps everything. On uninstall, the plugin always removes review links and their tokens, the Review Pins roles, and the review capabilities it added to other roles. By default it <strong>keeps feedback and settings<\/strong>, so they are not lost by accident. If an administrator checks <strong>Permanently delete all review feedback and plugin settings when the plugin is uninstalled<\/strong> in Settings, uninstalling also deletes all feedback, settings, and the review-link activity log. WordPress user accounts and their content are never deleted. Network-wide uninstall on multisite is not supported.<\/p><\/dd>\n<dt id=\"how%20does%20the%20plugin%20handle%20personal%20data%20requests%3F\"><h3>How does the plugin handle personal data requests?<\/h3><\/dt>\n<dd><p>Review Pins works with <strong>Tools \u2192 Export Personal Data<\/strong> and <strong>Tools \u2192 Erase Personal Data<\/strong>. An export includes the feedback a person wrote (including the page excerpt captured where they commented), comments they resolved, and review-link activity about them. Erasure removes the text of the feedback they wrote, the captured page excerpts and on-page locations, and their name from feedback they wrote or resolved; it also revokes their review link and anonymizes the link activity log. A de-identified record of each comment (which page, its status, and dates) is kept and reported as retained; managers can delete it from the dashboard. Feedback written by other people is not searched for mentions of the person.<\/p><\/dd>\n<dt id=\"does%20it%20send%20data%20anywhere%3F\"><h3>Does it send data anywhere?<\/h3><\/dt>\n<dd><p>No. The plugin makes no external requests and includes no tracking.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release: on-page pins and general feedback, resolve\/reopen workflow, management dashboard, dedicated reviewer and manager roles, optional review links, privacy tools, lifecycle cleanup policy, pagination, keyboard placement, and WP-CLI commands.<\/li>\n<li>Review is off on new installs and review links are separately opt-in.<\/li>\n<li>Account-changing WP-CLI commands require an explicitly authorized WordPress actor, and feedback targets are authorized server-side before a record is created.<\/li>\n<li>Supports WordPress 6.4+ and PHP 8.0+; multisite network operation is not supported.<\/li>\n<\/ul>","raw_excerpt":"Pin feedback directly to your WordPress pages. Review comments together and track changes to resolution.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/389772","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=389772"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ruhler"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=389772"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=389772"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=389772"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=389772"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=389772"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=389772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}