{"id":95297,"date":"2012-08-28T14:24:32","date_gmt":"2012-08-28T18:24:32","guid":{"rendered":"http:\/\/wpmu.org\/?p=95297"},"modified":"2013-04-15T01:19:14","modified_gmt":"2013-04-15T05:19:14","slug":"wordpress-plugin-construction-for-the-non-programmer-part-vi","status":"publish","type":"post","link":"https:\/\/wpmudev.com\/blog\/wordpress-plugin-construction-for-the-non-programmer-part-vi\/","title":{"rendered":"WordPress Plugin Construction for the Non-Programmer: Part VI"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-96104 aligncenter\" src=\"https:\/\/wpmudev.com\/blog\/wp-content\/uploads\/2012\/08\/wordpress-tutorial2.jpg\" alt=\"Post image\" aria-hidden=\"true\" width=\"440\" height=\"300\" \/><\/p>\n<p>Welcome to the sixth post in my series on building a WordPress plugin from scratch. This tutorial series requires no programming experience, but I do suggest you start from the first post in this series if you\u2019re a total newbie to WordPress development.<\/p>\n<p>Just a couple things to keep in mind about this series if you\u2019re just tuning in:<\/p>\n<h2>Five Official \u201cCover my Butt\u201d Statements<\/h2>\n<ul>\n<li>At the time of this writing, the most up to date WordPress version is 3.4.1. It might be different by the time you read this.<\/li>\n<li>I\u2019m assuming you already know how to install a basic WordPress site, if you\u2019re unsure please see their <a href=\"http:\/\/www.wordpress.org\/\" target=\"_blank\">www.wordpress.org<\/a>.<\/li>\n<li>Please do NOT attempt anything in these tutorials on one of your live WordPress sites. Rather, set up a subdomain and a brand new WordPress installation to use for plugin testing purposes only.<\/li>\n<li>If you\u2019re confused by any of the code or terminology above, please go back and read the first five posts in this series.<\/li>\n<\/ul>\n<h2>Basic WordPress Plugin Source Code for This Tutorial<\/h2>\n<p>Below is the source code for this tutorial. I\u2019ve provided this for example purposes but strongly encourage you to recode this yourself from scratch and to experiment with some minor modifications:<\/p>\n<p>{code type=php}<\/p>\n<p>&lt;?php<\/p>\n<p>\/*\/<\/p>\n<p>Plugin Name: Basic<\/p>\n<p>Plugin URI: www.yourwebsiteurl.com<\/p>\n<p>Description: Demonstrates how a WP plugin works and how to create a unique class for your WordPress plugin.<\/p>\n<p>Version: 101<\/p>\n<p>Author: Your Name<\/p>\n<p>Author URI:\u00a0 www.yourwebsiteurl.com<\/p>\n<p>\/*\/<\/p>\n<p>\/\/ check for existing class \/\/<\/p>\n<p>if(!class_exists(&#8220;YourBrandWPBasic&#8221;)) {<\/p>\n<p>\/\/ create class \/\/<\/p>\n<p>class YourBrandWPBasic {<\/p>\n<p>\/\/plugin constructor\/\/<\/p>\n<p>function YourBrandWPConstructor(){<\/p>\n<p>}\/\/close constructor \/\/<\/p>\n<p>\/\/create admin page\/\/<\/p>\n<p>function YourBrandWPAdminPage() {<\/p>\n<p>\/\/lock out unauthorized users\/\/<\/p>\n<p>if (!current_user_can(&#8216;manage_options&#8217;)) {<\/p>\n<p>wp_die( __( &#8216; KEEP OUT! Authorized Personnel Only!&#8217; ) );<\/p>\n<p>}\/\/end lock out\/<\/p>\n<p>\/\/spit out html for admin area\/\/<\/p>\n<p>echo &#8216;&lt;div&gt;&#8217;;<\/p>\n<p>echo &#8216;&lt;h1&gt;Welcome to Your Brand WP Basic&lt;\/h1&gt;&#8217;;<\/p>\n<p>echo &#8216;&lt;p&gt;This will be the command center for the Basic Plugin customization features.&lt;\/p&gt;&#8217;;<\/p>\n<p>echo &#8216;&lt;\/div&gt;&#8217;;<\/p>\n<p>\/\/grab users information from the database\/\/<\/p>\n<p>global $wpdb;<\/p>\n<p>\/\/grab user data\/\/<\/p>\n<p>$user_data = $wpdb-&gt;get_row(&#8220;SELECT * FROM $wpdb-&gt;users WHERE ID = 1&#8221;, ARRAY_A);<\/p>\n<p>echo &#8220;Username: &#8220;. $user_data[&#8216;user_login&#8217;];<\/p>\n<p>echo &#8221; | User Email: &#8220;. $user_data[&#8216;user_email&#8217;];<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p>echo &#8220;First post by &#8220;. $user_data[&#8216;user_login&#8217;] . &#8220;: &#8220;;<\/p>\n<p>\/\/grab user post data\/\/<\/p>\n<p>$user_post_data = $wpdb-&gt;get_row(&#8220;SELECT * FROM $wpdb-&gt;posts WHERE post_author = &#8216;&#8221; . $user_data[&#8216;ID&#8217;] . &#8220;&#8216;&#8221;, ARRAY_A);<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p>echo $user_post_data[&#8216;post_title&#8217;];<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p>} \/\/end of html for admin page\/\/<\/p>\n<p>\/\/build plugin menu\/\/<\/p>\n<p>function my_plugin_menu() {<\/p>\n<p>add_options_page(&#8216;Your Brand WP Basic&#8217;, &#8216;Your Brand WP Basic&#8217;, &#8216;manage_options&#8217;, &#8216;your-brand-wp-basic-admin&#8217;, array(&amp;$this, &#8216;YourBrandWPAdminPage&#8217;));<\/p>\n<p>}\/\/end plugin menu<\/p>\n<p>} \/\/ close class \/\/<\/p>\n<p>} \/\/close check or existing class \/\/<\/p>\n<p>\/\/if the class exists, assign a handler to it\/\/<\/p>\n<p>if(class_exists(YourBrandWPBasic)){<\/p>\n<p>$your_brand_wp_basic = new YourBrandWPBasic();<\/p>\n<p>\/\/tell your handler to build the plugin menu using WP action<\/p>\n<p>add_action( &#8216;admin_menu&#8217;, array($your_brand_wp_basic, &#8216;my_plugin_menu&#8217;) );<\/p>\n<p>}\/\/close assignment of handler\/\/<\/p>\n<p><\/code><\/p>\n<p>BTW, a quick disclaimer about these source code snippets based on some feedback from one of my more experienced readers\u2026<\/p>\n<p>The \u201c\/\/\u201d which you see after each of my comments is not considered standard practice for PHP commenting. Comments in PHP normally start with either \u201c\/\u201d or \u201c\/\/\u201d but don\u2019t end in \u201c\/\u201d or \u201c\/\/\u201d as they do in my examples. The code will function the same whether you comment as I have or follow the conventions, just be aware that I\u2019m deviating from the standard a bit.<\/p>\n<p>And now, let\u2019s break down our new lines of code in plain English.<\/p>\n<h2>Step #1: Use the $wpdb Class to Talk to the WordPress Database<\/h2>\n<p>In the fourth post of this series, I showed you how to create a basic menu for your plugin within the WordPress admin panel as well as a very simple admin page. In this tutorial, we\u2019re simply using the $wpdb class (covered in the fifth tutorial of this series) to display some information from the WordPress database in the admin page of your plugin.<\/p>\n<p>This will be accomplished through the portion of code which we added to the method called \u201cYourBrandWPAdminPage\u201d which is a \u201ctool\u201d in your \u201cYourBrandWPBasic\u201d class (toolbox).<\/p>\n<p>The code for the entire \u201cYourBrandWPAdminPage\u201d method is below:<\/p>\n<p>{code type=php}<\/p>\n<p>function YourBrandWPAdminPage() {<\/p>\n<p>\/\/lock out unauthorized users\/\/<\/p>\n<p>if (!current_user_can(&#8216;manage_options&#8217;)) {<\/p>\n<p>wp_die( __( &#8216; KEEP OUT! Authorized Personnel Only!&#8217; ) );<\/p>\n<p>}\/\/end lock out\/\/<\/p>\n<p>\/\/spit out html for admin area\/\/<\/p>\n<p>echo &#8216;&lt;div&gt;&#8217;;<\/p>\n<p>echo &#8216;&lt;h1&gt;Welcome to Your Brand WP Basic&lt;\/h1&gt;&#8217;;<\/p>\n<p>echo &#8216;&lt;p&gt;This will be the command center for the Basic Plugin customization features.&lt;\/p&gt;&#8217;;<\/p>\n<p>echo &#8216;&lt;\/div&gt;&#8217;;<\/p>\n<p>\/\/grab users information from the database\/\/<\/p>\n<p>global $wpdb;<\/p>\n<p>\/\/grab user data\/\/<\/p>\n<p>$user_data = $wpdb-&gt;get_row(&#8220;SELECT * FROM $wpdb-&gt;users WHERE ID = 1&#8221;, ARRAY_A);<\/p>\n<p>echo &#8220;Username: &#8220;. $user_data[&#8216;user_login&#8217;];<\/p>\n<p>echo &#8221; | User Email: &#8220;. $user_data[&#8216;user_email&#8217;];<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p>echo &#8220;First post by &#8220;. $user_data[&#8216;user_login&#8217;] . &#8220;: &#8220;;<\/p>\n<p>\/\/grab user post data\/\/<\/p>\n<p>$user_post_data = $wpdb-&gt;get_row(&#8220;SELECT * FROM $wpdb-&gt;posts WHERE post_author = &#8216;&#8221; . $user_data[&#8216;ID&#8217;] . &#8220;&#8216;&#8221;, ARRAY_A);<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p>echo $user_post_data[&#8216;post_title&#8217;];<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p>} \/\/end of html for admin page\/\/<\/p>\n<p><\/code><\/p>\n<p>Everything above the <strong>\u201c\/\/grab users information from the database\/\/\u201d <\/strong>comment should look familiar, we\u2019ve covered it in the past few tutorials of this series.<\/p>\n<p>However, you\u2019ll notice that beneath that comment we\u2019ve added some new codes. First, we set the global variable (global variables were explained in post V of this series) $wpdb to show that we\u2019ll be using the WordPress $wpdb class to \u201ctalk\u201d to the WordPress database:<\/p>\n<p>{code type=php}<\/p>\n<p>global $wpdb;<\/p>\n<p><\/code><\/p>\n<p>In the next line of code, we apply the $wpdb class to grab some data from the table called \u201cusers.\u201d Let\u2019s break down look at exactly what this code is doing:<\/p>\n<p>{code type=php}<\/p>\n<p>$user_data = $wpdb-&gt;get_row(&#8220;SELECT * FROM $wpdb-&gt;users WHERE ID = 1&#8221;, ARRAY_A);<\/p>\n<p><\/code><\/p>\n<p>First, we\u2019re storing everything to the right of the \u201c=\u201d sign in a variable called \u201c$user_data.\u201d The commands to the right of the \u201c=\u201d then tell us exactly what information will end up stored in the \u201c$user_data\u201d variable.<\/p>\n<p>First, I\u2019m using the \u201c$wpdb-&gt;get_row\u201d to tell WordPress that I\u2019m calling a method named \u201cget_row\u201d which is a part of the \u201c$wpdb\u201d class. The method \u201cget_row\u201d is another native WordPress function. It simply means that I\u2019m grabbing a row of data out of the WordPress database. Between the \u201c(\u201c and the \u201c)\u201d are the two pieces of information which the \u201cget_row\u201d method is operating on, separated by a comma.<\/p>\n<p>The first piece of information is:<\/p>\n<p><strong>&#8220;SELECT * FROM $wpdb-&gt;users WHERE ID = 1&#8221;<\/strong><\/p>\n<p>In the previous post of this series, I explained that this command ^ is telling WordPress to \u201cSELECT\u201d * (\u201c*\u201d stands for \u201ceverything) \u201cFROM\u201d the WordPress database ($wpdb) table named \u201cusers\u201d \u201cWHERE\u201d the \u201cID\u201d column is equal to the number one.<\/p>\n<p>Pretty simple right?<\/p>\n<p>Just one thing you need to be aware of\u2026the actual table within the WordPress database is called \u201cwp_users,\u201d not \u201cusers.\u201d So why are we saying \u201c$wpdb-&gt;users\u201d instead of $wpdb-&gt;wp_users?\u201d Because that\u2019s the way the WordPress developers decided to build the \u201c$wpdb\u201d class, so keep that in mind while you\u2019re communicating with the WordPress database using the \u201c$wpdb\u201d class.<\/p>\n<p>The next piece of information is \u201cARRAY_A\u201d which is another WordPress command. Remember that an array is a string of information, and it can contain letters and words only, <em>numbers<\/em> only OR it can contain both letters <em>and<\/em> numbers. When an array contains letters and numbers, it\u2019s called an associative array.<\/p>\n<p>If you look at the \u201cwp_users\u201d table of your WordPress installation, you\u2019ll notice that the rows of data in that table contain numbers and letters as well as words. So can you guess why we\u2019re using \u201cARRAY_A?\u201d We\u2019re using it because that \u201cA\u201d stands for \u201cassociative.\u201d<\/p>\n<p>There are other options available depending on what kind of data you\u2019re retrieving, but just between you and I, you can use \u201cARRAY_A\u201d in just about every case. I do it all the time. So now we\u2019ve got our data out of the WordPress database, time to do something with it\u2026<\/p>\n<p><strong>Step #2: Display the Data Selected from the WordPress Database<\/strong><\/p>\n<p>Once we\u2019ve scooped our data out of the WordPress database, we simply apply the rules you\u2019ve already learned in this series to spit out some of the data contained within the \u201c$user_data\u201d variable:<\/p>\n<p>{code type=php}<\/p>\n<p>echo &#8220;Username: &#8220;. $user_data[&#8216;user_login&#8217;];<\/p>\n<p>echo &#8221; | User Email: &#8220;. $user_data[&#8216;user_email&#8217;];<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p>echo &#8220;First post by &#8220;. $user_data[&#8216;user_login&#8217;] . &#8220;: &#8220;;<\/p>\n<p><\/code><\/p>\n<p>We\u2019ve already talked about what the echo command does in the first tutorial of this series. But I\u2019ve included a few new tricks in the code above. First, I used the double quotes to echo out a piece of literal text which reads:<\/p>\n<p><strong>Username: <\/strong><\/p>\n<p>Next, I used the double quotes to show that I was closing <em>out<\/em> of plain text and moving into a PHP variable called \u201c$user_data[\u2018user_login\u2019].\u201d Then, I used the semi-colon to close out of that PHP line. That\u2019s how you move between echoing PHP variables and echoing plain text or html.<\/p>\n<p>However, notice that on each of the four lines of echoed code, there\u2019s a period between all of PHP variables and the regular text. This is called \u201cconcatenation,\u201d it basically means that I\u2019m \u201cgluing\u201d pieces of information together to create a string of information.<\/p>\n<p>The period is simply the glue which attaches PHP variables to regular html (or text) or which glues one PHP variable to another. For example, if I had wanted to echo out the variables \u201c$user_data[\u2018user_login\u2019]\u201d and\u00a0 \u201c$user_data[\u2018user_email\u2019]\u201d I would have needed to glue (concatenate) them together using the period, like this:<\/p>\n<p>{code type=php}<\/p>\n<p>echo $user_data[\u2018user_login\u2019]\u00a0 . $user_data[\u2018user_email\u2019];<\/p>\n<p><\/code><\/p>\n<p>So assuming that my user login was \u201clogindude\u201d and my email was \u201cdude@thedude.com\u201d, the above line of code would echo out:<\/p>\n<p><strong>logindudedude@thedude.com<\/strong><\/p>\n<p>Of course, this looks bad. I can\u2019t tell where the user_login ends and the email address begins. So I would need to either use regular text or html to add either a space between the words\u2026<\/p>\n<p>{code type=php}<\/p>\n<p>echo $user_data[\u2018user_login\u2019]\u00a0 .\u00a0 \u201c \u201c . $user_data[\u2018user_email\u2019];<\/p>\n<p><\/code><\/p>\n<p>\u2026 or use the html tag \u201c&lt;br\/&gt;\u201d to create a full line break between the words:<\/p>\n<p>{code type=php}<\/p>\n<p>echo $user_data[\u2018user_login\u2019] ;<\/p>\n<p>echo \u201c&lt;br \/&gt;\u201d;<\/p>\n<p>echo $user_data[\u2018user_email\u2019];<\/p>\n<p><\/code><\/p>\n<p>Now, applying everything we just covered in this tutorial and the previous tutorial in this series, you should now be able to decipher what this chunk of code is doing:<\/p>\n<p>{code type=php}<\/p>\n<p>\/\/grab user post data\/\/<\/p>\n<p>$user_post_data = $wpdb-&gt;get_row(&#8220;SELECT * FROM $wpdb-&gt;posts WHERE post_author = &#8216;&#8221; . $user_data[&#8216;ID&#8217;] . &#8220;&#8216;&#8221;, ARRAY_A);<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p>echo $user_post_data[&#8216;post_title&#8217;];<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p><\/code><\/p>\n<p>I\u2019ve just stored some more database information into a new variable named \u201c$user_post_data,\u201d which will contain a <strong>SELECT<\/strong>ION from the \u201cposts\u201d (aka, wp_posts) table \u201cWHERE\u201d the \u201cpost_author\u201d column equals the \u201cID\u201d column from my \u201c$user_data\u201d variable.<\/p>\n<p>Remember that the \u201c$user_data\u201d variable contains the row from our \u201cwp_users\u201d table where the \u201cID\u201d equals the number one. So if I use the \u201c[]\u201d characters just after the \u201c$user_data\u201d variable and place \u201cID\u201d within the \u201c[]\u201d characters, I\u2019m telling WordPress that the variable represents the \u201cID\u201d from the user row which I yanked out of the \u201cwp_users\u201d table and stored in the \u201c$user_data\u201d variable.<\/p>\n<p>So the above chunk of code is grabbing all the posts written by user number (ID) one and I\u2019m echoing the post title from the \u201c$user_post_data\u201d row between two line breaks:<\/p>\n<p>{code type=php}<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p>echo $user_post_data[&#8216;post_title&#8217;];<\/p>\n<p>echo &#8220;&lt;br \/&gt;&#8221;;<\/p>\n<p><\/code><\/p>\n<p>Now, since we\u2019ve simply added new code to our admin page by adding the new database code to our \u201cYourBrandWPAdminPage\u201d method, our admin area should now contain the echoed information about user #1, including their username, email and the title of their WordPress post:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-95300 alignleft\" src=\"https:\/\/wpmudev.com\/blog\/wp-content\/uploads\/2012\/08\/demo-of-basic-plugin-admin2.jpg\" alt=\"Post image\" aria-hidden=\"true\" width=\"611\" height=\"245\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Woohoo! Super Cool Stuff Coming Up Now<\/strong><\/p>\n<p><strong><\/strong>Congratulations, you now know enough about WordPress to do quite a bit with your basic plugin. Of course, we\u2019ve yet to cover Javascript (very cool stuff coming) and we haven\u2019t talked about a lot of the WordPress filters, actions or database functions. But if you keep up with the tutorials which will be coming next in this series, I think you\u2019ll see that we\u2019ve opened up a LOT of cool options already with what we\u2019ve learned.<\/p>\n<p>Just go back to the first post of this tutorial series and try out some of what you now know if you want to get an idea of what I mean. In the next tutorial, we\u2019ll start modifying your plugin so that you and your users can actually \u201ctalk\u201d to it, and preparing you for including Javascript.<\/p>\n<p>More to come!<\/p>\n<p>-Best,<\/p>\n<p>Seth C<\/p>\n<h2>Other Posts in This WordPress Plugin Construction Series<\/h2>\n<p><strong><a title=\"Permalink to How to Create Your Very First WordPress Plugin\" href=\"https:\/\/wpmudev.com\/blog\/how-to-create-your-very-first-wordpress-plugin\/\" rel=\"bookmark\" target=\"_blank\">How to Create Your Very First WordPress Plugin<\/a><\/strong><br \/>\n<strong><a title=\"Permalink to WordPress Plugin Construction for the Non-Programmer: Part II\" href=\"https:\/\/wpmudev.com\/blog\/wordpress-plugin-construction-for-the-non-programmer-part-ii\/\" rel=\"bookmark\" target=\"_blank\">WordPress Plugin Construction for the Non-Programmer: Part II<\/a><\/strong><br \/>\n<strong><a title=\"Permalink to WordPress Plugin Construction for the Non-Programmer: Part III\" href=\"https:\/\/wpmudev.com\/blog\/wordpress-plugin-construction-for-the-non-programmer-part-iii\/\" rel=\"bookmark\" target=\"_blank\">WordPress Plugin Construction for the Non-Programmer: Part III<\/a><\/strong><br \/>\n<strong><a title=\"Permalink to WordPress Plugin Construction for the Non-Programmer: Part IV\" href=\"https:\/\/wpmudev.com\/blog\/wordpress-plugin-construction-for-the-non-programmer-part-iv\/\" rel=\"bookmark\" target=\"_blank\">WordPress Plugin Construction for the Non-Programmer: Part IV<\/a><\/strong><br \/>\n<strong><a title=\"Permalink to WordPress Plugin Construction for the Non-Programmer: Part V\" href=\"https:\/\/wpmudev.com\/blog\/wordpress-plugin-construction-for-the-non-programmer-part-v\/\" rel=\"bookmark\" target=\"_blank\">WordPress Plugin Construction for the Non-Programmer: Part V<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The simplest explanation for WordPress plugin construction, no programming experience required! Check out how to word with the WP database\u2026<\/p>\n","protected":false},"author":132058,"featured_media":96104,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"blog_reading_time":"","wds_primary_category":0,"wds_primary_tutorials_categories":0,"footnotes":""},"categories":[557,263],"tags":[],"tutorials_categories":[],"class_list":["post-95297","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","category-tutorials"],"_links":{"self":[{"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/posts\/95297","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/users\/132058"}],"replies":[{"embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/comments?post=95297"}],"version-history":[{"count":0,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/posts\/95297\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/media\/96104"}],"wp:attachment":[{"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/media?parent=95297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/categories?post=95297"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/tags?post=95297"},{"taxonomy":"tutorials_categories","embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/tutorials_categories?post=95297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}