{"id":286378,"date":"2026-03-17T00:17:48","date_gmt":"2026-03-17T00:17:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/vector-expressions\/"},"modified":"2026-03-17T00:17:21","modified_gmt":"2026-03-17T00:17:21","slug":"vector-expressions","status":"publish","type":"plugin","link":"https:\/\/twd.wordpress.org\/plugins\/vector-expressions\/","author":23458467,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.2","stable_tag":"1.0.2","tested":"6.9.4","requires":"6.2","requires_php":"8.1","requires_plugins":null,"header_name":"Vector Expressions","header_author":"Vector Arrow LLC","header_description":"Logic engine for Gutenberg. Personalize content and control block visibility.","assets_banners_color":"3a7957","last_updated":"2026-03-17 00:17:21","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/vectorarrow.com\/products\/vector-expressions\/","header_author_uri":"https:\/\/vectorarrow.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":171,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"vectorarrow","date":"2026-03-17 00:17:21"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3484347,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3484347,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3484347,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3484347,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3484347,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3484347,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3484347,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3484347,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"Expression editor with live previews \u2014 edit expressions in the sidebar and see resolved values in real time.","2":"Autocomplete menu \u2014 type <code>{{<\/code> to browse data roots and insert expressions without memorizing syntax.","3":"Suggestion browser \u2014 browse all available data roots, properties, and filters organized by category.","4":"Visibility and dynamic class controls \u2014 show or hide any block based on conditions and inject CSS classes powered by expressions."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[148857,4060,2487,148076,10685],"plugin_category":[],"plugin_contributors":[257917],"plugin_business_model":[],"class_list":["post-286378","plugin","type-plugin","status-publish","hentry","plugin_tags-block-editor","plugin_tags-conditional","plugin_tags-dynamic-content","plugin_tags-gutenberg","plugin_tags-personalization","plugin_contributors-vectorarrow","plugin_committers-vectorarrow"],"banners":{"banner":"https:\/\/ps.w.org\/vector-expressions\/assets\/banner-772x250.png?rev=3484347","banner_2x":"https:\/\/ps.w.org\/vector-expressions\/assets\/banner-1544x500.png?rev=3484347","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/vector-expressions\/assets\/icon-128x128.png?rev=3484347","icon_2x":"https:\/\/ps.w.org\/vector-expressions\/assets\/icon-256x256.png?rev=3484347","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vector-expressions\/assets\/screenshot-1.png?rev=3484347","caption":"Expression editor with live previews \u2014 edit expressions in the sidebar and see resolved values in real time."},{"src":"https:\/\/ps.w.org\/vector-expressions\/assets\/screenshot-2.png?rev=3484347","caption":"Autocomplete menu \u2014 type <code>{{<\/code> to browse data roots and insert expressions without memorizing syntax."},{"src":"https:\/\/ps.w.org\/vector-expressions\/assets\/screenshot-3.png?rev=3484347","caption":"Suggestion browser \u2014 browse all available data roots, properties, and filters organized by category."},{"src":"https:\/\/ps.w.org\/vector-expressions\/assets\/screenshot-4.png?rev=3484347","caption":"Visibility and dynamic class controls \u2014 show or hide any block based on conditions and inject CSS classes powered by expressions."}],"raw_content":"<!--section=description-->\n<h4>Features<\/h4>\n\n<p><strong>Dynamic Content<\/strong> \u2014 Insert live data into any block using a simple template syntax: <code>{{ post.title }}<\/code>, <code>{{ user.name }}<\/code>, <code>{{ site.name }}<\/code>. No shortcodes, no PHP templates, no code.<\/p>\n\n<p><strong>Personalization<\/strong> \u2014 Greet visitors by name, show role-specific content, or display custom messages based on login status. Expressions are evaluated server-side on every page load.<\/p>\n\n<p><strong>Visibility Control<\/strong> \u2014 Show or hide any Gutenberg block based on conditions. Display content only for logged-in users, specific roles, or specific post states \u2014 all configured from the block sidebar.<\/p>\n\n<p><strong>Dynamic CSS Classes<\/strong> \u2014 Inject CSS classes into any block based on live data. Style blocks differently for administrators vs. guests, published vs. draft posts, and more.<\/p>\n\n<p><strong>20+ Built-in Filters<\/strong> \u2014 Transform values with chainable pipes: <code>upper<\/code>, <code>lower<\/code>, <code>truncate<\/code>, <code>date<\/code>, <code>default<\/code>, <code>match<\/code>, <code>replace<\/code>, <code>kebab<\/code>, and more. Chain them: <code>{{ post.title | upper | truncate 20 }}<\/code>.<\/p>\n\n<p><strong>Custom Fields<\/strong> \u2014 Access any post or user meta with <code>post.meta.my_field<\/code> or <code>user.meta.my_field<\/code>. Sensitive keys are blocked by default.<\/p>\n\n<p><strong>Full Expression Language<\/strong> \u2014 Arithmetic, comparison, ternary, logical operators, string interpolation, and bracket access. All evaluated server-side with zero frontend JavaScript.<\/p>\n\n<p><strong>In-Editor Autocomplete<\/strong> \u2014 Typing <code>{{<\/code> triggers smart autocomplete with categorized suggestions, icons, and live previews.<\/p>\n\n<p><strong>Extensible<\/strong> \u2014 Register custom data roots, custom filters, and custom autocomplete suggestions via WordPress hooks and JavaScript filters.<\/p>\n\n<p>For complete syntax reference, filter documentation, and developer guides, visit the <a href=\"https:\/\/vectorarrow.com\/docs\/\">full documentation<\/a>.<\/p>\n\n<h4>How It Works<\/h4>\n\n<p>Add an expression to any block's text content by typing <code>{{<\/code> and selecting your expression from the autocomplete menu. The plugin will automatically format it as an expression chip.<\/p>\n\n<pre><code>{{ post.title }}\n{{ user.name | default \"Guest\" }}\n{{ post.date | date \"F j, Y\" }}\n{{ user.is_logged_in ? \"Welcome back!\" : \"Hello, visitor!\" }}\n<\/code><\/pre>\n\n<p>Expressions are rendered as interactive chips in the editor and resolved server-side on every page render. No JavaScript runs on the frontend.<\/p>\n\n<p>For the full syntax guide, data roots, and filter reference, see the <a href=\"https:\/\/vectorarrow.com\/docs\/\">documentation<\/a>.<\/p>\n\n<h4>Source Code<\/h4>\n\n<p>The full, uncompressed source code is publicly available on <a href=\"https:\/\/github.com\/samuel-reinhardt\/Vector-Expressions\">GitHub<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to the <code>\/wp-content\/plugins\/vector-expressions<\/code> directory, or install the plugin through the WordPress plugins screen directly.<\/li>\n<li>Activate the plugin through the 'Plugins' screen in WordPress.<\/li>\n<li>Open the Block Editor and click the Vector ({{ braces) icon in the sidebar to access the Vector tab.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20any%20block%3F\"><h3>Does this work with any block?<\/h3><\/dt>\n<dd><p>Yes. Expressions can be inserted into any block that uses Gutenberg's standard RichText component \u2014 including paragraphs, headings, buttons, lists, and third-party blocks. Editor previews resolve automatically for these blocks. Blocks that don't support previews are still processed and rendered on the frontend. A small number of code-oriented blocks (Code, Preformatted, HTML, Shortcode, Classic Editor) are excluded.<\/p><\/dd>\n<dt id=\"is%20the%20content%20evaluated%20on%20the%20server%20or%20the%20client%3F\"><h3>Is the content evaluated on the server or the client?<\/h3><\/dt>\n<dd><p>All expressions are evaluated <strong>server-side<\/strong> on every block render. There is no JavaScript on the frontend, so content is resolved before it reaches the visitor's browser.<\/p><\/dd>\n<dt id=\"can%20i%20use%20custom%20post%20meta%20or%20user%20meta%3F\"><h3>Can I use custom post meta or user meta?<\/h3><\/dt>\n<dd><p>Yes. Use <code>post.meta.my_field<\/code> or <code>user.meta.my_field<\/code> to access any registered meta field. Sensitive meta keys (containing \"password\", \"token\", \"secret\", etc.) are blocked by default.<\/p><\/dd>\n<dt id=\"is%20this%20compatible%20with%20caching%20plugins%3F\"><h3>Is this compatible with caching plugins?<\/h3><\/dt>\n<dd><p>Expressions that depend on the current user (e.g., <code>user.name<\/code>, <code>user.is_logged_in<\/code>) require per-user or no-cache handling. Post-only expressions (e.g., <code>post.title<\/code>) are fully cache-safe.<\/p><\/dd>\n<dt id=\"can%20i%20extend%20it%20with%20my%20own%20data%20or%20filters%3F\"><h3>Can I extend it with my own data or filters?<\/h3><\/dt>\n<dd><p>Yes. Use PHP filters to register custom data roots and custom filter functions. Use JavaScript filters to add autocomplete suggestions in the editor. See the <a href=\"https:\/\/vectorarrow.com\/docs\/\">developer documentation<\/a> for details.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Added: <code>post.author_name<\/code> computed property \u2014 resolves author display name without exposing <code>wp_users<\/code> internals.<\/li>\n<li>Added: <code>date<\/code> filter for formatting date strings with custom PHP date formats.<\/li>\n<li><p>Added: Explicit pattern categories in the suggestion accordion \u2014 patterns can now declare their own category instead of being auto-distributed by root.<\/p><\/li>\n<li><p>Changed: <code>user.email<\/code> and <code>user.login<\/code> are now gated behind <code>is_user_logged_in()<\/code> \u2014 available for logged-in visitors (dashboard personalization), <code>null<\/code> for anonymous visitors.<\/p><\/li>\n<li>Changed: <code>get_user<\/code> modifier no longer requires <code>list_users<\/code> capability \u2014 the property allowlist is the security boundary.<\/li>\n<li>Changed: Restyled expression editor action buttons for improved visual hierarchy.<\/li>\n<li>Changed: Modifier architecture refactored into a base <code>Modifier<\/code> class and <code>ModifierSet<\/code> registry for cleaner extension patterns.<\/li>\n<li><p>Changed: Third-party developers can now inject expression completions at runtime via the <code>vector_expressions\/editor\/completions<\/code> JavaScript filter.<\/p><\/li>\n<li><p>Fixed: Removed direct user data hydration to prevent a race condition with <code>getCurrentUser()<\/code> and <code>useEffect<\/code> cleanup.<\/p><\/li>\n<li>Fixed: Modifier category matching updated to use <code>endsWith<\/code> with optional chaining for improved flexibility.<\/li>\n<li>Fixed: Documentation corrected: <code>post.url<\/code> now accurately documented as <code>get_permalink()<\/code> (was incorrectly listed as <code>guid<\/code>), syntax table for <code>{{{ }}}<\/code> clarified as <code>wp_kses_post()<\/code>.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added: Dedicated <strong>Vector<\/strong> sidebar tab in the block editor alongside Post and Block tabs.<\/li>\n<li>Added: <strong>Expression tab<\/strong> \u2014 clicking an in-content expression token opens the sidebar with a focused editor (input, live preview, apply\/remove).<\/li>\n<li>Added: <strong>Accordion suggestions<\/strong> with searchable filter \u2014 categories auto-expand when searching.<\/li>\n<li>Added: Tabbed layout with per-tab content filters (<code>vectorExpressions.sidebar.tab.*<\/code>).<\/li>\n<li>Added: <code>vectorExpressions.sidebar.tabs<\/code> filter for extensions to register additional tabs.<\/li>\n<li>Added: <code>vectorExpressions.suggestions.roots<\/code> filter for extensions to register root categories.<\/li>\n<li>Added: <code>vectorExpressions.suggestions.patterns<\/code> filter for extensions to add curated patterns.<\/li>\n<li>Added: <code>vectorExpressions.suggestions.categories<\/code> filter for extensions to customize accordion sections.<\/li>\n<li><p>Added: Single-tab mode: when no extensions add tabs, content renders without the tab strip.<\/p><\/li>\n<li><p>Changed: <strong>Expression editing moved from popover to sidebar<\/strong> \u2014 the floating popover is removed.<\/p><\/li>\n<li>Changed: Accordion categories are dynamically derived from completions data.<\/li>\n<li>Changed: Moved Visibility and Dynamic Class controls from the block inspector into the new sidebar.<\/li>\n<li><p>Changed: Logic panel HOC is now UI-free \u2014 only handles pass1\/pass2 token conversion.<\/p><\/li>\n<li><p>Fixed: Invalid forward slashes in WordPress hook namespace arguments (<code>addFilter<\/code>) replaced with dots \u2014 resolves React \"Rendered fewer hooks than expected\" crash on block selection.<\/p><\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Added: Vector Expressions block format added to the Rich Text toolbar.<\/li>\n<li>Added: Expression pill editing popover with syntax highlighting.<\/li>\n<li>Added: Server-side parsing and evaluation engine for expressions.<\/li>\n<li>Added: Logic panel in block inspector for visibility and class expressions.<\/li>\n<li><p>Added: Live preview evaluation via REST APIs.<\/p><\/li>\n<li><p>Changed: Changed the core expression pill HTML tag from <code>&lt;mark&gt;<\/code> to <code>&lt;span&gt;<\/code>.<\/p><\/li>\n<li><p>Fixed: Expression format now appears in core Button blocks and other blocks using <code>withoutInteractiveFormatting<\/code>. Removed <code>interactive: true<\/code> from format registration.<\/p><\/li>\n<li>Fixed: Pressing Escape while editing an expression in the popover now reliably closes it.<\/li>\n<li>Fixed: Custom <code>vector\/button<\/code> block now allows all registered rich-text formats (was <code>allowedFormats={[]}<\/code>).<\/li>\n<li><p>Fixed: <code>render_block_logic<\/code>: <code>attrs<\/code> is now always initialized as an empty array and guarded with <code>is_array()<\/code> before iteration.<\/p><\/li>\n<li><p>Features: <strong>Mustache-style expression syntax<\/strong> \u2014 Embed <code>{{ expression }}<\/code>, <code>{{{ raw }}}<\/code>, and <code>{{-- comment --}}<\/code> tokens directly inside any block's text content. Evaluated server-side on every render.<\/p><\/li>\n<li>Features: <strong>Dot-notation data access<\/strong> \u2014 Access WordPress data with simple, readable paths: <code>post.title<\/code>, <code>user.name<\/code>, <code>site.name<\/code>. No need to know internal WordPress property names like <code>post_title<\/code> or <code>display_name<\/code>.<\/li>\n<li>Features: <strong>Post, User &amp; Site context roots<\/strong> \u2014 Three built-in data roots cover the most common dynamic content needs out of the box.<\/li>\n<li>Features: <strong>Custom field (meta) access<\/strong> \u2014 Read any post or user meta field with <code>post.meta.my_key<\/code> or <code>user.meta.my_key<\/code>.<\/li>\n<li>Features: <strong>Full expression language<\/strong> \u2014 Supports arithmetic (<code>+<\/code>, <code>-<\/code>, <code>*<\/code>, <code>\/<\/code>, <code>%<\/code>), comparison (<code>==<\/code>, <code>!=<\/code>, <code>&gt;<\/code>, <code>&lt;<\/code>), logical operators (<code>&amp;&amp;<\/code>, <code>||<\/code>), ternary expressions (<code>condition ? a : b<\/code>), dynamic bracket access (<code>post[\"title\"]<\/code>), and inline string interpolation (<code>\"Hello {user.name}\"<\/code>).<\/li>\n<li>Features: <strong>Built-in filters (pipes)<\/strong> \u2014 Transform values with a chainable filter syntax: <code>upper<\/code> \/ <code>uppercase<\/code>, <code>lower<\/code> \/ <code>lowercase<\/code>, <code>upper_first<\/code> \/ <code>capitalize<\/code>, <code>truncate<\/code>, <code>trim<\/code>, <code>replace<\/code>, <code>kebab<\/code>, <code>default<\/code>, <code>if<\/code>, <code>match<\/code>, <code>map<\/code>, <code>join<\/code>, <code>prop<\/code> \/ <code>get<\/code>, <code>get_post<\/code>, <code>get_user<\/code>, <code>get_meta<\/code>, <code>date<\/code>, <code>esc_html<\/code>, <code>esc_attr<\/code>, <code>raw<\/code>, and <code>render<\/code>.<\/li>\n<li>Features: <strong>Block visibility control<\/strong> \u2014 Every Gutenberg block gains a <strong>Vector Logic<\/strong> panel. Set show\/hide conditions with an expression evaluated per-render.<\/li>\n<li>Features: <strong>Dynamic CSS class<\/strong> \u2014 Append CSS classes to any block's root element based on an expression result.<\/li>\n<li>Features: <strong>In-editor autocomplete<\/strong> \u2014 Typing <code>{{<\/code> in the block editor triggers a smart autocomplete dropdown with categorised expression suggestions, icons, and preview snippets.<\/li>\n<li>Features: <strong>In-editor expression chips<\/strong> \u2014 Inserted expressions are rendered as interactive inline chips in the editor, allowing quick edits and previews without hunting for raw text.<\/li>\n<li>Features: <strong>Excerpt rendering<\/strong> \u2014 Expressions in post content are evaluated before WordPress generates post excerpts, ensuring clean, parsed output in archive loops and REST responses.<\/li>\n<li>Features: <strong>Extensible via hooks<\/strong> \u2014 Register custom data roots, custom filter functions, custom autocomplete completions, and more via standard WordPress filters and JavaScript hooks.<\/li>\n<li><p>Features: <strong><code>WP_DEBUG<\/code> error comments<\/strong> \u2014 When debug mode is active, parse errors are surfaced as HTML comments (<code>&lt;!-- VE Error: ... --&gt;<\/code>) for easy troubleshooting.<\/p><\/li>\n<li><p>Added: <strong><code>prop<\/code> \/ <code>get<\/code> filter<\/strong> \u2014 Access a property on the result of a pipeline filter without needing parentheses. <code>{{ post.id | get_post | prop 'post_title' }}<\/code> is now equivalent to <code>{{ (post.id | get_post).post_title }}<\/code>.<\/p><\/li>\n<li>Added: <strong><code>truncate<\/code> filter<\/strong> \u2014 Limit a string to N characters with an optional suffix (default <code>\u2026<\/code>). Supports named args: <code>{{ post.excerpt | truncate length=120 suffix='...' }}<\/code>.<\/li>\n<li>Added: <strong><code>trim<\/code> filter<\/strong> \u2014 Strip whitespace or a custom character set: <code>{{ value | trim }}<\/code> \/ <code>{{ value | trim '\/' }}<\/code>.<\/li>\n<li>Added: <strong><code>replace<\/code> filter<\/strong> \u2014 Find-and-replace: <code>{{ post.title | replace 'Old' 'New' }}<\/code> or with named args <code>search=<\/code> \/ <code>replace=<\/code>.<\/li>\n<li>Added: <strong><code>upper_first<\/code> \/ <code>capitalize<\/code> filter<\/strong> \u2014 Uppercase the first character only: <code>{{ post.title | capitalize }}<\/code>.<\/li>\n<li>Added: <strong><code>kebab<\/code> filter<\/strong> \u2014 Convert a string to a URL-safe kebab slug via WordPress's native <code>sanitize_title()<\/code>: <code>{{ post.title | kebab }}<\/code>.<\/li>\n<li>Added: <strong>Filter aliases<\/strong> \u2014 <code>uppercase<\/code> (\u2192 <code>upper<\/code>), <code>lowercase<\/code> (\u2192 <code>lower<\/code>), <code>capitalize<\/code> (\u2192 <code>upper_first<\/code>) for more readable expressions.<\/li>\n<li>Added: <strong>Keyword meta deny list<\/strong> \u2014 <code>ObjectProxy<\/code> and <code>get_meta<\/code> now block meta keys containing sensitive substrings (<code>pass<\/code>, <code>token<\/code>, <code>secret<\/code>, <code>api_key<\/code>, <code>auth<\/code>, <code>nonce<\/code>, <code>salt<\/code>, <code>credential<\/code>, <code>private_key<\/code>) as a defense-in-depth layer beyond <code>is_protected_meta()<\/code>. The list is filterable via <code>vector_expressions\/security\/sensitive_meta_keywords<\/code>.<\/li>\n<li>Added: <strong><code>vector_expressions\/error<\/code> action<\/strong> \u2014 Fires on every expression evaluation failure. Allows production error tracking (logging, Sentry, etc.) without exposing details in the frontend HTML.<\/li>\n<li><p>Added: <strong><code>vectorExpressions.logicPanel.sections<\/code> JS filter<\/strong> \u2014 Extension point for adding custom sections to the Vector Expressions inspector panel from JavaScript. Used by Pro to inject Dynamic Bindings UI.<\/p><\/li>\n<li><p>Fixed: <code>render_block_logic<\/code>: <code>attrs<\/code> is now always initialized as an empty array and guarded with <code>is_array()<\/code> before iteration.<\/p><\/li>\n<\/ul>","raw_excerpt":"Embed dynamic expressions in the Gutenberg block editor to personalize content and control block visibility.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/286378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=286378"}],"author":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/vectorarrow"}],"wp:attachment":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=286378"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=286378"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=286378"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=286378"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=286378"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=286378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}