{"id":74223,"date":"2026-02-12T21:00:54","date_gmt":"2026-02-12T13:00:54","guid":{"rendered":"https:\/\/www.hongkiat.com\/blog\/?p=74223"},"modified":"2026-02-02T19:29:40","modified_gmt":"2026-02-02T11:29:40","slug":"wordpress-abilities-api-tutorial","status":"publish","type":"post","link":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/","title":{"rendered":"How to Use the WordPress Abilities API (Register &#038; Execute)"},"content":{"rendered":"<p>WordPress 6.9 is shipped with a number of interesting features. Among these is a new API called <strong><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/developer.wordpress.org\/news\/2025\/11\/introducing-the-wordpress-abilities-api\/\">Abilities API<\/a><\/strong>.<\/p>\n<p><strong>The Abilities API<\/strong> provides a standardized way for WordPress core, plugins, and themes to define their capabilities in a format both humans and machines can read.<\/p>\n<p>In this post, we\u2019ll explore what the Abilities API is, why it matters, and how to use it in practice with some code examples.<\/p>\n<p>Without further ado, let\u2019s get started.<\/p>\n<h2>What is Abilities API?<\/h2>\n<p>The Abilities API is a new feature in WordPress that acts like a dictionary of everything a site can do. Before this, there was no simple or consistent way for plugins or external tools to discover a site\u2019s available features. Functionality was often scattered across hooks, REST API endpoints, and various pieces of custom code.<\/p>\n<p>With the Abilities API, automation tools, AI assistants, and other plugins can more easily understand how to interact with a WordPress site. Tools like AI agents, Zapier, or <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/n8n.io\/\">n8n<\/a> can simply ask WordPress, <strong>\u201cWhat can you do?\u201d<\/strong> and receive a structured list of abilities.<\/p>\n<p>This API also makes cross-plugin collaboration much cleaner. Plugins can call each other\u2019s abilities directly instead of relying on hidden hooks or fragile workarounds.<\/p>\n<h2>Getting Started<\/h2>\n<p>To <strong>use the Abilities API<\/strong>, the first step is to register a new ability. This is typically done within your plugin or theme. An \u201cAbility\u201d should contain:<\/p>\n<ul>\n<li>A unique name that consists of only lowercase alphanumeric characters, dashes, and forward slashes e.g. <code>hongkiatcom\/create-invoice<\/code><\/li>\n<li>A human-readable description and label.<\/li>\n<li>A defined output and input schema.<\/li>\n<li>A permission check.<\/li>\n<\/ul>\n<p>Here is a simple example of how we register an ability that analyzes a site and returns some metrics.<\/p>\n<p>In this example, we call it <code>hongkiatcom\/site-analytics-summary<\/code>. It doesn\u2019t require any inputs and returns an object containing three metrics: visits, signups, and sales. The ability can only be executed by users with the <code>manage_options<\/code> capability.<\/p>\n<pre>\r\nadd_action( 'wp_abilities_api_init', function () {\r\n    if ( ! function_exists( 'wp_register_ability' ) ) {\r\n        return;\r\n    }\r\n    \r\n    wp_register_ability(\r\n        'hongkiatcom\/site-analytics-summary',\r\n        [\r\n            'label'       => __( 'Get Site Analytics Summary', 'myplugin' ),\r\n            'description' => __( 'Returns a simple overview of site performance.', 'myplugin' ),\r\n            'input_schema' => [\r\n                'type'       => 'object',\r\n                'properties' => [],\r\n            ],\r\n            'output_schema' => [\r\n                'type'       => 'object',\r\n                'properties' => [\r\n                    'visits'  => [ 'type' => 'integer' ],\r\n                    'signups' => [ 'type' => 'integer' ],\r\n                    'sales'   => [ 'type' => 'integer' ],\r\n                ],\r\n            ],\r\n            'permission_callback' => function () {\r\n                return current_user_can( 'manage_options' );\r\n            },\r\n            'execute_callback' => function () {\r\n                return [\r\n                    'visits'  => 1473,\r\n                    'signups' => 32,\r\n                    'sales'   => 5,\r\n                ];\r\n            },\r\n        ]\r\n    );\r\n});\r\n<\/pre>\n<p>Here is another example of registering an ability that processes an order. This ability takes in customer ID, product SKUs, and a payment token as input, and returns the order ID, status, and a confirmation message as output.<\/p>\n<pre>\r\nadd_action( 'init', function() {\r\n    if ( ! function_exists( 'wp_register_ability' ) ) {\r\n        return;\r\n    }\r\n\r\n    wp_register_ability( 'hongkiatcom\/process-order', [\r\n        'description' => 'Handles payment, creates an order record, and sends a confirmation email.',\r\n        'execute_callback'    => function () {\r\n            \/\/ Implementation of order processing logic goes here...\r\n        },\r\n        'input_schema' => [\r\n            'type'       => 'object',\r\n            'properties' => [\r\n                'customer_id' => [\r\n                    'type'        => 'integer',\r\n                    'description' => 'The ID of the customer placing the order.',\r\n                ],\r\n                'product_skus' => [\r\n                    'type'        => 'array',\r\n                    'description' => 'An array of product SKUs (strings) to be included in the order.',\r\n                    'items'       => [ 'type' => 'string' ],\r\n                ],\r\n                'payment_token' => [\r\n                    'type'        => 'string',\r\n                    'description' => 'A secure, single-use token from the payment gateway.',\r\n                ],\r\n            ],\r\n            'required' => [ 'customer_id', 'product_skus', 'payment_token' ],\r\n        ],\r\n        'output_schema' => [\r\n            'type'       => 'object',\r\n            'properties' => [\r\n                'order_id' => [\r\n                    'type'        => 'integer',\r\n                    'description' => 'The ID of the newly created order post.',\r\n                ],\r\n                'order_status' => [\r\n                    'type'        => 'string',\r\n                    'description' => 'The resulting status of the order (e.g., \"processing\", \"pending\").',\r\n                ],\r\n                'message' => [\r\n                    'type'        => 'string',\r\n                    'description' => 'A confirmation message.',\r\n                ],\r\n            ],\r\n        ],\r\n    ] );\r\n} );\r\n<\/pre>\n<h2>Executing Abilities<\/h2>\n<p>Registering an ability doesn\u2019t do much on its own. We also want to execute it and get the result.<\/p>\n<h5>In PHP<\/h5>\n<p>In PHP, using an ability is straightforward. WordPress provides a function <code>wp_get_ability()<\/code> to retrieve the ability object by name, and then you call the ability\u2019s <code>execute()<\/code> method.<\/p>\n<p>Here\u2019s how you might execute the <code>site-analytics-summary<\/code> ability we registered:<\/p>\n<pre>\r\n$ability = wp_get_ability( 'hongkiatcom\/site-analytics-summary' );\r\n\r\nif ( $ability ) {\r\n    $result = $ability->execute();\r\n}\r\n<\/pre>\n<p>If the ability requires inputs such as in the <code>process-order<\/code> example, you would pass an associative array of inputs to the <code>execute()<\/code> method:<\/p>\n<pre>\r\n$ability = wp_get_ability( 'hongkiatcom\/process-order' );\r\nif ( $ability ) {\r\n    $inputs = [\r\n        'customer_id'  => 123,\r\n        'product_skus' => [ 'SKU123', 'SKU456' ],\r\n        'payment_token'=> 'tok_1A2B3C****',\r\n    ];\r\n    $result = $ability->execute( $inputs );\r\n}\r\n<\/pre>\n<p>Notice that we didn\u2019t have to manually handle permission checks or input validation here. If the current user didn\u2019t have permission, or if we passed a wrong type of input, <code>execute()<\/code> would fail gracefully. It wouldn\u2019t run the callback and would return an error or false. This is thanks to the schemas and permission callback we set up during registration. It makes using the ability safe and predictable.<\/p>\n<p>Now that we\u2019ve seen how to declare and use abilities on the back-end, let\u2019s look at how abilities can be accessed from JavaScript, which covers front-end use cases and external integrations.<\/p>\n<h5>In JavaScript<\/h5>\n<p>The Abilities API supports REST API out of the box, but you need to make sure that you enable the <code>show_in_rest<\/code> on the Ability registration, for example:<\/p>\n<pre>\r\nadd_action( 'wp_abilities_api_init', function () {\r\n    if ( ! function_exists( 'wp_register_ability' ) ) {\r\n        return;\r\n    }\r\n    \r\n    wp_register_ability(\r\n        'hongkiatcom\/site-analytics-summary',\r\n        [\r\n            ...\r\n            'execute_callback' => function () {\r\n                return [\r\n                    'visits'  => 1473,\r\n                    'signups' => 32,\r\n                    'sales'   => 5,\r\n                ];\r\n            },\r\n            'meta' => [\r\n                'show_in_rest' => true,\r\n            ],\r\n        ]\r\n    );\r\n});\r\n<\/pre>\n<p>Once that\u2019s set, the ability becomes accessible under a special REST namespace <code>wp-abilities\/v1\/{ability-namespace}\/{ability-name}<\/code>. In our example above, the full REST endpoint to execute the ability would be: <code>\/wp-json\/wp-abilities\/v1\/hongkiatcom\/site-analytics-summary<\/code>.<\/p>\n<p>This means external applications or your own front-end code can execute abilities by sending HTTP requests without you writing any extra REST handler code. WordPress takes care of that based on the info you provided.<\/p>\n<p>WordPress is also introducing a JavaScript client library for the Abilities API, making it much easier to call abilities from the browser or any headless JS setup. Instead of writing manual <code>fetch()<\/code> calls, you can simply use built-in helper functions to list, fetch, and run abilities.<\/p>\n<p>First, we\u2019d need to install the library with NPM:<\/p>\n<pre>\r\nnpm i @wordpress\/abilities\r\n<\/pre>\n<p>Then, we can use it like this in our JavaScript application:<\/p>\n<pre>\r\nuseEffect(() => {\r\n   executeAbility( 'hongkiatcom\/site-analytics-summary' ).then( ( response ) => {\r\n       setResponse( response ); \/\/ Store the result in state.\r\n   } );\r\n}, []);\r\n<\/pre>\n<h2>Wrapping Up<\/h2>\n<p>The Abilities API introduces a new way for WordPress to describe what it can do in a clear and more standardized format. This improves the interoperability of your site and allows it to work more naturally with AI assistants or automation tools.<\/p>\n<p>In this article, we\u2019ve just scratched the surface of what\u2019s possible with the Abilities API. As more plugins and themes adopt it, we can expect a richer ecosystem where capabilities are easily discoverable and usable across different contexts.<\/p>\n<p>And in the next article, we\u2019ll see how we can integrate your WordPress site with external applications like Claude or LM Studio using the Abilities API.<\/p>\n<p>So stay tuned!<\/p>","protected":false},"excerpt":{"rendered":"<p>WordPress 6.9 is shipped with a number of interesting features. Among these is a new API called Abilities API. The Abilities API provides a standardized way for WordPress core, plugins, and themes to define their capabilities in a format both humans and machines can read. In this post, we\u2019ll explore what the Abilities API is,&hellip;<\/p>\n","protected":false},"author":113,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[49],"tags":[],"topic":[],"class_list":["entry-content","is-maxi"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v22.8 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to Use the WordPress Abilities API (Register &amp; Execute) - Hongkiat<\/title>\n<meta name=\"description\" content=\"WordPress 6.9 is shipped with a number of interesting features. Among these is a new API called Abilities API. The Abilities API provides a standardized\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Use the WordPress Abilities API (Register &amp; Execute)\" \/>\n<meta property=\"og:description\" content=\"WordPress 6.9 is shipped with a number of interesting features. Among these is a new API called Abilities API. The Abilities API provides a standardized\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"Hongkiat\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/hongkiatcom\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-12T13:00:54+00:00\" \/>\n<meta name=\"author\" content=\"Thoriq Firdaus\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@tfirdaus\" \/>\n<meta name=\"twitter:site\" content=\"@hongkiat\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Thoriq Firdaus\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wordpress-abilities-api-tutorial\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wordpress-abilities-api-tutorial\\\/\"},\"author\":{\"name\":\"Thoriq Firdaus\",\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/#\\\/schema\\\/person\\\/e7948c7a175d211496331e4b6ce55807\"},\"headline\":\"How to Use the WordPress Abilities API (Register &#038; Execute)\",\"datePublished\":\"2026-02-12T13:00:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wordpress-abilities-api-tutorial\\\/\"},\"wordCount\":819,\"publisher\":{\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/#organization\"},\"articleSection\":[\"WordPress\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wordpress-abilities-api-tutorial\\\/\",\"url\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wordpress-abilities-api-tutorial\\\/\",\"name\":\"How to Use the WordPress Abilities API (Register & Execute) - Hongkiat\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-02-12T13:00:54+00:00\",\"description\":\"WordPress 6.9 is shipped with a number of interesting features. Among these is a new API called Abilities API. The Abilities API provides a standardized\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wordpress-abilities-api-tutorial\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wordpress-abilities-api-tutorial\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wordpress-abilities-api-tutorial\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Use the WordPress Abilities API (Register &#038; Execute)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/\",\"name\":\"Hongkiat\",\"description\":\"Tech and Design Tips\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/#organization\",\"name\":\"Hongkiat.com\",\"url\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wp-content\\\/uploads\\\/hkdc-logo-rect-yoast.jpg\",\"contentUrl\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/wp-content\\\/uploads\\\/hkdc-logo-rect-yoast.jpg\",\"width\":1200,\"height\":799,\"caption\":\"Hongkiat.com\"},\"image\":{\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/hongkiatcom\",\"https:\\\/\\\/x.com\\\/hongkiat\",\"https:\\\/\\\/www.pinterest.com\\\/hongkiat\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/#\\\/schema\\\/person\\\/e7948c7a175d211496331e4b6ce55807\",\"name\":\"Thoriq Firdaus\",\"description\":\"Thoriq is a writer for Hongkiat.com with a passion for web design and development. He is the author of Responsive Web Design by Examples, where he covered his best approaches in developing responsive websites quickly with a framework.\",\"sameAs\":[\"https:\\\/\\\/thoriq.com\",\"https:\\\/\\\/x.com\\\/tfirdaus\"],\"jobTitle\":\"Web Developer\",\"url\":\"https:\\\/\\\/www.hongkiat.com\\\/blog\\\/author\\\/thoriq\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Use the WordPress Abilities API (Register & Execute) - Hongkiat","description":"WordPress 6.9 is shipped with a number of interesting features. Among these is a new API called Abilities API. The Abilities API provides a standardized","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/","og_locale":"en_US","og_type":"article","og_title":"How to Use the WordPress Abilities API (Register & Execute)","og_description":"WordPress 6.9 is shipped with a number of interesting features. Among these is a new API called Abilities API. The Abilities API provides a standardized","og_url":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/","og_site_name":"Hongkiat","article_publisher":"https:\/\/www.facebook.com\/hongkiatcom","article_published_time":"2026-02-12T13:00:54+00:00","author":"Thoriq Firdaus","twitter_card":"summary_large_image","twitter_creator":"@tfirdaus","twitter_site":"@hongkiat","twitter_misc":{"Written by":"Thoriq Firdaus"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/#article","isPartOf":{"@id":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/"},"author":{"name":"Thoriq Firdaus","@id":"https:\/\/www.hongkiat.com\/blog\/#\/schema\/person\/e7948c7a175d211496331e4b6ce55807"},"headline":"How to Use the WordPress Abilities API (Register &#038; Execute)","datePublished":"2026-02-12T13:00:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/"},"wordCount":819,"publisher":{"@id":"https:\/\/www.hongkiat.com\/blog\/#organization"},"articleSection":["WordPress"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/","url":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/","name":"How to Use the WordPress Abilities API (Register & Execute) - Hongkiat","isPartOf":{"@id":"https:\/\/www.hongkiat.com\/blog\/#website"},"datePublished":"2026-02-12T13:00:54+00:00","description":"WordPress 6.9 is shipped with a number of interesting features. Among these is a new API called Abilities API. The Abilities API provides a standardized","breadcrumb":{"@id":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.hongkiat.com\/blog\/wordpress-abilities-api-tutorial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.hongkiat.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Use the WordPress Abilities API (Register &#038; Execute)"}]},{"@type":"WebSite","@id":"https:\/\/www.hongkiat.com\/blog\/#website","url":"https:\/\/www.hongkiat.com\/blog\/","name":"Hongkiat","description":"Tech and Design Tips","publisher":{"@id":"https:\/\/www.hongkiat.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.hongkiat.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.hongkiat.com\/blog\/#organization","name":"Hongkiat.com","url":"https:\/\/www.hongkiat.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hongkiat.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.hongkiat.com\/blog\/wp-content\/uploads\/hkdc-logo-rect-yoast.jpg","contentUrl":"https:\/\/www.hongkiat.com\/blog\/wp-content\/uploads\/hkdc-logo-rect-yoast.jpg","width":1200,"height":799,"caption":"Hongkiat.com"},"image":{"@id":"https:\/\/www.hongkiat.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/hongkiatcom","https:\/\/x.com\/hongkiat","https:\/\/www.pinterest.com\/hongkiat\/"]},{"@type":"Person","@id":"https:\/\/www.hongkiat.com\/blog\/#\/schema\/person\/e7948c7a175d211496331e4b6ce55807","name":"Thoriq Firdaus","description":"Thoriq is a writer for Hongkiat.com with a passion for web design and development. He is the author of Responsive Web Design by Examples, where he covered his best approaches in developing responsive websites quickly with a framework.","sameAs":["https:\/\/thoriq.com","https:\/\/x.com\/tfirdaus"],"jobTitle":"Web Developer","url":"https:\/\/www.hongkiat.com\/blog\/author\/thoriq\/"}]}},"jetpack_featured_media_url":"https:\/\/","jetpack_shortlink":"https:\/\/wp.me\/p4uxU-jj9","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/posts\/74223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/users\/113"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/comments?post=74223"}],"version-history":[{"count":1,"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/posts\/74223\/revisions"}],"predecessor-version":[{"id":74224,"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/posts\/74223\/revisions\/74224"}],"wp:attachment":[{"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/media?parent=74223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/categories?post=74223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/tags?post=74223"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.hongkiat.com\/blog\/wp-json\/wp\/v2\/topic?post=74223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}