About this series: How to Write a Wordpress Plugin, written by Ronald Huereca is an extensive, twelve part series on the

process of creating your own Wordpress plugin. Every step is covered, from “Seven Steps for Writing a Wordpress Plugin” all the way down to adding ajax to your plugin and releasing it. This is an excellent article series for anyone interested in the process behind creating your very first Wordpress plugin. With code examples to help assist you, you will be on your way to future releases of your own plugins for the Wordpress community. About the author: Ronald is frequently found laying his thoughts out in strong, straight-forward articles on various web related topics. He comes from a relatively strong technical and business background, having an undergrad in Electrical Engineering Technology and a Master of Science in Business Administration. A programmer by day, and web hobbyist (and writer) by night, who also runs his own blog at www.ronalfy.com. Ronald has been on the Devlounge team since the fall of 2006, and has contributed many wonderful articles, including this very wordpress series. He also writes for Weblogtoolscollection.

Introduction
For any WordPress user, plugins are essential. WordPress Plugins allow those with little to no programming skills to extend the functionality of their blog. Plugins come in all shapes and sizes, and there is a plugin that does just about anything for WordPress. As good as WordPress is as a standalone application, there are still things that WordPress lacks. Users are requesting more and more features for WordPress that would be very feasible to write as a plugin. There are many untapped ideas out there, and new ones created every day. Having released three plugins already (not counting the custom ones I wrote), I am aware of some of the limitations of WordPress and wish to share some of the lessons I have learned (and am still learning) about creating WordPress plugins. As a result, I will be starting series that will discuss various topics regarding writing your own WordPress plugin. The series will start off very introductory and will assume your plugin knowledge is zilch.

Who is this Series For? This series is for any WordPress user who is curious about or wants to learn how to write their own WordPress plugin. Readers of this series will have an intermediate knowledge of PHP, know a little JavaScript, and be decent at Cascading Style Sheets. This plugin series will benefit theme designers, those that like to tinker with plugin code, and those that are interested in writing their own plugin from scratch. Tools to Get the Job Done To write plugins, any text editor will do. Here are the tools I personally use to create plugins. Dreamweaver Firefox Firebug Firefox Extension Web Developer Firefox Extension XAMPP with a local WordPress installation This series assumes you have WordPress 2.1.x or greater installed. Code Samples All code I use will be available for download after each post in the Conclusion section. I will be building the code as I go along, so each download will be different. I will be creating a plugin that doesn’t really do anything other than to show you the basics of how a plugin works.

Since each post in this series builds on top of each other, it is recommended to read this series in the order it is presented. I highly recommend not using the test plugin on a production WordPress installation. Instead, use a local WordPress installation. Topics I plan to start off really basic and move quickly into the more hard-core WordPress plugin functions. This series will not be a comprehensive micro-detail of plugin development, but will hopefully give you a nice foundation to start your own plugin development. If you have any questions or suggestions, please leave a comment or email me using the Devlounge contact form (Ronald). I do ask that you not rely on Devlounge for support and instead use the WordPress Support forums. Techniques Some of the techniques I use in my code samples may not be the best way to present code and you may be cringing because I don’t have a lot of shortcuts. I apologize in advance. Everybody has a different coding style. As far as plugin techniques, structure, behavior, and other nuisances, if there is a better and easier way that I overlooked, I am all ears (er, eyes).

Seven Reasons to Write a Wordpress Plugin
While writing the “How to Write a Plugin” series, I thought it would be beneficial to list some reasons why WordPress users would want to write a WordPress plugin in the first place. Listed below are seven reasons why a WordPress user should consider writing a WordPress plugin. You like a plugin’s idea, but don’t like the plugin’s implementation Whether discovering WordPress plugins on Weblog Tools Collection, the official WordPress plugins directory, or the WordPress Plugin Database, you will inevitably find a plugin that meets your needs — sort of. You like the idea of the plugin, but not really the approach the plugin author took with it. Why not run with the original idea and create your own separate version? You want to modify existing plugin code Sometimes the plugin’s output needs to be tweaked a little bit or some functionality you would like is missing. You can try convincing the plugin author to add your feature, but plugin authors are usually quite busy or they may not like your suggestion. It takes a lot of effort by a plugin author to provide support and field feature and bug requests for a plugin that is free. Sometimes the plugin is no longer supported by anyone. In the event the plugin author is unable to your needs, it will be up to you to take the initiative and modify the existing plugin code. If you do a good enough job and make enough changes, you can re-release the plugin as long as the original plugin was released under a GPL compatible license. Usually one of the first things I do when I install or test a new plugin is to look at the code and see what I can modify, what I can’t modify, and what I can possibly add or take away. You want to extend a plugin Sometimes a plugin is good as it is, but you would like to build upon it and release your own version. For example, you may think a plugin would work better using AJAX, or would like to add more hooks so that it is compatible with other plugins. You may want to add an admin panel so you don’t have to dig through the code to change the output. As stated earlier, if a plugin is released as GPL compatible, you are free to release your own version. You want portable theme code For those of us who opted to build a custom theme from scratch rather than download one, you may find yourself re-using code snippets all over the place. Wouldn’t it be

You are a theme designer I would argue that if you are a template designer for WordPress. one of the goals I had was to rapidly build incoming links. You want incoming links When launching the Reader Appreciation Project. the next logical step is to be a plugin author. You want to make money A good plugin author can usually get paid on the side for custom work. Some plugin authors take donations as well or charge extra for providing support or for consulting. If you are a custom theme designer. . And you only have one place to change the code rather than several. The best way I knew how was to write some WordPress plugins and promote them. Writing plugins gives you a more intimate knowledge of how WordPress behaves and allows you to extend the functionality of your released themes.better just to write your own plugin that combined all the little code snippets so that you could use them as template tags? The beauty of template tags is that you can re-use them over and over for your theme and any future ones you build. One of my plugins (WP Ajax Edit Comments) turned out to be very popular and has currently generated more than 100 incoming links. you can package your custom plugins in with the theme for an extra charge.

