WP-PostRatings
by Lester Chan 4.3 (179 reviews)

WP-PostRatings

Adds an AJAX rating system for your WordPress site's content.

WP-PostRatings ranks #1,097 among WordPress.org plugins with 20,000+ active installations, is #22 of 1,206 in the Ratings & Reviews category, a 4.3/5 rating from 179 reviews, and was last updated Sep 2, 2026. Data from WordPress.org, refreshed twice daily — see methodology.

Compatible with WP 7.1
v2.0.2 Current Version v2.0.2
Updated 2 weeks ago Last Update on 02 Sep, 2026
Refreshed 12 hours ago Last Refreshed on
#22 of 1,206 in Ratings & Reviews Top 5% by installs Downloads -45.7% this week Actively maintained
View on WordPress.org
Rank
#1,097
No change
Active Installs
20K+
-34.1%
KW Avg Position
30
No change
Downloads
2.3M
+15 today
Support Resolved
75%
No change
Rating
86%
Review 4.3 out of 5
4.3 (179 reviews)

Next Milestone 30K

Total Progress 99.2%
20K+ 30K+
3
Ranks to Climb
-
Growth Needed
8,000,000
Active Installs
Pro

Unlock Exact Install Count

See the precise estimated active installs for this plugin, calculated from real-time ranking data.

  • Exact install estimates within tiers
  • Track install growth over time
  • Milestone progress predictions
Upgrade to Pro
Need 84 more installs to reach 30K+

Rank Changes

1,041 1,069 1,097 1,124 1,152 10-09-2026 11-09-2026 12-09-2026 13-09-2026 14-09-2026 15-09-2026 16-09-2026 17-09-2026
1,041 1,069 1,098 1,126 1,154 02-09-2026 03-09-2026 04-09-2026 05-09-2026 06-09-2026 07-09-2026 08-09-2026 09-09-2026 10-09-2026 11-09-2026 12-09-2026 13-09-2026 14-09-2026 15-09-2026 16-09-2026 17-09-2026
Current #1,097
Change
Best #

Upgrade to Pro

Unlock 30-day and 90-day rank history charts with a Pro subscription.

Upgrade Now

Active Installs Growth

Active Installs 0,000,000+
Growth +0.0%
Peak 0,000,000

Downloads Growth

0 50 100 150 200 10-09-2026 11-09-2026 12-09-2026 13-09-2026 14-09-2026 15-09-2026 16-09-2026 17-09-2026
0 500 1K 1.5K 2K 2.5K 3K 02-09-2026 03-09-2026 04-09-2026 05-09-2026 06-09-2026 07-09-2026 08-09-2026 09-09-2026 10-09-2026 11-09-2026 12-09-2026 13-09-2026 14-09-2026 15-09-2026 16-09-2026 17-09-2026
Downloads
Growth
Peak

Upgrade to Pro

Unlock 30-day, 90-day, and yearly download history charts with a Pro subscription.

Upgrade Now

Reviews & Ratings

4.3
179 reviews
Overall 86%
5
133 (74%)
4
15 (8%)
3
9 (5%)
2
3 (2%)
1
19 (11%)

Support Threads Overview

Resolved
Unresolved
4
Total Threads
3
Resolved
1
Unresolved
75%
Resolution Rate

Security History

Source: WPVulnerability

8 known vulnerabilities on record · 0 in the last 24 months · checked 1 week ago

  1. WP-PostRatings [wp-postratings] < 1.91.2 (closed)

    CVE-2024-39659 · Fixed in v1.91.2

  2. WP-PostRatings [wp-postratings] < 1.65 (closed)

    CVE-2011-10006 · Fixed in v1.65

  3. WP-PostRatings [wp-postratings] < 1.86.1 (closed)

    CVE-2021-25117 · Fixed in v1.86.1

  4. WP-PostRatings [wp-postratings] < 1.91.1 (closed)

    CVE-2023-40332 · Fixed in v1.91.1

  5. WP-PostRatings [wp-postratings] < 1.90 (closed)

    CVE-2022-36422 · Fixed in v1.90

  6. WP-PostRatings [wp-postratings] < 1.86.1 (closed)

    CVE-2021-25117 · Fixed in v1.86.1

  7. WP-PostRatings [wp-postratings] < 1.86.1 (closed)

    Fixed in v1.86.1

  8. WP-PostRatings [wp-postratings] < 1.62 (closed)

    CVE-2011-4646 · Fixed in v1.62

TL;DR

AI summary of the plugin's readme

This plugin is for WordPress site owners who want visitors to rate their posts or pages. It adds an AJAX-based rating system that can be inserted into theme templates or embedded into specific content using a shortcode.

  • AJAX rating system
  • Shortcode embedding via [ratings]
  • Display ratings by post ID
  • Display ratings results by post ID
  • Theme template integration

