{"id":345738,"date":"2026-09-01T02:04:48","date_gmt":"2026-09-01T02:04:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/smeplan-security-shield\/"},"modified":"2026-09-20T12:08:52","modified_gmt":"2026-09-20T12:08:52","slug":"smeplan-security-shield","status":"publish","type":"plugin","link":"https:\/\/fa.wordpress.org\/plugins\/smeplan-security-shield\/","author":11909762,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.7.38","stable_tag":"0.7.38","tested":"7.1.1","requires":"6.1","requires_php":"7.4","requires_plugins":null,"header_name":"SMEPlan Security Shield","header_author":"SMEPlan","header_description":"Scheduled security scanning (files\/DB\/config), baseline\/integrity checks, safe quarantine & rollback, and hardening (login, XML-RPC, REST, headers) for WordPress. Keeps running even when WP-Cron is unreliable, thanks to a watchdog + HMAC-signed REST runner + WP-CLI.","assets_banners_color":"0e1f29","last_updated":"2026-09-20 12:08:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/smeplan.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":288,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.7.31":{"tag":"0.7.31","author":"solotop","date":"2026-09-01 02:04:27","revision":3675152},"0.7.32":{"tag":"0.7.32","author":"solotop","date":"2026-09-06 03:12:26","revision":3682938},"0.7.34":{"tag":"0.7.34","author":"solotop","date":"2026-09-09 08:21:25","revision":3687889},"0.7.35":{"tag":"0.7.35","author":"solotop","date":"2026-09-09 11:19:27","revision":3688195},"0.7.36":{"tag":"0.7.36","author":"solotop","date":"2026-09-19 19:02:46","revision":3703596},"0.7.37":{"tag":"0.7.37","author":"solotop","date":"2026-09-19 19:19:45","revision":3703613},"0.7.38":{"tag":"0.7.38","author":"solotop","date":"2026-09-20 12:08:52","revision":3704219}},"upgrade_notice":{"0.7.38":"<p>Security release, recommended for everyone. Fixes a re-validation pass that could never finish after 0.7.36 (and re-scanned three components every minute meanwhile), a failed quarantine that looked successful and let a live file be whitelisted, directory quarantines restored without any checksum, a purge that followed a planted symlink, site administrators on multisite changing files shared by every site, and a scanner that could freeze on one database row while the dashboard stayed green.<\/p>","0.7.37":"<p>Fixes three ways a defence could be switched off without anyone seeing it: database findings collapsing to a single index entry (which an attacker can steer), one partial settings write turning off fourteen hardening flags at once, and a cron_secret rotation silently blanking the whole event log. Settings changes are now recorded.<\/p>","0.7.36":"<p>Security fix, recommended for everyone. Four backdoor patterns were invisible to the detector in 0.7.35 and earlier \u2014 anything whose payload sits inside a string literal, including preg_replace with the \/e modifier and ini_set(&#039;auto_prepend_file&#039;, ...). Also fixes a login block that renewed its own expiry, which let anyone lock any account out permanently without credentials, and restores the cap on how many files a single scan may quarantine.<\/p>","0.7.35":"<p>Plugins are now verified against WordPress.org&#039;s official per-file checksums, including files added to a plugin that are not part of the official release. Also flags plugins removed from the directory or abandoned, and makes trust revocable so future detection improvements apply retroactively.<\/p>","0.7.34":"<p>Closes a critical hole: anything able to write into the uploads folder could forge a component backup and have it extracted over a plugin directory on the next Restore. Backups, baselines and scan checkpoints are now signed. Recommended for all sites.<\/p>","0.7.32":"<p>Fixes four ways this plugin could itself lose data or take a site down (a core-file restore leaving the file missing, a rollback overwriting the destination, a backup restore running with the site live, and a stranded .maintenance file after uninstall), stops one large file stalling the scanner, and restores quarantine recovery on sites upgraded from 0.7.26-0.7.30. Adds a Trusted components screen. Recommended for all sites.<\/p>","0.7.31":"<p>Follow-up fixes to 0.7.30: restores legacy-quarantine recovery after a reinstall, stops the scanner from restarting without ever finishing, and hardens the 0.7.30 alert and cron-example fixes. Recommended for all sites.<\/p>","0.7.30":"<p>Fourteen security and correctness fixes from a full review of 0.7.29, several affecting multisite recovery, quarantine rollback, and automatic backups. Recommended for all sites.<\/p>","0.7.29":"<p>Stops WordPress 6.7+ logging a &quot;translation loaded too early&quot; notice on every admin page load. Recommended if your debug log is filling up.<\/p>","0.7.28":"<p>Removes a debug warning added in 0.7.25 that flooded the log on sites with WP_DEBUG enabled. No behaviour change otherwise.<\/p>","0.7.27":"<p>Stops WordPress 6.7+ filling the debug log with a &quot;translation loaded too early&quot; notice on every request. No behaviour change otherwise; 0.7.26&#039;s security fix is included.<\/p>","0.7.26":"<p>Security release. Fixes an arbitrary file write inside the WordPress root: a forged quarantine session could make Rollback overwrite wp-config.php. Affects 0.7.24 and 0.7.25. Update, then review the Remediation screen before clicking Rollback if the site may have been compromised.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3675151,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3675151,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3675151,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3675151,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.7.31","0.7.32","0.7.34","0.7.35","0.7.36","0.7.37","0.7.38"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3675151,"resolution":"1","location":"assets","locale":"","width":1616,"height":779}},"screenshots":{"1":"SMEPlan Security Shield Dashboard and Security Scanner Overview."}},"plugin_section":[],"plugin_tags":[8646,1174,31093,163531,600],"plugin_category":[54],"plugin_contributors":[278558],"plugin_business_model":[],"class_list":["post-345738","plugin","type-plugin","status-publish","hentry","plugin_tags-backdoor","plugin_tags-firewall","plugin_tags-hardening","plugin_tags-malware-scan","plugin_tags-security","plugin_category-security-and-spam-protection","plugin_contributors-solotop","plugin_committers-solotop"],"banners":{"banner":"https:\/\/ps.w.org\/smeplan-security-shield\/assets\/banner-772x250.png?rev=3675151","banner_2x":"https:\/\/ps.w.org\/smeplan-security-shield\/assets\/banner-1544x500.png?rev=3675151","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/smeplan-security-shield\/assets\/icon-128x128.png?rev=3675151","icon_2x":"https:\/\/ps.w.org\/smeplan-security-shield\/assets\/icon-256x256.png?rev=3675151","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/smeplan-security-shield\/assets\/screenshot-1.png?rev=3675151","caption":"SMEPlan Security Shield Dashboard and Security Scanner Overview."}],"raw_content":"<!--section=description-->\n<p>SMEPlan Security Shield is a free, open-source security plugin built around a practical WordPress operations checklist: it watches the 3 most common attack surfaces (OWASP-class attacks plus WordPress-specific ones, persistence mechanisms, and entry vectors), detects issues with baseline\/checksum + signature + thresholded heuristics, and remediates safely (quarantine instead of outright deletion; 1-click rollback).<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Batched, checkpointed file scanning<\/strong>: prioritizes <code>mu-plugins<\/code>, drop-ins, the active theme\/plugins, and <code>uploads<\/code>; never loads the whole file tree into RAM at once.<\/li>\n<li><strong>Safe database scanning<\/strong>: keyset pagination (no <code>OFFSET<\/code>) over <code>options<\/code>\/<code>posts<\/code>\/<code>postmeta<\/code>; only flags a row when it decodes into an actually executable PHP\/JS token, skipping image data URIs.<\/li>\n<li><strong>Configuration checks<\/strong>: <code>.htaccess<\/code>\/<code>.user.ini<\/code> rules that map media extensions to PHP, <code>auto_prepend_file<\/code>, file\/directory permissions, weak salts\/keys, unusual cron entries.<\/li>\n<li><strong>Baseline\/integrity<\/strong>: compares core files against WordPress.org's official checksums; automatically builds a SHA-256 baseline for every plugin\/theme on install\/update; 1-click restore of any mismatched core file from a signature-verified WordPress.org package, with the current file quarantined first.<\/li>\n<li><strong>Quarantine &amp; rollback<\/strong>: moves suspicious files aside (never deletes), with a full transaction log and 1-click rollback.<\/li>\n<li><strong>Per-component backups<\/strong>: a \"last confirmed good\" snapshot of each plugin\/theme, refreshed on every trusted update, checksum-verified before every restore, with a best-effort local tamper-resistance layer.<\/li>\n<li><strong>Maintenance mode with a TTL<\/strong> that turns on automatically when remediation touches a hot path or a large batch, and turns itself off once a health-check passes.<\/li>\n<li><strong>Hardening<\/strong>: login rate-limit\/lockout by IP + IP\/username (real IP behind a CDN via trusted proxies), disables XML-RPC pingback + caps <code>system.multicall<\/code>, security headers (HSTS\/X-Frame-Options\/CSP Report-Only), controlled auto-updates (low-traffic time window, skips VCS-managed sites, health-check after updating).<\/li>\n<li><strong>Multi-layer scan scheduling<\/strong>: WP-Cron + an internal watchdog + an HMAC-signed REST endpoint (for system cron\/remote pings) + a WP-CLI command \u2014 the schedule keeps running even when WP-Cron is unreliable.<\/li>\n<li><strong>Multisite<\/strong>: enumerates every site by <code>blog_id<\/code>, scanning each site's own <code>uploads<\/code> folder and tables.<\/li>\n<\/ul>\n\n<p>Two hardening behaviours worth knowing about before you enable them, because they change how the site answers requests that are not this plugin's own:<\/p>\n\n<ul>\n<li><strong>User-enumeration blocking is on by default.<\/strong> For visitors who are not signed in, the core <code>wp\/v2\/users<\/code> REST routes stop being served and <code>?author=&lt;id&gt;<\/code> links redirect to the home page. This is a deliberate part of the login-hardening layer, but it is a change to an API this plugin does not own \u2014 a headless front end, a mobile app or a third-party integration that reads the public user list will see it disappear. Turn it off under Hardening if something depends on it. (rc-47)<\/li>\n<li><strong><code>wp smeplan-ss scan run<\/code> exits 75 when a scan is already running.<\/strong> 75 is <code>EX_TEMPFAIL<\/code> \u2014 \"temporary failure, try again\" \u2014 rather than 0, so a wrapper running under <code>set -e<\/code> will treat a busy lock as a failed command. Handle 75 explicitly if you schedule the command that way. (rc-49)<\/li>\n<\/ul>\n\n<h4>Not yet in this release (planned for later versions)<\/h4>\n\n<ul>\n<li>2FA (TOTP) and CAPTCHA for the login page.<\/li>\n<li>Anonymous telemetry (opt-in).<\/li>\n<li>Translations (every string is already wrapped in <code>__()<\/code>, ready for translators via translate.wordpress.org \u2014 no translation is bundled with the plugin itself).<\/li>\n<li>Action Scheduler integration for enterprise-grade durable queuing.<\/li>\n<\/ul>\n\n<h3>Privacy Policy<\/h3>\n\n<p>By default, this plugin does not send any data outside of the site it is installed on. Everything it collects (scan findings, logs, baseline data) stays in the local WordPress database and in a protected local storage folder inside the uploads directory (<code>wp-content\/uploads\/smeplan-security-shield\/<\/code>, blocked from direct web access).<\/p>\n\n<p>Two features send data off-site, and both are entirely opt-in \u2014 off unless the site admin explicitly sets them up:<\/p>\n\n<ul>\n<li><strong>Alert email<\/strong>: if enabled, a summary of new findings is emailed to the site's configured admin email address (<code>admin_email<\/code>) using WordPress's own <code>wp_mail()<\/code>.<\/li>\n<li><strong>Alert webhook<\/strong>: if the admin enters a Webhook URL in Policies, a summary (site URL, alert subject, malicious\/suspicious counts, timestamp \u2014 no personal or visitor data) is sent as JSON to that admin-provided URL whenever new findings are detected. Nothing is sent anywhere unless the admin fills in this field themselves.<\/li>\n<\/ul>\n\n<p>That storage folder outlives the plugin on purpose: deleting the plugin removes its options, cron events and capabilities, but leaves the folder in place so a quarantined file is never destroyed by an uninstall performed mid-incident. See the FAQ entry \"What is removed when I delete the plugin?\" for the reasoning and for how to remove it yourself.<\/p>\n\n<p>The plugin does not phone home to any SMEPlan-operated server, does not track usage\/analytics, and does not include any third-party tracking or advertising code.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>wp-content\/plugins\/<\/code> or install it through the Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>Security Shield \u2192 Wizard<\/strong> to check WP-Cron\/loopback and configure trusted proxies if the site sits behind a CDN.<\/li>\n<li>See <strong>Security Shield \u2192 Policies<\/strong> to turn hardening features on\/off as needed.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20delete%20suspicious%20files%20automatically%3F\"><h3>Does the plugin delete suspicious files automatically?<\/h3><\/dt>\n<dd><p>No. Files at the \"malicious\" level are <strong>moved into quarantine<\/strong> (<code>wp-content\/uploads\/smeplan-security-shield\/quarantine\/<\/code>) rather than deleted, and can be rolled back with 1 click. Files at the \"suspicious\" level are only recorded, waiting for manual review on the Findings page.<\/p>\n\n<p>Quarantined files are kept for a limited time: once a session is older than the retention period set under Policies (14 days by default), it is removed automatically to stop the quarantine folder growing without bound. Roll back anything you want to keep before that window closes, or raise the retention setting.<\/p><\/dd>\n<dt id=\"what%20is%20removed%20when%20i%20delete%20the%20plugin%3F\"><h3>What is removed when I delete the plugin?<\/h3><\/dt>\n<dd><p>Deleting the plugin removes every option it created, its scheduled events, and the three custom capabilities it grants. It <strong>deliberately does not remove its storage folder<\/strong> at <code>wp-content\/uploads\/smeplan-security-shield\/<\/code>, which holds the quarantine, the file baseline, the event log and any component backups.<\/p>\n\n<p>This is a deliberate choice, not an oversight. Quarantined files are <em>moved<\/em>, not copied \u2014 the folder holds the only remaining copy of anything the plugin took out of the site. Deleting a plugin is easy to do in the middle of handling an incident, or by someone who is not the person investigating, and having that click silently destroy both the only rollback path and the only forensic evidence would be the wrong default for a security plugin. Reinstalling brings the previous quarantine and logs straight back.<\/p>\n\n<p>To remove it, delete that folder yourself over SFTP or your host's file manager once you are sure nothing in it is still needed. <strong>Read the caution first:<\/strong> the <code>quarantine\/<\/code> subfolder can contain live malicious files that were pulled off the site. Delete them, do not move them back into place.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20automatically%20edit%20database%20content%20or%20the%20.htaccess%20file%3F\"><h3>Does the plugin automatically edit database content or the .htaccess file?<\/h3><\/dt>\n<dd><p>No. Every finding in the database or in configuration files (.htaccess\/.user.ini) is only reported, never auto-fixed, to avoid breaking a site's legitimate functionality.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20change%20how%20wordpress%20updates%20itself%3F\"><h3>Does this plugin change how WordPress updates itself?<\/h3><\/dt>\n<dd><p>No. It never supplies its own update source: there is no bundled update checker, no third-party update server, no filtering of the plugin-information API, and nothing written to the transients core caches available updates in. Everything WordPress installs still comes from WordPress.org, fetched and verified by WordPress itself.<\/p>\n\n<p>What it does offer \u2014 off by default, and only if you switch it on in <strong>Policies<\/strong> \u2014 is control over <em>when<\/em> an update WordPress has already found and verified gets applied. Using core's own public <code>auto_update_core<\/code> \/ <code>auto_update_plugin<\/code> \/ <code>auto_update_theme<\/code> filters, it can hold an update back until the low-traffic window you configure, skip it while the site is under load, and skip any plugin or theme directory that is under version control (updating those breaks a deploy). It only ever delays WordPress's own updates; it never substitutes them.<\/p>\n\n<p>Since 0.7.32 it can also refuse one: a plugin or theme package is scanned while still in its temporary folder, and if a file in it matches malware detection the install is stopped before anything is written. A manual update can be allowed through once from the dashboard notice; an automatic one is refused and reported. This uses core's own <code>upgrader_source_selection<\/code> filter, changes nothing about where updates come from, and can be switched off in Policies.<\/p>\n\n<p>Automated scanners flag any use of those filters for a human to look at, which is why this is spelled out here.<\/p><\/dd>\n<dt id=\"what%20environment%20does%20it%20need%3F\"><h3>What environment does it need?<\/h3><\/dt>\n<dd><p>WordPress 6.1+, PHP 7.4+. Works best when WP-Cron runs normally; if the site has <code>DISABLE_WP_CRON<\/code> set or blocks loopback requests, use system cron\/WP-CLI following the instructions on the Wizard page.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<p>Newest release only \u2014 WordPress.org truncates this section at 5,000\ncharacters. The full history is in <code>changelog.txt<\/code>, shipped with the plugin.<\/p>\n\n<h4>0.7.38<\/h4>\n\n<p>Security release, recommended for everyone. A third full-codebase review of 0.7.37 found sixteen critical findings; this release fixes all sixteen.<\/p>\n\n<ul>\n<li><strong>The rules re-validation pass could never finish.<\/strong> Every page view re-seeded the queue, so after 0.7.36's rules bump a site re-scanned the same three components every minute forever and never re-scored its accepted files. The pass now leaves a queue in progress alone.<\/li>\n<li><strong>The same pass signed any baseline it found<\/strong>, including one written by whoever can write to uploads. It now refuses one it cannot authenticate and lets the scanner rebuild it.<\/li>\n<li><strong>A failed quarantine left a session that looked like a successful one<\/strong>, and \"Restore and accept\" on it whitelisted the still-live file. A failed move now takes its session with it, and \"already restored\" is only reported when the file at the original path is the one recorded.<\/li>\n<li><strong>A directory quarantine had no checksum<\/strong>, so anything added to it in uploads was restored into the plugins directory as the original. Directory sessions now record a tree digest and are refused when it no longer matches.<\/li>\n<li><strong>Purge followed a symlink planted in the quarantine folder<\/strong> and deleted its target. It no longer does.<\/li>\n<li><strong>On multisite, any site administrator could move or restore files shared by every site.<\/strong> Actions that change files now require a super admin on a network; single sites are unaffected.<\/li>\n<li><strong>\"Allow this update once\" could be spent by WP-Cron<\/strong> installing a different package of the same component with no scan. An unattended install never uses the override.<\/li>\n<li><strong>A form path lost its percent-encoded bytes<\/strong>, so the file accepted or quarantined could differ from the one shown. Paths are now validated without being rewritten.<\/li>\n<li><strong>A backup containing accepted files was never re-checked on restore<\/strong>; it is now, so a file whose acceptance the rules have since revoked is caught before extraction. A re-check cut short by its time cap no longer counts as clean, and the pseudo-component <code>plugin_.<\/code> (the whole plugins directory) is rejected.<\/li>\n<li><strong>Three \"checked, clean\" stamps could be earned by a failure<\/strong>: an unreachable checksum API, a failed database query and an unreadable subdirectory each now report as incomplete instead of verified. A rules-driven revoke that lost its write is now logged rather than counted as done.<\/li>\n<li><strong>A database row that kept killing the scan tick froze the scanner<\/strong> at that row while the dashboard stayed green. A position that fails three ticks in a row is now reported and skipped, so the file, config and core checks run again.<\/li>\n<li><strong>Behind a trusted proxy, a client-settable header chose the lockout bucket<\/strong>, and every new value left two rows in the options table forever. The proxy's own X-Forwarded-For entry now wins, and stale rate-limit rows are cleaned up daily.<\/li>\n<li><strong>Core repair re-downloaded the 10\u201325 MB package on every click<\/strong> and usually died inside the download on shared hosting. The verified package is now kept between clicks; every file taken from it is still checked against the official checksum before it is written.<\/li>\n<\/ul>\n\n<h4>0.7.37<\/h4>\n\n<p>Observability, and three ways a defence could be switched off without anyone seeing it.<\/p>\n\n<ul>\n<li><strong>Every database finding shared one index key<\/strong>, so however many injected rows a scan found, the index kept one \u2014 and which one is steerable by anyone who can write postmeta. Records without the file-shaped fields now key on the fields they actually carry.<\/li>\n<li><strong>One partial write could switch off fourteen hardening flags at once<\/strong>, because the boolean branch of the settings sanitiser was the only one with no <code>isset()<\/code> guard and the only one that reset rather than preserved. A marker submitted by the Policies form now tells a form save apart from a programmatic write.<\/li>\n<li><strong>A settings change now leaves a trail.<\/strong> Nothing recorded one before, so there was no way to show when a site stopped being hardened \u2014 or that a fix had taken effect. Secrets are recorded as changed, never quoted.<\/li>\n<li><strong>Rotating cron_secret made the entire event log unreadable<\/strong>, silently blanking Findings, the badge and the REST listing while the history sat intact on disk under its old name. Reads now fall back to the previous generation.<\/li>\n<li><strong>\"Trust this IP\" no longer claims more than it does<\/strong> \u2014 a username lockout is a separate bucket it never cleared \u2014 and the exemption is now recorded with the actor.<\/li>\n<\/ul>\n\n<p>Older releases: see <code>changelog.txt<\/code>, included with the plugin.<\/p>","raw_excerpt":"Scheduled security scanning (files\/DB\/config), baseline\/integrity checks, safe quarantine &amp; rollback, and hardening for WordPress.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/345738","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=345738"}],"author":[{"embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/solotop"}],"wp:attachment":[{"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=345738"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=345738"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=345738"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=345738"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=345738"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=345738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}