Since blog readers are the ones who use your blog the most. but you would like to see it included in WordPress. Google Maps. Luckily there is already a few plugins out there for that. If there is a service that you really like. there are many places to find inspiration regarding developing your own WordPress plugin. The Blog Herald has a column called WordPress Wednesday. Another area is the WordPress ideas page. I will list several ways to get ideas for your very own WordPress plugin. and others have APIs (Application Program Interfaces) that allow third-party applications the ability to interface with their services. FeedBurner. why not program it yourself in the form of a plugin? Chances are that if you desire the feature added. it may be hard to think of that idea that will allow you to take the plunge. Through these APIs. . Listen to Yourself “If only WordPress could do…” If you find that WordPress lacks a feature that you truly want. For example. one of my readers asked me to have a way to preview a comment before posting. Within this column are plugin requests and a “wishlist” for WordPress. Listen to your Readers Your readers are a valuable asset when it comes to getting ideas for plugins. investigate the service’s API and see if it would make a good plugin. A particularly useful forum for plugin ideas is the Requests and Feedback forum. Check out the WordPress Support Forums The WordPress Support Forums are full of people looking for help on extending their WordPress blog. Fortunately. Weblog Tools Collection typically has a plugin announcement almost every day. Just the other day. Investigate APIs Online services such as Flickr. others will too. but sometimes your readers will suggest something that has yet to be implemented as a plugin. On Wednesday. Within this post. and from there you can get an idea of what kind of plugins people are churning out. they have a unique insight in what they want out of your blog. a reader might request an easy way to reply to or edit comments. Check out Blogging Resources Sites such as The Blog Herald and Weblog Tools Collection are great resources for plugin ideas.How to get ideas for Wordpress Plugins If you are convinced that you would like to investigate the possibility of creating your own WordPress plugin. you start programming your own WordPress solution.

There are many plugins out there that essentially do the same thing.Third Party Applications There are many third-party applications that people may have installed along with a WordPress blog. If you don’t like the implementation of a particular plugin. and many others. feel free to do so. build your own implementation. Why not develop a WordPress plugin that integrates these third-party applications into a WordPress blog? Existing WordPress Plugins If you find a WordPress plugin you really like and would like to branch out with your own idea. but are all slightly different. Vanilla. . Examples of such programs are Mint.

You can control this by taking advantage of actions and filters. I typically structure my plugin in this folder structure: Plugin Folder Name (The name of your plugin with no spaces or special characters) o Main plugin php file o js folder (for JavaScript files) o css folder (for StyleSheet files) o php folder (for other PHP includes) For example purposes. you can take advantage of this by tapping into the WordPress Plugin Application Program Interface (API).php o js o css o php . but I recommend always creating a folder to store your plugin. this tells WordPress to load your bit of code on "each" page (including admin pages). your WordPress installation may be very slow due to the amount of code being included. When a plugin is "Activated". I'll first briefly describe how a WordPress plugin works and then go into a plugin's structure. Since WordPress loads your code automatically when the plugin is activated.Structure of a Wordpress Plugin One of the more important aspects of developing a WordPress plugin is how you structure it. so these tips are merely my own personal preference. Some plugin authors simply include a PHP file for their plugin. This is why if you have many plugins activated. The WordPress loop is the loop that displays your posts. so it is imperative that you know exactly where your code is executing. How a WordPress Plugin Works After placing a WordPress plugin into the "wp-content/plugins/" folder. Each plugin author is different in the way they structure a plugin. This post will go over some tips on how to structure your plugin to organize your plugin resources and avoid naming collisions. here is a sample structure I have created: devlounge-plugin-series o devlounge-plugin-series. You can also access the WordPress template tags or create your own. Some template tags will not work outside of this loop. the plugin should automatically be available to install. which will be explained in later posts. I suggest reading into the WordPress loop if you plan on making changes to the post content or comments. Folder Structure All WordPress plugins will be installed in the wp-content/plugins directory.