Frequently Asked Questions

Common questions about WP-PostRatings

Go to WP-Admin -> Ratings -> Settings and look under Individual Rating Text and Value. Each step on the scale has its own pair of colour swatches, in the Rated and Not rated columns, which is what the old stars_crystal and stars_dark image sets were for. Hovering uses the rated colour. If you would rather tell "about to pick" apart from "already recorded", set --wp-postratings-color-hover in your theme.
Anything beyond the two colours is a CSS custom property on .wp-postratings, so this is all it takes in your theme: .wp-postratings { --wp-postratings-size: 24px; --wp-postratings-gap: 4px; --wp-postratings-color-hover: #f7c56b; } Before 2.0.0 a different colour meant a whole extra folder of images, which is why the plugin shipped stars, stars_crystal and stars_dark separately. They are all the same shape now.
Register it with the wp_postratings_shapes filter. It then appears on the Ratings Settings screen like any built-in shape, and unlike the old approach of dropping a folder into wp-content/plugins/wp-postratings/images/, it survives an update. add_filter( 'wp_postratings_shapes', function ( $shapes ) { $shapes['diamond'] = array( 'type' => 'scale', 'label' => 'Diamonds', 'path' => 'M12 2l10 10-10 10L2 12z', ); return $shapes; } ); The path is SVG path data drawn in a 24x24 box. For an up/down control use 'type' => 'updown' and supply 'up' and 'down' paths instead of 'path'. For a scale whose points are numbers rather than a repeated glyph, use 'type' => 'numeric' and supply no path at all — the position is the glyph: add_filter( 'wp_postratings_shapes', function ( $shapes ) { $shapes['points'] = array( 'type' => 'numeric', 'label' => 'Points', ); return $shapes; } ); A numeric shape is still a scale, so it appears under Scale on the settings screen and everything that reads a rating goes on reading it the same way. Only the drawing changes. Every visitor can rate over and over, or every rating log entry shows the same IP This is about the Header That Contains The IP field on the Ratings Settings screen. Leave it blank unless your site is genuinely behind a reverse proxy or CDN such as Cloudflare. Blank means the plugin uses the address your web server actually saw, which is what you want on a normal host. If you are behind a proxy, name the exact header your proxy sets, for example HTTP_CF_CONNECTING_IP for Cloudflare or HTTP_X_FORWARDED_FOR for most load balancers. Two things are worth knowing: A visitor can send any header they like. If you name a header your own stack does not set and overwrite, anyone can put whatever they want in it and rate as many times as they please. X-Forwarded-For is a list, client, proxy1, proxy2. As of 2.0.0 the plugin reads the first valid address in that list rather than storing the whole string. Before 2.0.0 it stored the whole string, which meant a visitor could append one more address and appear to be somebody new on every request. Because the stored value has changed shape, rating logs recorded through such a header before 2.0.0 will not match any more, and some visitors may be able to rate one more time. Logs recorded without the field set are unaffected.
<?php add_filter( 'wp_postratings_schema_itemtype', 'wp_postratings_schema_itemtype' ); function wp_postratings_schema_itemtype( $itemtype ) { return 'itemscope itemtype="https://schema.org/Recipe"'; } ?> The default schema type is 'Article', if you want to change it to 'Recipe', you need to make use of the wp_postratings_schema_itemtype filter as shown in the sample code above.
<?php add_filter( 'wp_postratings_site_logo', 'wp_postratings_site_logo' ); function wp_postratings_site_logo( $url ) { return 'https://example.com/logo.png'; } ?> By default, the plugin will use your site header image URL as your site logo. If you want to change it, you need to make use of the wp_postratings_site_logo filter as shown in the sample code above.
add_filter( 'wp_postratings_ratings_image_alt', function ( $label ) { return $label; } ); This is the description a screen reader reads out for a displayed rating, such as "4 votes, average: 3.70 out of 5". Since 2.0.0 the ratings are drawn with CSS rather than images, so there is no alt or title attribute involved; the value becomes the aria-label on the rating. Returning an empty string removes it, which is what this filter was usually used for. Be aware that it leaves the rating with no accessible name at all, so anyone using a screen reader is told nothing about it. Prefer rewording it over removing it.
add_filter( 'wp_postratings_display_comment_author_ratings', '__return_true' ); By default, the comment author ratings are not displayed. If you want to display the ratings, you need to make use of the wp_postratings_display_comment_author_ratings filter as shown in the sample code above.
function custom_rating_cookie_expiration() { return strtotime( 'tomorrow' ) ; } add_filter( 'wp_postratings_cookie_expiration', 'custom_rating_cookie_expiration', 10, 0 ); The default cookie expiration if 'time() + 30000000', if you want to change the lenght of the experation, you need to make use of the wp_postratings_cookie_expiration filter as shown in the sample code above.
Most restyling needs no CSS file at all any more: the colours are a setting, and the size, spacing and hover colour are custom properties. See the two questions above first. If you do want to replace the stylesheet wholesale, WP-PostRatings loads wp-postratings.css from your theme's directory (or its css/ subdirectory) when that file exists, and its own copy otherwise, so an upgrade will not overwrite your styles. Note the filename changed in 2.0.0: it was postratings-css.css before. A theme still shipping the old name is simply ignored, and the plugin's own stylesheet loads instead. There is no separate RTL stylesheet any more either, because the rules use logical properties. My own code renders a rating and the page loads no stylesheet or script The head pass looks for the ratings widget, a [ratings] shortcode and the block, and anything rendering after it — a template tag, a rating in a loop page, the comment author strip — asks for the assets as it renders and gets them from the footer. Neither reaches rating markup fetched over admin-ajax.php or the REST API into a page that itself shows no rating: the fetch has no footer to enqueue into, and the page carried nothing for the head to find. The symptom is a rating that will not vote, drawn as bare radio buttons because every rating shape is a CSS mask in that stylesheet. Say so from the page that will hold the rating: add_filter( 'wp_postratings_needs_assets', '__return_true' ); Anywhere the rating can be predicted this early will do. Code that already runs later in the page — a the_content filter inserting a placeholder, say — can call WP_PostRatings_Template::request_assets() instead, which is the same request the render paths make and is picked up by the footer pass.
Go to WP-Admin -> Appearance -> Widgets The widget name is Ratings. To Display Lowest Rated Post <?php if (function_exists('get_lowest_rated')): ?> <ul> <?php get_lowest_rated(); ?> </ul> <?php endif; ?> Default: get_lowest_rated('both', 0, 10) The value 'both' will display both the lowest rated posts and pages. If you want to display the lowest rated posts only, replace 'both' with 'post'. If you want to display the lowest rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 lowest rated posts/pages. To Display Lowest Rated Post By Tag <?php if (function_exists('get_lowest_rated_tag')): ?> <ul> <?php get_lowest_rated_tag(TAG_ID); ?> </ul> <?php endif; ?> Default: get_lowest_rated_tag(TAG_ID, 'both', 0, 10) Replace TAG_ID will your tag ID. If you want it to span several categories, replace TAG_ID with array(1, 2) where 1 and 2 are your categories ID. The value 'both' will display both the lowest rated posts and pages. If you want to display the lowest rated posts only, replace 'both' with 'post'. If you want to display the lowest rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 lowest rated posts/pages. To Display Lowest Rated Post In A Category <?php if (function_exists('get_lowest_rated_category')): ?> <ul> <?php get_lowest_rated_category(CATEGORY_ID); ?> </ul> <?php endif; ?> Default: get_lowest_rated_category(CATEGORY_ID, 'both', 0, 10) Replace CATEGORY_ID will your category ID. If you want it to span several categories, replace CATEGORY_ID with array(1, 2) where 1 and 2 are your categories ID. The value 'both' will display both the lowest rated posts and pages. If you want to display the lowest rated posts only, replace 'both' with 'post'. If you want to display the lowest rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 lowest rated posts/pages. To Display Highest Rated Post <?php if (function_exists('get_highest_rated')): ?> <ul> <?php get_highest_rated(); ?> </ul> <?php endif; ?> Default: get_highest_rated('both', 0, 10) The value 'both' will display both the highest rated posts and pages. If you want to display the highest rated posts only, replace 'both' with 'post'. If you want to display the highest rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 highest rated posts/pages. To Display Highest Rated Post By Tag <?php if (function_exists('get_highest_rated_tag')): ?> <ul> <?php get_highest_rated_tag(TAG_ID); ?> </ul> <?php endif; ?> Default: get_highest_rated_tag(TAG_ID, 'both', 0, 10) Replace TAG_ID will your tag ID. If you want it to span several categories, replace TAG_ID with array(1, 2) where 1 and 2 are your categories ID. The value 'both' will display both the highest rated posts and pages. If you want to display the highest rated posts only, replace 'both' with 'post'. If you want to display the highest rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 highest rated posts/pages. To Display Highest Rated Post In A Category <?php if (function_exists('get_highest_rated_category')): ?> <ul> <?php get_highest_rated_category(CATEGORY_ID); ?> </ul> <?php endif; ?> Default: get_highest_rated_category(CATEGORY_ID, 'both', 0, 10) Replace CATEGORY_ID will your category ID. If you want it to span several categories, replace CATEGORY_ID with array(1, 2) where 1 and 2 are your categories ID. The value 'both' will display both the highest rated posts and pages. If you want to display the highest rated posts only, replace 'both' with 'post'. If you want to display the highest rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 highest rated posts/pages. To Display Highest Rated Post Within A Given Period <?php if (function_exists('get_highest_rated_range')): ?> <ul> <?php get_highest_rated_range('1 day'); ?> </ul> <?php endif; ?> Default: get_highest_rated_range('1 day', 'both', 10) The value '1 day' will be the range that you want. You can use '2 days', '1 month', etc. The value 'both' will display both the most rated posts and pages. If you want to display the most rated posts only, replace 'both' with 'post'. If you want to display the most rated pages only, replace 'both' with 'page'. The value 10 will display only the top 10 most rated posts/pages. To Display Most Rated Post <?php if (function_exists('get_most_rated')): ?> <ul> <?php get_most_rated(); ?> </ul> <?php endif; ?> Default: get_most_rated('both', 0, 10) The value 'both' will display both the most rated posts and pages. If you want to display the most rated posts only, replace 'both' with 'post'. If you want to display the most rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 most rated posts/pages. To Display Most Rated Post In A Category <?php if (function_exists('get_most_rated_category')): ?> <ul> <?php get_most_rated_category(CATEGORY_ID); ?> </ul> <?php endif; ?> Default: get_most_rated_category(CATEGORY_ID, 'both', 0, 10) Replace CATEGORY_ID will your category ID. If you want it to span several categories, replace CATEGORY_ID with array(1, 2) where 1 and 2 are your categories ID. The value 'both' will display both the most rated posts and pages. If you want to display the most rated posts only, replace 'both' with 'post'. If you want to display the most rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 most rated posts/pages. To Display Most Rated Post Within A Given Period <?php if (function_exists('get_most_rated_range')): ?> <ul> <?php get_most_rated_range('1 day'); ?> </ul> <?php endif; ?> Default: get_most_rated_range('1 day', 'both', 10) The value '1 day' will be the range that you want. You can use '2 days', '1 month', etc. The value 'both' will display both the most rated posts and pages. If you want to display the most rated posts only, replace 'both' with 'post'. If you want to display the most rated pages only, replace 'both' with 'page'. The value 10 will display only the top 10 most rated posts/pages. To Display Highest Score Post <?php if (function_exists('get_highest_score')): ?> <ul> <?php get_highest_score(); ?> </ul> <?php endif; ?> Default: get_highest_score('both', 0, 10) The value 'both' will display both the most rated posts and pages. If you want to display the most rated posts only, replace 'both' with 'post'. If you want to display the most rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 most rated posts/pages. To Display Highest Score Post In A Category <?php if (function_exists('get_highest_score_category')): ?> <ul> <?php get_highest_score_category(CATEGORY_ID); ?> </ul> <?php endif; ?> Default: get_highest_score_category(CATEGORY_ID, 'both', 0, 10) Replace CATEGORY_ID will your category ID. If you want it to span several categories, replace CATEGORY_ID with array(1, 2) where 1 and 2 are your categories ID. The value 'both' will display both the most rated posts and pages. If you want to display the most rated posts only, replace 'both' with 'post'. If you want to display the most rated pages only, replace 'both' with 'page'. The value 0 refers to the minimum votes required before the post get shown. The value 10 will display only the top 10 most rated posts/pages. To Display Highest Score Post Within A Given Period <?php if (function_exists('get_highest_score_range')): ?> <ul> <?php get_highest_score_range('1 day'); ?> </ul> <?php endif; ?> Default: get_highest_score_range('1 day', 'both', 10) The value '1 day' will be the range that you want. You can use '2 days', '1 month', etc. The value 'both' will display both the most rated posts and pages. If you want to display the most rated posts only, replace 'both' with 'post'. If you want to display the most rated pages only, replace 'both' with 'page'. The value 10 will display only the top 10 most rated posts/pages. To Sort Highest/Lowest Rated Posts $query = new WP_Query( array( 'meta_key' => 'ratings_average', 'orderby' => 'meta_value_num', 'order' => 'DESC', ) ); Or pass the variables in the URL: https://yoursite.com/?r_sortby=highest_rated&r_orderby=desc Replace desc with asc for the lowest rated posts. To Sort Most/Least Rated Posts $query = new WP_Query( array( 'meta_key' => 'ratings_users', 'orderby' => 'meta_value_num', 'order' => 'DESC', ) ); Or pass the variables in the URL: https://yoursite.com/?r_sortby=most_rated&r_orderby=desc Replace desc with asc for the least rated posts. These examples use WP_Query rather than query_posts(), which the old ones called: query_posts() replaces the main query and WordPress has discouraged it for years. To sort the main query instead, use pre_get_posts.

More plugins by Lester Chan

Sign In / Register

You need to sign in or register to use this feature.