Description
Init Review System adds a clean and customizable 5-star rating system to your WordPress site. Votes are stored via REST API, tracked with localStorage, and the average score is auto-calculated and optionally displayed with schema markup.
Built to be lightweight, developer-friendly, and easy to integrate into any theme or custom UI. Now with multi-criteria reviews and an emoji reactions system for richer user interaction.
This plugin is part of the Init Plugin Suite — a collection of minimalist, fast, and developer-focused tools for WordPress.
GitHub repository: https://github.com/brokensmile2103/init-review-system
Highlights:
- 5-star voting via frontend
- NEW: Multi-criteria review support
- NEW: Emoji Reactions with Login Enforcement
- Average score display
- Optional login requirement
- Optional strict IP checking
- REST API for vote submission
- JSON-LD schema for SEO
- Works with any post type
- Minimal, theme-friendly UI
Features
- 5-star rating system
- Multi-criteria review scoring (up to 5 custom criteria)
- Emoji-based reactions bar with live counts (requires login)
- REST API endpoint for reactions:
/wp-json/initrsys/v1/reactions/toggle - Reactions stored in both post meta and dedicated userpost mapping table
- Accessibility-ready with
aria-pressed+aria-liveupdates - Shortcode-based integration
- Auto-insert blocks before/after content or comments
- Optional login + IP check to prevent abuse
- REST API endpoint:
/wp-json/initrsys/v1/vote - Developer filters and extensible architecture
- No jQuery, only minimal assets loaded when needed
Usage
[init_review_system]
Displays interactive 5-star voting block.
Attributes:
– id: Post ID (default: current post)
– class: Custom CSS class
– schema: true|false – Output JSON-LD schema markup
[init_review_score]
Displays average score (read-only).
Attributes:
– id: Post ID (default: current post)
– icon: true|false – Show star icon (default: false)
– sub: true|false – Show /5 subtext (default: true)
– class: Custom CSS class
– hide_if_empty: true|false – Hide if no reviews (default: false)
[init_review_criteria]
Displays multi-criteria review block.
Attributes:
– id: Post ID (default: current post)
– class: Custom CSS class
– schema: true|false – Output schema markup (default: false)
– per_page: Number of reviews to show (default: 0 = all)
– paged: Current review page number (default: 1)
[init_reactions]
Displays emoji reactions bar under a post.
Attributes:
– id: Post ID (default: current post)
– class: Custom CSS class
– require_login: Always true (login required)
Filters for Developers
This plugin provides filters and actions to let developers customize auto-insert behavior, schema output, review permissions, and REST API logic.
init_plugin_suite_review_system_auto_insert_enabled_score
Enable or disable automatic score output (before/after content).
Applies to: Frontend filter
Params: bool $enabled, string $position, string $post_type
init_plugin_suite_review_system_auto_insert_enabled_vote
Enable or disable automatic voting block insertion.
Applies to: Frontend filter
Params: bool $enabled, string $position, string $post_type
init_plugin_suite_review_system_default_score_shortcode
Change the default shortcode used for score auto-insertion.
Applies to: Frontend
Params: string $shortcode
init_plugin_suite_review_system_default_vote_shortcode
Change the default shortcode used for voting block auto-insertion.
Applies to: Frontend
Params: string $shortcode
init_plugin_suite_review_system_require_login
Force login for submitting reviews, even if disabled in settings.
Applies to: REST /submit-criteria-review
Params: bool $require_login
init_plugin_suite_review_system_min_len_for_ws_check
Adjust minimum length threshold for triggering no-whitespace check.
Applies to: Backend + JS precheck
Params: int $threshold (default 20)
init_plugin_suite_review_system_repetition_threshold
Adjust repetition threshold for detecting excessive word repetition.
Applies to: Backend + JS precheck
Params: int $threshold (default 8)
init_plugin_suite_review_system_schema_type
Customize schema.org type (e.g., Book, Product, Course).
Applies to: Shortcode output
Params: string $type, string $post_type
init_plugin_suite_review_system_schema_data
Modify JSON-LD schema output array.
Applies to: Shortcode output
Params: array $data, int $post_id, string $schema_type
init_plugin_suite_review_system_after_vote
Run custom logic after a single-star vote is submitted.
Applies to: REST /vote
Params: int $post_id, float $score, float $avg_score, int $total_votes
init_plugin_suite_review_system_after_criteria_review
Trigger custom logic after a multi-criteria review is submitted.
Applies to: REST /submit-criteria-review
Params: int $post_id, int $user_id, float $avg_score, string $review_content, array $scores
init_plugin_suite_review_system_get_reaction_types
Customize available reaction types (labels + emojis).
Applies to: Reactions system
Params: array $types
init_plugin_suite_review_system_reaction_meta_key
Customize the meta key used for storing reaction counts.
Applies to: Reaction counts storage
Params: string $meta_key, string $rx_key
License
This plugin is licensed under the GPLv2 or later.
You are free to use, modify, and distribute it under the same license.
Screenshots