com/">Ronald Huereca</a> Description: A sample plugin for a <a href="http://www. 6. <?php /* Plugin Name: Your Plugin Name Here Plugin URI: Your Plugin URI Version: Current Plugin Version Author: Who Are You? Description: What does your plugin do? Line 3 allows you to name your plugin. 7. 5.devlounge. 4. Shown below is a screenshot of what the plugin would look like in the WordPress Plugins panel. <?php /* Plugin Name: Devlounge Plugin Series Plugin URI: http://www.Within the devlounge-plugin-series folder. PHP: 1. WordPress also recommends placing images in their own directory and including a read me file for your plugin. Line 4 allows you to point a user to the web location of your plugin. 2. 2. 4. Line 5 allows you to specify the current version.devlounge.00 Author: <a href="http://www. 7. Set Up a Class Structure . 3. 3.net/ Version: v1. I would include just the main PHP file and put all other files in their respective folders. Line 7 allows you to describe your plugin. Main Plugin File When you start a new plugin file. the first seven lines are the lines that describe your plugin.ronalfy. Shown below is an example of the code filled out: PHP: 1. This structure will assist other plugin authors who look at your code to be able to tell what the main plugin file is and where all the supporting files are located. 5.net">Devlounge</a> series. Line 6 allows you to specify the author of the plugin. 6.

} 6. but it sure helps. If someone out there sets up the same function name as yours in a plugin. . it is imperative that all plugins incorporate a PHP class structure. Set Up Actions and Filters The next bit of code sets up a place holder for WordPress actions and filters (which I will go over in a later post). 7. Here is some bare-bones code that will allow you to set up a class structure. the class is created. If it has. $dl_pluginSeries = new DevloungePluginSeries(). if (class_exists("DevloungePluginSeries")) { 2. a variable called $dl_pluginSeries is created with an instance of the DevloungePluginSeries class. 9. an error will result and WordPress will be rendered inoperable until that plugin is removed. PHP: 1. If the class doesn't exist. PHP: 1. } //End Class DevloungePluginSeries What the above code does is checks for the existence of a class named DevloungePluginSeries. A class structure is necessary in order to avoid naming collisions with other WordPress plugins. } 8. Initialize Your Class The next bit of code will initialize (instantiate) your class. } All the above code checks for is if the class DevloungePluginSeries has been created. 3. function DevloungePluginSeries() { //constructor 4. class DevloungePluginSeries { 3. if (!class_exists("DevloungePluginSeries")) { 2. //Actions and Filters 2. PHP: 1. To avoid naming collisions. if (isset($dl_pluginSeries)) { 3. 5.You don't have to be incredibly familiar with PHP Classes to develop a WordPress plugin. //Actions 4.

?> The above code checks to make sure the $dl_pluginSeries variable is set. . If it is (and that's only if the class exists). } 7.5. then the appropriate actions and filters are set up. //Filters 6. 8.

Rather simple. we are going to set up a piece of code that will run inside the <head> tag of a WordPress blog. //Actions and Filters 2. To call this function. //Actions 4. } All the above function does is output an HTML comment. 1). I left a place holder for some actions. we add an action. Running the Code . We have given our plugin a priority level of 1. 6. [accepted_args] ). 5. ?> 3. First we need to add a function into our DevloungePluginSeries class. 'your_function_name'. Some of the actions that I use heavily are: admin_menu: Allows you to set up an admin panel for your plugin. [priority]. In this example. <!-. function addHeaderCode() { 2. the add_action structure is as follows: add_action ( 'hook_name'. PHP: 1. we pass the action an array with a reference to our class variable (dl_pluginSeries) and the function name we wish to call (addHeaderCode). array(&$dl_pluginSeries. wp_head: Allows you to insert code into the <head> tag of a blog Actions in Action While defining the structure of a WordPress plugin. but you could output just about anything. if (isset($dl_pluginSeries)) { 3. add_action('wp_head'. //Filters 6. with lower numbers executed first. Since we are calling a function inside of a class. PHP: 1. } From the WordPress Plugin API page.Wordpress Plugin Actions WordPress actions allow you as a plugin author to be able to hook into the WordPress application and execute a piece of code. <?php 5. 'addHeaderCode').Devlounge Was Here --> 4. An example of an action would be that you want a execute some code after a user has published a post or left a comment.

. The structure is as follows: remove_action('action_hook'.If the Devlounge Plugin Series plugin is activated. Removing Actions If your plugin dynamically adds actions. you can dynamically remove actions as well with the remove_actions function.'action_function'). the comment of "Devlounge was here" should show up when you go to View->Source in your web browser when looking at your main blog site.

= "<p>Devlounge Was Here</p>". Let's call it addContent. Adding A Content Filter One of the cool filters you can hook into is one called 'the_content'. the next step is to hook into the 'the_content' filter and call the function. 1). 3. [priority]. a default value is set. . and much. 'your_filter'. //Actions and Filters 2. This modified text is usually formatted for either inserting into a database or displaying the output to the end user. This particular filter is run for post content being displayed to the browser. After the function is added to the class. } In the above code. PHP: 1. The text is then returned. To demonstrate the usefulness of WordPress filters. WordPress filters allow to you modify virtually any kind of text displayed and are extremely powerful. The content variable has our line of text added to it. [accepted_args]). PHP: 1. The above function will accept one variable named content. We're going to just add a line of text that will be displayed at the end of the content. we will continue working with the existing code in the Devlounge Plugin Series code from the WordPress Plugin Actions post. feeds. //Actions 4. $content . We just need to add in a function to the DevloungePluginSeries class. the following things are happening. if (isset($dl_pluginSeries)) { 3. how authors are displayed in comments. function addContent($content = '') { 2. The format for adding a filter from the WordPress Plugin API is: add_filter('hook_name'. 'addHeaderCode'). array(&$dl_pluginSeries. add_action('wp_head'. return $content. 4. much more. If no variable is passed.Wordpress Plugin Filters WordPress filters are the functions that your plugin can hook into with regards to modifying text. WordPress filters allow you to modify posts.

7. Let's call it authorUpperCase. //Actions and Filters 2. PHP: 1. 5. 1).5. If no variable is passed. 'addHeaderCode'). The above function will accept one variable named author. 'authorUpperCase')). add_action('wp_head'. } As you can see on line 6. The author string is returned as uppercase. if (isset($dl_pluginSeries)) { 3. the text "Devlounge Was Here" would show up towards the end of the post content. Adding An Author Filter Another example of a filter I will show is manipulating the display of comment authors. return strtoupper($author). 3. } In the above code. add_filter('the_content'. //Filters 6. After the function is added to the class. a filter with the name 'the_content' is added and our function 'addContent' is called. array(&$dl_pluginSeries. a default value is set. . If the plugin were activated and a post was viewed. //Filters 6. add_filter('get_comment_author'. array(&$dl_pluginSeries. I'm simply going to make all authors uppercase. We just need to add in a function to the DevloungePluginSeries class. 'addContent')). 8. function authorUpperCase($author = '') { 2. the next step is to hook into the 'get_comment_author' filter and call the function. } As you can see on line 7. add_filter('the_content'. a filter with the name 'get_comment_author' is added and our function 'authorUpperCase' is called. array(&$dl_pluginSeries. PHP: 1. 'addContent')). //Actions 4. 7. array(&$dl_pluginSeries. the following things are happening.

Applying Filters One of the more powerful things you can do with filters is to call then dynamically. the comment authors would all be upper case. The format for the apply_filters function is: apply_filter('filter name'. .If the plugin were activated and a post with comments was viewed. 'your text'). There's no need to add a filter to be run every time. You will see an example of apply_filters in use later in this series. You can run a filter whenever you choose from within your code.

should have some kind of administration panel. I added this variable declaration to the DevloungePluginSeries class: . In the case of the Devlounge Plugin Series plugin. This post will go into what it takes to successfully create an admin panel for your plugin. For now. A Place to Store the Variables One of the first problems you will likely encounter when constructing your own admin panel is where exactly to store the variables. I store this in the form of a member variable inside my class.to modify code is generally not a good idea. so it annoys me when plugin authors decide not to build one and want plugin users to modify PHP code. I will explain options and database storage in a later post in this series. Luckily WordPress makes it quite easy with options.whose experience with PHP might be nil -.Constructing a Wordpress Plugin Admin Panel Any plugin that needs user input. The first thing I usually do with regards to options is to assign a "unique" name for my admin options. Asking users -. Building a administration panel isn't all that difficult. all you have to do is nod your head and follow the steps to store your own admin variables in the WordPress database. such as changing a variable.

