{"id":352917,"date":"2026-08-29T10:20:17","date_gmt":"2026-08-29T10:20:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/palette-data-analyzer\/"},"modified":"2026-08-29T10:19:57","modified_gmt":"2026-08-29T10:19:57","slug":"palette-data-analyzer","status":"publish","type":"plugin","link":"https:\/\/tw.wordpress.org\/plugins\/palette-data-analyzer\/","author":23524750,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"4.20.4","stable_tag":"4.20.4","tested":"7.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Palette Data Analyzer","header_author":"Palette Agency","header_description":"A data-driven SEO assistant for Google Search Console: analytical reports with formula-based modules, a prioritized Action Plan, and results tracking. A product of Palette Agency.","assets_banners_color":"182a4c","last_updated":"2026-08-29 10:19:57","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/palette.agency\/palette-data-analyzer-intro\/","header_author_uri":"https:\/\/palette.agency\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":38,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"4.20.4":{"tag":"4.20.4","author":"paletteagencyy","date":"2026-08-29 10:19:57","revision":3671373}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3671377,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3671377,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3671377,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3671377,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["4.20.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3671377,"resolution":"1","location":"assets","locale":"","width":1280,"height":1360},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3671377,"resolution":"2","location":"assets","locale":"","width":1280,"height":1150},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3671377,"resolution":"3","location":"assets","locale":"","width":1280,"height":840},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3671377,"resolution":"4","location":"assets","locale":"","width":1280,"height":1300},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3671377,"resolution":"5","location":"assets","locale":"","width":1280,"height":1240},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3671377,"resolution":"6","location":"assets","locale":"","width":1280,"height":520},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3671377,"resolution":"7","location":"assets","locale":"","width":1280,"height":470}},"screenshots":{"1":"The dashboard: every capability at a glance, the latest report's four KPIs, and the top five suggested actions.","2":"Report header: clicks, impressions, CTR and average position against the previous period, the last five reports side by side, and the daily trend.","3":"Distribution: how queries and pages spread across position buckets, and the click-through rate your own site actually earns at each bucket. That curve is the benchmark the low-CTR module judges against, instead of a generic industry table.","4":"Analysis modules: growing queries, page-one opportunities at positions 11-20, and pages whose CTR is far below what their position should deliver. A query that did not exist last period is marked \"new\" rather than shown as a rank drop.","5":"The Action Plan: one prioritised list assembled from every module by fixed rules. No language model is involved in producing or ordering it.","6":"Report archive: every report is kept per property, each with a printable view you can save as PDF.","7":"Generating a report: upload the .xlsx, .csv or .zip that Search Console hands you. Any date range works."}},"plugin_section":[262246],"plugin_tags":[232,150,3652,127115,186],"plugin_category":[36,55],"plugin_contributors":[271908],"plugin_business_model":[],"class_list":["post-352917","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-analytics","plugin_tags-google","plugin_tags-reporting","plugin_tags-search-console","plugin_tags-seo","plugin_category-analytics","plugin_category-seo-and-marketing","plugin_contributors-paletteagencyy","plugin_committers-paletteagencyy"],"banners":{"banner":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/banner-772x250.png?rev=3671377","banner_2x":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/banner-1544x500.png?rev=3671377","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/icon-128x128.png?rev=3671377","icon_2x":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/icon-256x256.png?rev=3671377","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/screenshot-1.png?rev=3671377","caption":"The dashboard: every capability at a glance, the latest report's four KPIs, and the top five suggested actions."},{"src":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/screenshot-2.png?rev=3671377","caption":"Report header: clicks, impressions, CTR and average position against the previous period, the last five reports side by side, and the daily trend."},{"src":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/screenshot-3.png?rev=3671377","caption":"Distribution: how queries and pages spread across position buckets, and the click-through rate your own site actually earns at each bucket. That curve is the benchmark the low-CTR module judges against, instead of a generic industry table."},{"src":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/screenshot-4.png?rev=3671377","caption":"Analysis modules: growing queries, page-one opportunities at positions 11-20, and pages whose CTR is far below what their position should deliver. A query that did not exist last period is marked \"new\" rather than shown as a rank drop."},{"src":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/screenshot-5.png?rev=3671377","caption":"The Action Plan: one prioritised list assembled from every module by fixed rules. No language model is involved in producing or ordering it."},{"src":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/screenshot-6.png?rev=3671377","caption":"Report archive: every report is kept per property, each with a printable view you can save as PDF."},{"src":"https:\/\/ps.w.org\/palette-data-analyzer\/assets\/screenshot-7.png?rev=3671377","caption":"Generating a report: upload the .xlsx, .csv or .zip that Search Console hands you. Any date range works."}],"raw_content":"<!--section=description-->\n<p>Palette Data Analyzer reads your Google Search Console data and turns it into a report you can act on: which queries are growing, which pages sit just off page one, where your click-through rate is below what your own site normally achieves at that position, and which changes are large enough to be real rather than noise.<\/p>\n\n<p>Every number is produced by a fixed formula, not by a language model. Run the same file twice and you get the same answer twice.<\/p>\n\n<h4>Two ways to get data in<\/h4>\n\n<p><strong>Upload a file.<\/strong> Export from Search Console as .xlsx, .csv, or the .zip it hands you, and upload it. Any date range works. For the full analysis, enable the \"Compare\" tab in Search Console so each row carries the previous period too.<\/p>\n\n<p><strong>Connect the API with the separate Pro add-on.<\/strong> The free plugin does not require an API connection. If you install the separately distributed Palette Data Analyzer Pro add-on, you can connect your Google account and pull reports automatically.<\/p>\n\n<h4>What it measures<\/h4>\n\n<p>Growing and lost queries, page-two opportunities (positions 11-20), top-three opportunities (positions 4-10), abnormally low CTR, position drops that happen despite rising impressions, ranking volatility across several archived reports, big movers, position and CTR distribution by rank bucket, and an overall KPI panel - all feeding one prioritised action plan.<\/p>\n\n<p>Two things set the analysis apart. Changes are tested against a Poisson noise band, so a query going from 10 clicks to 14 is reported as noise rather than 40% growth. And when your average position moves, the report separates real ranking movement from a shift in which queries earn impressions - the two look identical in a single average but call for completely different responses.<\/p>\n\n<h4>Related plugin<\/h4>\n\n<p>A direct Search Console API connection, single-page analysis and an optional AI summary layer are provided by Palette Data Analyzer Pro, a separately distributed add-on. This plugin is complete on its own and needs none of them.<\/p>\n\n<h3>External services<\/h3>\n\n<p><strong>Google connectivity check<\/strong> (www.googleapis.com) - contacted only when an administrator presses the connection-test button on the settings screen. It sends nothing beyond the request itself, and reports whether this server can reach Google at all.\n<a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/p>\n\n<p><strong>Google Search Status Dashboard<\/strong> (status.search.google.com) - an optional public JSON feed used to label reports with ranking updates. It is disabled by default and is contacted only after an administrator enables it on the upload screen. Your server contacts the service at most once every 12 hours; the plugin does not send report data, Google credentials, or your site URL. As with any web request, the service receives normal connection metadata such as your server IP address.\n<a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/p>\n\n<p><strong>Chart.js<\/strong> 4.4.0 - charting library, MIT license.\nFile: <code>assets\/js\/chart.umd.min.js<\/code>\nLicense: <code>licenses\/chartjs-MIT.txt<\/code>\nSource: https:\/\/github.com\/chartjs\/Chart.js<\/p>\n\n<p><strong>Vazirmatn font<\/strong> 33.0.3 (variable, weights 100-900) - SIL Open Font License 1.1.\nFile: <code>assets\/fonts\/Vazirmatn-Variable.woff2<\/code> - full license: <code>assets\/fonts\/LICENSE.txt<\/code>\nSource: https:\/\/github.com\/rastikerdar\/vazirmatn<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>palette-data-analyzer<\/code> folder to <code>wp-content\/plugins\/<\/code>, or install the .zip from Plugins - Add New - Upload Plugin.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open the Palette Data Analyzer menu and upload a Search Console export.<\/li>\n<\/ol>\n\n<p>Your server needs the standard PHP <code>zip<\/code> and <code>xml<\/code> extensions, which are enabled on almost all WordPress hosts. No Composer packages are required - .xlsx files are parsed directly.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20google%20api%20connection%3F\"><h3>Do I need a Google API connection?<\/h3><\/dt>\n<dd><p>No. The free plugin analyses uploaded files. Direct API connection is an optional capability of the separately distributed Palette Data Analyzer Pro add-on.<\/p><\/dd>\n<dt id=\"which%20date%20range%20should%20i%20export%3F\"><h3>Which date range should I export?<\/h3><\/dt>\n<dd><p>Any range works, and the plugin scales its thresholds to match. A 28-day window is the best default because it is exactly four weeks, so each period contains the same number of Saturdays, Sundays and so on, and day-of-week seasonality cancels out of the comparison. A calendar-month comparison does not have that property.<\/p><\/dd>\n<dt id=\"is%20my%20data%20sent%20anywhere%3F\"><h3>Is my data sent anywhere?<\/h3><\/dt>\n<dd><p>Not unless you ask for it. File uploads are processed on your own server. The Google Search Status feed is contacted only after you explicitly enable it on the upload screen. The separately distributed Pro add-on contacts Google only after you start its connection flow, and contacts an AI service only after you configure a key and request a summary. See the External services section below.<\/p><\/dd>\n<dt id=\"does%20the%20ai%20layer%20change%20the%20numbers%3F\"><h3>Does the AI layer change the numbers?<\/h3><\/dt>\n<dd><p>No. In the separately distributed Pro add-on, it receives already-calculated figures and writes prose about them. Turning it off changes nothing about the analysis.<\/p><\/dd>\n<dt id=\"why%20is%20a%20section%20of%20the%20report%20empty%3F\"><h3>Why is a section of the report empty?<\/h3><\/dt>\n<dd><p>Some modules need history. Ranking volatility, for example, is measured as the standard deviation of a page's position across at least three archived reports, because volatility cannot be defined from two data points. The section explains what it still needs.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<p>Older releases are listed in <code>changelog.txt<\/code> inside the plugin folder.<\/p>\n\n<h4>4.20.4<\/h4>\n\n<ul>\n<li>Added the dedicated plugin page as the Plugin URI.<\/li>\n<\/ul>\n\n<h4>4.20.3<\/h4>\n\n<ul>\n<li>Removed the redundant Plugin URI header so the plugin and author URIs are not identical.<\/li>\n<\/ul>\n\n<h4>4.20.2<\/h4>\n\n<ul>\n<li>Clarified which capabilities belong to the free plugin and which require the separately distributed Pro add-on.<\/li>\n<li>Connection and relay tests now run only after an administrator explicitly clicks a nonce-protected test link; opening Settings never makes a network request.<\/li>\n<li>Removed Pro upgrade cards from the free plugin dashboard; the single contextual add-on notice remains on the Settings page.<\/li>\n<\/ul>\n\n<h4>4.20.1<\/h4>\n\n<ul>\n<li>Google Search Status updates are now strictly opt-in. The upload screen explains the network request and the feed does not include the site URL in its User-Agent.<\/li>\n<li>Removed code that suppressed other plugins' admin notices.<\/li>\n<li>Added the bundled Chart.js MIT license and moved the WordPress minimum version into the main plugin header.<\/li>\n<\/ul>\n\n<h4>4.20.0<\/h4>\n\n<ul>\n<li>The Action Plan is now ordered by estimated impact inside each priority level, instead of by the order the modules happen to run in. Previously every item of one module came out in a block, so a report with ten page-two queries opened with ten near-identical lines while a single low-CTR page worth several times the traffic sat further down. Each action is now scored in one common unit - the clicks it would gain or recover, using your own site's CTR curve for the target position - and ties are broken by title so the same file still produces the same report twice.<\/li>\n<\/ul>\n\n<h4>4.19.0<\/h4>\n\n<ul>\n<li>A query or page that did not exist in the previous period no longer shows a position drop. With no earlier rank, its \"position change\" was computed as zero minus the current rank, so a brand-new query at position 15.3 was reported as having fallen 15.30 places. Those rows are now labelled \"new\".<\/li>\n<li>The dashboard said \"19 analysis modules\" in both editions. It now states the real count for the edition you are running.<\/li>\n<\/ul>\n\n<h4>4.18.0<\/h4>\n\n<ul>\n<li>Search Console reports the same page once per anchor link, so <code>\/page\/<\/code>, <code>\/page\/#h-1<\/code> and <code>\/page\/#h-2<\/code> arrived as three separate rows. On a real site 376 of 585 page rows were anchors and a single page was split across eleven of them, which meant no row carried that page's real weight and one page could fill most of the action plan. Anchors are now merged: clicks and impressions are summed, position becomes an impression-weighted average, and CTR is recalculated from the totals rather than averaged.<\/li>\n<\/ul>\n\n<h4>4.17.0<\/h4>\n\n<ul>\n<li>Saving a report now returns its archive ID, so anything referring back to that exact report \u2014 such as a shareable link \u2014 can name the right row.<\/li>\n<li>Setup guide updated for Google's new console: \"Publishing status\" and \"Test users\" both moved to the Audience page, and the wizard links there directly.<\/li>\n<\/ul>\n\n<h4>4.16.0<\/h4>\n\n<ul>\n<li>Fixed a slowdown on servers that cannot reach Google. The Google Search Status feed is fetched while building a report, but a failed fetch was never cached \u2014 so every single report waited out the full 15-second timeout, again and again. Failures are now remembered for an hour, the timeout is 5 seconds, and the previous data is kept rather than discarded.<\/li>\n<li>That feed can now go through the relay. It was missing from the allowlist, so a configured relay did not help it. Added to both the PHP list and the sample Cloudflare Worker.<\/li>\n<\/ul>\n\n<h4>4.15.0<\/h4>\n\n<ul>\n<li>The setup guide now covers the \"Access blocked \/ Error 403: access_denied\" screen people hit when connecting their Google account, and adds a step for publishing the OAuth app. That step matters more than it looks: while the app stays in Testing, Google expires the connection after seven days, so the plugin silently loses access about once a week and scheduled reports stop. Publishing removes that limit and needs no Google review.<\/li>\n<\/ul>\n\n<h4>4.14.1<\/h4>\n\n<ul>\n<li>Bot setup instructions no longer print bare @handles, which some marketplace scanners flag as personal contact details. The instructions name the official BotFather bot instead.<\/li>\n<\/ul>\n\n<h4>4.14.0<\/h4>\n\n<ul>\n<li>The settings page no longer probes Google on load. It only checks connectivity once you have entered a Client ID or a property address \u2014 before that there is nothing to connect to, and probing meant an outbound request just for opening a page.<\/li>\n<li>Sections that need a direct API connection now say so instead of showing a \"Pro\" upsell. Those sections have no data when the report comes from a file upload, and telling a customer who already owns Pro to buy Pro was confusing.<\/li>\n<li>Added a <code>PALDA_DISTRIBUTION<\/code> constant so a vendor-neutral build can be produced from the same source, without maintaining a second copy of the plugin.<\/li>\n<\/ul>\n\n<h4>4.13.0<\/h4>\n\n<ul>\n<li>A fresh install no longer makes any outbound request until you generate your first report. The Google Search Status feed was fetched on a daily cron that scheduled itself five minutes after the first admin page view \u2014 before the user had done anything, and while its output had nothing to label yet. It is now scheduled only once a report exists. Existing installs keep their schedule.<\/li>\n<\/ul>\n\n<h4>4.12.0<\/h4>\n\n<ul>\n<li><strong>Fixed \"jump to section\", which had been broken in Persian.<\/strong> Section IDs were built from the section number \u2014 a <em>translated<\/em> string. In English it stayed \"1\" and worked; in Persian it became \"\u06f1\", every non-ASCII character was stripped, and all twenty sections ended up with the identical id <code>pda-sec-<\/code>. So <code>getElementById<\/code> always returned the first section (every jump went to the top of the report) and the active-section highlight had nothing to map to. IDs are now derived from section order and are language-independent.<\/li>\n<li>Pro teaser sections had the same bug and were also missing from the jump bar entirely, so free users could not jump to them. Both section builders now share one ID source.<\/li>\n<li>The jump offset was hardcoded at 120px while the real sticky-bar height is around 230px, so the target landed hidden underneath the bar. It is now measured, which also covers RTL, mobile and a hidden admin bar.<\/li>\n<li>Jumping now survives environments that ignore smooth scrolling (reduced-motion settings), re-checks its position once the scroll settles \u2014 charts change height as they load \u2014 and cancels a pending correction when you click another section.<\/li>\n<li><strong>Bidirectional text is now derived from content, not assumed.<\/strong> Every link was forced to <code>direction: ltr<\/code>, which is right for a URL but wrong for links whose text is Persian, whose trailing punctuation jumped to the wrong side. Links and inline code now use <code>unicode-bidi: plaintext<\/code>, so each element takes its direction from its own first strong character. Standalone URLs stay explicitly LTR so a Persian slug cannot flip them.<\/li>\n<li>Multi-line URLs in tables were right-aligned line by line, breaking their left-to-right reading order. They are block-level now, so the box follows the page direction while the text inside stays left-aligned.<\/li>\n<li>Free dashboard: the \"Get started\" link pointed at the settings page, which without a licence is only a Pro pitch \u2014 a free user clicking it landed on a sales page instead of somewhere they could work. It now points at the file upload, and the main button carries a \"Start here\" badge until the first report exists.<\/li>\n<\/ul>\n\n<h4>4.11.0<\/h4>\n\n<ul>\n<li>Plugin Check compliance: zero errors and zero warnings against the official WordPress plugin-check tool.<\/li>\n<li>readme.txt is now in English, as the plugin directory requires. The full Persian history moved to <code>changelog.txt<\/code>.<\/li>\n<li>File operations in the uninstaller and the ZIP-signature check now use WP_Filesystem, so they work on hosts where WordPress writes over FTP or SSH.<\/li>\n<li>Dropped <code>wp_set_option_autoload()<\/code>, which needs WordPress 6.4 while this plugin supports 5.8. The same result is achieved with functions available in every supported version.<\/li>\n<li>Removed the manual <code>load_plugin_textdomain()<\/code> call; WordPress has loaded translations automatically since 4.6. Verified that Persian still loads without it.<\/li>\n<\/ul>\n\n<h4>4.10.0<\/h4>\n\n<ul>\n<li>The <code>palda_settings_sections<\/code> seam is now live, so the Pro add-on can render its own settings block without any of its code living in the free plugin.<\/li>\n<li><code>PALDA_Connectivity::rewrite_google()<\/code> renamed to <code>rewrite_if_allowed()<\/code>; the relay allowlist is no longer Google-only. The old name is kept as an alias.<\/li>\n<li>Sample Cloudflare Worker: <code>api.telegram.org<\/code> added to the allowlist.<\/li>\n<\/ul>\n\n<h4>4.9.0<\/h4>\n\n<ul>\n<li>Report thresholds now scale with the length of the exported window. Minimum-impression gates were tuned for 28 days, so on a 3-month export they were roughly three times too loose and on a 7-day export three times too strict.<\/li>\n<\/ul>\n\n<h4>4.8.0<\/h4>\n\n<ul>\n<li>Comparison exports now work with any date range, not just 28 days. Previously the column detection matched the literal text \"Last 28 days\"; every other range silently produced a report where all numbers were zero, alongside a misleading \"your file is single-period\" message.<\/li>\n<li>Added a guard against that silent failure: if a sheet has rows but no numbers could be read, the plugin says so and names the sheet.<\/li>\n<li>Re-running the same report no longer clutters the archive. Each run used to insert a new row, which put duplicate points into the time series and dragged volatility toward zero.<\/li>\n<\/ul>\n\n<h4>4.7.0<\/h4>\n\n<ul>\n<li>Rewrote the ranking-volatility module. It previously measured the absolute difference between two periods, which is not volatility and duplicated the \"biggest movers\" module. It now uses the standard deviation of position across at least three archived reports.<\/li>\n<li>Each report now stores a snapshot of the top 50 pages so per-page time series can be built.<\/li>\n<\/ul>\n\n<h4>4.6.1<\/h4>\n\n<ul>\n<li>Property selection in the report archive is now correctly limited to the Pro add-on.<\/li>\n<li>Fixed archive rows saved under an inconsistent property format, with a one-time migration.<\/li>\n<\/ul>","raw_excerpt":"Turn a Google Search Console export into a prioritised SEO action plan with formula-based analysis.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/352917","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=352917"}],"author":[{"embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/paletteagencyy"}],"wp:attachment":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=352917"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=352917"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=352917"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=352917"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=352917"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=352917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}