Plugin Settings Page – Configure general options like login requirement, IP restriction, auto-display position, and up to 5 custom criteria fields. 
Single-Star Rating Display – Star-based rating shown on a post with average score and vote count. 
Multi-Criteria Review Display – Frontend layout showing score breakdown per criteria and full user review content. 
Reactions Bar – Emoji-based reactions under the post, showing total counts, current user reaction highlight, and requiring login to interact.
Installation
- Upload plugin to
/wp-content/plugins/ - Activate via Plugins menu
- Go to Settings > Init Review System to configure options
FAQ
-
Is login required to vote?
-
Not by default. You can enable it in plugin settings.
-
Does it support IP protection?
-
Yes. You can enable strict IP check to prevent duplicate votes.
-
Can I use this with custom post types?
-
Yes, it works with any post type that uses
the_content()orcomment_form(). -
Does it support multi-criteria reviews?
-
Yes. You can define up to 5 custom criteria and show them using the provided shortcode.
-
Does it support 10-star ratings?
-
No. The plugin currently supports only a 5-star scale.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Init Review System – Reactions, Multi-Criteria, Guest-Friendly” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Init Review System – Reactions, Multi-Criteria, Guest-Friendly” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.11 – November 5, 2025
- Added User Review Fetching API
- New function
init_plugin_suite_review_system_get_reviews_by_user_id() - Supports pagination (
paged,per_page) just like the post-based fetcher - Automatically joins with
wp_poststo exclude orphaned reviews - Returns unserialized
criteria_scoresfor direct UI rendering
- New function
- Added Total Pages Counter for User Reviews
- New function
init_plugin_suite_review_system_get_total_pages_by_user_id() - Counts reviews belonging to a specific user (filtered by
status) - Returns the total number of pages (minimum value:
1for UX consistency)
- New function
- Performance and internal improvements:
- Consistent sanitization and safety (
absint(),max(), typed values) - All SQL queries use
$wpdb->prepare()— no unbound parameters - PHPCS/WPCS compliant and follows plugin prefix standard
- Consistent sanitization and safety (
1.10 – November 3, 2025
- Added Admin Reset & Manual Score Adjustment Metabox
- Visible only when a post already has rating data
- New UI: compact stat chips showing Avg / Votes / Total (premium-style mini cards)
- Supports manual override: admin can set Average (0–5) and Vote Count
- Internal logic auto-calculates
Total = Avg × Count(rounded to 2 decimals) - All displayed values are fully escaped (
esc_html() / esc_attr()) following PHPCS - Metabox is registered per-post, not globally — zero UI clutter
- Security and permissions:
- Only users with capability
edit_others_posts(Editor+) can view or interact with the metabox save_posthandler validates nonce + capability, protects against unauthorized POST submissions- Input sanitized:
sanitize_text_field( wp_unslash() )before casting to float/int
- Only users with capability
- UX improvements:
- No inline
<style>tags — every style moved to inline attribute (WordPress admin standard) - Metabox does not appear at all until the first vote exists (no “empty” box)
- No inline
1.9 – October 31, 2025
- Added Double-Click Confirmation Rating (anti-misclick mechanic)
- New setting:
Require double-click to rate - When enabled, users must click the same star twice to confirm rating
- First click enters pending state, visually marked with
.hovering - Second click submits rating and disables the block as usual
- New setting:
- JavaScript improvements:
- New pending handler with auto-timeout (2.2s) — no accidental lock state
.hoveringclass persists across mouseleave while pending- Clean async state teardown ensures no ghost states
- No UI popups, no alerts — rating confirmation is purely action-based
- Zero breaking changes — existing rating logic untouched
1.8 – October 6, 2025
- Updated function
init_plugin_suite_review_system_get_reviews_by_post_id():- When
$post_id = 0, orphaned reviews are now automatically excluded (posts that no longer exist across all CPTs).
- When
- Shortcode
[init_review_criteria]enhanced:- Added new attribute
pagedto control review pagination. - Internal call now passes
$pageddynamically toinit_plugin_suite_review_system_get_reviews_by_post_id().
- Added new attribute
1.7 – September 13, 2025
- Added content moderation: banned words, banned phrases, no-whitespace, excessive repetition
- New settings: enable JS precheck (optional), manage banned words/phrases in textarea fields
- Improved modal UX: must rate all required criteria, inline error/success messages under submit button
- JavaScript updated: i18n error mapping, client-side prechecks, red outline highlight for missing scores
- CSS enhancements:
.init-review-inline-msgfor messages,.init-review-criteria-errorfor criteria validation (with dark mode support)
1.6 – September 2, 2025
- Reactions endpoint
/reactions/togglenow requires login: enforcedis_user_logged_in()and nonce validation - Updated REST API registration:
permission_callbackfor/reactions/togglenow only allows logged-in users - Shortcode
[init_reactions]updated:require_loginis alwaystrue, ensuring consistent frontend behavior - Improved JS logic:
- Removed guest/localStorage fallback (no more anonymous reactions)
- Preserved initial
disabledstate for buttons; guest users always see counts but cannot interact - Fixed bug where guest buttons could be re-enabled after API calls
- CSS adjustments: new
.is-disabledstyle keeps emoji + counts fully visible, while visually indicating login requirement - Enhanced accessibility: reaction buttons now toggle
aria-pressedaccurately and supportis-activestate for current user reaction - Code cleanup: removed obsolete guest handling code paths and simplified state management
1.5 – September 1, 2025
- Enhanced Reactions System with total reactions counter displayed under “What do you think?”
- Added unique
idfor total counter span (irs-total-reactions-{post_id}) to support JS live updates - Updated JavaScript: total reaction count now updates instantly when users toggle reactions
- Synced UIkit theme template with total reactions output for consistent frontend display
- Added CSS styles for
.init-reaction-total(font weight, spacing, responsive display) - Improved accessibility: total reactions wrapped with
aria-live="polite"for screen reader updates - Minor code cleanups and consistency improvements
1.4 – August 31, 2025
- Introduced Reactions System: emoji-based reactions (👍 😄 😍 😯 😠 😢)
- Added shortcode + template for reactions bar
- Reactions stored in both post meta (counts) and dedicated
init_reactionstable (userpost map) - Guest-friendly: works without login (tracked via localStorage)
- Added developer filters:
init_plugin_suite_review_system_get_reaction_typesinit_plugin_suite_review_system_reaction_meta_key
- Internal refactor: extracted reaction-core functions, silent table creation with
dbDelta()
1.3 – August 25, 2025
- Restructured admin interface: moved from Settings submenu to dedicated main menu with star icon
- Added comprehensive review management system with bulk operations and filtering capabilities
- Implemented review approval workflow with pending/approved/rejected status management
- Enhanced admin dashboard with review statistics, search functionality, and pagination
- Added individual review actions: approve, reject, delete with proper nonce security
- Integrated bulk actions for managing multiple reviews simultaneously
- Created dedicated review management page with detailed review display and user information
- Improved database queries with proper prepared statements and PHPCS compliance
- Added admin-only review management scripts with proper enqueueing standards
- Refined plugin architecture for better scalability and maintainability
1.2 – July 27, 2025
- Standardized all output with
esc_html(),esc_attr(), andwp_kses()for frontend safety - Secured REST API endpoint with enforced login + nonce validation for logged-in users
- Added
uninstall.phpto clean up plugin options when uninstalled - Refined UI labels and descriptions on settings page
- Improved shortcode documentation and attributes in
readme.txt - Enhanced multi-criteria input layout for better clarity
1.1 – July 11, 2025
- Added support for multi-criteria reviews
- New shortcode for criteria-based score display
- Separate logic and schema handling for criteria reviews
- Improved review interface and modal UX
- Refactored code to support both single and multi-criteria review paths
1.0 – June 28, 2025
- Initial release
- Shortcode
[init_review_system]for 5-star voting block - Shortcode
[init_review_score]for average score display - REST API endpoint
/wp-json/initrsys/v1/votewith conditional login and nonce check - Vote tracking via
localStoragefor guest users - Optional login restriction + strict IP check using hashed IP + transient
- JSON-LD schema output using
AggregateRating - Auto-insert system: before/after post content or comment form
- Admin settings page with shortcode builder and control toggles
- Minimal, responsive, theme-inheriting design
- Developer-friendly: filters, actions, and reusable helpers