$devloungeAdminOptions[$key] = $option. return $devloungeAdminOptions. 13. 5. 4. Set Your Admin Default Options You're going to need a place to initialize your admin options. 7. $devloungeAdminOptions).Name Your Admin Options PHP: 1. However. 11. Here's the function I inserted in the DevloungePluginSeries class: PHP: 1. 3. 6. 'content' => ''). especially when a user first activates your plugin. class DevloungePluginSeries { 2. foreach ($devOptions as $key => $option) 10. $devOptions = get_option($this->adminOptionsName). 'add_content' => 'true'. . The options are stored in the WordPress database (line 12). you also need to make these options upgrade-proof just in case you decide to add more options in the future. but most admin panels aren't incredibly complicated so one function for your admin options should be sufficient. 5. } What this function does is: Assigns defaults for your admin options (lines 3 . I named my variable adminOptionsName and gave it the long and unique value of DevloungePluginSeriesAdminOptions. function getAdminOptions() { 3.6). if (!empty($devOptions)) { 9. If options have been previously stored. Your plugin needs may be different. Attempts to find previous options that may have been stored in the database (line 7). } 12. } Line 2 shows where I added in my member variable. 8. function DevloungePluginSeries() { //constructor 4. The options are returned for your use (line 13). update_option($this->adminOptionsName. $devloungeAdminOptions = array('show_header' => 'true'. My technique is to provide a dedicated function to call your admin options. var $adminOptionsName = "DevloungePluginSeriesAdminOptions". it overwrites the default values (lines 8 11). 14. //Returns an array of admin options 2. 'comment_author' => 'true'.

However. sweet. You give it the path to the main plugin PHP file. what about when the plugin is first installed (er. 3.Initialize the Admin Options The getAdminOptions can be called at anytime to retrieve the admin options. 'DevloungePluginSeries') . $this->getAdminOptions(). So anytime the plugin is activated. Here's what the action does: You tell it to run when a plugin has been activated. PHP: 1. and simple. function init() { 2. You pass a reference to the instance variable dl_pluginSeries and call the init function. How the Admin Panel Works Before I delve into the code of constructing the actual admin panel. it will be beneficial to describe the behavior of the admin panel. The _e function allows WordPress to search for a localized version of your text. The function works like a normal echo. add_action('activate_devlounge-plugin-series/devlounge-plugin-series. One thing that may confuse you greatly in the admin panel is the use of the _e WordPress function. array(&$dl_pluginSeries. is required to call this init function. This of course is assuming that your plugin is properly placed in the wp-content/plugins/ directory. Display the admin panel options. activated)? There should be some kind of function that is called that also retrieves the admin options. } Short. An example would be: _e('Update Settings'. This action is a little complicated. Output notifications if form data is present. however.php. An action. This will help WordPress potentially translate your plugin in the future. which is devlounge-pluginseries/devlounge-plugin-series. 'init')).php'. but instead you pass it your text and an identifier variable (typically your plugin name). Here are the steps you'll want to take for setting up your admin panel: Check to see if any form data has been submitted. but easy to figure out. I added the following function into the DevloungePluginSeries class: PHP: 1. the init function is called for the Devlounge Plugin Series plugin.

in line 16. <?php 23. The function's name will be printAdminPage. 5. update_option($this->adminOptionsName.?></strong></p></div> 22. $devOptions['comment_author'] = $_POST['devloungeAuthor']. } 9. if (isset($_POST['devloungeAddContent'])) { 10. . } 12. it's assumed that a form hasn't been submitted. "DevloungePluginSeries"). Set up the Admin Panel Function The first thing we want to do is set up a function that will actually print out the admin panel. This variable is assigned to our "Submit" button. if (isset($_POST['update_devloungePluginSeriesSettings'])) { 6. It's a little involved. All the code in this section is assumed to be within the printAdminPage function. All the code is doing is displaying the form elements and reading in options. The first form variable that is tested as being set is update_devloungePluginSeriesSettings. //Prints out the admin page 2. I use the apply_filters function to format the content for saving in the database. The if-statement overkill isn't necessary. 17. 14. but sometimes it is useful for debugging. 20. $devOptions). if (isset($_POST['devloungeAuthor'])) { 13. so I'll summarize it here. if (isset($_POST['devloungeHeader'])) { 7. <div class="updated"><p><strong><?php _e("Settings Updated. } ?> All the above code does is load in the options and test to make sure each portion of the form is submitted. ?> 21.This code would work the same way as: echo "Update Settings". 4. $devOptions['add_content'] = $_POST['devloungeAddContent']. $devOptions['content'] = apply_filters('content_save_pre'. } 18. As promised. The next bit of code will display the HTML form that is necessary for the admin panel. This next bit of code will read in the options we specified earlier and check to see if any post options have been submitted. 19. $_POST['devloungeContent']). PHP: 1. if (isset($_POST['devloungeContent'])) { 16. $devOptions = $this->getAdminOptions(). $devOptions['show_header'] = $_POST['devloungeHeader']. function printAdminPage() { 3. 11. } 15. 8. If that isn't set.".

&nbsp. <input type="submit" name="update_devloungePluginSeriesSettings" value="<?php _e('Update Settings'. <h3>Allow Comment Code in the Header?</h3> 7. "DevloungePluginSeries"). 18.</p> 8. }?> /> Yes</label>&nbsp. <p><label for="devloungeAddContent_yes"><input type="radio" id="devloungeAddContent_yes" name="devloungeAddContent" value="true" <?php if ($devOptions['add_content'] == "true") { _e('checked="checked"'. </div> 22.&nbsp. <div class="submit"> 19. <p><label for="devloungeHeader_yes"><input type="radio" id="devloungeHeader_yes" name="devloungeHeader" value="true" <?php if ($devOptions['show_header'] == "true") { _e('checked="checked"'. <p>Selecting "No" will disable the comment code inserted in the header.</p> 16. }?>/> No</label></p> 9.&nbsp. }?> /> Yes</label>&nbsp.PHP: 1. "DevloungePluginSeries").<label for="devloungeAuthor_no"><input type="radio" id="devloungeAuthor_no" name="devloungeAuthor" value="false" <?php if ($devOptions['comment_author'] == "false") { _e('checked="checked"'. <div class=wrap> <form method="post" action="<?php echo $_SERVER["REQUEST_URI"]. }?>/> No</label></p> 17. }//End function printAdminPage() . 4. "DevloungePluginSeries"). <?php 23. height: 100px. 3. <p>Selecting "No" will disable the content from being added into the end of a post.</p> 12. <h3>Allow Content Added to the End of a Post?</h3> 11.<label for="devloungeHeader_no"><input type="radio" id="devloungeHeader_no" name="devloungeHeader" value="false" <?php if ($devOptions['show_header'] == "false") { _e('checked="checked"'.&nbsp. 14.&nbsp. 2. "DevloungePluginSeries").&nbsp. "DevloungePluginSeries"). 10.&nbsp. 'DevloungePluginSeries') ?>" /></div> 20. }?> /> Yes</label>&nbsp. 'DevloungePluginSeries') ?></textarea> 6. 5. ?>"> <h2>Devlounge Plugin Series</h2> <h3>Content to Add to the End of a Post</h3> <textarea name="devloungeContent" style="width: 80%.&nbsp. <p>Selecting "No" will leave the comment authors alone. }?>/> No</label></p> 13.&nbsp.<label for="devloungeAddContent_no"><input type="radio" id="devloungeAddContent_no" name="devloungeAddContent" value="false" <?php if ($devOptions['add_content'] == "false") { _e('checked="checked"'.$devOptions['content']). <p><label for="devloungeAuthor_yes"><input type="radio" id="devloungeAuthor_yes" name="devloungeAuthor" value="true" <?php if ($devOptions['comment_author'] == "true") { _e('checked="checked"'."><?php _e(apply_filters('format_to_edit'. "DevloungePluginSeries"). <h3>Allow Comment Authors to be Uppercase?</h3> 15. </form> 21.

