{"id":372071,"date":"2026-09-22T10:42:18","date_gmt":"2026-09-22T10:42:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/anti-spam-guard-for-better-messages\/"},"modified":"2026-09-22T19:45:50","modified_gmt":"2026-09-22T19:45:50","slug":"anti-spam-guard-for-better-messages","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/anti-spam-guard-for-better-messages\/","author":23200109,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2","stable_tag":"1.2","tested":"7.1.2","requires":"6.2","requires_php":"7.1","requires_plugins":null,"header_name":"Anti-Spam Guard for Better Messages","header_author":"butterfly888","header_description":"Anti-spam and scam protection for private messages in Better Messages: rate limits, contact filters, bot detection and safety warnings.","assets_banners_color":"759bc2","last_updated":"2026-09-22 19:45:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":76,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"1.1":{"tag":"1.1","author":"butterfly888","date":"2026-09-22 16:15:41","revision":3707744},"1.2":{"tag":"1.2","author":"butterfly888","date":"2026-09-22 19:45:50","revision":3708019}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.jpg":{"filename":"icon-128x128.jpg","revision":3706881,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3706877,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3706880,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3706879,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1","1.2"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2656,282012,166108,273583,2419],"plugin_category":[54],"plugin_contributors":[237423],"plugin_business_model":[],"class_list":["post-372071","plugin","type-plugin","status-publish","hentry","plugin_tags-anti-spam","plugin_tags-better-messages","plugin_tags-bot-protection","plugin_tags-private-messaging","plugin_tags-spam-protection","plugin_category-security-and-spam-protection","plugin_contributors-butterfly888","plugin_committers-butterfly888"],"banners":{"banner":"https:\/\/ps.w.org\/anti-spam-guard-for-better-messages\/assets\/banner-772x250.jpg?rev=3706879","banner_2x":"https:\/\/ps.w.org\/anti-spam-guard-for-better-messages\/assets\/banner-1544x500.jpg?rev=3706880","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/anti-spam-guard-for-better-messages\/assets\/icon-128x128.jpg?rev=3706881","icon_2x":"https:\/\/ps.w.org\/anti-spam-guard-for-better-messages\/assets\/icon-256x256.jpg?rev=3706877","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Protect private conversations in Better Messages from spam and scam attempts with rate limits, contact filters, bot detection and safety warnings. Every module is optional and configurable.<\/p>\n\n<h3>Why is this plugin needed?<\/h3>\n\n<p>Spam protection has become more difficult.<\/p>\n\n<p>Modern bots do not always behave like obvious bots. Some can complete registration forms, work with automated browsers and behave enough like a normal visitor to get through basic anti bot measures. CAPTCHAs can help, but they are not a complete solution either.<\/p>\n\n<p>There is another problem with private communities: <strong>most protection stops at the login or registration stage.<\/strong><\/p>\n\n<p>A bot may create an account in a relatively human way, wait until the account is accepted and then let automation take over. Once logged in, it can start sending private messages to other members without passing through the same protections that were used during registration.<\/p>\n\n<p>This plugin was built specifically for that part of the problem.<\/p>\n\n<p>It adds protection to the private messaging activity itself. Instead of relying on a single CAPTCHA or trying to identify every possible bot, it looks at behaviour and message patterns inside Better Messages.<\/p>\n\n<p>That includes things such as:<\/p>\n\n<ul>\n<li>How quickly a new account starts conversations<\/li>\n<li>How many new conversations it starts<\/li>\n<li>Whether it repeatedly sends the same message<\/li>\n<li>Whether it shares phone numbers, e mail addresses or links<\/li>\n<li>Whether messages contain known messenger patterns<\/li>\n<li>Whether a browser reports inconsistent information<\/li>\n<li>Whether several signals appear together<\/li>\n<\/ul>\n\n<p>The goal is not to find one perfect way to identify a bot. <strong>It is to make automated abuse harder at the point where it actually happens.<\/strong><\/p>\n\n<p>The plugin comes with sensible defaults, but every community is different. Use <strong>Log only<\/strong> to see how the rules behave on your own site before deciding what you want to block.<\/p>\n\n<h3>Based on real and thoroughly tested scenarios<\/h3>\n\n<p>This plugin was built to solve a real problem.<\/p>\n\n<p>The site it was built for is a friendly community where members can chat privately with each other. Registration was already protected, comment forms were covered and public spam was under control. Yet new accounts kept appearing in private inboxes with the same opening lines, the same stories and the same requests to continue the conversation on another messenger platform.<\/p>\n\n<p>Blocking one account only meant another would appear. Blocking a keyword was easy to work around and deleting one scam conversation did not stop the same message from being sent to other members. Bots also respected the message delay that can be configured in Better Messages and simply adjusted their behaviour to stay within that limit. Slowing messages down therefore did not stop them. It only made the automated activity look more like normal user behaviour.<\/p>\n\n<p>Most anti spam plugins are designed for comments, forms and public content. They do not address what happens inside a real-time private chat.<\/p>\n\n<p>That is why this plugin was built around the actual problems encountered on a live community.<\/p>\n\n<p><strong>The features were developed from real situations, tested against real examples and refined through use.<\/strong> The defaults are based on observed behaviour rather than theoretical scenarios. Detection rules have also been tested against both common scam patterns and normal messages that should not trigger a filter. The result is a plugin that works with sensible defaults but can also be adjusted to fit your own community.<\/p>\n\n<p>Please treat this plugin as a free resource for the community.<\/p>\n\n<h3>How it works<\/h3>\n\n<p>Three principles guide the plugin:<\/p>\n\n<ol>\n<li><strong>Add friction where it helps.<\/strong> The goal is to slow down automated abuse without making normal conversations difficult.<\/li>\n<li><strong>Observe before you block.<\/strong> Detection modules can start in <strong>Log only<\/strong> mode so you can see what they catch before enabling blocking.<\/li>\n<li><strong>Your community, your settings.<\/strong> Durations, thresholds, word lists and messages can all be configured in the admin.<\/li>\n<\/ol>\n\n<p>The plugin protects logged-in members. Better Messages guest chats (visitors without an account) are outside its scope.<\/p>\n\n<h3>Features<\/h3>\n\n<h3>New account limits<\/h3>\n\n<p>New accounts are often used to send messages at scale.<\/p>\n\n<p>You can set:<\/p>\n\n<ul>\n<li>A cooldown after registration before a new conversation can be started<\/li>\n<li>A limit on how many new conversations a young account can start per hour<\/li>\n<li>How long an account is considered new<\/li>\n<\/ul>\n\n<p>Replies in existing conversations are not limited. A new member can still have a normal conversation with someone they have already contacted.<\/p>\n\n<h3>Contact sharing filter<\/h3>\n\n<p>Detect e mail addresses, phone numbers and links in private messages.<\/p>\n\n<p>Each type can independently be set to:<\/p>\n\n<ul>\n<li>Block<\/li>\n<li>Log only<\/li>\n<li>Off<\/li>\n<\/ul>\n\n<p>The default detection covers common local and international phone formats, e mail addresses, bare domains and common messenger invite links.<\/p>\n\n<p>Phone prefixes can be configured for your own country.<\/p>\n\n<p>The detection rules have been tested against legitimate content too, including dates, file names and version numbers.<\/p>\n\n<h3>Extra link patterns<\/h3>\n\n<p>Add your own messenger or service patterns to the link filter.<\/p>\n\n<p>This is useful for services that are specific to your region or community, such as Zalo, LINE or KakaoTalk.<\/p>\n\n<p>Patterns are matched case insensitively. You only need to enter the pattern itself. You do not need to add <code>https:\/\/<\/code>.<\/p>\n\n<h3>Bad word and messenger filter<\/h3>\n\n<p>Use an editable keyword list to detect mentions of services such as WhatsApp, Telegram, Snapchat, Instagram, Discord, Kik, Viber, WeChat and Signal. Add one word or phrase per line and choose <strong>Block<\/strong>, <strong>Log only<\/strong> or <strong>Off<\/strong>. You can apply the filter to all accounts or only new accounts and optionally temporarily lock an account after repeated matches within a configurable retention window. Because keyword matching is less precise than the contact filter, <strong>Log only<\/strong> is recommended when setting it up.<\/p>\n\n<h3>Duplicate message check<\/h3>\n\n<p>Detect copy and paste spam across conversations.<\/p>\n\n<p>The plugin counts identical messages per user within a configurable time window. Both the message threshold and the time window are configurable.<\/p>\n\n<p>The check works across all conversations, so sending the same message to many different members still counts.<\/p>\n\n<h3>Two step confirmation for private details<\/h3>\n\n<p>For established members, sharing an e mail address or phone number can trigger a confirmation step. The first message is held back and the member sees a short warning, giving them a moment to consider why the other person may be asking for their private details. If they send the exact same message again within the confirmation window, it is delivered. New accounts are handled by the new account rules instead.<\/p>\n\n<h3>Safety warning in the conversation<\/h3>\n\n<p>When a very new account shares an e mail address or phone number, the other participant automatically sees a short safety warning in the conversation. It reminds them to be careful when a new member quickly asks to move the conversation elsewhere or requests private contact details. Nothing is blocked and the sender does not see the warning. The aim is to give members a moment to recognise a potentially risky pattern before sharing their own details. The warning threshold and message are configurable.<\/p>\n\n<h3>Admin e mail alerts<\/h3>\n\n<p>Receive an e mail when the plugin detects a signal such as contact information, a new account limit or duplicate messages.<\/p>\n\n<p>Alerts can be enabled separately for each signal type.<\/p>\n\n<p>A cooldown prevents one active account from generating a large number of identical alerts.<\/p>\n\n<p>Alerts contain information about who triggered the signal, what was detected and when it happened. They do not contain the message itself.<\/p>\n\n<h3>Automation &amp; client-hints checks<\/h3>\n\n<p>Some automated browsers try to look like normal browsers. This check looks for a few clear inconsistencies that can reveal automation.<\/p>\n\n<p>It can detect:<\/p>\n\n<ul>\n<li>Known automation tools such as Puppeteer, Playwright, Selenium, HeadlessChrome and similar tools<\/li>\n<li>A completely missing User Agent<\/li>\n<li>A User Agent that claims Windows 10 or 11 while the browser engine itself reported platform version \"0.x\" - a placeholder no real Windows browser ever sends.<\/li>\n<li>A mismatch between the operating system reported by the User Agent and the platform reported by the browser<\/li>\n<\/ul>\n\n<p>The check only acts on clear signals. Missing client hints are not treated as suspicious, since browsers such as Safari, Firefox and iOS may not send them at all. The Windows version check only applies when the relevant Windows values are present. Other browsers and operating systems are not affected.<\/p>\n\n<p>Use Log only first to see what the check detects on your site before enabling Block.<\/p>\n\n<h3>Cloudflare Turnstile<\/h3>\n\n<p>Optionally add Cloudflare Turnstile for invisible bot verification.<\/p>\n\n<p>Members do not see a puzzle or checkbox. The verification runs in the background. Users who actively block Turnstile with a privacy extension get a friendly notification to allow Cloudflare to run in order to send messages.<\/p>\n\n<p>Turnstile requires Cloudflare keys and is completely optional. The other modules work without Cloudflare.<\/p>\n\n<h3>Editor restore (legacy)<\/h3>\n\n<p>In older versions of Better Messages, when a message is rejected, the message editor is normally cleared.<\/p>\n\n<p>This module restores the text so the member can edit it and try again without having to retype everything.<\/p>\n\n<p>Enable this optional module only while you are still running an older version of Better Messages. It can also still be useful to enable when blocking certain words, as it gives people a chance to change their input.<\/p>\n\n<h3>Excluded users<\/h3>\n\n<p>Add user IDs that should bypass all checks. This is useful for testing and for moderators who should not be affected by new account limits.<\/p>\n\n<h3>Activity log<\/h3>\n\n<p>The plugin can write its decisions to the PHP error log using <code>[BMSG]<\/code> entries.<\/p>\n\n<p>The log shows who triggered a signal, which signal was detected and what action was taken.<\/p>\n\n<p>Message content is never written to the log.<\/p>\n\n<p>This makes <strong>Log only<\/strong> mode useful for tuning the settings based on what actually happens on your site.<\/p>\n\n<h3>Performance<\/h3>\n\n<p>The guard is designed to add as little overhead as possible. Each module only runs when it is relevant, and checks exit early when there is nothing to process. Front end scripts and styles are loaded only when needed, while counters and temporary data use lightweight cached storage.<\/p>\n\n<p>The result is a guard that protects private messages without adding unnecessary work to the rest of your site.<\/p>\n\n<h3>Rigorously tested<\/h3>\n\n<p>The plugin has been thoroughly tested in both automated tests and a live community. The detection rules, duplicate detection, admin interface and individual modules are all covered by testing.<\/p>\n\n<p>There are more than 90 automated assertions, all passing before a release. The plugin has also been tested against real scam attempts and normal user behaviour.<\/p>\n\n<p>The features were developed from real situations, tested against real examples and refined through use.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin includes an optional Cloudflare Turnstile anti-spam module. It is disabled by default and does nothing until an administrator enables it in the plugin settings.<\/p>\n\n<p>When enabled, the plugin:<\/p>\n\n<ul>\n<li>loads the official Cloudflare Turnstile widget script from https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js (required by Cloudflare's implementation guide; it cannot be bundled locally), and<\/li>\n<li>performs server-side verification of Turnstile tokens by POSTing to https:\/\/challenges.cloudflare.com\/turnstile\/v0\/siteverify.<\/li>\n<\/ul>\n\n<p>Turnstile is an interactive security service: when active, visitor interaction with the widget is processed by Cloudflare under Cloudflare's own terms and privacy policy. No message content is sent to Cloudflare; only the widget token is verified.<\/p>\n\n<p>The widget script and server-side verification are provided by Cloudflare, Inc.:\n* <strong>Cloudflare Terms of Service:<\/strong> <a href=\"https:\/\/www.cloudflare.com\/terms\/\">https:\/\/www.cloudflare.com\/terms\/<\/a>\n* <strong>Cloudflare Privacy Policy:<\/strong> <a href=\"https:\/\/www.cloudflare.com\/privacypolicy\/\">https:\/\/www.cloudflare.com\/privacypolicy\/<\/a><\/p>\n\n<h3>Requirements<\/h3>\n\n<ul>\n<li>WordPress 5.8 or newer<\/li>\n<li>PHP 7.1 or newer<\/li>\n<li>The <a href=\"https:\/\/wordpress.org\/plugins\/bp-better-messages\/\">Better Messages<\/a> plugin, installed and active<\/li>\n<\/ul>\n\n<h3>Step by step<\/h3>\n\n<ol>\n<li>In your WordPress admin, go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Upload <code>anti-spam-guard-for-better-messages.zip<\/code> and click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>A new <strong>Anti Spam Guard<\/strong> item appears in the admin menu.<\/li>\n<li>Enable the modules you want to use.<\/li>\n<li>Start with <strong>Log only<\/strong> for the detection modules and review the results for one or two weeks before enabling Block where appropriate.<\/li>\n<li>If you want invisible bot verification, enter your Cloudflare Turnstile keys under <strong>Advanced<\/strong>.<\/li>\n<\/ol>\n\n<p>No settings are required. The plugin remains inactive until you enable a module.<\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is released under the GPL v2 license to comply with WordPress plugin guidelines.<\/p>\n\n<h3>Credits<\/h3>\n\n<p>Developed by Butterfly88<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"1.%20does%20this%20work%20without%20better%20messages%3F\"><h3>1. Does this work without Better Messages?<\/h3><\/dt>\n<dd><p>No. The plugin hooks directly into the Better Messages message pipeline. Without Better Messages active, the guard does nothing.<\/p><\/dd>\n<dt id=\"2.%20will%20it%20block%20innocent%20members%3F\"><h3>2. Will it block innocent members?<\/h3><\/dt>\n<dd><p>Detection modules can always start in <strong>Log only<\/strong> mode so you can see what they catch before enabling blocking.<\/p>\n\n<p>The detection rules are tested against both suspicious and legitimate input. Threshold based modules such as duplicate detection and new account limits are designed around behaviour that differs from normal member activity.<\/p><\/dd>\n<dt id=\"3.%20are%20guest%20chat%20and%20group%20chat%20also%20protected%3F\"><h3>3. Are guest chat and group chat also protected?<\/h3><\/dt>\n<dd><p>No. The plugin primarily focuses on logged-in users. Messages sent by guests or in group chats are not covered.<\/p><\/dd>\n<dt id=\"4.%20where%20can%20i%20see%20what%20the%20guard%20did%3F\"><h3>4. Where can I see what the guard did?<\/h3><\/dt>\n<dd><p>You can use the admin alert e mails and the <code>[BMSG]<\/code> entries in your PHP error log.<\/p>\n\n<p>With <code>WP_DEBUG<\/code> enabled, this is normally <code>wp-content\/debug.log<\/code>.<\/p>\n\n<p>Neither contains message content.<\/p><\/dd>\n<dt id=\"5.%20why%20was%20a%20message%20containing%20%22call%20me%20at%20%5Bphone%20number%5D%22%20blocked%3F\"><h3>5. Why was a message containing \"call me at [phone number]\" blocked?<\/h3><\/dt>\n<dd><p>The contact filter detected the phone number and the phone action is set to Block. Hard blocking only applies to accounts younger than the minimum contact age; accounts past that age are logged and alerted but allowed through (with the two step confirmation for e mail and phone when that module is on).<\/p>\n\n<p>You can change the phone action to <strong>Log only<\/strong> or <strong>Off<\/strong> under Contact Filter.<\/p><\/dd>\n<dt id=\"6.%20will%20a%20date%20such%20as%20%2206-08-1962%22%20be%20detected%20as%20a%20phone%20number%3F\"><h3>6. Will a date such as \"06-08-1962\" be detected as a phone number?<\/h3><\/dt>\n<dd><p>No. This case is included in the automated test suite.<\/p><\/dd>\n<dt id=\"7.%20does%20it%20slow%20down%20my%20site%3F\"><h3>7. Does it slow down my site?<\/h3><\/dt>\n<dd><p>The guard only runs on the private message send path.<\/p>\n\n<p>Counters use transients and store hashes rather than message text. Age lookups are cached per request and the front end script only loads when a relevant module is enabled.<\/p><\/dd>\n<dt id=\"8.%20what%20about%20member%20privacy%3F\"><h3>8. What about member privacy?<\/h3><\/dt>\n<dd><p>Logs and alert e mails contain information about the detected signal but never the message content.<\/p>\n\n<p>The duplicate checker stores one way hashes rather than message text. Client hints store the reported platform version and the browser's User Agent for 24 hours. The bad word escalation stores the first 160 characters of a matched message with the user's account, so repeated violations can be reviewed.<\/p>\n\n<p>No data leaves your server except for the optional Turnstile verification, which communicates with Cloudflare.<\/p><\/dd>\n<dt id=\"9.%20does%20the%20turnstile%20check%20slow%20down%20sending%20messages%3F\"><h3>9. Does the Turnstile check slow down sending messages?<\/h3><\/dt>\n<dd><p>No. Verification runs in the background while members chat; a passed check is remembered for 15 minutes. A send never waits on Cloudflare \u2014 it either passes instantly from cache or is refused immediately with a clear message, while the background check finishes seconds later for the next attempt.<\/p><\/dd>\n<dt id=\"10.%20why%20did%20a%20member%20see%20%22the%20security%20check%20was%20not%20finished%20yet%22%3F\"><h3>10. Why did a member see \"The security check was not finished yet\"?<\/h3><\/dt>\n<dd><p>The invisible check can take a second or two after a page loads. If a member sends a message during this brief window, it may be refused once due to a race condition. This is a temporary race condition, not a block. The member can simply send the message again a few seconds later.<\/p><\/dd>\n<dt id=\"11.%20can%20i%20change%20the%20messages%20members%20see%3F\"><h3>11. Can I change the messages members see?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Anti Spam Guard \u2192 Message Texts<\/strong>.<\/p>\n\n<p>Each block, confirmation and warning message has its own setting. Leaving a field empty uses the built in translatable default.<\/p><\/dd>\n<dt id=\"12.%20is%20it%20translation%20ready%3F\"><h3>12. Is it translation ready?<\/h3><\/dt>\n<dd><p>Yes. Admin and member facing text is translation ready using the <code>anti-spam-guard-for-better-messages<\/code> text domain.<\/p><\/dd>\n<dt id=\"13.%20does%20the%20duplicate%20check%20block%20typical%20short%20messages%20such%20as%20%22haha%22%3F\"><h3>13. Does the duplicate check block typical short messages such as \"haha\"?<\/h3><\/dt>\n<dd><p>No. Messages shorter than the minimum length (default 40 characters, configurable) never enter the duplicate check at all. Both the threshold and the time window are configurable.<\/p><\/dd>\n<dt id=\"14.%20do%20blocked%20attempts%20count%20against%20the%20new-account%20limits%3F\"><h3>14. Do blocked attempts count against the new-account limits?<\/h3><\/dt>\n<dd><p>No. The per-hour conversation limit only counts messages that were actually delivered. Refused sends (security check, contact filter, duplicates) never count.<\/p><\/dd>\n<dt id=\"15.%20does%20this%20replace%20a%20captcha%3F\"><h3>15. Does this replace a CAPTCHA?<\/h3><\/dt>\n<dd><p>It can be used without a CAPTCHA. Cloudflare Turnstile is optional.<\/p>\n\n<p>The behavioural modules can detect several types of automated abuse without showing a verification prompt to members.<\/p><\/dd>\n<dt id=\"16.%20does%20my%20website%20need%20to%20be%20behind%20cloudflare%3F\"><h3>16. Does my website need to be behind Cloudflare?<\/h3><\/dt>\n<dd><p>No. It uses the optional standalone Cloudflare Turnstile module. So you need that only if you want to use the Turnstile module. All other modules work without it.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2<\/h4>\n\n<ul>\n<li>Security: the opening message of a new conversation is now checked by the same content filters as every other message (contact details, bad words, duplicate check, automation signals). Previously it bypassed them because Better Messages writes the first message directly, without firing the send hook.<\/li>\n<li>Improvement: the safety warning in the conversation now uses the Better Messages colour variables, so it follows the site palette and automatically works in dark mode. Falls back to the original colours on older Better Messages versions.<\/li>\n<li>Performance: removed the last direct database query from the message path. The \"first message of this conversation\" check now listens to Better Messages' own new-thread hook instead of counting messages on every send.<\/li>\n<li>Documentation: the readme now states that guest chat senders (visitors without an account) are not covered.<\/li>\n<\/ul>\n\n<h4>1.1<\/h4>\n\n<ul>\n<li>Initial release of Anti-Spam Guard for Better Messages<\/li>\n<\/ul>\n\n<p><strong>Do you like this plugin? Please leave a review!<\/strong><\/p>","raw_excerpt":"Anti-spam and scam protection for private messages in Better Messages: rate limits, contact filters, bot detection and safety warnings.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/372071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=372071"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/butterfly888"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=372071"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=372071"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=372071"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=372071"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=372071"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=372071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}