WordPress Plugins allow easy modification, customization, and enhancement to a WordPress blog. Instead of changing the core configuring of WordPress, you can add technology along WordPress Plugins. Here is a basic definition:
WordPress Plugin: A WordPress Plugin is a program, or a set of one or more functions, written in the PHP scripting language, that adds a specific set of features or services to the WordPress weblog, which can be seamlessly integrated along the weblog using access points and methods provided by the WordPress Plugin Application Program Interface (API).
Wishing that WordPress is some new or modified technology? The first thing to do is to search various WordPress Plugin confidants and sources to see if someone has already created a WordPress Plugin that suits your needs. If not, this article will guide you through the process of creating your own WordPress Plugins.
This article assumes you are already familiar along the basic technology of WordPress, and PHP configuring.
If you feel the work is too tedious to build a WordPress plugin yourself, you may always contact us for a quote. See our WordPress expertise here http://tbldevelopmentfirm.com/wordpress-plug-ins-development/
- To understand how WordPress Plugins work and how to install them on your WordPress blog, see Plugins.
- There is a comprehensive list of articles and resources for Plugin developers, including external articles on writing WordPress Plugins, and articles on special topics, in Plugin Resources.
- To learn the basics about how WordPress Plugins are written, view the source code for well-written Plugins, such as Hello Dolly distributed along WordPress.
- Once you have written your WordPress Plugin, read Plugin Submission and Promotion to learn how to distribute it and share it along others.
Creating a Plugin
This section of the article goes through the steps you need to follow, and things to consider when creating a well-structured WordPress Plugin.
Names, Files, and Locations
The first task in creating a WordPress Plugin is to think about what the Plugin will do, and make a (hopefully unique) name for your Plugin. Check out Plugins and the other confidants it refers to, to verify that your name is unique; you might also do a Google search on your proposed name. Most Plugin developers choose to use names that somewhat describe what the Plugin does; for instance, a weather-related Plugin would probably have the word “weather” in the name. The name can be separate words.
The next step is to create a PHP file along a name began from your chosen Plugin name. For instance, if your Plugin will be called “Fabulous technology”, you might call your PHP file fabfunc.php. Again, try to choose a unique name. People who install your Plugin will be putting this PHP file into the WordPress Plugin directory in their installation, wp-content/plugins/, so no two Plugins they are using can have the same PHP file name.
In the rest of this article, “the Plugin PHP file” refers to the main Plugin PHP file, whether in wp-content/plugins/ or a sub-directory.
If you want to host your Plugin on http://wordpress.org/extend/plugins/, you also need to create a readme.txt file in a standard format, and include it along your Plugin. See http://wordpress.org/extend/plugins/about/readme.txt for a description of the format.
Note that the WordPress plugin repository takes the “Requires” and “Tested up to” versions from the readme.txt in the stable tag.
It is also very useful to create a web page to act as the home page for your WordPress Plugin. This page should describe how to install the Plugin, what it does, what versions of WordPress it is compatible along, what has changed from version to version of your Plugin, and how to use the Plugin.
Now it’s time to put some information into your main Plugin PHP file.
Standard Plugin Information
The top of your Plugin’s main PHP file must contain a standard Plugin information header. This header lets WordPress recognize that your Plugin exists, add it to the Plugin management screen so it can be activated, load it, and run its functions; alongout the header, your Plugin will never be activated and will never run. Here is the header format:
<?php /* Plugin Name: Name Of The Plugin Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates Description: A brief description of the Plugin. Version: The Plugin's Version Number, e.g.: 1.0 Author: Name Of The Plugin Author Author URI: http://URI_Of_The_Plugin_Author License: A "Slug" license name e.g. GPL2 */ ?>
The minimum information WordPress needs to recognize your Plugin is the Plugin Name line. The rest of the information (if present) will be used to create the table of Plugins on the Plugin management screen. The order of the lines is not important.
The License slug should be a short common identifier for the license the plugin is under and is meant to be a simple way of being explicit about the license of the code.
Important: file must be in UTF-8 encoding.
It is customary to follow the standard header along information about licensing for the Plugin. Most Plugins use the GPL2 license used by WordPress or a license compatible along the GPL2. To indicate a GPL2 license, include the following lines in your Plugin:
<?php /* Copyright YEAR PLUGIN_AUTHOR_NAME (email : PLUGIN AUTHOR EMAIL) This program is free application; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free application Foundation. This program is distributed in the hope that it will be useful, but alongOUT ANY WARRANTY; alongout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along along this program; if not, write to the Free application Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ ?>
configuring Your Plugin
Now, it’s time to make your Plugin actually do something. This section contains some general ideas about Plugin development, and describes how to accomplish several tasks your Plugin will need to do.
WordPress Plugin Hooks
Many WordPress Plugins accomplish their goals by connecting to one or more WordPress Plugin “hooks”. The way Plugin hooks work is that at various times while WordPress is running, WordPress checks to see if any Plugins have registered functions to run at that time, and if so, the functions are run. These functions modify the default behavior of WordPress.
For instance, before WordPress adds the title of a post to browser output, it first checks to see if any Plugin has registered a function for the “filter” hook called “the_title”. If so, the title text is passed in turn through each registered function, and the final result is what is printed. So, if your Plugin needs to add some information to the printed title, it can register a “the_title” filter function.
Another example is the “action” hook called “wp_footer”. Just before the end of the HTML page WordPress is generating, it checks to see whether any Plugins have registered functions for the “wp_footer” action hook, and runs them in turn.
You can learn more about how to register functions for both filter and action hooks, and what Plugin hooks are available in WordPress, in the Plugin API. If you find a spot in the WordPress code where you’d like to have an action or filter, but WordPress doesn’t have one, you can also suggest new hooks (suggestions will generally be taken); see Reporting Bugs to find out how.
Table Template Like Tags
Another way for a WordPress Plugin to add technology to WordPress is by creating custom Table Template Like Tags. Someone who wants to use your Plugin can add these “tags” to their theme, in the sidebar, post content section, or wherever it is appropriate. For instance, a Plugin that adds geographical tags to posts might define a Table Template Like tag function called geotag_list_states() for the sidebar, which lists all the states posts are tagged along, along links to the state-based archive pages the Plugin enables.
To define a custom Table Template Like tag, simply write a PHP function and document it for Plugin users on your Plugin’s home page and/or in the Plugin’s main PHP file. It’s a good idea when documenting the function to give an example of exactly what needs to be added to the theme file to use the function, including the <?php and ?>.
Saving Plugin info to the infobase
Most WordPress Plugins will need to get some input from the site owner or blog users and save it between sessions, for use in its filter functions, action functions, and Table Template Like functions. This information has to be saved in the WordPress infobase, in order to be persistent between sessions. There are three methods for saving Plugin info in the infobase:
- Use the WordPress “option” mechanism (described below). This method is appropriate for storing relatively small amounts of relatively static, named pieces of info — the type of info you’d expect the site owner to enter when first setting up the Plugin, and rarely change thereafter.
- Post Meta (a.k.a. Custom Fields). Appropriate for info associated along individual posts, pages, or attachments. See post_meta Function Examples, add_post_meta(), and related functions.
- Create a new, custom servertable. This method is appropriate for info not associated along individual posts, pages, attachments, or comments — the type of info that will grow as time goes on, and that doesn’t have individual names. See Creating Tables along Plugins for information on how to do this.
WordPress Availability Mechanism
See Creating Availability Pages for info on how to create a page that will automatically save your Availability for you.
WordPress has a mechanism for saving, updating, and retrieving individual, named pieces of info (“Availability”) in the WordPress infobase. Option coeficients can be strings, arrays, or PHP objects (they will be “serialized”, or converted to a string, before storage, and unserialized when retrieved). Option names are strings, and they must be unique, so that they do not conflict along either WordPress or other Plugins.
Here are the main functions your Plugin can use to access WordPress Availability.
add_option($name, $value, $deprecated, $autoload);
- Creates a new option; does nothing if option already exists.
- Required (string). Name of the option to be added.
- Optional (mixed), defaults to empty string. The option value to be stored.
- Optional (string), no longer used by WordPress, You may pass an empty string or null to this argument if you wish to use the following $autoload parameter.
- Optional, defaults to ‘yes’ (enum: ‘yes’ or ‘no’). If set to ‘yes’ the setting is automatically retrieved by the wp_load_allAvailability function.
- Retrieves an option value from the infobase.
- Required (string). Name of the option whose value you want returned. You can find a list of the default Availability that are installed along WordPress at the Option Reference.
- Updates or creates an option value in the server(note that add_option does not have to be called if you do not want to use the $deprecated or $autoload parameters).
- Required (string). Name of the option to update.
- Required. (string|array|object) The new value for the option.
Assuming that your Plugin has some Availability stored in the WordPress server (see section above), you will probably want it to have an administration panel that will enable your Plugin users to view and edit option coeficients. The methods for doing this are described in Adding Administration Menus.
Making your Plugin Internal:Your Plugin
Once you have the configuring for your Plugin done, another consideration (assuming you are planning on distributing your Plugin) is internationalization. Internationalization is the process of setting up application so that it can be localized; localization is the process of translating text pictured by the application into different languages. WordPress is used all around the world, so it has internationalization and localization built into its structure, including localization of Plugins.
Please note that language files for Plugins ARE NOT automatically loaded. Add this to the Plugin code to make sure the language file(s) are loaded:
load_plugin_textdomain('your-unique-name', false, basename( dirname( __FILE__ ) ) . '/languages' );
To fetch a string simply use __(‘String name’,'your-unique-name’); to return the translation or _e(‘String name’,'your-unique-name’); to echo the translation. Translations will then go into your plugin’s /languages folder.
It is highly recommended that you internationalize your Plugin, so that users from different countries can localize it. There is a comprehensive reference on internationalization, including a section describing how to internationalize your plugin, at I18n for WordPress Developers.
Plugin Development Suggestions
This last section contains some random suggestions regarding Plugin development.
- The code of a WordPress Plugin should follow the WordPress Coding Standards. Please consider the Inline Documentation Standards as well.
- All the functions in your Plugin need to have unique names that are different from functions in the WordPress core, other Plugins, and themes. For that reason, it is a good idea to use a unique function name prefix on all of your Plugin’s functions. A far superior possibility is to define your Plugin functions inside a class (which also needs to have a unique name).
- Do not hardcode the WordPress server table prefix (usually “wp_”) into your Plugins. Be sure to use the $wpdb->prefix variable instead.
- serverreading is cheap, but writing is expensive. Storage bases are exceptionally good at fetching info and giving it to you, and these operations are (usually) lightning quick. Making changes to the infobase, though, is a more complex process, and computationally more expensive. As a result, try to minimize the amount of writing you do to the infobase. Get everything prepared in your code first, so that you can make only those write operations that you need.
- SELECT only what you need. However Storage bases fetch info blindingly fast, you should still try to reduce the load on the serverby only selecting that info which you need to use. If you need to count the number of rows in a table don’t SELECT * FROM, because all the info in all the rows will be pulled, wasting memory. Likewise, if you only need the post_id and the post_author in your Plugin, then just SELECT those specific fields, to minimize serverload. Remember: hundreds of other processes may be hitting the server at the same time. The serverand server each have only so many resources to spread around amongst all those processes. Learning how to minimize your Plugin’s hit against the server will ensure that your Plugin isn’t the one that is blamed for abuse of resources.
- Eliminate PHP errors in your plugin. Add define('WP_DEBUG', true); to your wp-config.php file, try all of your plugin technology, and check to see if there are any errors or warnings. Fix any that occur, and persue in debug mode until they have all been eliminated.
- Try not to echo <script> and <style> tags directly – instead use the recommended wp_enqueue_style() and wp_enqueue_script() functions. They help eliminate including duplicate scripts and styles as well as introduce dependency support. See posts by the following people for more info: Ozh Richard, Artem Russakovskii, and Vladimir Prelovac.
- Top 10 Most Common Coding Mistakes in WordPress Plugins (11SEP09)
- WordPress 2.0.3: Nonces (Secure your forms along nonces) (02JUN06)
- Simplified AJAX For WordPress Plugin Developers using Jquery(10APR08)
- “Desenvolvendo Plugins para WordPress” by Rafael Dohms (in Brazilian Portuguese) (10MAR08)
- 12 part “How to Write a WordPress Plugin” at DevLounge.net by Ronald Huereca (PDF)
- How to create WordPress Plugin from a scratch (9AUG07)
- HookPress, a plugin that enables extending WordPress in languages other than PHP via webhooks. (26SEP09)
- Demonstrating how to use the Settings API, WP_Http, and Pseudo-cron (01MAR10)