[function]). global $dl_pluginSeries. //Initialize the admin panel 2. The access level (in this case a 9) is described in more detail at the Users Levels page in the WordPress codex. The add_options_page function format is described by WordPress as: add_options_page(page_title. function DevloungePluginSeries_ap() { 4. add_action('admin_menu'. add_options_page('Devlounge Plugin Series'. 9. if (!function_exists("DevloungePluginSeries_ap")) { 3. 'Devlounge Plugin Series'. } The above code does this: A function named DevloungePluginSeries_ap is created. An admin page named "Devlounge Plugin Series" is initialized and our printAdminPage function is referenced (lines 8-10).One observation to make in the above code is the reference to the options and how the HTML and PHP is integrated. file. } 8. . } 12. 7. 'DevloungePluginSeries_ap'). PHP: 1. we need to call it through an action. This variable references our class. First a function must be set up right above the actions that it outside the scope of the class. array(&$dl_pluginSeries. basename(__FILE__). } 11. 10. Variable dl_pluginSeries is tested for existence (lines 4 . 'printAdminPage')). 5. menu_title. An action must now be set up to call the DevloungePluginSeries_ap function: PHP: 1. if (function_exists('add_options_page')) { 9. access_level/capability. if (!isset($dl_pluginSeries)) { 6.7). return. Set up the Admin Panel Action Now the the printAdminPage function is added.

Constructing a Wordpress Plugin User’s Panel There will be situations where you will have a main administrative panel. especially when a user first activates your plugin. Set Your the Default User Options You're going to need a place to initialize your user options. However. Name Your User Options PHP: 1. I gave this variable the long and unique name of DevloungePluginSeriesAdminUsersOptions. these options should also work outside of the admin panel where users may or may not be logged in. what if a logged-in user doesn't want to see this text? Why not give them the option without affecting all of the other users? This post will go over the steps to add in your own User's Administration Panel. 3. In the case of the Devlounge Plugin Series. var $adminOptionsName = "DevloungePluginSeriesAdminOptions". but would like individual users to set their own preferences. . class DevloungePluginSeries { 2. we added an option for text to be added in at the end of each post. However. Line 3 shows where I added in the member variable called adminUsersName . var $adminUsersName = "DevloungePluginSeriesAdminUsersOptions".

