{"id":369755,"date":"2026-09-22T10:35:18","date_gmt":"2026-09-22T10:35:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/hanu-malware-guard\/"},"modified":"2026-09-22T11:02:35","modified_gmt":"2026-09-22T11:02:35","slug":"hanu-malware-guard","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/hanu-malware-guard\/","author":23564183,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.8","stable_tag":"1.2.8","tested":"7.1.2","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Hanu Malware Guard","header_author":"Hanu IT Solutions","header_description":"Scans theme, plugin and upload files for malware signatures, tracks file integrity, audits WP-Cron for malicious\/orphaned jobs, blocks login brute-force and common attack patterns, checks core file integrity, and keeps an activity log.","assets_banners_color":"517ea7","last_updated":"2026-09-22 11:02:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/hanuitsolutions.com","rating":5,"author_block_rating":0,"active_installs":0,"downloads":52,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.3":{"tag":"1.2.3","author":"hanuitsolutions","date":"2026-09-22 10:34:49","revision":3707076},"1.2.8":{"tag":"1.2.8","author":"hanuitsolutions","date":"2026-09-22 11:02:35","revision":3707132}},"upgrade_notice":{"1.2.0":"<p>Plugin renamed to Hanu Malware Guard (slug change) to comply with WordPress.org naming rules; adds bulk quarantine\/block actions for handling large numbers of findings at once.<\/p>","1.1.0":"<p>Adds login brute-force protection, a lightweight firewall, security headers, core file integrity checking, and an activity log. No breaking changes.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3707074,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3707074,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3707074,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3707074,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3707074,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.3","1.2.8"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3707074,"resolution":"1","location":"assets","locale":"","width":1622,"height":1118},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3707074,"resolution":"2","location":"assets","locale":"","width":1666,"height":2914},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3707074,"resolution":"3","location":"assets","locale":"","width":1622,"height":1991},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3707074,"resolution":"4","location":"assets","locale":"","width":1675,"height":650}},"screenshots":{"1":"Dashboard \u2014 scan summary, quick actions, and core integrity status.","2":"Scan Results \u2014 findings with severity, snippet, and quarantine\/ignore\/delete actions.","3":"Cron Monitor \u2014 flagged cron hooks with block\/trust actions.","4":"Login Security \u2014 active lockouts and recent failed attempts."}},"plugin_section":[],"plugin_tags":[8646,1174,1229,55021,600],"plugin_category":[54],"plugin_contributors":[282011],"plugin_business_model":[],"class_list":["post-369755","plugin","type-plugin","status-publish","hentry","plugin_tags-backdoor","plugin_tags-firewall","plugin_tags-login-security","plugin_tags-malware-scanner","plugin_tags-security","plugin_category-security-and-spam-protection","plugin_contributors-hanuitsolutions","plugin_committers-hanuitsolutions"],"banners":{"banner":"https:\/\/ps.w.org\/hanu-malware-guard\/assets\/banner-772x250.png?rev=3707074","banner_2x":"https:\/\/ps.w.org\/hanu-malware-guard\/assets\/banner-1544x500.png?rev=3707074","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/hanu-malware-guard\/assets\/icon.svg?rev=3707074","icon":"https:\/\/ps.w.org\/hanu-malware-guard\/assets\/icon.svg?rev=3707074","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/hanu-malware-guard\/assets\/screenshot-1.png?rev=3707074","caption":"Dashboard \u2014 scan summary, quick actions, and core integrity status."},{"src":"https:\/\/ps.w.org\/hanu-malware-guard\/assets\/screenshot-2.png?rev=3707074","caption":"Scan Results \u2014 findings with severity, snippet, and quarantine\/ignore\/delete actions."},{"src":"https:\/\/ps.w.org\/hanu-malware-guard\/assets\/screenshot-3.png?rev=3707074","caption":"Cron Monitor \u2014 flagged cron hooks with block\/trust actions."},{"src":"https:\/\/ps.w.org\/hanu-malware-guard\/assets\/screenshot-4.png?rev=3707074","caption":"Login Security \u2014 active lockouts and recent failed attempts."}],"raw_content":"<!--section=description-->\n<p>Hanu Malware Guard is a self-contained WordPress security plugin covering eight areas:<\/p>\n\n<ol>\n<li><p><strong>Malware Scanner<\/strong> \u2014 recursively scans themes, plugins, mu-plugins and uploads for a curated set of regex heuristics matching common backdoor\/webshell patterns (obfuscated eval(), webshell string signatures, command execution of user input, arbitrary file writes, etc). Any executable PHP-family file found inside <code>wp-content\/uploads<\/code> is flagged outright, since WordPress never legitimately places runnable code there.<\/p><\/li>\n<li><p><strong>File Integrity Monitor<\/strong> \u2014 hashes every scanned file and records a baseline. Later scans report files that are new, modified, or deleted since the previous pass, so you can see exactly what changed and when.<\/p><\/li>\n<li><p><strong>Cron Guard<\/strong> \u2014 catches cron-based persistence. WordPress fires whatever hook name is stored in its <code>cron<\/code> option regardless of whether any currently-loaded code registers a handler for it. Malware commonly schedules a job under an unfamiliar hook name and re-adds its own callback dynamically, so the job keeps firing even after the plugin\/theme file that \"owns\" it is deleted. Hanu Malware Guard snapshots every scheduled cron event on each page load, flags any hook with <strong>no currently registered callback<\/strong> (\"orphan\") or a randomly-generated-looking name, and lets you:<\/p>\n\n<ul>\n<li><strong>Block<\/strong> a hook: unschedules every pending event for it immediately and blacklists the hook name so WordPress refuses to re-schedule it in the future (via the <code>pre_schedule_event<\/code> filter).<\/li>\n<li><strong>Trust<\/strong> a hook: marks it as known-good so it stops appearing as a flag.<\/li>\n<li>Cross-references file changes against flagged cron activity so you can see file changes that happened right around when a suspicious cron job ran.<\/li>\n<\/ul><\/li>\n<li><p><strong>Login Brute-Force Lockout<\/strong> \u2014 locks out an IP\/username combination after too many failed logins within a configurable window. Runs as an early <code>authenticate<\/code> filter, so it covers both wp-login.php and XML-RPC logins (both authenticate through the same core <code>wp_authenticate()<\/code> call). Manage active lockouts and view recent failed attempts on the Login Security page.<\/p><\/li>\n<li><p><strong>Firewall<\/strong> \u2014 blocks the handful of request patterns that account for most automated WordPress attacks: XML-RPC pingback amplification abuse (optional full XML-RPC disable), <code>?author=N<\/code> and REST <code>\/wp\/v2\/users<\/code> username enumeration, and requests whose URL contains obvious SQL-injection \/ path-traversal \/ PHP-injection strings. Logged-in administrators are always exempt from the query-string check so normal site use is never at risk of self-lockout. Blocked requests are logged on the Firewall page.<\/p><\/li>\n<li><p><strong>Security Headers<\/strong> \u2014 sends <code>X-Content-Type-Options<\/code>, <code>X-Frame-Options<\/code>, <code>Referrer-Policy<\/code>, and a <code>Content-Security-Policy: frame-ancestors 'self'<\/code> (clickjacking protection only \u2014 no script-src policy, since that reliably breaks themes\/page builders unless hand-tuned per site).<\/p><\/li>\n<li><p><strong>Core File Integrity Check<\/strong> \u2014 compares <code>wp-admin<\/code>\/<code>wp-includes<\/code> against the official checksums WordPress.org publishes for your exact version, and additionally flags any PHP file physically present in those folders that isn't part of the official manifest at all (a classic place to hide a backdoor, since admins assume \"core\" never changes). Findings appear in Scan Results alongside everything else.<\/p><\/li>\n<li><p><strong>Activity Log<\/strong> \u2014 records logins (success\/failure\/lockout), new admin users and role escalations, plugin\/theme activation and switching, core\/plugin\/theme updates, and use of the built-in file editor, so you have a timeline of what changed and by whom.<\/p><\/li>\n<\/ol>\n\n<p>Additional hardening options (Settings page): block PHP execution inside <code>wp-content\/uploads<\/code> (.htaccess\/web.config, with an Nginx snippet shown for reference), and disable the built-in wp-admin file editor.<\/p>\n\n<h4>External services<\/h4>\n\n<p>This plugin makes one outbound HTTP request, only when you run \"Check Core File Integrity\" (manually or via the daily scheduled scan): it calls the official WordPress.org checksums API at <code>https:\/\/api.wordpress.org\/core\/checksums\/1.0\/?version={your WP version}&amp;locale={your locale}<\/code> to fetch the known-good hash list for your exact WordPress version. No site data, file contents, or personal information is sent \u2014 only your WordPress version number and locale, which is required for the API to return the right checksum set. See the WordPress.org API documentation and privacy policy: https:\/\/wordpress.org\/about\/privacy\/. No other external service is contacted by this plugin.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>hanu-malware-guard<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install directly from the WordPress Plugin Directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Go to Malware Guard \u2192 Dashboard and run your first scan.<\/li>\n<li>Review Malware Guard \u2192 Cron Monitor for any orphaned\/suspicious jobs.<\/li>\n<li>Review Malware Guard \u2192 Settings to tune login lockout thresholds, firewall toggles and security headers for your site.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20definitely%20find%20every%20piece%20of%20malware%20on%20my%20site%3F\"><h3>Will this definitely find every piece of malware on my site?<\/h3><\/dt>\n<dd><p>No security scanner can guarantee that, and you should be skeptical of any that claims to. The signature scanner and core-integrity checker produce heuristic matches for you to review \u2014 they are a strong starting point, not a certified clean bill of health. Always keep offline backups regardless.<\/p><\/dd>\n<dt id=\"i%20got%20a%20%22critical%22%20finding%20but%20i%27m%20sure%20the%20file%20is%20legitimate%20%E2%80%94%20what%20now%3F\"><h3>I got a \"critical\" finding but I'm sure the file is legitimate \u2014 what now?<\/h3><\/dt>\n<dd><p>Inspect the snippet shown in Scan Results. Several signatures (obfuscated <code>eval()<\/code>, <code>create_function()<\/code>, long base64 blobs) can legitimately appear in caching layers, minified vendor code, or some page builders. If you're confident it's a false positive, click \"Ignore\" rather than deleting the file. Auto-quarantine of critical findings is off by default for exactly this reason.<\/p><\/dd>\n<dt id=\"can%20it%20stop%20a%20malicious%20cron%20job%20from%20ever%20writing%20a%20file%3F\"><h3>Can it stop a malicious cron job from ever writing a file?<\/h3><\/dt>\n<dd><p>Not in real time \u2014 no WordPress plugin can intercept a file write at the PHP-engine level; that requires a hosting-level security layer. What it does is control cron <em>scheduling<\/em> (block a hook so WordPress refuses to re-run it) and <em>detect<\/em> file changes that happened around the same time as a suspicious cron run, so you can act quickly.<\/p><\/dd>\n<dt id=\"does%20the%20login%20lockout%20affect%20xml-rpc%20too%3F\"><h3>Does the login lockout affect XML-RPC too?<\/h3><\/dt>\n<dd><p>Yes. XML-RPC authentication goes through the same core <code>wp_authenticate()<\/code> function as the normal login form, so the same failed-attempt counter and lockout apply to both.<\/p><\/dd>\n<dt id=\"will%20the%20firewall%20lock%20me%20out%20of%20my%20own%20site%3F\"><h3>Will the firewall lock me out of my own site?<\/h3><\/dt>\n<dd><p>The query-string pattern check always exempts logged-in administrators, specifically so normal plugin\/editor use can never trigger a self-lockout. Only unauthenticated requests are checked against the SQLi\/path-traversal\/PHP-injection patterns.<\/p><\/dd>\n<dt id=\"does%20this%20send%20any%20of%20my%20data%20to%20a%20third%20party%3F\"><h3>Does this send any of my data to a third party?<\/h3><\/dt>\n<dd><p>No. The only outbound request the plugin makes is to WordPress.org's own official checksums API, and only your WordPress version + locale are sent (see \"External services\" above). Everything else \u2014 scanning, hashing, cron auditing, login tracking \u2014 runs entirely on your own server.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20quarantined%20files%20if%20i%20uninstall%20the%20plugin%3F\"><h3>What happens to quarantined files if I uninstall the plugin?<\/h3><\/dt>\n<dd><p>Nothing is left on disk. Quarantining a file reads its content into the database (base64-encoded, in the plugin's own scan_results table) and deletes the original \u2014 the file is gone from the filesystem the moment it's quarantined, not just hidden behind a protected folder. Uninstalling the plugin removes that table along with everything else, so if you want to keep a quarantined file's content for forensics, restore or export it before uninstalling.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20support%3F\"><h3>Where can I get support?<\/h3><\/dt>\n<dd><p>Use the plugin's support forum on WordPress.org, or email herry@hanuitsolutions.com.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.8<\/h4>\n\n<ul>\n<li>Fixed: the file-editor activity-log hook read $_POST['file']\/$_POST['theme'] and used them to build a nonce-action string before sanitizing \u2014 even though the only sink is wp_verify_nonce() (a hash comparison, not an executable\/output context), the fix follows \"sanitize early\" literally: both values now go through sanitize_text_field() immediately, before any use. This is a no-op for every legitimate request, since real file paths and theme slugs never contain the characters it strips.<\/li>\n<li>Hardened several other raw $_GET\/$_SERVER reads in the firewall (author-enumeration check, REST user-enumeration check, malicious-pattern scanner) with explicit per-line justification for why they're intentionally inspected unsanitized \u2014 each is used only for validation (is_numeric()), substring comparison, or pattern-matching against attack signatures, never stored or output without separate escaping.<\/li>\n<\/ul>\n\n<h4>1.2.7<\/h4>\n\n<ul>\n<li>Fixed: WordPress.DB.PreparedSQLPlaceholders.LikeWildcardsInQuery \u2014 a LIKE clause value was baked directly into the query string instead of passed through a placeholder. The schema-migration column check now passes its LIKE value via %s, and uninstall.php's options cleanup now runs the pattern through $wpdb-&gt;esc_like() (it contains a real % wildcard) before passing it as %s, rather than hardcoding the pattern in the SQL.<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>Fixed: dozens of static-analysis findings from the official Plugin Check tool (WordPress.DB.PreparedSQL.InterpolatedNotPrepared \/ PluginCheck.Security.DirectDB.UnescapedDBParameter) where a table name was interpolated into a SQL string across several files. All custom-table queries now pass the table name through $wpdb-&gt;prepare()'s %i identifier placeholder instead \u2014 this also closes a few cases where an existing <code>phpcs:ignore<\/code> comment sat on the wrong physical line of a multi-line prepare() call and so wasn't actually suppressing anything. %i requires WordPress 6.2+, so the minimum supported version is now 6.2 (previously 6.0).<\/li>\n<li>Fixed: the legacy quarantine-folder cleanup used raw unlink()\/rmdir() instead of the WP_Filesystem API (Plugin Check ERROR-level finding); it now goes through WP_Filesystem, and silently skips cleanup if direct filesystem access isn't available rather than failing.<\/li>\n<li>Fixed: two remaining input-handling findings \u2014 added the missing sniff code to an existing justified <code>phpcs:ignore<\/code> on the file-editor's $_POST['file'] read, and added a missing <code>phpcs:ignore<\/code> (with rationale) to the read-only $_GET check behind the settings-saved admin notice.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Fixed: quarantine no longer writes anything to the filesystem. Previously a quarantined file was moved into a protected subfolder under wp-content\/uploads \u2014 the plugin directory guidelines don't allow storing potentially-executable code there at all, even in a plugin-specific, .htaccess-protected folder, since that protection isn't guaranteed to be honored (Nginx ignores .htaccess entirely; offloaded\/CDN-backed uploads bypass it too). Quarantine now reads the file's bytes into the database (base64-encoded) and deletes the original from disk; restoring writes it back from the database. Sites upgrading from an earlier version automatically migrate any already-quarantined files into the database and remove the legacy on-disk folder on first load after updating.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Fixed: the activity-log entry for built-in theme\/plugin file-editor usage was written before verifying the nonce, so a CSRF-forged request from a user with edit_themes\/edit_plugins capability could produce a false log entry even though core's own handler would go on to reject the edit. It now verifies the same nonce core checks (edit-plugin_{file} \/ edit-theme_{file}{stylesheet}) before writing anything, and simply skips logging on failure without interfering with core's own request handling.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Fixed: the Quarantine action could move a file out of wp-admin\/wp-includes for core-integrity findings, which counts as modifying a WordPress core directory. Findings inside core directories can now only be reviewed or ignored from Scan Results; the UI explains that core files must be restored via Dashboard \u2192 Updates \u2192 Re-install Now, or replaced manually.<\/li>\n<li>Fixed: the activity-log entry for built-in theme\/plugin file-editor usage could previously be triggered by any logged-in user, since it hooked core's ajax action at a priority that ran before core's own nonce\/capability check. It's now gated by its own capability check (edit_themes\/edit_plugins) before logging anything.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Fixed: is_writable() replaced with wp_is_writable() (Windows-safe core wrapper).<\/li>\n<li>Fixed: shortened the readme short description to meet the 150-character limit.<\/li>\n<li>Fixed: every admin view file now defines its own prefixed render function instead of running top-level template code, so its local variables are function-scoped rather than looking like unprefixed globals to static analysis.<\/li>\n<li>Fixed: corrected the placement of several phpcs:ignore suppressions that were on the wrong line to take effect, and added missing ones for direct-query\/no-caching\/unescaped-parameter findings against this plugin's own custom tables (table names always come from the internal WPMG_DB::table() helper, never user input).<\/li>\n<li>Fixed: clarified\/suppressed the DISALLOW_FILE_EDIT prefix warning (it's a WordPress core-mandated constant name) and the REMOTE_ADDR sanitization warning (already validated via filter_var() immediately after).<\/li>\n<li>No functional changes \u2014 this release addresses static-analysis findings only.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Renamed the main bootstrap class from the unprefixed WP_Malware_Guard to WPMG_Plugin, per WordPress.org's naming-collision guidelines.<\/li>\n<li>Replaced hardcoded wp-content-relative paths with proper WordPress location APIs: WP_PLUGIN_DIR \/ WPMU_PLUGIN_DIR for plugins\/mu-plugins, and theme-root enumeration via wp_get_themes() (so themes registered outside wp-content\/themes are scanned too), and fixed the Nginx snippet to derive its path from wp_upload_dir()['baseurl'] instead of ABSPATH.<\/li>\n<li>Moved quarantine storage out of wp-content\/wpmg-quarantine into wp-content\/uploads\/hanu-malware-guard\/quarantine, resolved via wp_upload_dir() at runtime (multisite-safe), per the plugin directory's file-storage-location requirements.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Renamed from \"WP Malware Guard\" to \"Hanu Malware Guard\" (and slug from wp-malware-guard to hanu-malware-guard) to comply with the WordPress.org restriction on plugin names\/slugs starting with \"wp\".<\/li>\n<li>Added bulk actions for incident response: \"Quarantine All Critical Findings\" on Scan Results and \"Block All Suspicious Cron Jobs\" on Cron Monitor, so a large-scale infection doesn't require clicking every row individually.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added login brute-force lockout (covers wp-login.php and XML-RPC).<\/li>\n<li>Added a lightweight firewall: XML-RPC pingback lockdown, username-enumeration blocking, malicious query-string blocking.<\/li>\n<li>Added baseline security response headers.<\/li>\n<li>Added WordPress core file integrity checking against the official WordPress.org checksums, plus detection of unexpected PHP files in wp-admin\/wp-includes.<\/li>\n<li>Added a site-wide activity\/audit log (logins, admin user\/role changes, plugin\/theme changes, file editor use, firewall blocks).<\/li>\n<li>Fixed the scanner and quarantine system flagging\/moving the plugin's own files (its signature list legitimately contains strings like \"eval\" and \"FilesMan\" as plain text).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: scanner, file integrity monitor, cron guard, upload hardening.<\/li>\n<\/ul>","raw_excerpt":"Scans files for malware, tracks file integrity, audits WP-Cron for planted jobs, and blocks login brute-force and common attacks.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/369755","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=369755"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/hanuitsolutions"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=369755"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=369755"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=369755"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=369755"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=369755"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=369755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}