{"id":375920,"date":"2026-09-28T04:16:48","date_gmt":"2026-09-28T04:16:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/universal-reviews\/"},"modified":"2026-10-07T11:19:01","modified_gmt":"2026-10-07T11:19:01","slug":"universal-reviews","status":"publish","type":"plugin","link":"https:\/\/vi.wordpress.org\/plugins\/universal-reviews\/","author":23571888,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.1.3","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Universal Reviews","header_author":"Universal WP","header_description":"Collect, moderate and display reviews for any content \u2014 posts, products, terms, users or your whole business. Dedicated tables, server-side pagination and conditional asset loading keep it fast at a million reviews.","assets_banners_color":"8397a4","last_updated":"2026-10-07 11:19:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/universal-reviews\/","header_author_uri":"https:\/\/profiles.wordpress.org\/universalwp\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":444,"num_ratings":1,"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":"universalwp","date":"2026-09-28 04:32:45","revision":3716291},"1.0.1":{"tag":"1.0.1","author":"universalwp","date":"2026-09-30 05:11:50","revision":3720346},"1.0.2":{"tag":"1.0.2","author":"universalwp","date":"2026-10-01 06:13:55","revision":3722476},"1.0.3":{"tag":"1.0.3","author":"universalwp","date":"2026-10-06 03:53:04","revision":3729959},"1.1.0":{"tag":"1.1.0","author":"universalwp","date":"2026-10-07 11:19:01","revision":3732444}},"upgrade_notice":{"1.1.0":"<p>Adds optional Google Reviews (connect your own Google Business Profile, shown from a temporary local copy). The database updates automatically on first load. Nothing contacts Google unless you set it up.<\/p>","1.0.2":"<p>Adds Elementor widgets, a &quot;Load more reviews&quot; button, a Helpful vote button, new block controls and many security, performance and schema improvements. Recommended for all sites.<\/p>","1.0.1":"<p>Adds photo reviews and half-star ratings, plus security and performance improvements. The database updates automatically on first load.<\/p>","1.0.0":"<p>Initial release of Universal Reviews.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3716279,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3716279,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3716279,"resolution":"1544x500","location":"assets","locale":"","width":1500,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3716279,"resolution":"772x250","location":"assets","locale":"","width":750,"height":250}},"assets_blueprints":{},"all_blocks":{"unirev\/reviews-list":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"unirev\/reviews-list","title":"Reviews List","category":"widgets","icon":"star-filled","description":"Display approved reviews for a product, post, term, user or business \u2014 with optional star-rating filtering.","keywords":["reviews","ratings","testimonials","universal reviews"],"version":"1.0.2","textdomain":"universal-reviews","attributes":{"reviewType":{"type":"string","default":"product"},"targetType":{"type":"string","default":"post"},"targetId":{"type":"number","default":0},"perPage":{"type":"number","default":10},"sort":{"type":"string","default":"newest"},"minRating":{"type":"number","default":0},"allowRatingFilter":{"type":"boolean","default":true}},"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true},"color":{"text":true,"background":true},"typography":{"fontSize":true}},"example":{"attributes":{"reviewType":"product","targetType":"post","targetId":0}},"editorScript":"unirev-reviews-list-editor","style":"unirev-frontend","render":"file:.\/render.php"},"unirev\/google-reviews":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"unirev\/google-reviews","title":"Google Reviews","category":"widgets","icon":"star-filled","description":"Display recent reviews synchronized from your connected Google Business Profile. Not affiliated with Google.","keywords":["google","reviews","ratings","business profile","universal reviews"],"version":"1.1.0","textdomain":"universal-reviews","attributes":{"connection":{"type":"number","default":0},"perPage":{"type":"number","default":6},"layout":{"type":"string","default":"list"},"columns":{"type":"number","default":0},"cardStyle":{"type":"string","default":""},"minRating":{"type":"number","default":0},"showSummary":{"type":"boolean","default":true},"showName":{"type":"boolean","default":true},"showDate":{"type":"boolean","default":true},"showText":{"type":"boolean","default":true},"loadMore":{"type":"boolean","default":true},"filter":{"type":"boolean","default":false}},"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true},"color":{"text":true,"background":true},"typography":{"fontSize":true}},"editorScript":"unirev-google-reviews-editor","render":"file:.\/render.php"},"unirev\/review-form":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"unirev\/review-form","title":"Review Form","category":"widgets","icon":"edit","description":"A submission form so visitors can leave a review for a product, post, term, user or business.","keywords":["review form","submit review","universal reviews"],"version":"1.0.2","textdomain":"universal-reviews","attributes":{"formSlug":{"type":"string","default":"unirev_form"},"reviewType":{"type":"string","default":"product"},"targetType":{"type":"string","default":"post"},"targetId":{"type":"number","default":0},"buttonBg":{"type":"string","default":""},"buttonHoverBg":{"type":"string","default":""},"buttonTextColor":{"type":"string","default":""},"fieldBg":{"type":"string","default":""},"fieldBorderColor":{"type":"string","default":""},"fieldTextColor":{"type":"string","default":""},"fieldPlaceholderColor":{"type":"string","default":""},"fieldActiveColor":{"type":"string","default":""},"starColor":{"type":"string","default":""},"starOffColor":{"type":"string","default":""},"starSize":{"type":"number","default":0}},"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true},"color":{"text":true,"background":true},"typography":{"fontSize":true}},"example":{"attributes":{"reviewType":"product","targetType":"post","targetId":0}},"editorScript":"unirev-review-form-editor","style":"unirev-frontend","render":"file:.\/render.php"}},"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3716279,"resolution":"1","location":"assets","locale":"","width":1695,"height":823},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3716279,"resolution":"2","location":"assets","locale":"","width":1694,"height":805},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3716279,"resolution":"3","location":"assets","locale":"","width":1688,"height":824},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3716279,"resolution":"4","location":"assets","locale":"","width":1695,"height":818},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3716279,"resolution":"5","location":"assets","locale":"","width":1693,"height":819},"screenshot-6.jpg":{"filename":"screenshot-6.jpg","revision":3716279,"resolution":"6","location":"assets","locale":"","width":1694,"height":827}},"screenshots":{"1":"Dashboard \u2014 review metrics, trends, rating distribution and recent activity.","2":"Reviews moderation \u2014 status filters, search, bulk actions, owner replies and review history.","3":"Review form builder \u2014 configurable fields, ordering and form preview.","4":"Review Types \u2014 target and schema configuration.","5":"Settings \u2014 moderation, anti-abuse, display, privacy and notifications.","6":"Dashboard in dark mode."}},"plugin_section":[],"plugin_tags":[21827,5431,8203,1519,286],"plugin_category":[45,53,55],"plugin_contributors":[283048],"plugin_business_model":[],"class_list":["post-375920","plugin","type-plugin","status-publish","hentry","plugin_tags-google-reviews","plugin_tags-product-reviews","plugin_tags-ratings","plugin_tags-reviews","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-ratings-and-reviews","plugin_category-seo-and-marketing","plugin_contributors-universalwp","plugin_committers-universalwp"],"banners":{"banner":"https:\/\/ps.w.org\/universal-reviews\/assets\/banner-772x250.png?rev=3716279","banner_2x":"https:\/\/ps.w.org\/universal-reviews\/assets\/banner-1544x500.png?rev=3716279","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/universal-reviews\/assets\/icon-128x128.png?rev=3716279","icon_2x":"https:\/\/ps.w.org\/universal-reviews\/assets\/icon-256x256.png?rev=3716279","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/universal-reviews\/assets\/screenshot-1.jpg?rev=3716279","caption":"Dashboard \u2014 review metrics, trends, rating distribution and recent activity."},{"src":"https:\/\/ps.w.org\/universal-reviews\/assets\/screenshot-2.jpg?rev=3716279","caption":"Reviews moderation \u2014 status filters, search, bulk actions, owner replies and review history."},{"src":"https:\/\/ps.w.org\/universal-reviews\/assets\/screenshot-3.jpg?rev=3716279","caption":"Review form builder \u2014 configurable fields, ordering and form preview."},{"src":"https:\/\/ps.w.org\/universal-reviews\/assets\/screenshot-4.jpg?rev=3716279","caption":"Review Types \u2014 target and schema configuration."},{"src":"https:\/\/ps.w.org\/universal-reviews\/assets\/screenshot-5.jpg?rev=3716279","caption":"Settings \u2014 moderation, anti-abuse, display, privacy and notifications."},{"src":"https:\/\/ps.w.org\/universal-reviews\/assets\/screenshot-6.jpg?rev=3716279","caption":"Dashboard in dark mode."}],"raw_content":"<!--section=description-->\n<p><strong>Universal Reviews is a WordPress review plugin that lets visitors rate and review anything on your site, and gives you one clean place to manage what they say.<\/strong><\/p>\n\n<p>Run a WooCommerce shop? A local business? An agency, a course, a directory or a membership site? You probably want the same few things: a simple review form, honest star ratings, a queue to approve reviews, and a good-looking way to show them. This plugin does exactly that, without turning your comments section into a rating system.<\/p>\n\n<p>Reviews can be attached to posts, pages, custom post types, WooCommerce products, taxonomy terms, users or your whole business. Show them with <strong>Elementor widgets<\/strong>, <strong>Gutenberg blocks<\/strong> or <strong>shortcodes<\/strong>, whichever you prefer.<\/p>\n\n<p>Reviews live in their own indexed database tables instead of the comments table or post meta. Rating summaries are precomputed, so your review lists and summaries don't run a <code>COUNT(*)<\/code> on the reviews table for every page view.<\/p>\n\n<p><strong>Show your Google reviews too.<\/strong> Connect your own Google Business Profile and display recent Google reviews next to the reviews you collect yourself, with a shortcode, a block or an Elementor widget. Google Reviews is optional: nothing contacts Google unless you set it up, and Universal Reviews is not affiliated with, endorsed by or sponsored by Google.<\/p>\n\n<h4>Free features<\/h4>\n\n<ul>\n<li><strong>Review Forms &amp; Field Builder<\/strong> \u2014 Drag-and-drop form builder with 12+ field types, photo uploads, and per-review-type rules. Import and export templates as JSON, and preview before publishing.<\/li>\n<li><strong>Review Types<\/strong> \u2014 Define Product, Service, Place or any custom type, each with its own moderation policy and schema.org type. Choose whole or half-star rating scales per type.<\/li>\n<li><strong>Moderation Dashboard<\/strong> \u2014 A focused React-powered queue to approve, reject, reply to and manage incoming reviews. Filter, search, sort and bulk-action across large review collections.<\/li>\n<li><strong>Anti-Abuse Protection<\/strong> \u2014 Honeypot, signed time trap, per-IP rate limiting and duplicate-submission blocking \u2014 no CAPTCHA required. Sensible defaults out of the box, fully configurable.<\/li>\n<li><strong>Elementor &amp; Gutenberg<\/strong> \u2014 Native Review Form and Reviews List widgets\/blocks with live previews and style controls. Shortcodes also available for any theme or page builder.<\/li>\n<li><strong>Display &amp; Schema.org<\/strong> \u2014 Star-rating summaries, filtering, helpful votes, owner replies and verified badges on the front end. AggregateRating JSON-LD output for real search-result rich snippets.<\/li>\n<li><strong>Google Reviews (optional)<\/strong> \u2014 Connect your own Google Business Profile with OAuth (your own Google Cloud project; tokens are encrypted) and show up to 50 recent Google reviews from one location, refreshed daily, with a rating summary, Load more, display options and a Google attribution line. Use the <code>[unirev_google_reviews]<\/code> shortcode, the Google Reviews block or the Google Reviews Elementor widget. Shown from a temporary local copy (kept for at most 30 days), so visitors never trigger a Google request. Disconnect any time to delete it.<\/li>\n<li><strong>Built for performance<\/strong> \u2014 Dedicated indexed database tables and precomputed rating totals, with server-side filtering and pagination. Stays fast even with large review collections.<\/li>\n<\/ul>\n\n<h4>Pro Features<\/h4>\n\n<p>adds 9 premium modules on top of everything above.<\/p>\n\n<ul>\n<li><strong>Templates<\/strong> \u2014 10 ready-made review forms for shops, restaurants, hotels, events and more. Import any template into a working form in one click.<\/li>\n<li><strong>Social-Proof Widgets<\/strong> \u2014 A floating rating badge for every page, plus a reviews carousel block\/shortcode. Server-rendered from a cached summary, so it appears instantly with no layout shift.<\/li>\n<li><strong>Analytics<\/strong> \u2014 Server-side event tracking (created, approved, rejected, replies) with per-day charts. No visitor tracking or cookies involved.<\/li>\n<li><strong>Migration<\/strong> \u2014 Move existing WooCommerce product reviews or rating-carrying comments into Universal Reviews. Batched, resumable, and safe to re-run.<\/li>\n<li><strong>Webhooks<\/strong> \u2014 Signed JSON deliveries for every review event, retried automatically on failure. Full delivery history, with per-endpoint auto-disable after repeated failures.<\/li>\n<li><strong>AI Assist<\/strong> \u2014 AI-generated summaries, sentiment scoring and reply drafts for your reviews. Reviewer names are never sent, and API keys are encrypted at rest.<\/li>\n<li><strong>Review Requests<\/strong> \u2014 Invite customers by email with single-use links that prefill the review form. Track sent, opened and completed requests from one screen.<\/li>\n<li><strong>Sources<\/strong> \u2014 Import reviews from any HTTPS JSON feed, with field mapping and deduplication. Scheduled syncs run safely in the background.<\/li>\n<li><strong>More Google Reviews<\/strong> \u2014 Grid layout with 2\u20134 columns, carousel, card styles, star colour and rating filter, up to 500 reviews per location, and up to 25 Google locations with a location choice per block, shortcode or widget.<\/li>\n<\/ul>\n\n<h4>Set it up in about three minutes<\/h4>\n\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Open <strong>Reviews<\/strong> in the admin menu and look over <strong>Forms<\/strong>, <strong>Review Types<\/strong> and <strong>Settings<\/strong>. The defaults are sensible.<\/li>\n<li>Edit a post, page or product and add <code>[unirev_reviews show_form=1]<\/code>, or drop in the <strong>Reviews List<\/strong> block, or use the <strong>Reviews List<\/strong> widget in Elementor.<\/li>\n<li>Visit the page, leave a test review, then approve it under <strong>Reviews \u2192 Reviews<\/strong>.<\/li>\n<li>Optional: open <strong>Reviews \u2192 Google Reviews<\/strong> to connect your Google Business Profile and show your Google reviews too.<\/li>\n<\/ol>\n\n<p>You now have a rating summary, a review list and a review form on the page.<\/p>\n\n<h4>Who is it for?<\/h4>\n\n<ul>\n<li><strong>Online stores<\/strong> that want customer reviews and star ratings on WooCommerce product pages.<\/li>\n<li><strong>Local businesses and service providers<\/strong> who want reviews of the business itself, including their Google reviews.<\/li>\n<li><strong>Agencies, freelancers and course creators<\/strong> collecting testimonials.<\/li>\n<li><strong>Directories and membership sites<\/strong> where people review listings, users or categories.<\/li>\n<li><strong>Elementor and block-editor users<\/strong> who want review widgets that match their design.<\/li>\n<\/ul>\n\n<p>The everyday workflow stays simple:<\/p>\n\n<ol>\n<li>Create or adjust a review form.<\/li>\n<li>Place the form and review list on your site.<\/li>\n<li>Moderate incoming reviews.<\/li>\n<li>Reply, feature or verify reviews when appropriate.<\/li>\n<li>Show the rating summary and approved reviews to visitors.<\/li>\n<\/ol>\n\n<h3>Elementor widgets<\/h3>\n\n<p>If you build with Elementor, you don't need to paste shortcodes any more. Universal Reviews adds two Elementor widgets:<\/p>\n\n<ul>\n<li><strong>Review Form<\/strong> \u2013 let visitors submit a rating and review right from your Elementor page.<\/li>\n<li><strong>Reviews List<\/strong> \u2013 show approved reviews with the rating summary, star filters, owner replies, a \"Load more reviews\" button and helpful votes.<\/li>\n<\/ul>\n\n<p>Both widgets use the same forms, review types and moderation queue as the shortcodes and blocks, so you can switch between them at any time. Elementor is optional. The plugin works the same without it.<\/p>\n\n<h3>Support and community<\/h3>\n\n<ul>\n<li><a href=\"https:\/\/wordpress.org\/support\/plugin\/universal-reviews\/\">Support Forum<\/a> \u2013 ask questions and report issues.<\/li>\n<li><a href=\"https:\/\/www.facebook.com\/profile.php?id=61594808884671\">Facebook Community<\/a> \u2013 share feedback and follow updates.<\/li>\n<\/ul>\n\n<h3>Collect reviews<\/h3>\n\n<ul>\n<li>Create review forms with a drag-and-drop field builder.<\/li>\n<li>Rating field is included by default and uses a 1\u20135 star scale, in whole or half steps per review type.<\/li>\n<li>Let reviewers attach photos (JPEG, PNG, WebP or AVIF) with configurable size and count limits. SVG is never accepted.<\/li>\n<li>Available field types include rating, heading, text, textarea, select, radio, checkbox, number, email, URL, phone, date and hidden fields.<\/li>\n<li>Mark fields as required, use half-width layouts, add placeholders and help text, and assign custom CSS classes.<\/li>\n<li>Add headings and text blocks between fields with configurable HTML tag, size, color and alignment.<\/li>\n<li>Custom field answers are saved with the review and available to moderators.<\/li>\n<li>Import and export form templates as JSON.<\/li>\n<li>Preview forms before publishing them.<\/li>\n<li>Create review types such as Product, Service or Place, each with its own moderation policy, allowed targets and schema.org type.<\/li>\n<\/ul>\n\n<h3>Protect submissions<\/h3>\n\n<p>Universal Reviews includes several layers of basic anti-abuse protection without requiring a CAPTCHA.<\/p>\n\n<ul>\n<li>Honeypot field.<\/li>\n<li>Signed time trap with an expiring token.<\/li>\n<li>Per-IP rate limiting.<\/li>\n<li>One-review-per-person-per-item protection within a configurable time window.<\/li>\n<li>Consent checkbox.<\/li>\n<li>Same-site origin validation.<\/li>\n<li>Validation of review types and public targets.<\/li>\n<li>HTTP 429 responses when the configured rate limit is exceeded.<\/li>\n<\/ul>\n\n<p>Default protection includes a limit of 12 submissions per 60 minutes per IP and a 72-hour duplicate-review window.<\/p>\n\n<h3>Moderate reviews<\/h3>\n\n<p>The React-powered admin dashboard gives moderators a focused place to work through incoming reviews.<\/p>\n\n<ul>\n<li>Filter reviews by status.<\/li>\n<li>Search and sort reviews.<\/li>\n<li>Cursor-based pagination for large review collections.<\/li>\n<li>Approve, reject, mark as spam, trash, feature or delete reviews.<\/li>\n<li>Apply moderation actions individually or in bulk.<\/li>\n<li>Reply to reviews as the site owner.<\/li>\n<li>Mark reviews as verified.<\/li>\n<li>View the original form answers.<\/li>\n<li>Keep a review change history.<\/li>\n<li>Receive a daily digest when reviews are waiting for moderation.<\/li>\n<li>Disable the digest with the <code>unirev_digest_enabled<\/code> filter.<\/li>\n<\/ul>\n\n<p>The moderation interface uses server-side filtering, sorting and pagination so the browser does not need to load the complete review database.<\/p>\n\n<h3>Display reviews<\/h3>\n\n<p>Add reviews to your site with Elementor widgets, Gutenberg blocks or shortcodes.<\/p>\n\n<p>Available shortcodes:<\/p>\n\n<pre><code>[unirev_form]\n\n[unirev_reviews]\n\n[unirev_summary]\n<\/code><\/pre>\n\n<p>The Reviews List and Review Form blocks are server-rendered. In the block editor you get a live preview, a dropdown of your saved forms, a searchable picker for posts, products, terms and users, and colour and size controls for the button, fields and star rating.<\/p>\n\n<p>Front-end features include:<\/p>\n\n<ul>\n<li>Rating summary with average rating and total review count.<\/li>\n<li>5-to-1 star distribution.<\/li>\n<li>Star-rating filtering such as 4+ stars.<\/li>\n<li>\"Helpful\" vote button on each review.<\/li>\n<li>\"Load more reviews\" button for long review lists.<\/li>\n<li>Photo reviews with image thumbnails.<\/li>\n<li>Owner replies.<\/li>\n<li>Verified review badges.<\/li>\n<li>Keyboard-friendly star selection.<\/li>\n<li>Inline validation and form status messages.<\/li>\n<li>Loading and success states.<\/li>\n<li>Theme-friendly CSS variables using the <code>--unirev-*<\/code> naming system.<\/li>\n<\/ul>\n\n<p>Plugin CSS and JavaScript are loaded only on pages that actually show a Universal Reviews widget, and in the page head when a post contains the shortcode or block, so your layout doesn't jump.<\/p>\n\n<h3>SEO and structured data<\/h3>\n\n<p>Universal Reviews can output AggregateRating JSON-LD (the review schema behind star ratings in search results) for supported public review targets.<\/p>\n\n<p>Structured data is printed only when the page actually displays the target's review list or summary and the target has approved reviews. The plugin uses the schema.org type configured for the review type and avoids outputting review structured data for private content.<\/p>\n\n<p>This keeps structured data tied to the content visitors can actually see rather than adding review markup site-wide.<\/p>\n\n<p>Schema output is built to play nicely with other plugins: it uses the correct worst rating for half-star types, a stable <code>@id<\/code>, merges multiple reviewed items into one <code>@graph<\/code>, limits types to a list of valid schema.org types (filter <code>unirev_schema_types<\/code>), and has a <code>unirev_schema_output<\/code> filter so you can avoid duplicates with WooCommerce or your SEO plugin.<\/p>\n\n<p>Important: structured data does not guarantee rich results in search engines. Search engines decide whether and how eligible structured data is displayed.<\/p>\n\n<h3>Performance<\/h3>\n\n<p>Universal Reviews is designed for larger review collections.<\/p>\n\n<ul>\n<li>Reviews use dedicated database tables.<\/li>\n<li>Important review, moderation and lookup queries are indexed.<\/li>\n<li>Rating totals and distributions are precomputed.<\/li>\n<li>Public review lists and summaries do not run COUNT(*) on the reviews table for every page view.<\/li>\n<li>Background jobs support retry, cancellation and recovery from stuck jobs.<\/li>\n<li>Jobs and logs older than 30 days are automatically purged.<\/li>\n<li>Optional persistent object caching such as Redis or Memcached can make repeated public queries cheaper, but it is not required.<\/li>\n<\/ul>\n\n<p>The architecture is intended to remain practical as a site grows from hundreds of reviews to much larger collections.<\/p>\n\n<h3>Import, export and diagnostics<\/h3>\n\n<p>The Tools area includes:<\/p>\n\n<ul>\n<li>Streaming CSV export.<\/li>\n<li>Streaming JSON export.<\/li>\n<li>Spreadsheet formula-injection protection during export.<\/li>\n<li>Batched CSV import with up to 5,000 rows per file.<\/li>\n<li>Row-level import errors.<\/li>\n<li>Background jobs.<\/li>\n<li>Job retry and cancellation.<\/li>\n<li>Logs.<\/li>\n<li>Database table-size diagnostics.<\/li>\n<li>Automatic cleanup of old jobs and logs.<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>Privacy controls are built into the review workflow.<\/p>\n\n<ul>\n<li>Reviewer IP addresses are not stored by default.<\/li>\n<li>WordPress privacy exporter integration.<\/li>\n<li>WordPress privacy eraser integration.<\/li>\n<li>Custom form answers are included in privacy handling.<\/li>\n<li>Erasing personal data anonymises reviewer name, email and IP where applicable while keeping the review text as a business record.<\/li>\n<li>Optional data-retention settings.<\/li>\n<li>Review data remains after deactivation.<\/li>\n<li>Data is deleted on uninstall only when \"Delete all data on uninstall\" is enabled.<\/li>\n<li>Multisite sites manage their own uninstall-data setting.<\/li>\n<li>No telemetry is sent by the plugin.<\/li>\n<\/ul>\n\n<p>Always configure retention, consent and privacy settings according to your site's legal and business requirements.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Universal Reviews works fully offline. The only external service it can contact is <strong>Google<\/strong>, and only if you choose to connect Google Reviews (Reviews \u2192 Google Reviews). Nothing is sent to Google, and no Google code is loaded, otherwise.<\/p>\n\n<p>When you connect Google Reviews, your server contacts these Google endpoints using your own Google Cloud project and the Google account you authorize:<\/p>\n\n<ul>\n<li><code>accounts.google.com<\/code> and <code>oauth2.googleapis.com<\/code> \u2014 OAuth 2.0 sign-in, token exchange, token refresh and token revocation. Data sent: your OAuth Client ID\/Secret, the authorization code and your tokens.<\/li>\n<li><code>mybusinessaccountmanagement.googleapis.com<\/code>, <code>mybusinessbusinessinformation.googleapis.com<\/code> and <code>mybusiness.googleapis.com<\/code> \u2014 the Google Business Profile APIs, used to list the accounts and locations you manage and to read reviews for the location you select. Data sent: your access token and the account\/location IDs.<\/li>\n<\/ul>\n\n<p>Requests happen when you press Sync Now, during the daily scheduled sync, and while you set up the connection \u2014 never when a visitor loads a page. If a reviewer has a Google profile photo, visitors' browsers load that image from Google's image servers (googleusercontent.com).<\/p>\n\n<p>Google's terms: https:\/\/policies.google.com\/terms \u2014 privacy policy: https:\/\/policies.google.com\/privacy \u2014 Business Profile API terms: https:\/\/developers.google.com\/my-business\/content\/terms<\/p>\n\n<h3>Google Reviews<\/h3>\n\n<p>Show recent reviews from your Google Business Profile next to your own reviews. Google Reviews is optional and never required for the rest of the plugin.<\/p>\n\n<p><strong>What you need<\/strong><\/p>\n\n<ul>\n<li>A Google Business Profile you own or manage (verified and active).<\/li>\n<li>Your own Google Cloud project with the Business Profile APIs enabled and API access approved by Google. Google requires each business to use its own approved project, so Universal Reviews does not ship a shared one.<\/li>\n<li>An OAuth client ID of type \"Web application\" with this authorized redirect URI: <code>https:\/\/your-site.example\/wp-admin\/admin-post.php?action=unirev_google_oauth<\/code> (the exact URL is shown on the setup screen).<\/li>\n<\/ul>\n\n<p><strong>Setup<\/strong><\/p>\n\n<ol>\n<li>Open Reviews \u2192 Google Reviews.<\/li>\n<li>Enter your Google Client ID and Client Secret and click Save Credentials.<\/li>\n<li>Click Connect Google, sign in with the Google account that manages the business, and approve access.<\/li>\n<li>Choose a location. The first sync runs immediately.<\/li>\n<\/ol>\n\n<p><strong>Changing the Google account or credentials:<\/strong> open Reviews \u2192 Google Reviews and use <strong>Change Google account<\/strong>, <strong>Edit Client ID &amp; Secret<\/strong> or <strong>Disconnect<\/strong>. These are also available on the location screen, so a failing Google request never leaves you stuck. Signing in with a different Google account clears the previous location and its cached reviews.<\/p>\n\n<p><strong>Free plan limits:<\/strong> one connection and location, up to 50 recent reviews displayed, daily automatic sync plus Sync Now, a basic list layout and basic styling. If your profile has more reviews, only the allowed number is displayed and a note is shown to administrators; the connection keeps working. Multiple locations, higher limits, advanced  &hellip;<\/p>\n\n<!--section=installation-->\n<h3>Install from your dashboard (easiest)<\/h3>\n\n<ol>\n<li>Go to <strong>Plugins \u2192 Add New Plugin<\/strong>.<\/li>\n<li>Search for <strong>Universal Reviews<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<\/ol>\n\n<h3>Upload the ZIP from WordPress admin<\/h3>\n\n<ol>\n<li>Download the <code>universal-reviews<\/code> plugin ZIP.<\/li>\n<li>In WordPress, go to <strong>Plugins \u2192 Add New Plugin<\/strong>.<\/li>\n<li>Select <strong>Upload Plugin<\/strong>.<\/li>\n<li>Choose the <code>universal-reviews.zip<\/code> file.<\/li>\n<li>Click <strong>Install Now<\/strong>.<\/li>\n<li>After installation finishes, click <strong>Activate Plugin<\/strong>.<\/li>\n<\/ol>\n\n<h3>Install manually<\/h3>\n\n<ol>\n<li>Download the plugin ZIP.<\/li>\n<li>Extract the <code>universal-reviews<\/code> folder.<\/li>\n<li>Upload the folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Open <strong>Plugins \u2192 Installed Plugins<\/strong> in WordPress.<\/li>\n<li>Find <strong>Universal Reviews<\/strong>.<\/li>\n<li>Click <strong>Activate<\/strong>.<\/li>\n<\/ol>\n\n<h3>After activation<\/h3>\n\n<p>After activation, open <strong>Reviews<\/strong> in the WordPress admin menu.<\/p>\n\n<p>Start with:<\/p>\n\n<ol>\n<li><strong>Reviews \u2192 Forms<\/strong> \u2014 review the default form or create another form.<\/li>\n<li><strong>Reviews \u2192 Review Types<\/strong> \u2014 configure Product, Service, Place or another review type.<\/li>\n<li><strong>Reviews \u2192 Settings<\/strong> \u2014 check moderation, anti-abuse, display, privacy and notification settings.<\/li>\n<li>Add a review form and review list using a shortcode or Gutenberg block.<\/li>\n<li>Submit a test review from the front end.<\/li>\n<li>Open <strong>Reviews \u2192 Reviews<\/strong> and test the complete moderation workflow.<\/li>\n<li>Approve the test review and confirm that the review list and summary appear correctly.<\/li>\n<\/ol>\n\n<p>For the quickest setup, add this shortcode to a post, page or product:<\/p>\n\n<pre><code>[unirev_reviews show_form=1]\n<\/code><\/pre>\n\n<p>This displays the review list and enables the form for the current supported target.<\/p>\n\n<p>Using Elementor? Edit the page, search the widget panel for <strong>Reviews List<\/strong> or <strong>Review Form<\/strong>, and drag it where you want it.<\/p>\n\n<p>Requirements: WordPress 6.2 or newer and PHP 7.4 or newer. WooCommerce and Elementor are optional.<\/p>\n\n<h3>Deactivation and uninstall<\/h3>\n\n<p>Deactivating Universal Reviews does not remove review data.<\/p>\n\n<p>By default, database tables and settings remain available after deactivation. If you want WordPress to remove the plugin's stored data during uninstall, enable <strong>Settings \u2192 Privacy \u2192 Delete all data on uninstall<\/strong> before deleting the plugin.<\/p>\n\n<p>Use this option carefully because uninstall data deletion is intended to be permanent.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20universal%20reviews%20require%20woocommerce%3F\"><h3>Does Universal Reviews require WooCommerce?<\/h3><\/dt>\n<dd><p>No. WooCommerce is not required.<\/p>\n\n<p>Reviews can target WordPress posts and custom post types, taxonomy terms, users, the site\/business and other supported targets. WooCommerce products are supported as the <code>product<\/code> post type.<\/p>\n\n<p>Universal Reviews does not read WooCommerce orders for purchase verification. A moderator can mark a review as verified from the Reviews screen, and developers can add their own verification logic through the <code>unirev_verification_providers<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20i%20use%20universal%20reviews%20for%20custom%20post%20types%3F\"><h3>Can I use Universal Reviews for custom post types?<\/h3><\/dt>\n<dd><p>Yes. The <code>post<\/code> target type can work with WordPress post types, including custom post types, when the target is public and supported by the plugin's target validation.<\/p><\/dd>\n<dt id=\"does%20universal%20reviews%20work%20with%20elementor%3F\"><h3>Does Universal Reviews work with Elementor?<\/h3><\/dt>\n<dd><p>Yes. Version 1.0.2 adds Elementor widgets for the Review Form and the Reviews List. Drag them onto any Elementor page, template or product layout. They share the same forms, review types and moderation queue as the blocks and shortcodes.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20without%20a%20page%20builder%3F\"><h3>Can I use it without a page builder?<\/h3><\/dt>\n<dd><p>Yes. Elementor is optional. Universal Reviews also works with the WordPress block editor and with shortcodes, and you don't need a special theme.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20star%20ratings%20and%20customer%20reviews%20to%20a%20wordpress%20page%3F\"><h3>How do I add star ratings and customer reviews to a WordPress page?<\/h3><\/dt>\n<dd><p>Add <code>[unirev_reviews show_form=1]<\/code> to the page, insert the <strong>Reviews List<\/strong> block, or drop in the <strong>Reviews List<\/strong> widget in Elementor. Visitors will see the rating summary, the approved reviews and the review form.<\/p><\/dd>\n<dt id=\"how%20do%20i%20show%20reviews%20on%20woocommerce%20product%20pages%3F\"><h3>How do I show reviews on WooCommerce product pages?<\/h3><\/dt>\n<dd><p>WooCommerce products are supported as a review target. Add the shortcode, block or Elementor widget to your product description, product template or product layout. Universal Reviews doesn't take over the built-in WooCommerce reviews tab.<\/p><\/dd>\n<dt id=\"can%20visitors%20upload%20photos%20with%20their%20review%3F\"><h3>Can visitors upload photos with their review?<\/h3><\/dt>\n<dd><p>Yes. Reviewers can attach JPEG, PNG, WebP or AVIF photos, and you control the size and number of photos. SVG uploads are never accepted. Photos that can't be verified as real images are rejected, and photos are deleted when a review is rejected or marked as spam.<\/p><\/dd>\n<dt id=\"can%20i%20collect%20reviews%20for%20my%20business%20instead%20of%20a%20page%3F\"><h3>Can I collect reviews for my business instead of a page?<\/h3><\/dt>\n<dd><p>Yes. Use the <code>business<\/code> target type to collect reviews about your company as a whole, then show them anywhere with the same widgets, blocks and shortcodes.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20review%20form%3F\"><h3>Can I customize the review form?<\/h3><\/dt>\n<dd><p>Yes. The form builder supports multiple field types, required fields, half-width layouts, placeholders, help text, headings, text blocks and custom CSS classes. Form styling uses <code>--unirev-*<\/code> CSS variables.<\/p><\/dd>\n<dt id=\"can%20i%20create%20different%20review%20forms%3F\"><h3>Can I create different review forms?<\/h3><\/dt>\n<dd><p>Yes. Forms can be created and managed from <strong>Reviews \u2192 Forms<\/strong>. Forms can be associated with supported review types and embedded with the form shortcode or Review Form block.<\/p><\/dd>\n<dt id=\"can%20i%20use%20half-star%20ratings%3F\"><h3>Can I use half-star ratings?<\/h3><\/dt>\n<dd><p>Yes, since version 1.0.1. Choose <strong>Half stars<\/strong> under <strong>Star steps<\/strong> when editing a review type in <strong>Reviews \u2192 Review Types<\/strong>. Types default to whole stars (1 to 5).<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20store%20ip%20addresses%3F\"><h3>Does the plugin store IP addresses?<\/h3><\/dt>\n<dd><p>Not by default. IP storage is disabled by default and can be enabled from the privacy settings when a site needs it.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20use%20captcha%3F\"><h3>Does the plugin use CAPTCHA?<\/h3><\/dt>\n<dd><p>No CAPTCHA is required. Universal Reviews uses a honeypot, signed time trap, rate limiting, duplicate-review protection, consent and request validation.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20deactivate%20the%20plugin%3F\"><h3>What happens when I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Deactivation does not delete reviews, settings or database tables.<\/p>\n\n<p>Data is removed during uninstall only when <strong>Delete all data on uninstall<\/strong> has been enabled in <strong>Settings \u2192 Privacy<\/strong>.<\/p><\/dd>\n<dt id=\"do%20i%20need%20redis%20or%20another%20object%20cache%3F\"><h3>Do I need Redis or another object cache?<\/h3><\/dt>\n<dd><p>No. Universal Reviews does not require Redis or Memcached.<\/p>\n\n<p>Rating aggregates are precomputed in a summary table. A persistent object cache can further reduce repeated public queries when available.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20add%20review%20schema%20automatically%3F\"><h3>Does the plugin add review schema automatically?<\/h3><\/dt>\n<dd><p>When enabled, Universal Reviews can output AggregateRating JSON-LD for supported targets whose review list or summary is actually displayed and which have approved reviews.<\/p>\n\n<p>Structured data eligibility does not guarantee a search-engine rich result.<\/p><\/dd>\n<dt id=\"does%20universal%20reviews%20guarantee%20google%20star%20snippets%3F\"><h3>Does Universal Reviews guarantee Google star snippets?<\/h3><\/dt>\n<dd><p>No. The plugin outputs supported structured data according to its configuration and visible review content, but search engines independently decide whether structured data qualifies for or appears as a rich result.<\/p><\/dd>\n<dt id=\"can%20visitors%20mark%20reviews%20as%20helpful%3F\"><h3>Can visitors mark reviews as helpful?<\/h3><\/dt>\n<dd><p>Yes. Version 1.0.2 adds a \"Helpful\" vote button on each review. Voting can be enabled in the display settings, and votes have their own rate limit.<\/p><\/dd>\n<dt id=\"does%20the%20review%20list%20have%20pagination%3F\"><h3>Does the review list have pagination?<\/h3><\/dt>\n<dd><p>Yes. Long lists show a \"Load more reviews\" button that loads the next page of reviews without reloading the page.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20full-page%20caching%3F\"><h3>Does it work with full-page caching?<\/h3><\/dt>\n<dd><p>Yes. Review forms and vote buttons on cached pages fetch fresh security tokens when the visitor interacts, so they no longer fail with expired nonces.<\/p><\/dd>\n<dt id=\"will%20it%20work%20with%20hindi%2C%20arabic%2C%20chinese%20and%20emoji%20text%3F\"><h3>Will it work with Hindi, Arabic, Chinese and emoji text?<\/h3><\/dt>\n<dd><p>Yes. Titles, names, answers and avatar initials are cut on character boundaries, so non-Latin text and emoji are no longer corrupted.<\/p><\/dd>\n<dt id=\"can%20the%20business%20owner%20reply%20to%20reviews%3F\"><h3>Can the business owner reply to reviews?<\/h3><\/dt>\n<dd><p>Yes. Moderators with the appropriate capability can add owner replies. Replies are displayed beneath the review on the front end.<\/p><\/dd>\n<dt id=\"can%20i%20import%20existing%20reviews%3F\"><h3>Can I import existing reviews?<\/h3><\/dt>\n<dd><p>Version 1.0.0 includes Universal Reviews CSV import. Import files can contain up to 5,000 rows per file and report row-level errors.<\/p>\n\n<p>Dedicated migration importers for other review plugins are planned for the Pro roadmap.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20connect%20google%3F\"><h3>Do I need to connect Google?<\/h3><\/dt>\n<dd><p>No. Google Reviews is optional. Nothing contacts Google unless you set it up.<\/p><\/dd>\n<dt id=\"why%20do%20i%20need%20my%20own%20google%20cloud%20project%3F\"><h3>Why do I need my own Google Cloud project?<\/h3><\/dt>\n<dd><p>Google's Business Profile API terms require each business to use its own approved project. Universal Reviews therefore never shares one project between sites: you create the OAuth client, and you authorize access to your own Business Profile.<\/p><\/dd>\n<dt id=\"google%20says%20my%20api%20access%20is%20not%20approved%2C%20or%20the%20api%20is%20not%20enabled.\"><h3>Google says my API access is not approved, or the API is not enabled.<\/h3><\/dt>\n<dd><p>Business Profile API access must be requested from Google and approved (the quota for the APIs shows 0 until it is). Then enable the \"My Business Account Management API\", \"My Business Business Information API\" and \"Google My Business API\" in your project. The plugin shows the exact problem and a recommended action, with technical details you can send to support.<\/p><\/dd>\n<dt id=\"why%20does%20my%20google%20connection%20say%20%22needs%20reauthorization%22%3F\"><h3>Why does my Google connection say \"Needs Reauthorization\"?<\/h3><\/dt>\n<dd><p>Google no longer accepts the saved authorization \u2014 usually because access was revoked, the password changed, or the account lost access to the location. Click Reconnect Google.<\/p><\/dd>\n<dt id=\"only%20some%20of%20my%20google%20reviews%20show.\"><h3>Only some of my Google reviews show.<\/h3><\/dt>\n<dd><p>The Free plan displays up to 50 recent reviews. Your connection keeps working and the rest are not deleted from Google.<\/p><\/dd>\n<dt id=\"are%20my%20google%20reviews%20stored%20permanently%3F\"><h3>Are my Google reviews stored permanently?<\/h3><\/dt>\n<dd><p>No. They are a temporary copy kept for at most 30 days and refreshed daily. Disconnecting deletes them immediately.<\/p><\/dd>\n<dt id=\"google%20says%20my%20server%20could%20not%20be%20reached%2C%20or%20the%20location%20list%20times%20out.\"><h3>Google says my server could not be reached, or the location list times out.<\/h3><\/dt>\n<dd><p>Your server must be able to make outgoing HTTPS requests to Google (<code>*.googleapis.com<\/code> and <code>accounts.google.com<\/code>). Ask your host to allow them, then press Try Again. If you connected the wrong account in the meantime, use Change Google account.<\/p><\/dd>\n<dt id=\"my%20google%20reviews%20disappeared.\"><h3>My Google reviews disappeared.<\/h3><\/dt>\n<dd><p>Cached Google reviews are removed after 30 days if they are not refreshed. Check Reviews \u2192 Google Reviews for a sync error, press Sync Now, and make sure WP-Cron is not disabled on your site.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20telemetry%3F\"><h3>Does the plugin send telemetry?<\/h3><\/dt>\n<dd><p>No. Universal Reviews does not send telemetry.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20privacy%20data%20when%20a%20review%20is%20erased%3F\"><h3>What happens to privacy data when a review is erased?<\/h3><\/dt>\n<dd><p>Universal Reviews integrates with the WordPress privacy exporter and eraser. Personal information such as reviewer name, email and stored IP data can be anonymised while the review text remains as a business record.<\/p><\/dd>\n<dt id=\"where%20is%20the%20source%20code%20for%20the%20compiled%20admin%20app%3F\"><h3>Where is the source code for the compiled admin app?<\/h3><\/dt>\n<dd><p>The admin dashboard (<code>assets\/admin\/index.js<\/code> and <code>assets\/admin\/index.css<\/code>) is compiled from the human-readable TypeScript\/React source in the <code>admin-src\/<\/code> folder, which ships inside the plugin. To rebuild it, run <code>npm install<\/code> and then <code>npm run build<\/code> in the plugin folder (esbuild bundles the JavaScript and the Tailwind CLI builds the CSS; see <code>admin-src\/README.md<\/code>). The bundle includes React, React DOM, Radix UI, lucide-react, class-variance-authority, clsx and tailwind-merge, all under MIT-compatible licences. The front-end script (<code>assets\/admin\/frontend.js<\/code>), the block editor scripts (<code>blocks\/*\/edit.js<\/code>) and the PHP are not minified.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<p>07 Oct 2026\n* New: Google Reviews (optional). Connect your own Google Business Profile with OAuth (your own Google Cloud project; tokens and the client secret are encrypted) and show recent Google reviews from a temporary local copy. Free: one location, up to 50 reviews, daily sync plus Sync Now.\n* New: <code>[unirev_google_reviews]<\/code> shortcode, Google Reviews block and Google Reviews Elementor widget.\n* New: Google Reviews display options: layout, reviews per page, rating summary, reviewer name, date, text, Google attribution, rating filter, Load more, star style, size and colour, spacing, text size and button style.\n* New (Pro): grid layout with 2\u20134 columns, carousel, card styles, star colour, rating filter, up to 500 reviews per location, and up to 25 locations with Add location and a location choice per block, shortcode or widget.\n* New: Change Google account, Edit Client ID &amp; Secret and Disconnect from the Google Reviews screen, a warning when the last successful sync is old, a Google Reviews card on the Dashboard, and a first-run Getting started checklist.\n* Improved: translations. The language template now includes the admin app strings.<\/p>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed : Improved and Bug Fixed<\/li>\n<li>Removed: the admin notice warning that an Nginx server needs manual config to protect the review-photos upload folder (the folder's own protection still applies; this only removed the heads-up notice).<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>New: Review Form block's \"Form\" field is a dropdown of your saved forms, and adds full color\/size style controls for the button, fields and star rating.<\/li>\n<li>New: Elementor widgets for Review Form and Reviews List.<\/li>\n<li>New: \"Load more reviews\" button on review lists (cursor pagination) and a \"Helpful\" vote button on each review.<\/li>\n<li>Added: an admin notice (with the exact config) when the server is Nginx, since the upload folder's <code>.htaccess<\/code> protection doesn't apply there.<\/li>\n<li>Improved: schema.org output uses the correct worst rating for half-star types, a stable <code>@id<\/code>, merges multiple reviewed items into one <code>@graph<\/code>, an allow-list of valid types (filter <code>unirev_schema_types<\/code>) and a <code>unirev_schema_output<\/code> filter to avoid duplicates with WooCommerce or SEO plugins.<\/li>\n<li>Improved: the duplicate-review guard also checks the reviewer's IP via a privacy-safe one-way hash \u2014 works regardless of the \"store IP\" setting, so a different email no longer bypasses it.<\/li>\n<li>Improved: Reviews List and Review Form blocks use block API v3, add editor previews, colour and font-size controls, and a searchable picker (posts, products, terms and users) instead of a raw ID field.<\/li>\n<li>Improved: admin rating-distribution chart is cached in a transient, same as the status-count badge.<\/li>\n<li>Improved: the public reviews API is now rate-limited per IP, separate from the submission limit; it also no longer runs a total count or resolves target titles, and returns nothing for posts that are no longer public.<\/li>\n<li>Improved: front-end CSS\/JS load in the page head when a post contains the shortcode or block (no layout shift), and rate-limit counters use the persistent object cache when one is available instead of writing database options on every hit.<\/li>\n<li>Improved: the time-trap token is bound to the visitor's IP; helpful votes use their own rate-limit bucket instead of the submission quota.<\/li>\n<li>Improved: the submit error no longer reveals whether an item ID exists.<\/li>\n<li>Improved: admin menu badge counts are cached in a short-lived transient; identical pending background jobs are no longer queued twice.<\/li>\n<li>Improved: bulk moderation now uses one lookup and one update per status group instead of several queries per review.<\/li>\n<li>Fixed: Review Form and Reviews List block previews were unstyled in the editor; they now match the front-end.<\/li>\n<li>Fixed: titles, names, answers and avatar initials are now cut on character boundaries, so Hindi, Arabic, CJK and emoji text is no longer corrupted.<\/li>\n<li>Fixed: \"Highest rated\" pagination skipped half-star (4.5) reviews after the first page.<\/li>\n<li>Fixed: a new auto-approved review now updates the review count, average rating and schema.org data immediately instead of waiting for WP-Cron.<\/li>\n<li>Fixed: review forms and vote buttons on full-page-cached pages no longer fail with stale nonce or time-trap tokens; fresh tokens are fetched on interaction.<\/li>\n<li>Fixed: a rate-limit window of 0 no longer disables the limit; window, reviews-per-page and cron interval settings are now range-limited.<\/li>\n<li>Privacy: the personal-data eraser also removes log entries containing the reviewer's email, and vote records older than one year are pruned.<\/li>\n<li>Security: photos that cannot be verified (unreadable image header, including AVIF) are rejected; photos are deleted when a review is rejected or marked spam.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>New: photo reviews (JPEG, PNG, WebP and AVIF uploads with size and count limits; SVG is never accepted) and optional half-star ratings per review type.<\/li>\n<li>Improved: spam-check filter, vote nonce, admin REST rate limit and settings\/summary caching; fixed empty stars showing as filled in review lists.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Dedicated indexed review tables.<\/li>\n<li><code>[unirev_form]<\/code>, <code>[unirev_reviews]<\/code> and <code>[unirev_summary]<\/code> shortcodes.<\/li>\n<li>Reviews List and Review Form Gutenberg blocks.<\/li>\n<li>Drag-and-drop review form builder.<\/li>\n<li>Review types with configurable targets and schema.org types.<\/li>\n<li>Review moderation with bulk actions.<\/li>\n<li>Owner replies, helpful votes and verified reviews.<\/li>\n<li>Review history and form-answer inspection.<\/li>\n<li>Honeypot, signed time trap, rate limiting and duplicate-review protection.<\/li>\n<li>Streaming CSV\/JSON export.<\/li>\n<li>Batched CSV import with row-level errors.<\/li>\n<li>Background jobs, logs and diagnostics.<\/li>\n<li>Precomputed rating summaries and distributions.<\/li>\n<li>Conditional CSS and JavaScript loading.<\/li>\n<li>AggregateRating JSON-LD for eligible visible review content.<\/li>\n<li>WordPress privacy exporter and eraser integration.<\/li>\n<li>No telemetry.<\/li>\n<\/ul>","raw_excerpt":"Collect, moderate and show ratings and photo reviews on any post or product, plus optional Google reviews. Elementor, blocks and review schema.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/375920","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=375920"}],"author":[{"embeddable":true,"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/universalwp"}],"wp:attachment":[{"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=375920"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=375920"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=375920"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=375920"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=375920"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/vi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=375920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}