no extra steps are necessary. 17. function init() { 2. $this->getUserOptions(). $devOptions[$user_email] = 'true. if (empty($user_email)) { 5. 3. $devOptions). } 12. } 7. //Returns an array of user options 2. } 8. function getUserOptions() { 3. Attempts to find previous options that may have been stored in the database (line 8). 4. Initialize the Admin User Options The getUserOptions can be called at anytime to retrieve the admin user options. However. if (empty($devOptions[$user_email])) { 13. 11. 4. } Line 3 calls the new function getUserOptions. Since there is already an action added that calls the init function. get_currentuserinfo(). 14. 6. } 16. return $devOptions.true'. $devOptions = get_option($this->adminUsersName). How the Admin Panel and User Panel Will Work Together . defaults are assigned (lines 9-15) The options are returned for your use (line 16). } What this function does is: Checks to see if a user is logged in (lines 3 . $devOptions = array(). if (!isset($devOptions)) { 10. 15. $this->getAdminOptions(). activated)? There should be some kind of function that is called that also retrieves the user options. 9.7). if (empty($user_email)) { return ''. This is easily determined by checking to see if the user_email variable is set. global $user_email.Here's the function I inserted in the DevloungePluginSeries class: PHP: 1. If options aren't found. update_option($this->adminUsersName. what about when the plugin is first installed (er. I added the following function into the init function: PHP: 1.

". $content = $devOptions[0]. ?> 14. global $user_email. 6. 8. PHP: 1. and whether an author's name was uppercase in the comments. <?php 16. //Save the updated options to the database 10. 4. if (sizeof($devOptions)>= 2) { 23.You will recall from the last post about setting up an admin panel that the WordPress admin could set the content at the end of the post. We're going to allow the user to decide if they: Want content at the end of the post to show (only if the admin has this enabled already).". whether code was shown in the header. 17. This next bit of code will read in the options we specified earlier and check to see if any post options have been submitted. 24. $devOptions). 21. if (empty($user_email)) { 5. $devOptions[$user_email] = $_POST['devloungeAddContent'] . //Prints out the admin page 2. <div class="updated"><p><strong>Settings successfully updated." . //Get the author options 20. $author = $devOptions[1]. function printAdminUsersPage() { 3. Wants the comment authors to be uppercase (only if the admin has this enabled already). if (isset($user_email)) { 12. The user's panel allows users who aren't admin to be able to specify whether they want these options or not. The function's name will be printAdminUsersPage. $devOptions = explode(". $devOptions = $this->getUserOptions(). 22. 13. $_POST['devloungeAuthor']. 9. $devOptions = $devOptions[$user_email]. update_option($this->adminUsersName. } 7. Set up the User's Panel Function The first thing we want to do is set up a function that will actually print out the user's panel. } 19. All the code in this section is assumed to be within the printAdminUsersPage function. $devOptions). .</strong></p></div> 15. get_currentuserinfo(). } 18. if (isset($_POST['update_devloungePluginSeriesSettings']) && isset($_POST['devloungeAddContent']) && isset($_POST['devloungeAuthor'])) { 11.

&nbsp.&nbsp. All the code is doing is displaying the form elements and reading in options that were already retrieved. }?> /> Yes</label>&nbsp.<label for="devloungeAddContent_no"><input type="radio" id="devloungeAddContent_no" name="devloungeAddContent" value="false" <?php if ($content == "false") { _e('checked="checked"'. <p><label for="devloungeAddContent_yes"><input type="radio" id="devloungeAddContent_yes" name="devloungeAddContent" value="true" <?php if ($content == "true") { _e('checked="checked"'. }?>/> No</label></p> 7.&nbsp. 'DevloungePluginSeries') ?>" /></div> 12.18) Reads in comma-separated variables for the user. 3.</p> 6. PHP: 1. <div class=wrap> <form method="post" action="<?php echo $_SERVER["REQUEST_URI"].&nbsp. }//End function printAdminUsersPage() Set up the User's Panel Action . </form> 13.<label for="devloungeAuthor_no"><input type="radio" id="devloungeAuthor_no" name="devloungeAuthor" value="false" <?php if ($author == "false") { _e('checked="checked"'. <?php 15. "DevloungePluginSeries"). 4. 26. <h3>Allow Comment Authors to be Uppercase?</h3> 8. }?>/> No</label></p> 10. <p><label for="devloungeAuthor_yes"><input type="radio" id="devloungeAuthor_yes" name="devloungeAuthor" value="true" <?php if ($author == "true") { _e('checked="checked"'.(lines 19-25) The next bit of code will display the HTML form that is necessary for the user's panel. <input type="submit" name="update_devloungePluginSeriesSettings" value="<?php _e('Update Settings'.&nbsp. }?> /> Yes</label>&nbsp.25. The above code: } ?> Retrieves the user options (line 7) Saved post data (if available) to the database (lines 9 . "DevloungePluginSeries"). <div class="submit"> 11. </div> 14. 2. "DevloungePluginSeries").</p> 9. ?>"> <h2>Devlounge Plugin Series User Options</h2> <h3>Allow Content Added to the End of a Post?</h3> <p>Selecting "No" will disable the content from being added into the end of a post. <p>Selecting "No" will leave the comment authors alone. "DevloungePluginSeries"). 5.&nbsp.

basename(__FILE__). 0. 10. } 11. We're going to piggy back on this function in order to add in our user's panel. add_submenu_page('profile. array(&$dl_pluginSeries. add_options_page('Devlounge Plugin Series'. } 8. PHP: 1. basename(__FILE__).php'. Calls our printAdminUsersPage function. 7. 13. if (!function_exists("DevloungePluginSeries_ap")) { 3. } 15. if (function_exists('add_submenu_page')) { 12. 5. 'Devlounge Plugin Series'. you can see a line of code that: Adds a sub-menu to the profile. 9. return. 'printAdminPage')).php page. . "Devlounge Plugin Series User Options".While setting up the administrative panel. //Initialize the admin and users panel 2. if (!isset($dl_pluginSeries)) { 6. array(&$dl_pluginSeries. if (function_exists('add_options_page')) { 9. } On line 12. global $dl_pluginSeries. The access level (in this case a 0) is described in more detail at the Users Levels page in the WordPress codex. function DevloungePluginSeries_ap() { 4. } 14. we specified a function called DevloungePluginSeries_ap that helped initialize the admin panel."Devlounge Plugin Series User Options". Let users with a user's level greater than or equal to zero access to the user's panel. 'printAdminUsersPage')).

It accepts only one variable. WordPress has four functions for options: add_option get_option update_option delete_option add_option The add_option function accepts four variables. $description. The function format is: get_option($option_name).Wordpress Plugins and Database Interaction When you are writing a plugin. saving and retrieving data from the database is as simple as a function call. get_option The get_option function allows you to retrieve a previously stored option from the database. $value. This function is beneficial for adding data to the database for retrieval later. However. The $name variable should be unique so that you don't overwrite someone else's option. This post will cover storing and retrieving data from a WordPress database. the WordPress codex has detailed instructions on how to set up your own table. WordPress Options With WordPress options. I usually don't use this function because update_option pretty much does the same thing. Fortunately WordPress makes data retrieval simple with options and a database object. which is the name of the option to retrieve. you will inevitably have to store variables in a database and retrieve them. $autoload). with the name of the option being required. or someone else doesn't write over yours. . Storing Data in a Database There are two main ways to store data in the WordPress database: 1. Create your own table. Use Options Since most plugins will not require their own database table. The variables are: add_option($name. I will only cover options. 2.

I personally like the double functionality of the function and prefer it over add_option when storing data to the database. a reference to the class would look like: PHP: 1. 5. Here is a sample function followed by a brief explanation: PHP: 1. function getAdminOptions() { 3. and naming collisions with other plugin authors. if (!empty($devOptions)) { 9. 7.6. A Code Example You might recall from previous posts in this series that I stored options in the database as an array. database queries. } 12. 11. foreach ($devOptions as $key => $option) 10. This technique helps with code bloat. The function format is: update_option($option_name. $devloungeAdminOptions[$key] = $option. 13. 'add_content' => 'true'. I do this so I don't have to store multiple options (each a database call).update_option The update_option function works about the same as the add_option function except that it also updates an option if it already exists. The WordPress Database Class Another powerful method of storing and retrieving data from the WordPress database is using the WordPress Database class object. 8. In a function. 4. //Returns an array of admin options 2. 14. 'comment_author' => 'true'. The function format is: delete_option($option_name). $devloungeAdminOptions = array('show_header' => 'true'. $new_value). 6. I begin an associative array that will eventually be stored in the WordPress database as an option (line 12). $devOptions = get_option($this->adminOptionsName). delete_option The delete_option function deletes options from the database. update_option($this->adminOptionsName. function sample_function() { . } On lines 3 . return $devloungeAdminOptions. 'content' => ''). $devloungeAdminOptions).

ARRAY_A). For example. On line 3. $comments = $wpdb->get_row("SELECT count(comment_approved) comments_count FROM $wpdb->comments where comment_approved = '1' group by comment_approved". function sample_function() { 2. global $wpdb. we retrieve data from the comments table ($wpdb->comments). I simply call the variable I assigned the results in SQL. 4. 3. I suggest heading over the WPDB Class page and looking over what the wpdb class is capable of. you can access the many useful functions of the wpdb class. which was comments_count. On line 3. } Here's what the function does: On line 2. Here's a function that does that using the WPDB class: PHP: 1. } After this variable is referenced. We specify that we want the data returned as an associative array (ARRAY_A). we echo out the result. echo $comments['comments_count']. 5. . 3. On line 4. say we want to retrieve the total number of comments for our WordPress installation. Since I wanted the results returned as an associative array. global $wpdb. we add a reference to the $wpdb variable. The wpdb class is a very large class with a lot of functionality.2. we call a function inside the wpdb class called get_row.

Here are the parameters for wp_register_script: wp_register_script( $handle. For example. $ver = false ) The handle is a unique name that you will use to reference your script later. Say for example you had a script that was located at: http://yourdomain. Your version is 1. The wp_register_script function The wp_register_script function allows you to register your script for calling and can allow you to set pre-requisites. The src is the absolute source to your JavaScript file. 'http://yourdomain. For example. This variable is optional. The ver variable is a string version of the script. '1. array('prototype').com/wpcontent/plugins/your-plugin-directory/js/script. you would list it here.js'. Add your JavaScript Your plugin might need to load the Prototype library or perhaps a custom script.Using Javascript and CSS with your Wordpress Plugin A lot of plugins nowadays are more reliant on JavaScript and Cascading Style Sheets. you can specify this. It is important to separate your JavaScript and CSS into separate files so that the plugin is easier to maintain. This variable is optional. if your script requires Prototype to have been loaded.0 You would likely call the function in your plugin code initialization or after a wp_head action: PHP: 1.com/wpcontent/plugins/your-plugin-directory/js/script. This portion of the series will cover how to load JavaScript and CSS files for your plugin. . $src. Your script depends on the Prototype library. $deps = array().js Let's make a few assumptions: You want to name the handle 'my_script_handle'. This variable is required. if your script requires prototype. This variable is required. wp_register_script('my_script_handle'.0'). This section will show you a few WordPress functions that will allow you to load scripts and avoid script conflicts. The deps variable is an array of dependencies.

<? 10. wp_enqueue_script('devlounge_plugin_series'.js The file is dependent upon prototype. we're going to add in a dummy JavaScript file that will be used in a later post. get_bloginfo('wpurl') . it would be called like this: PHP: 1. '/wp-content/plugins/devlounge-plugin-series/js/devlounge-plugin-series.The wp_enqueue_script Function The wp_enqueue_script function does the same thing as wp_register_script except that the src variable is optional. <!-. we added an action for wp_head. } 7. This file is located at the following location: http://yourdomain. 'http://yourdomain.js'. } The above code does the following: . function addHeaderCode() { 2. 6.com/wpcontent/plugins/devlounge-plugin-series/js/devlounge-plugin-series. 4.Devlounge Was Here --> 9. If an src is provided. '0. The function that was run as a result of that action was called addHeaderCode. A JavaScript Example For the Devlounge Plugin Series plugin. The purpose of this file is to demonstrate how to use the wp_enqueue_script function. if (function_exists('wp_enqueue_script')) { 3. The version is 0. 11.1 You might recall that in a previous post in this series. wp_enqueue_script('my_script_handle'. array('prototype'). array('prototype'). $devOptions = $this->getAdminOptions(). However. thus making the wp_register_script function somewhat unnecessary. the wp_register_script allows you to register your scripts manually so you can load all of your JavaScripts using one wp_enqueue_script function. Let's modify this function to add in our new JavaScript: PHP: 1. ?> 8. } 5.com/wpcontent/plugins/your-plugin-directory/js/script. '1.js'. the enqueue function automatically registers the script for you.1').0'). If we were to call the same custom script as before. if ($devOptions['show_header'] == "false") { return.

if ($devOptions['show_header'] == "false") { return. 12. 3. We use the get_bloginfo('wpurl') to get the location of the WordPress installation and hard-code the rest. 7.js will have loaded as well as the Prototype library.com/wpcontent/plugins/devlounge-plugin-series/css/devlounge-plugin-series. 5. 3. 4. $devOptions = $this->getAdminOptions(). '/wp-content/plugins/devlounge-plugin-series/css/devlounge-plugin-series. dependencies. Loading in the Cascading Style Sheets I've added a new style sheet to my styles directory. #devlounge-link { 2.css" />' . get_bloginfo('wpurl') . When you go to a post and view-source. wp_enqueue_script('devlounge_plugin_series'. The wp_enqueue_script is called with the src.1. Here are my assumptions: This file is located at the following location: http://yourdomain.The wp_enqueue_script function is checked for existence. function addHeaderCode() { 2. background-color:#006. I have added in the following ID: CSS: 1.x and up I believe). get_bloginfo('wpurl') .1'). "\n". '/wp-content/plugins/devlounge-plugin-series/js/devlounge-plugin-series. <? 11. } Adding in the style sheet for the plugin is as simple as adding a line to the addHeaderCode function: PHP: 1. <!-. echo '<link type="text/css" rel="stylesheet" href="' .Devlounge Was Here --> 10.css I specified an ID called #devlounge-link in the CSS file. } 6. the devlounge-plugin-series.js'. array('prototype'). } . } 8. if (function_exists('wp_enqueue_script')) { 4. color: #FFF. which is conveniently included along with WordPress (versions 2. You have added in the following code at the end of a post: <a href="#" id="devlounge-link">Get the Number of Blog Comments</a> In the style sheet file. and version. '0. ?> 9.

On line 2. . I simply echo out a reference to the new style sheet.

4. 8./. 5.php (main plugin file) o js devlounge-plugin-series. 9./.Using AJAX with your Wordpress Plugin More and more plugins are starting to use AJAX techniques. } ?> This code is simple enough and is used solely for AJAX calls. } if (isset($dl_pluginSeries)) { $dl_pluginSeries->showComments()./wp-config. I personally don't see a use for most cases of AJAX. Set Up a new PHP File The Devlounge Plugin Series plugin has the following directory structure: devlounge-plugin-series o devlounge-plugin-series. the showComments function hasn't been created yet.../. 6. However.js. Set up the showComments function The showComments function is placed inside our DevloungePluginSeries class: . 7.php (new php file for AJAX calls) Notice I have a php extension at the end of my JavaScript file. 2.. but it may be necessary for your plugin to use AJAX to accomplish a task. This post will show you how to use AJAX with your WordPress plugin. I have placed the following code inside the file: PHP: 1. This post will be building on the last one where we added in a JavaScript and Stylesheet file. 3.css o php dl-plugin-ajax.php. so that is the next item on our agenda..php").php o css devlounge-plugin-series. I'll explain the change a little later in this post. I've created a new file and placed it in the php directory and have called it dl-pluginajax. <?php if (!function_exists('add_action')) { require_once(". It makes sure that config structure is present so we can call our class object dl_pluginSeries and reference other WordPress functions and variables.

function showComments() { 2. array('prototype').js. Allow JavaScript to Know Where Your Blog is Located One pesky thing about AJAX is that the external JavaScript file has no idea where your blog is installed. This function outputs the number of comments made on your blog. 4.php'. 3. '/wp-content/plugins/devlounge-plugin-series/js/devlounge-plugin-series. Let's now set up the JavaScript. array('prototype'). ARRAY_A). if (function_exists('wp_enqueue_script')) { 2. Within the addHeaderCode function. } The only thing I changed was the version number and added a PHP extension to the end of the JavaScript file.php) is to find the blog's URL. echo "You have " . " comments on your blog". call the PHP file.js. '/wp-content/plugins/devlounge-plugin-series/js/devlounge-plugin-series.js'. global $wpdb. '0.1'). I changed the code from this: PHP: 1. 3. get_bloginfo('wpurl') . } You might recognize this bit of code from the database interaction post. I get around this by adding a PHP extension to my included JavaScript file so that I can access WordPress functions. $devloungecomments['comments_count'] . get_bloginfo('wpurl') .3'). 3. Now JavaScript has a way of finding out where our blog is for AJAX calls. wp_enqueue_script('devlounge_plugin_seriess'. } to this: PHP: 1. if (function_exists('wp_enqueue_script')) { 2. and return a result to the user.PHP: 1. wp_enqueue_script('devlounge_plugin_series'. Setting up the JavaScript The purpose of this script (which is located in devlounge-plugin-series. '0. 5. . $devloungecomments = $wpdb->get_row("SELECT count(comment_approved) comments_count FROM $wpdb->comments where comment_approved = '1' group by comment_approved".

5..php". var url = "<?php bloginfo('wpurl') ?>/wp-content/plugins/devlounge-pluginseries/php/dl-plugin-ajax. onSuccess:success}).../wp-config.JAVASCRIPT: 1. the devloungePluginSeriesInit is called. $('devlounge-link')././.onclick = devloungePluginSeriesClick. 10. {method:'post'. Event. false).} 14. } 6.observe(window. Simply find a post and add this code to the bottom of it: <a href="#" id="devlounge-link">Get the Number of Blog Comments</a> The absolute URL to the PHP file is found (line 12). 'load'. function devloungePluginSeriesClick(evt) { 12. 16. The Result This next step assumes you are at the post where the link was added. . return false. After the document has loaded. 13.responseText). devloungePluginSeriesInit.. When clicking on the link "Get the Number of Blog Comments". 19. the script uses AJAX to call a function in the DevloungePluginSeries class and returns the result to you in the form of an alert box. <?php 2. function devloungePluginSeriesInit() { 9. } 11. 8. If you forgot. 15. var success = function(t){devloungePluginSeriesClickComplete(t). if (!function_exists('add_action')) 3. now is the time to add the link in.php"). function devloungePluginSeriesClickComplete(t) { 18. The PHP file is called (line 14). } The above code does the following (keep in mind we are using Prototype): Makes sure that config structure is present so we can access WordPress functions and variables. { 4. alert(t.Request(url. The response is outputted to the user (line 18)./. ?> 7. var myAjax = new Ajax. require_once(". } 17. An event is set up for the link you added at the end of a post (line 7).

. I don't have many comments on my local installation.As you can see.

It'll be impossible to find every bug. <?php /*your php code*/ ?> Make Sure You Have Tested Your Plugin Thoroughly Find some guinea pigs (er. This file should contain at the very minimum installation instructions for your plugin. but at least make an effort to put out a stable release. <? /*your php code*/ ?> You would have: PHP: 1. So instead of: PHP: 1. but you also want some testers who will represent the average user who knows nothing about programming languages. Make Sure You Have a Readme File Before you release a plugin into the wild. Set Up a Dedicated WordPress Plugin Page Ajay D'Souza wrote some recommendations regarding releasing WordPress themes. There's even a groovy Readme file validator. make sure you at the very least have a Readme file. The advice he gives can also be applied to plugins to an extent. testers) who would be willing to test your plugin. Prior to Release Try to Follow the Standards While it isn't required to follow the WordPress coding standards. The reason? Not everybody has shorthand PHP enabled. Technically competent testers are good. check out the WordPress recommendations regarding a Readme file. . there are a few things to consider before releasing and promoting your WordPress plugin. One of the more valuable tips in there is to never use shorthand PHP. For a stricter version of a readme file. there are some things in there that will make your life easier.Releasing and Promoting your Wordpress Plugin After you have finished writing your awesome WordPress plugin.

Others who link to your plugin will be doing the same. Any files other than the main plugin file should be included in sub-directories. An exception to this would be the plugins that add template tags to the WordPress core. you can give details regarding your new plugin. gzip. If your plugin does require theme or file manipulation. This plugin page should contain the following at a minimum: A brief description of your plugin. Contact or support information (or comments enabled). The time you spent on your description and features is crucial since you'll be using these for your plugin promotion. Promote at Weblog Tools Collection A very good resource for promoting your plugin is the Weblog Tools Collection news section. Have a Good Folder Structure I would argue to always include your plugin in a folder. A list of features. The download location. Under their Plugin Releases section. Make sure you zip. . Does Your Plugin Require Theme or File Manipulation? If your plugin requires users to tweak theme settings and/or files. Promoting Your Plugin After you have your dedicated download page. Known bugs and/or conflicts. The above information will assist you in promoting your plugin. include detailed examples on your download page and possibly include some examples in your release. prepare for the onslaught of bug reports and users wanting assistance. Screenshots or a demo (or both).Make sure you set up a dedicated WordPress Plugin page for your plugin. Version history (Changelog). especially the description and feature portion. I would argue that a good plugin requires absolutely no theme manipulation or file manipulation. Install instructions. This page will be the URL that people will go to to find out everything about your plugin. or rar your plugin folder that way it is as easy as possible for people to install your plugin. it is time to start making plugin announcements so people will download your work.

Promote at the Official WordPress Plugin Repository WordPress itself has offered to host your plugin. especially in the blogosphere. Most of these problems can be solved during testing. Remember that any publicity is good publicity. people will be wary of downloading your plugin. The process for adding your plugin isn't the most straightforward. the referrals will start coming in. Thank you very much for reading. use it on your blog.Promote at the WordPress Plugin Database The WordPress Plugin Database is another good resource for adding in your plugin. Hopefully this series proved beneficial to you and helped establish a foundation for you to write your own plugins. Conclusion You can have the best plugin in the world. Once you start the promotion process. but some bugs just don't seem to crop up until after the official release. It's important to get those bugs fixed and the crucial features added in early. and Stumble Upon. but there are detailed instructions. You have to meet several requirements before you will be allowed to add your plugin. or too many people have problems with it. but if it isn't released and promoted correctly. Get your friends to help. especially if your plugin is very young. very few people will download it. If your plugin is good enough. If your plugin doesn't work. . The End of the 'How to Write a WordPress Plugin' Series Thank you for reading the final post in the plugin series. Promote On Your Own Blog If your plugin is something that people will notice. Digg. Promote Using Social Networking Add your plugin to delicious. however. Word of mouth is a powerful ally. it is important to listen to feature and bug requests. People may start asking what plugin you are using.

devlounge. or ask a quick question. You can also dig the article from that page and show your support.net/extras/how-to-write-a-wordpress-plugin to leave feedback.devlounge. All content is copyrighted © to their respected owners and Devlounge.About the site: Devlounge is a designer and developer resource providing articles. and may not be reproduced without permission. © 2007 Devlounge http://www. A note about Code: Many code samples used in this series can be downloaded by visiting the specific section page on Devlounge. Be sure to visit the How to Write a Wordpress Plugin main page at http://www. Please visit http://www.net for more content and features just like this by this and other authors.net . interviews.devlounge. and exclusive extras such as this article e-book. download code.

com.win2pdf. .This document was created with Win2PDF available at http://www. The unregistered version of Win2PDF is for evaluation or non-commercial use only. This page will not be added after purchasing Win2PDF.

Sign up to vote on this title
UsefulNot useful