{"id":171,"date":"2026-01-30T09:00:00","date_gmt":"2026-01-30T09:00:00","guid":{"rendered":"https:\/\/developryplugins.com\/?p=171"},"modified":"2025-11-24T11:18:15","modified_gmt":"2025-11-24T11:18:15","slug":"wordpress-plugin-development-from-scratch-complete-beginners-guide","status":"publish","type":"post","link":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/","title":{"rendered":"WordPress Plugin Development from Scratch: Complete Beginner&#8217;s Guide"},"content":{"rendered":"<p><!-- @format --><\/p>\n<p>WordPress plugin development opens endless possibilities for extending WordPress functionality. This beginner-friendly guide teaches you to build your first plugin from scratch, even if you\u2019ve never written PHP code before. You\u2019ll learn fundamental concepts, best practices, and create a functioning plugin by the end.<\/p>\n<h2 id=\"what-are-wordpress-plugins\">What Are WordPress Plugins?<\/h2>\n<p>Plugins are PHP files that extend WordPress core functionality without modifying core files. They add features, modify behavior, and integrate services. WordPress\u2019s extensive plugin API provides hooks and functions that let you tap into WordPress at precise moments during execution.<\/p>\n<p>Understanding this principle is crucial: never modify WordPress core. Always build plugins (or themes) to add functionality. This keeps your changes upgrade-safe and maintainable.<\/p>\n<h2 id=\"prerequisites-and-setup\">Prerequisites and Setup<\/h2>\n<p>Before starting, ensure you have:<\/p>\n<ul>\n<li><strong>Basic PHP knowledge<\/strong> &#8211; Understand variables, functions, arrays<\/li>\n<li><strong>HTML\/CSS basics<\/strong> &#8211; Know how to structure and style content<\/li>\n<li><strong>Local development environment<\/strong> &#8211; LocalWP, MAMP, or Docker<\/li>\n<li><strong>Code editor<\/strong> &#8211; VS Code, PhpStorm, or Sublime Text<\/li>\n<\/ul>\n<p>Install LocalWP for the easiest local WordPress setup. It handles server configuration, making development straightforward for beginners.<\/p>\n<h2 id=\"your-first-plugin-file\">Your First Plugin File<\/h2>\n<p>Create a new folder in <code>wp-content\/plugins\/<\/code> named <code>my-first-plugin<\/code>. Inside, create <code>my-first-plugin.php<\/code>:<\/p>\n<div class=\"sourceCode\" id=\"cb1\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb1-1\"><a href=\"#cb1-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">&lt;?php<\/span><\/span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" aria-hidden=\"true\"><\/a><span class=\"co\">\/**<\/span><\/span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Plugin Name: My First Plugin<\/span><\/span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Plugin URI: https:\/\/example.com\/my-first-plugin<\/span><\/span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Description: A simple plugin to learn WordPress development<\/span><\/span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Version: 1.0.0<\/span><\/span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Author: Your Name<\/span><\/span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Author URI: https:\/\/example.com<\/span><\/span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" aria-hidden=\"true\"><\/a><span class=\"co\"> * License: GPL v2 or later<\/span><\/span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" aria-hidden=\"true\"><\/a><span class=\"co\"> * License URI: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html<\/span><\/span>\n<span id=\"cb1-11\"><a href=\"#cb1-11\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Text Domain: my-first-plugin<\/span><\/span>\n<span id=\"cb1-12\"><a href=\"#cb1-12\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Domain Path: \/languages<\/span><\/span>\n<span id=\"cb1-13\"><a href=\"#cb1-13\" aria-hidden=\"true\"><\/a><span class=\"co\"> *\/<\/span><\/span>\n<span id=\"cb1-14\"><a href=\"#cb1-14\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-15\"><a href=\"#cb1-15\" aria-hidden=\"true\"><\/a><span class=\"co\">\/\/ If this file is called directly, abort.<\/span><\/span>\n<span id=\"cb1-16\"><a href=\"#cb1-16\" aria-hidden=\"true\"><\/a><span class=\"kw\">if<\/span> <span class=\"ot\">(<\/span> ! <span class=\"fu\">defined<\/span><span class=\"ot\">(<\/span> <span class=\"st\">&#39;WPINC&#39;<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">)<\/span> {<\/span>\n<span id=\"cb1-17\"><a href=\"#cb1-17\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">die<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb1-18\"><a href=\"#cb1-18\" aria-hidden=\"true\"><\/a>}<\/span><\/code><\/pre>\n<\/div>\n<p>The header comment tells WordPress about your plugin. Required fields are Plugin Name and Description. The security check prevents direct file access.<\/p>\n<p>Navigate to Plugins in your WordPress admin. You\u2019ll see \u201cMy First Plugin\u201d listed. Click Activate.<\/p>\n<h2 id=\"understanding-wordpress-hooks\">Understanding WordPress Hooks<\/h2>\n<p>Hooks are WordPress\u2019s event system. They allow your plugin to execute code at specific moments.<\/p>\n<p><strong>Actions<\/strong> let you run code at specific points:<\/p>\n<div class=\"sourceCode\" id=\"cb2\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb2-1\"><a href=\"#cb2-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> dprt_welcome_message<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">echo<\/span> <span class=\"st\">&#39;&lt;div class=&quot;notice notice-info&quot;&gt;&lt;p&gt;Welcome to our site!&lt;\/p&gt;&lt;\/div&gt;&#39;<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" aria-hidden=\"true\"><\/a>add_action<span class=\"ot\">(<\/span> <span class=\"st\">&#39;admin_notices&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;dprt_welcome_message&#39;<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>This displays a message in the WordPress admin when the <code>admin_notices<\/code> action fires.<\/p>\n<p><strong>Filters<\/strong> let you modify data:<\/p>\n<div class=\"sourceCode\" id=\"cb3\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb3-1\"><a href=\"#cb3-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> dprt_modify_excerpt_length<span class=\"ot\">(<\/span> <span class=\"kw\">$length<\/span> <span class=\"ot\">)<\/span> {<\/span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">return<\/span> <span class=\"dv\">30<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" aria-hidden=\"true\"><\/a>add_filter<span class=\"ot\">(<\/span> <span class=\"st\">&#39;excerpt_length&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;dprt_modify_excerpt_length&#39;<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>This changes excerpt length to 30 words by filtering the default value.<\/p>\n<h2 id=\"common-hooks-for-beginners\">Common Hooks for Beginners<\/h2>\n<p>Start with these essential hooks:<\/p>\n<p><strong><code>init<\/code><\/strong> &#8211; Fires after WordPress finishes loading. Use it for registering post types, taxonomies, and initialization:<\/p>\n<div class=\"sourceCode\" id=\"cb4\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb4-1\"><a href=\"#cb4-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> dprt_init_plugin<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" aria-hidden=\"true\"><\/a>    <span class=\"co\">\/\/ Register custom post types, taxonomies, etc.<\/span><\/span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" aria-hidden=\"true\"><\/a>add_action<span class=\"ot\">(<\/span> <span class=\"st\">&#39;init&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;dprt_init_plugin&#39;<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p><strong><code>wp_enqueue_scripts<\/code><\/strong> &#8211; Load CSS and JavaScript for frontend:<\/p>\n<div class=\"sourceCode\" id=\"cb5\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb5-1\"><a href=\"#cb5-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> dprt_enqueue_assets<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" aria-hidden=\"true\"><\/a>    wp_enqueue_style<span class=\"ot\">(<\/span><\/span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;dprt-styles&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" aria-hidden=\"true\"><\/a>        plugin_dir_url<span class=\"ot\">(<\/span> <span class=\"kw\">__FILE__<\/span> <span class=\"ot\">)<\/span> . <span class=\"st\">&#39;assets\/css\/style.css&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" aria-hidden=\"true\"><\/a>        <span class=\"kw\">array<\/span><span class=\"ot\">(),<\/span><\/span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;1.0.0&#39;<\/span><\/span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" aria-hidden=\"true\"><\/a>    <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb5-9\"><a href=\"#cb5-9\" aria-hidden=\"true\"><\/a>    wp_enqueue_script<span class=\"ot\">(<\/span><\/span>\n<span id=\"cb5-10\"><a href=\"#cb5-10\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;dprt-scripts&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb5-11\"><a href=\"#cb5-11\" aria-hidden=\"true\"><\/a>        plugin_dir_url<span class=\"ot\">(<\/span> <span class=\"kw\">__FILE__<\/span> <span class=\"ot\">)<\/span> . <span class=\"st\">&#39;assets\/js\/script.js&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb5-12\"><a href=\"#cb5-12\" aria-hidden=\"true\"><\/a>        <span class=\"kw\">array<\/span><span class=\"ot\">(<\/span> <span class=\"st\">&#39;jquery&#39;<\/span> <span class=\"ot\">),<\/span><\/span>\n<span id=\"cb5-13\"><a href=\"#cb5-13\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;1.0.0&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb5-14\"><a href=\"#cb5-14\" aria-hidden=\"true\"><\/a>        <span class=\"kw\">true<\/span><\/span>\n<span id=\"cb5-15\"><a href=\"#cb5-15\" aria-hidden=\"true\"><\/a>    <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb5-16\"><a href=\"#cb5-16\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb5-17\"><a href=\"#cb5-17\" aria-hidden=\"true\"><\/a>add_action<span class=\"ot\">(<\/span> <span class=\"st\">&#39;wp_enqueue_scripts&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;dprt_enqueue_assets&#39;<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p><strong><code>admin_menu<\/code><\/strong> &#8211; Add admin menu pages:<\/p>\n<div class=\"sourceCode\" id=\"cb6\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb6-1\"><a href=\"#cb6-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> dprt_add_menu_page<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" aria-hidden=\"true\"><\/a>    add_menu_page<span class=\"ot\">(<\/span><\/span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;My Plugin Settings&#39;<\/span><span class=\"ot\">,<\/span>  <span class=\"co\">\/\/ Page title<\/span><\/span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;My Plugin&#39;<\/span><span class=\"ot\">,<\/span>           <span class=\"co\">\/\/ Menu title<\/span><\/span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;manage_options&#39;<\/span><span class=\"ot\">,<\/span>      <span class=\"co\">\/\/ Capability required<\/span><\/span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;my-plugin&#39;<\/span><span class=\"ot\">,<\/span>           <span class=\"co\">\/\/ Menu slug<\/span><\/span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;dprt_settings_page&#39;<\/span><span class=\"ot\">,<\/span>  <span class=\"co\">\/\/ Function to display page<\/span><\/span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;dashicons-admin-generic&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"co\">\/\/ Icon<\/span><\/span>\n<span id=\"cb6-9\"><a href=\"#cb6-9\" aria-hidden=\"true\"><\/a>        <span class=\"dv\">20<\/span>                     <span class=\"co\">\/\/ Position<\/span><\/span>\n<span id=\"cb6-10\"><a href=\"#cb6-10\" aria-hidden=\"true\"><\/a>    <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb6-11\"><a href=\"#cb6-11\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb6-12\"><a href=\"#cb6-12\" aria-hidden=\"true\"><\/a>add_action<span class=\"ot\">(<\/span> <span class=\"st\">&#39;admin_menu&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;dprt_add_menu_page&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb6-13\"><a href=\"#cb6-13\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb6-14\"><a href=\"#cb6-14\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> dprt_settings_page<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb6-15\"><a href=\"#cb6-15\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">echo<\/span> <span class=\"st\">&#39;&lt;div class=&quot;wrap&quot;&gt;&#39;<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb6-16\"><a href=\"#cb6-16\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">echo<\/span> <span class=\"st\">&#39;&lt;h1&gt;My Plugin Settings&lt;\/h1&gt;&#39;<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb6-17\"><a href=\"#cb6-17\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">echo<\/span> <span class=\"st\">&#39;&lt;p&gt;Settings page content goes here.&lt;\/p&gt;&#39;<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb6-18\"><a href=\"#cb6-18\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">echo<\/span> <span class=\"st\">&#39;&lt;\/div&gt;&#39;<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb6-19\"><a href=\"#cb6-19\" aria-hidden=\"true\"><\/a>}<\/span><\/code><\/pre>\n<\/div>\n<h2 id=\"plugin-activation-and-deactivation\">Plugin Activation and Deactivation<\/h2>\n<p>Run code when plugins activate or deactivate:<\/p>\n<div class=\"sourceCode\" id=\"cb7\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb7-1\"><a href=\"#cb7-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> dprt_activate_plugin<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" aria-hidden=\"true\"><\/a>    <span class=\"co\">\/\/ Set default options<\/span><\/span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" aria-hidden=\"true\"><\/a>    add_option<span class=\"ot\">(<\/span> <span class=\"st\">&#39;dprt_welcome_message&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;Welcome to our site!&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" aria-hidden=\"true\"><\/a>    <span class=\"co\">\/\/ Create custom database tables if needed<\/span><\/span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" aria-hidden=\"true\"><\/a>    <span class=\"co\">\/\/ Flush rewrite rules if registering custom post types<\/span><\/span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" aria-hidden=\"true\"><\/a>    flush_rewrite_rules<span class=\"ot\">();<\/span><\/span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" aria-hidden=\"true\"><\/a>register_activation_hook<span class=\"ot\">(<\/span> <span class=\"kw\">__FILE__<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;dprt_activate_plugin&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> dprt_deactivate_plugin<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" aria-hidden=\"true\"><\/a>    <span class=\"co\">\/\/ Clean up temporary data<\/span><\/span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" aria-hidden=\"true\"><\/a>    <span class=\"co\">\/\/ Flush rewrite rules<\/span><\/span>\n<span id=\"cb7-14\"><a href=\"#cb7-14\" aria-hidden=\"true\"><\/a>    flush_rewrite_rules<span class=\"ot\">();<\/span><\/span>\n<span id=\"cb7-15\"><a href=\"#cb7-15\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb7-16\"><a href=\"#cb7-16\" aria-hidden=\"true\"><\/a>    <span class=\"co\">\/\/ Don&#39;t delete user data on deactivation<\/span><\/span>\n<span id=\"cb7-17\"><a href=\"#cb7-17\" aria-hidden=\"true\"><\/a>    <span class=\"co\">\/\/ Save that for uninstall<\/span><\/span>\n<span id=\"cb7-18\"><a href=\"#cb7-18\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb7-19\"><a href=\"#cb7-19\" aria-hidden=\"true\"><\/a>register_deactivation_hook<span class=\"ot\">(<\/span> <span class=\"kw\">__FILE__<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;dprt_deactivate_plugin&#39;<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Never delete user data on deactivation. Users might temporarily deactivate to troubleshoot. Save deletion for uninstall.<\/p>\n<h2 id=\"the-options-api\">The Options API<\/h2>\n<p>Store plugin settings using the Options API:<\/p>\n<div class=\"sourceCode\" id=\"cb8\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb8-1\"><a href=\"#cb8-1\" aria-hidden=\"true\"><\/a><span class=\"co\">\/\/ Save option<\/span><\/span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" aria-hidden=\"true\"><\/a>update_option<span class=\"ot\">(<\/span> <span class=\"st\">&#39;dprt_setting_name&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;value&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" aria-hidden=\"true\"><\/a><span class=\"co\">\/\/ Get option<\/span><\/span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" aria-hidden=\"true\"><\/a><span class=\"kw\">$setting<\/span> = get_option<span class=\"ot\">(<\/span> <span class=\"st\">&#39;dprt_setting_name&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;default value&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb8-6\"><a href=\"#cb8-6\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb8-7\"><a href=\"#cb8-7\" aria-hidden=\"true\"><\/a><span class=\"co\">\/\/ Delete option<\/span><\/span>\n<span id=\"cb8-8\"><a href=\"#cb8-8\" aria-hidden=\"true\"><\/a>delete_option<span class=\"ot\">(<\/span> <span class=\"st\">&#39;dprt_setting_name&#39;<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Options are stored in the wp_options table. Use them for plugin configuration, user preferences, and cached data.<\/p>\n<h2 id=\"plugin-security-basics\">Plugin Security Basics<\/h2>\n<p>Security is paramount. Follow these practices from day one:<\/p>\n<p><strong>Sanitize input<\/strong> &#8211; Clean data users provide:<\/p>\n<div class=\"sourceCode\" id=\"cb9\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb9-1\"><a href=\"#cb9-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">$user_input<\/span> = sanitize_text_field<span class=\"ot\">(<\/span> <span class=\"kw\">$_POST<\/span><span class=\"ot\">[<\/span><span class=\"st\">&#39;input_field&#39;<\/span><span class=\"ot\">]<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" aria-hidden=\"true\"><\/a><span class=\"kw\">$email<\/span> = sanitize_email<span class=\"ot\">(<\/span> <span class=\"kw\">$_POST<\/span><span class=\"ot\">[<\/span><span class=\"st\">&#39;email_field&#39;<\/span><span class=\"ot\">]<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p><strong>Escape output<\/strong> &#8211; Prevent XSS attacks:<\/p>\n<div class=\"sourceCode\" id=\"cb10\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb10-1\"><a href=\"#cb10-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">echo<\/span> <span class=\"st\">&#39;&lt;p&gt;&#39;<\/span> . esc_html<span class=\"ot\">(<\/span> <span class=\"kw\">$user_data<\/span> <span class=\"ot\">)<\/span> . <span class=\"st\">&#39;&lt;\/p&gt;&#39;<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" aria-hidden=\"true\"><\/a><span class=\"kw\">echo<\/span> <span class=\"st\">&#39;&lt;a href=&quot;&#39;<\/span> . esc_url<span class=\"ot\">(<\/span> <span class=\"kw\">$link<\/span> <span class=\"ot\">)<\/span> . <span class=\"st\">&#39;&quot;&gt;Link&lt;\/a&gt;&#39;<\/span><span class=\"ot\">;<\/span><\/span><\/code><\/pre>\n<\/div>\n<p><strong>Use nonces<\/strong> &#8211; Verify form submissions:<\/p>\n<div class=\"sourceCode\" id=\"cb11\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb11-1\"><a href=\"#cb11-1\" aria-hidden=\"true\"><\/a><span class=\"co\">\/\/ Create nonce<\/span><\/span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" aria-hidden=\"true\"><\/a>wp_nonce_field<span class=\"ot\">(<\/span> <span class=\"st\">&#39;dprt_save_settings&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;dprt_settings_nonce&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" aria-hidden=\"true\"><\/a><span class=\"co\">\/\/ Verify nonce<\/span><\/span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" aria-hidden=\"true\"><\/a><span class=\"kw\">if<\/span> <span class=\"ot\">(<\/span> ! wp_verify_nonce<span class=\"ot\">(<\/span> <span class=\"kw\">$_POST<\/span><span class=\"ot\">[<\/span><span class=\"st\">&#39;dprt_settings_nonce&#39;<\/span><span class=\"ot\">],<\/span> <span class=\"st\">&#39;dprt_save_settings&#39;<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">)<\/span> {<\/span>\n<span id=\"cb11-6\"><a href=\"#cb11-6\" aria-hidden=\"true\"><\/a>    wp_die<span class=\"ot\">(<\/span> <span class=\"st\">&#39;Security check failed&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb11-7\"><a href=\"#cb11-7\" aria-hidden=\"true\"><\/a>}<\/span><\/code><\/pre>\n<\/div>\n<p><strong>Check capabilities<\/strong> &#8211; Ensure users have permission:<\/p>\n<div class=\"sourceCode\" id=\"cb12\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb12-1\"><a href=\"#cb12-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">if<\/span> <span class=\"ot\">(<\/span> ! current_user_can<span class=\"ot\">(<\/span> <span class=\"st\">&#39;manage_options&#39;<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">)<\/span> {<\/span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" aria-hidden=\"true\"><\/a>    wp_die<span class=\"ot\">(<\/span> <span class=\"st\">&#39;Unauthorized access&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb12-3\"><a href=\"#cb12-3\" aria-hidden=\"true\"><\/a>}<\/span><\/code><\/pre>\n<\/div>\n<h2 id=\"organizing-plugin-files\">Organizing Plugin Files<\/h2>\n<p>As plugins grow, organize code across multiple files:<\/p>\n<pre><code>my-first-plugin\/\n\u251c\u2500\u2500 my-first-plugin.php    (Main file)\n\u251c\u2500\u2500 includes\/\n\u2502   \u251c\u2500\u2500 class-admin.php\n\u2502   \u251c\u2500\u2500 class-frontend.php\n\u2502   \u2514\u2500\u2500 functions.php\n\u251c\u2500\u2500 assets\/\n\u2502   \u251c\u2500\u2500 css\/\n\u2502   \u2502   \u2514\u2500\u2500 style.css\n\u2502   \u2514\u2500\u2500 js\/\n\u2502       \u2514\u2500\u2500 script.js\n\u2514\u2500\u2500 languages\/<\/code><\/pre>\n<p>Include files in your main plugin file:<\/p>\n<div class=\"sourceCode\" id=\"cb14\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb14-1\"><a href=\"#cb14-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">require_once<\/span> plugin_dir_path<span class=\"ot\">(<\/span> <span class=\"kw\">__FILE__<\/span> <span class=\"ot\">)<\/span> . <span class=\"st\">&#39;includes\/functions.php&#39;<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" aria-hidden=\"true\"><\/a><span class=\"kw\">require_once<\/span> plugin_dir_path<span class=\"ot\">(<\/span> <span class=\"kw\">__FILE__<\/span> <span class=\"ot\">)<\/span> . <span class=\"st\">&#39;includes\/class-admin.php&#39;<\/span><span class=\"ot\">;<\/span><\/span><\/code><\/pre>\n<\/div>\n<h2 id=\"debugging-your-plugin\">Debugging Your Plugin<\/h2>\n<p>Enable WordPress debugging in wp-config.php:<\/p>\n<div class=\"sourceCode\" id=\"cb15\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb15-1\"><a href=\"#cb15-1\" aria-hidden=\"true\"><\/a><span class=\"fu\">define<\/span><span class=\"ot\">(<\/span> <span class=\"st\">&#39;WP_DEBUG&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"kw\">true<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" aria-hidden=\"true\"><\/a><span class=\"fu\">define<\/span><span class=\"ot\">(<\/span> <span class=\"st\">&#39;WP_DEBUG_LOG&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"kw\">true<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" aria-hidden=\"true\"><\/a><span class=\"fu\">define<\/span><span class=\"ot\">(<\/span> <span class=\"st\">&#39;WP_DEBUG_DISPLAY&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"kw\">false<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Log debug messages:<\/p>\n<div class=\"sourceCode\" id=\"cb16\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb16-1\"><a href=\"#cb16-1\" aria-hidden=\"true\"><\/a><span class=\"fu\">error_log<\/span><span class=\"ot\">(<\/span> <span class=\"st\">&#39;Debug message: &#39;<\/span> . <span class=\"fu\">print_r<\/span><span class=\"ot\">(<\/span> <span class=\"kw\">$variable<\/span><span class=\"ot\">,<\/span> <span class=\"kw\">true<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Check <code>\/wp-content\/debug.log<\/code> for logged errors.<\/p>\n<h2 id=\"building-a-complete-example-plugin\">Building a Complete Example Plugin<\/h2>\n<p>Let\u2019s build a simple quote display plugin:<\/p>\n<div class=\"sourceCode\" id=\"cb17\">\n<pre class=\"sourceCode php\"><code class=\"sourceCode php\"><span id=\"cb17-1\"><a href=\"#cb17-1\" aria-hidden=\"true\"><\/a><span class=\"kw\">&lt;?php<\/span><\/span>\n<span id=\"cb17-2\"><a href=\"#cb17-2\" aria-hidden=\"true\"><\/a><span class=\"co\">\/**<\/span><\/span>\n<span id=\"cb17-3\"><a href=\"#cb17-3\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Plugin Name: Simple Quote Display<\/span><\/span>\n<span id=\"cb17-4\"><a href=\"#cb17-4\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Description: Display random quotes on your site<\/span><\/span>\n<span id=\"cb17-5\"><a href=\"#cb17-5\" aria-hidden=\"true\"><\/a><span class=\"co\"> * Version: 1.0.0<\/span><\/span>\n<span id=\"cb17-6\"><a href=\"#cb17-6\" aria-hidden=\"true\"><\/a><span class=\"co\"> *\/<\/span><\/span>\n<span id=\"cb17-7\"><a href=\"#cb17-7\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb17-8\"><a href=\"#cb17-8\" aria-hidden=\"true\"><\/a><span class=\"kw\">if<\/span> <span class=\"ot\">(<\/span> ! <span class=\"fu\">defined<\/span><span class=\"ot\">(<\/span> <span class=\"st\">&#39;WPINC&#39;<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">)<\/span> {<\/span>\n<span id=\"cb17-9\"><a href=\"#cb17-9\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">die<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb17-10\"><a href=\"#cb17-10\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb17-11\"><a href=\"#cb17-11\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb17-12\"><a href=\"#cb17-12\" aria-hidden=\"true\"><\/a><span class=\"co\">\/\/ Add admin menu<\/span><\/span>\n<span id=\"cb17-13\"><a href=\"#cb17-13\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> sqd_add_menu<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb17-14\"><a href=\"#cb17-14\" aria-hidden=\"true\"><\/a>    add_menu_page<span class=\"ot\">(<\/span><\/span>\n<span id=\"cb17-15\"><a href=\"#cb17-15\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;Quotes&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb17-16\"><a href=\"#cb17-16\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;Quotes&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb17-17\"><a href=\"#cb17-17\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;manage_options&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb17-18\"><a href=\"#cb17-18\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;sqd-quotes&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb17-19\"><a href=\"#cb17-19\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;sqd_quotes_page&#39;<\/span><span class=\"ot\">,<\/span><\/span>\n<span id=\"cb17-20\"><a href=\"#cb17-20\" aria-hidden=\"true\"><\/a>        <span class=\"st\">&#39;dashicons-format-quote&#39;<\/span><\/span>\n<span id=\"cb17-21\"><a href=\"#cb17-21\" aria-hidden=\"true\"><\/a>    <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb17-22\"><a href=\"#cb17-22\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb17-23\"><a href=\"#cb17-23\" aria-hidden=\"true\"><\/a>add_action<span class=\"ot\">(<\/span> <span class=\"st\">&#39;admin_menu&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;sqd_add_menu&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb17-24\"><a href=\"#cb17-24\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb17-25\"><a href=\"#cb17-25\" aria-hidden=\"true\"><\/a><span class=\"co\">\/\/ Admin page<\/span><\/span>\n<span id=\"cb17-26\"><a href=\"#cb17-26\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> sqd_quotes_page<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb17-27\"><a href=\"#cb17-27\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">if<\/span> <span class=\"ot\">(<\/span> <span class=\"kw\">isset<\/span><span class=\"ot\">(<\/span> <span class=\"kw\">$_POST<\/span><span class=\"ot\">[<\/span><span class=\"st\">&#39;sqd_add_quote&#39;<\/span><span class=\"ot\">]<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">)<\/span> {<\/span>\n<span id=\"cb17-28\"><a href=\"#cb17-28\" aria-hidden=\"true\"><\/a>        <span class=\"kw\">if<\/span> <span class=\"ot\">(<\/span> ! wp_verify_nonce<span class=\"ot\">(<\/span> <span class=\"kw\">$_POST<\/span><span class=\"ot\">[<\/span><span class=\"st\">&#39;sqd_nonce&#39;<\/span><span class=\"ot\">],<\/span> <span class=\"st\">&#39;sqd_add_quote&#39;<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">)<\/span> {<\/span>\n<span id=\"cb17-29\"><a href=\"#cb17-29\" aria-hidden=\"true\"><\/a>            wp_die<span class=\"ot\">(<\/span> <span class=\"st\">&#39;Security check failed&#39;<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb17-30\"><a href=\"#cb17-30\" aria-hidden=\"true\"><\/a>        }<\/span>\n<span id=\"cb17-31\"><a href=\"#cb17-31\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb17-32\"><a href=\"#cb17-32\" aria-hidden=\"true\"><\/a>        <span class=\"kw\">$quote<\/span> = sanitize_textarea_field<span class=\"ot\">(<\/span> <span class=\"kw\">$_POST<\/span><span class=\"ot\">[<\/span><span class=\"st\">&#39;quote&#39;<\/span><span class=\"ot\">]<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb17-33\"><a href=\"#cb17-33\" aria-hidden=\"true\"><\/a>        <span class=\"kw\">$quotes<\/span> = get_option<span class=\"ot\">(<\/span> <span class=\"st\">&#39;sqd_quotes&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"kw\">array<\/span><span class=\"ot\">()<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb17-34\"><a href=\"#cb17-34\" aria-hidden=\"true\"><\/a>        <span class=\"kw\">$quotes<\/span><span class=\"ot\">[]<\/span> = <span class=\"kw\">$quote<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb17-35\"><a href=\"#cb17-35\" aria-hidden=\"true\"><\/a>        update_option<span class=\"ot\">(<\/span> <span class=\"st\">&#39;sqd_quotes&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"kw\">$quotes<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb17-36\"><a href=\"#cb17-36\" aria-hidden=\"true\"><\/a>    }<\/span>\n<span id=\"cb17-37\"><a href=\"#cb17-37\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb17-38\"><a href=\"#cb17-38\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">$quotes<\/span> = get_option<span class=\"ot\">(<\/span> <span class=\"st\">&#39;sqd_quotes&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"kw\">array<\/span><span class=\"ot\">()<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb17-39\"><a href=\"#cb17-39\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">?&gt;<\/span><\/span>\n<span id=\"cb17-40\"><a href=\"#cb17-40\" aria-hidden=\"true\"><\/a>    &lt;div <span class=\"kw\">class<\/span>=<span class=\"st\">&quot;wrap&quot;<\/span>&gt;<\/span>\n<span id=\"cb17-41\"><a href=\"#cb17-41\" aria-hidden=\"true\"><\/a>        &lt;h1&gt;Manage Quotes&lt;\/h1&gt;<\/span>\n<span id=\"cb17-42\"><a href=\"#cb17-42\" aria-hidden=\"true\"><\/a>        &lt;form method=<span class=\"st\">&quot;post&quot;<\/span>&gt;<\/span>\n<span id=\"cb17-43\"><a href=\"#cb17-43\" aria-hidden=\"true\"><\/a>            &lt;<span class=\"ot\">?<\/span>php wp_nonce_field<span class=\"ot\">(<\/span> <span class=\"st\">&#39;sqd_add_quote&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;sqd_nonce&#39;<\/span> <span class=\"ot\">);<\/span> <span class=\"kw\">?&gt;<\/span><\/span>\n<span id=\"cb17-44\"><a href=\"#cb17-44\" aria-hidden=\"true\"><\/a>            &lt;textarea name=<span class=\"st\">&quot;quote&quot;<\/span> rows=<span class=\"st\">&quot;3&quot;<\/span> cols=<span class=\"st\">&quot;50&quot;<\/span>&gt;&lt;\/textarea&gt;<\/span>\n<span id=\"cb17-45\"><a href=\"#cb17-45\" aria-hidden=\"true\"><\/a>            &lt;input type=<span class=\"st\">&quot;submit&quot;<\/span> name=<span class=\"st\">&quot;sqd_add_quote&quot;<\/span> value=<span class=\"st\">&quot;Add Quote&quot;<\/span> <span class=\"kw\">class<\/span>=<span class=\"st\">&quot;button button-primary&quot;<\/span>&gt;<\/span>\n<span id=\"cb17-46\"><a href=\"#cb17-46\" aria-hidden=\"true\"><\/a>        &lt;\/form&gt;<\/span>\n<span id=\"cb17-47\"><a href=\"#cb17-47\" aria-hidden=\"true\"><\/a>        &lt;h2&gt;Existing Quotes&lt;\/h2&gt;<\/span>\n<span id=\"cb17-48\"><a href=\"#cb17-48\" aria-hidden=\"true\"><\/a>        &lt;ul&gt;<\/span>\n<span id=\"cb17-49\"><a href=\"#cb17-49\" aria-hidden=\"true\"><\/a>            &lt;<span class=\"ot\">?<\/span>php <span class=\"kw\">foreach<\/span> <span class=\"ot\">(<\/span> <span class=\"kw\">$quotes<\/span> <span class=\"kw\">as<\/span> <span class=\"kw\">$quote<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">:<\/span> <span class=\"kw\">?&gt;<\/span><\/span>\n<span id=\"cb17-50\"><a href=\"#cb17-50\" aria-hidden=\"true\"><\/a>                &lt;li&gt;&lt;<span class=\"ot\">?<\/span>php <span class=\"kw\">echo<\/span> esc_html<span class=\"ot\">(<\/span> <span class=\"kw\">$quote<\/span> <span class=\"ot\">);<\/span> <span class=\"kw\">?&gt;<\/span>&lt;\/li&gt;<\/span>\n<span id=\"cb17-51\"><a href=\"#cb17-51\" aria-hidden=\"true\"><\/a>            &lt;<span class=\"ot\">?<\/span>php <span class=\"kw\">endfor<\/span>each<span class=\"ot\">;<\/span> <span class=\"kw\">?&gt;<\/span><\/span>\n<span id=\"cb17-52\"><a href=\"#cb17-52\" aria-hidden=\"true\"><\/a>        &lt;\/ul&gt;<\/span>\n<span id=\"cb17-53\"><a href=\"#cb17-53\" aria-hidden=\"true\"><\/a>    &lt;\/div&gt;<\/span>\n<span id=\"cb17-54\"><a href=\"#cb17-54\" aria-hidden=\"true\"><\/a>    &lt;<span class=\"ot\">?<\/span>php<\/span>\n<span id=\"cb17-55\"><a href=\"#cb17-55\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb17-56\"><a href=\"#cb17-56\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb17-57\"><a href=\"#cb17-57\" aria-hidden=\"true\"><\/a><span class=\"co\">\/\/ Shortcode to display random quote<\/span><\/span>\n<span id=\"cb17-58\"><a href=\"#cb17-58\" aria-hidden=\"true\"><\/a><span class=\"kw\">function<\/span> sqd_display_quote<span class=\"ot\">()<\/span> {<\/span>\n<span id=\"cb17-59\"><a href=\"#cb17-59\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">$quotes<\/span> = get_option<span class=\"ot\">(<\/span> <span class=\"st\">&#39;sqd_quotes&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"kw\">array<\/span><span class=\"ot\">()<\/span> <span class=\"ot\">);<\/span><\/span>\n<span id=\"cb17-60\"><a href=\"#cb17-60\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">if<\/span> <span class=\"ot\">(<\/span> <span class=\"kw\">empty<\/span><span class=\"ot\">(<\/span> <span class=\"kw\">$quotes<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">)<\/span> {<\/span>\n<span id=\"cb17-61\"><a href=\"#cb17-61\" aria-hidden=\"true\"><\/a>        <span class=\"kw\">return<\/span> <span class=\"st\">&#39;&#39;<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb17-62\"><a href=\"#cb17-62\" aria-hidden=\"true\"><\/a>    }<\/span>\n<span id=\"cb17-63\"><a href=\"#cb17-63\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">$random_quote<\/span> = <span class=\"kw\">$quotes<\/span><span class=\"ot\">[<\/span> <span class=\"fu\">array_rand<\/span><span class=\"ot\">(<\/span> <span class=\"kw\">$quotes<\/span> <span class=\"ot\">)<\/span> <span class=\"ot\">];<\/span><\/span>\n<span id=\"cb17-64\"><a href=\"#cb17-64\" aria-hidden=\"true\"><\/a>    <span class=\"kw\">return<\/span> <span class=\"st\">&#39;&lt;blockquote class=&quot;sqd-quote&quot;&gt;&#39;<\/span> . esc_html<span class=\"ot\">(<\/span> <span class=\"kw\">$random_quote<\/span> <span class=\"ot\">)<\/span> . <span class=\"st\">&#39;&lt;\/blockquote&gt;&#39;<\/span><span class=\"ot\">;<\/span><\/span>\n<span id=\"cb17-65\"><a href=\"#cb17-65\" aria-hidden=\"true\"><\/a>}<\/span>\n<span id=\"cb17-66\"><a href=\"#cb17-66\" aria-hidden=\"true\"><\/a>add_shortcode<span class=\"ot\">(<\/span> <span class=\"st\">&#39;random_quote&#39;<\/span><span class=\"ot\">,<\/span> <span class=\"st\">&#39;sqd_display_quote&#39;<\/span> <span class=\"ot\">);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>This complete plugin adds quotes via admin, stores them, and displays them with <code>[random_quote]<\/code> shortcode.<\/p>\n<h2 id=\"common-beginner-mistakes\">Common Beginner Mistakes<\/h2>\n<p>Avoid these pitfalls:<\/p>\n<ul>\n<li><strong>Not using prefixes<\/strong> &#8211; Prefix all functions to avoid conflicts<\/li>\n<li><strong>Forgetting security<\/strong> &#8211; Always sanitize, escape, and verify<\/li>\n<li><strong>Ignoring WordPress functions<\/strong> &#8211; Use WordPress APIs instead of raw PHP\/SQL<\/li>\n<li><strong>Not testing<\/strong> &#8211; Test across WordPress versions and with other plugins<\/li>\n<li><strong>Poor error handling<\/strong> &#8211; Anticipate failures and handle gracefully<\/li>\n<\/ul>\n<h2 id=\"next-steps\">Next Steps<\/h2>\n<p>After mastering basics:<\/p>\n<ol type=\"1\">\n<li>Study the Plugin Handbook thoroughly<\/li>\n<li>Explore the Settings API for complex settings pages<\/li>\n<li>Learn custom post types and taxonomies<\/li>\n<li>Understand the REST API for modern integrations<\/li>\n<li>Study established plugins\u2019 code on GitHub<\/li>\n<\/ol>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>WordPress plugin development is accessible to beginners willing to learn. Start with simple plugins, follow security best practices, use WordPress APIs, and gradually build complexity. Your first plugin might be basic, but it establishes the foundation for building sophisticated WordPress extensions.<\/p>\n<h2 id=\"external-links\">External Links<\/h2>\n<ol type=\"1\">\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/\">WordPress Plugin Handbook<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/\">Plugin Basics<\/a><\/li>\n<li><a href=\"https:\/\/localwp.com\/\">Local by Flywheel<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/coding-standards\/\">WordPress Coding Standards<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/\">WordPress Developer Resources<\/a><\/li>\n<\/ol>\n<h2 id=\"call-to-action\">Call to Action<\/h2>\n<p>Supercharge your development! <a href=\"https:\/\/acfcopilotplugin.com\/\">ACF Copilot Pro<\/a> generates ACF field groups with AI, exports to PHP, and accelerates custom field workflows\u2014try it free!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>WordPress plugin development opens endless possibilities for extending WordPress functionality. This beginner-friendly guide teaches you to build your first plugin from scratch, even if you\u2019ve never written PHP code before&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":352,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[58],"tags":[645,647,643,646,644],"class_list":["post-171","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-plugin-development-guide","tag-beginner-guide","tag-php-development","tag-plugin-development","tag-plugin-tutorial","tag-wordpress-plugins"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WordPress Plugin Development: Beginner&#039;s Guide<\/title>\n<meta name=\"description\" content=\"Learn WordPress plugin development from scratch. Complete beginner&#039;s guide covering plugin structure, hooks, APIs, and building your first functional plugin.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WordPress Plugin Development: Beginner&#039;s Guide\" \/>\n<meta property=\"og:description\" content=\"Learn WordPress plugin development from scratch. Complete beginner&#039;s guide covering plugin structure, hooks, APIs, and building your first functional plugin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Developry Plugins\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-30T09:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Krasen Slavov\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Krasen Slavov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/\"},\"author\":{\"name\":\"Krasen Slavov\",\"@id\":\"https:\/\/developryplugins.com\/#\/schema\/person\/0530536578f952020ae227beb06a8daa\"},\"headline\":\"WordPress Plugin Development from Scratch: Complete Beginner&#8217;s Guide\",\"datePublished\":\"2026-01-30T09:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/\"},\"wordCount\":657,\"publisher\":{\"@id\":\"https:\/\/developryplugins.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png\",\"keywords\":[\"beginner guide\",\"php development\",\"plugin development\",\"plugin tutorial\",\"wordpress plugins\"],\"articleSection\":[\"WordPress Plugin Development Guide\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/\",\"url\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/\",\"name\":\"WordPress Plugin Development: Beginner's Guide\",\"isPartOf\":{\"@id\":\"https:\/\/developryplugins.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png\",\"datePublished\":\"2026-01-30T09:00:00+00:00\",\"description\":\"Learn WordPress plugin development from scratch. Complete beginner's guide covering plugin structure, hooks, APIs, and building your first functional plugin.\",\"breadcrumb\":{\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#primaryimage\",\"url\":\"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png\",\"contentUrl\":\"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/developryplugins.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress Plugin Development from Scratch: Complete Beginner&#8217;s Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/developryplugins.com\/#website\",\"url\":\"https:\/\/developryplugins.com\/\",\"name\":\"Developry Plugins\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/developryplugins.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/developryplugins.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/developryplugins.com\/#organization\",\"name\":\"Developry Plugins\",\"url\":\"https:\/\/developryplugins.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/developryplugins.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/logo-black.png\",\"contentUrl\":\"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/logo-black.png\",\"width\":481,\"height\":107,\"caption\":\"Developry Plugins\"},\"image\":{\"@id\":\"https:\/\/developryplugins.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/developryplugins.com\/#\/schema\/person\/0530536578f952020ae227beb06a8daa\",\"name\":\"Krasen Slavov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/developryplugins.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7f554a5fc7eb1b702429addccdcc3fca841a0ce02bd76b04d2725098fbf925b9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7f554a5fc7eb1b702429addccdcc3fca841a0ce02bd76b04d2725098fbf925b9?s=96&d=mm&r=g\",\"caption\":\"Krasen Slavov\"},\"sameAs\":[\"https:\/\/developryplugins.com\"],\"url\":\"https:\/\/developryplugins.com\/author\/slavovkrasen\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WordPress Plugin Development: Beginner's Guide","description":"Learn WordPress plugin development from scratch. Complete beginner's guide covering plugin structure, hooks, APIs, and building your first functional plugin.","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:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/","og_locale":"en_US","og_type":"article","og_title":"WordPress Plugin Development: Beginner's Guide","og_description":"Learn WordPress plugin development from scratch. Complete beginner's guide covering plugin structure, hooks, APIs, and building your first functional plugin.","og_url":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/","og_site_name":"Developry Plugins","article_published_time":"2026-01-30T09:00:00+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png","type":"image\/png"}],"author":"Krasen Slavov","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Krasen Slavov","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#article","isPartOf":{"@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/"},"author":{"name":"Krasen Slavov","@id":"https:\/\/developryplugins.com\/#\/schema\/person\/0530536578f952020ae227beb06a8daa"},"headline":"WordPress Plugin Development from Scratch: Complete Beginner&#8217;s Guide","datePublished":"2026-01-30T09:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/"},"wordCount":657,"publisher":{"@id":"https:\/\/developryplugins.com\/#organization"},"image":{"@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png","keywords":["beginner guide","php development","plugin development","plugin tutorial","wordpress plugins"],"articleSection":["WordPress Plugin Development Guide"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/","url":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/","name":"WordPress Plugin Development: Beginner's Guide","isPartOf":{"@id":"https:\/\/developryplugins.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#primaryimage"},"image":{"@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png","datePublished":"2026-01-30T09:00:00+00:00","description":"Learn WordPress plugin development from scratch. Complete beginner's guide covering plugin structure, hooks, APIs, and building your first functional plugin.","breadcrumb":{"@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#primaryimage","url":"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png","contentUrl":"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/featured-171-1763983095.png","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/developryplugins.com\/wordpress-plugin-development-from-scratch-complete-beginners-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/developryplugins.com\/"},{"@type":"ListItem","position":2,"name":"WordPress Plugin Development from Scratch: Complete Beginner&#8217;s Guide"}]},{"@type":"WebSite","@id":"https:\/\/developryplugins.com\/#website","url":"https:\/\/developryplugins.com\/","name":"Developry Plugins","description":"","publisher":{"@id":"https:\/\/developryplugins.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/developryplugins.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/developryplugins.com\/#organization","name":"Developry Plugins","url":"https:\/\/developryplugins.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/developryplugins.com\/#\/schema\/logo\/image\/","url":"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/logo-black.png","contentUrl":"https:\/\/developryplugins.com\/wp-content\/uploads\/2025\/11\/logo-black.png","width":481,"height":107,"caption":"Developry Plugins"},"image":{"@id":"https:\/\/developryplugins.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/developryplugins.com\/#\/schema\/person\/0530536578f952020ae227beb06a8daa","name":"Krasen Slavov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/developryplugins.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7f554a5fc7eb1b702429addccdcc3fca841a0ce02bd76b04d2725098fbf925b9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7f554a5fc7eb1b702429addccdcc3fca841a0ce02bd76b04d2725098fbf925b9?s=96&d=mm&r=g","caption":"Krasen Slavov"},"sameAs":["https:\/\/developryplugins.com"],"url":"https:\/\/developryplugins.com\/author\/slavovkrasen\/"}]}},"_links":{"self":[{"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/posts\/171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/comments?post=171"}],"version-history":[{"count":1,"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/posts\/171\/revisions"}],"predecessor-version":[{"id":213,"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/posts\/171\/revisions\/213"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/media\/352"}],"wp:attachment":[{"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/media?parent=171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/categories?post=171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developryplugins.com\/wp-json\/wp\/v2\/tags?post=171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}