Solid Post Likes
Solid Post Likes
Description
Solid Post Likes adds a customizable like button to your posts, pages, custom post types, WooCommerce products and comments. Zero configuration required — activate, pick your post types and go.
The same button likes and unlikes. Visitors can like too (stored anonymized), or restrict liking to logged-in users.
Where it shows:
- All post types, selectable per post type.
- Single posts, and optionally archives, search results and query loops.
- WooCommerce products — all product types (Subscriptions, Bookings, …).
- Post comments, also on custom post types.
- Anywhere you want via shortcode.
Block and shortcodes:
- Like Button block — drop it anywhere, including inside Query Loops. Counter toggle in the sidebar.
[oacsspl]— the like button. Arguments:post_id,counter=offto hide the count for that instance.[oacsspltop count=5 post_type=post]— the most-liked posts, with counts. Adddays=7for trending (most likes in the last 7 days).[oacsspllist]— the posts the current user likes. Adduser_id=123to show a specific user’s likes.[oacs_spl_profile]— same list, table style.
Control who likes:
- Visitors can like. Since 1.2.0 visitors are remembered via an anonymous browser cookie (no personal data, works behind shared/mobile networks); before that via anonymized IP — the stored address always ends in .0.
- Or logged-in users only: the button and count stay visible, clicking sends visitors to the login page (or a custom URL).
- One-way likes: optionally disable unliking to prevent accidental removals.
Design:
- 29 icons for the liked and unliked state, individually selectable.
- Custom text for like and unlike.
- Color, size and padding controls for icon, text and counter.
For admins:
- Sortable “Likes” column on the post list of every enabled post type.
- Liked posts shown in the backend user profile.
- Set or reset like counts manually.
- Disable likes per post ID.
For developers:
- REST API:
GET /wp-json/spl/v1/likes/<id>andPOST /wp-json/spl/v1/likes/<id>/toggle— for headless and mobile use (Application Passwords supported). - Every like is stored as its own database row with a timestamp (since 1.2.0) — no more lost likes under concurrent clicks, and trending queries become possible.
- Place the button via your own theme hook (posts and WooCommerce separately).
before_oacs_spl_button/after_oacs_spl_buttonfilters for custom content around the button.- Full page cache support: like state and counts load via Ajax, including a fresh nonce, so cached pages keep working.
Installation
- Upload the plugin files to the
/wp-content/plugins/solid-post-likesdirectory, or install the plugin through the WordPress plugins screen directly. - Activate the plugin through the ‘Plugins’ menu in WordPress.
- Navigate to the new “oacs SPL” main menu item to configure.
Screenshots
Faq
No. This plugin uses the same button for like and unlike. You can however set different icons for the liked and unliked state.
Yes. Use [oacsspltop count=10] to show the most-liked posts sorted by likes, and sort the admin post list by the Likes column.
Yes. Enable “Enable Likes in Archives and Query Loops” in the settings. The shortcode then also works in custom loops via do_shortcode( '[oacsspl]' ).
Yes. Enable “Only Logged-in Users Can Like”. The button and count stay visible for visitors; clicking sends them to the login page or a custom URL of your choice.
Yes. Enable “Enable full page caching support” in the Developer tab. Buttons then fetch their live state (and a fresh security nonce) on page load.
In a limited way. Use [oacsspllist] to show the posts the current user likes, or [oacsspllist user_id=123] for a specific user.
Yes. [oacsspltop days=7] lists the posts with the most likes recorded in the last 7 days. Likes made before 1.2.0 count towards the post’s last like date.
Yes, since 1.2.0. GET /wp-json/spl/v1/likes/<id> returns the count, whether the current visitor liked it, and a nonce. POST /wp-json/spl/v1/likes/<id>/toggle likes/unlikes — authenticate with an Application Password (headless/mobile) or pass the nonce from the GET response. Comments: add ?type=comment.
Your existing likes and counts are kept. Likes move into a dedicated database table the first time each post is viewed or liked; the old data stays in place untouched as a safety net. One caveat: if you downgrade to 1.1.x and later upgrade again, likes made during the downgrade window are not merged back — the post returns to its pre-downgrade state.
Reviews
Good Plugin
By Dipto Nath (diptonath) on February 13, 2025
Hello,
It works good. Is there any option when user login to like the post. (Only login user like post)
Superb support from these developers
By aseverirene on February 15, 2024
Asked for help and within one day, the brilliant answer came through. I am ever so pleased!!
Support shortcode, easy to use
By rockthan on December 18, 2023
Very easy to use, it supports shortcodes too.
Excellent plugin and fantastic support
By Xaifu (xaifu) on September 10, 2023
I had looked for many similar plugins but it seems that nowadays they are not as common as they were years ago. Finally, I came across this one that fulfilled all the needs I required.
It is easy to use, elegant and GDPR compliant.
I highly recommend it!
Excellent and customisable
By simonclay on January 18, 2023
An excellent plugin. I implemented it into an Elementor Single Post and Post Loop template with relative ease because of the many options available.
The 'Full Page Caching support' option is great too as I, like many use caching on my sites.
Very good plugin and really fast support
By andreylyapin on July 12, 2022
Simple and easy
By ciscordpress on January 27, 2022
Solid indeed.
By con (conschneider) on April 14, 2022
Changelog
1.2.0
- New: Like Button block for the block editor — works inside Query Loops, counter toggle in the sidebar.
- New: REST API —
GET /wp-json/spl/v1/likes/<id>andPOST /wp-json/spl/v1/likes/<id>/toggle(Application Passwords supported). - New: trending —
[oacsspltop days=7]ranks by likes recorded within the window. - New:
[oacsspllist user_id=123]— show a specific user’s liked posts. - New: every like is stored as its own row in a dedicated table with a timestamp. Fixes likes lost under simultaneous clicks and removes the scaling ceiling of one serialized array per post. Existing likes migrate automatically per post on first view; legacy data is left untouched as a rollback safety net. Manually set counts are preserved.
- New: visitors are remembered via an anonymous browser cookie instead of only the anonymized IP — likes from shared and mobile networks no longer collide. Existing IP-based likes remain recognized.
- Fix:
[oacsspllist]and the profile likes list were capped at 10 posts.
1.1.0
- New: Enable Likes in Archives and Query Loops setting — buttons on archive pages, search results and custom query loops.
- New: Only Logged-in Users Can Like setting with optional custom login URL — visitors see the button and count, clicking sends them to the login page.
- New: Disable Unlike setting — one-way likes, prevents accidental unlikes.
- New:
[oacsspltop]shortcode — list the most-liked posts (count,post_type,show_countattributes). - New:
counter=offattribute on[oacsspl]— hide the counter per instance. - New: sortable “Likes” column on the admin post list of every enabled post type.
- Fix: fatal error
count(): Argument #1 ($value) must be of type Countable|arraywhen a like targeted an invalid post or comment ID. - Fix: the “Set Like Position via Hook” developer setting for WooCommerce was never applied due to a variable typo.
- Fix: the “Set Like Position via Hook” developer setting for posts printed escaped markup instead of the button.
- Fix: liking without JavaScript showed raw JSON instead of returning to the post.
- Fix: cache support now refreshes post buttons too (previously only comment buttons) and delivers a fresh nonce, so likes keep working on pages served from a long-lived full page cache.
- Fix: the “You Like” lists could include posts liked by a different user whose ID contains the same digits.
- Fix:
[oacsspllist]printed broken list markup and queried with user ID 0 for visitors — visitors now get a login hint. - Fix: script/style cache busting used a stale internal version number.
- Updated Carbon Fields to 3.6.9 (PHP 8.2+ and current WordPress compatibility).
- Text domain changed to
solid-post-likesso translations can be delivered via wordpress.org language packs.
1.0.8
- Fix: Shortcode like list outputted in header in some cases.
- Fix: Add none to post type setting to allow shortcode usage only.
1.0.7
- Fix: Shortcode like button outputted in header in some cases.
- Fix: Attempt to read property “ID” on int notice on like list.
1.0.6
- Add priority to comment_text to fix deprecated message.
- Renamed CSS class to spl-is-active
- Likes can now be set to zero via the settings.
- Fix: Undefined Variable post.
1.0.5
- Update Carbon Fields.
- Fix individual comment like.
1.0.4
- Fix: array_key_exists on int error occuring on some systems.
1.0.3
- Fix: Undefined index: post_id
- Fix: Trying to access array offset on value of type int
1.0.2
- Add post_id as [oacsspl] shortcode argument. You can now use [oacsspl post_id=123] to show post likes of post with the ID = 123. Fallback post_id value is the current post ID.
1.0.1
- Fix [oacsspl] output by replacing escape function.
1.0
- Initial release.



![The Like Button block in a Query Loop, plus <code>[oacsspltop]</code> trending and all-time lists.](https://ps.w.org/solid-post-likes/assets/screenshot-4.png?rev=3609436)