Writing Wordpress Plugin
Writing Wordpress Plugin
WordPress Plugins allow easy modification, customization, and enhancement of a WordPress blog.
Instead of changing the core programming of WordPress, you can add functionality with 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 with the weblog using access points and methods provided by the
WordPress Plugin Application Program Interface (API).
Wishing that WordPress had some new or modified functionality? The first thing to do is to search various
WordPress Plugin repositories 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 Plugin.
This article assumes you are already familiar with the basic functionality of WordPress, and PHP
programming.
Resources
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 wellwritten Plugins, such as Hello Dollydistributed with WordPress.
Once you have written your WordPress Plugin, read Plugin Submission and Promotion to learn
how to distribute it and share it with 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.
Plugin Name
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 repositories 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 weatherrelated Plugin would probably have the word "weather" in the name. The name can be multiple words.
Plugin Files
The next step is to create a PHP file with a name derived from your chosen Plugin name. For instance, if
your Plugin will be called "Fabulous Functionality", you might call your PHP file fabulous-functionality.php.
Again, try to choose a unique name. People who install your Plugin will be putting this PHP file into the
WordPress Plugins directory in their installation (usually wp-content/plugins/), so no two Plugins they are
using can have the same PHP file name.
Another option is to split your Plugin into multiple files. Your WordPress Plugin must have at least one
PHP file; it could also contain JavaScript files, CSS files, image files, language files, etc. If there are
multiple files, pick a unique name for a directory and a name of your choice (usually the same) for the
main PHP file of your Plugin, such as fabulous-functionality and fabulous-functionality.php, respectively,
put all your Plugin's files into that directory, and tell your Plugin users to install the whole directory
under wp-content/plugins/. Notice that WordPress installation can be configured for wpcontent/plugins/ directory to be moved, so you must use plugin_dir_path() and plugins_url() for absolute
paths and URLs. For more details see Determining Plugin and Content Directories.
In the rest of this article, "the Plugin PHP file" refers to the main Plugin PHP file, whether in wpcontent/plugins/ or a sub-directory.
Security Note: Consider blocking direct access to your plugin PHP files by adding the following line at the
top of each of them, or be sure to refrain from executing sensitive standalone PHP code before calling
any WordPress functions.
Readme File
If you want to host your Plugin on https://wordpress.org/plugins/, you also need to create a readme.txt file
in a standard format, and include it with your Plugin.
Home Page
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 with,
what has changed from version to version of your Plugin, and how to use the Plugin.
File Headers
Now it's time to put some information into your main Plugin PHP file.
License
Read this in the plugin developer handbook.
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.
Template Tags
Another way for a WordPress Plugin to add functionality to WordPress is by creating custom Template
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 template tag function called geotag_list_states() for the sidebar, which lists all the
states posts are tagged with, with links to the state-based archive pages the Plugin enables.
To define a custom template 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 ?>.
Use the WordPress "option" mechanism (described below). This method is appropriate for storing
relatively small amounts of relatively static, named pieces of data -- the type of data you'd expect the
site owner to enter when first setting up the Plugin, and rarely change thereafter.
2.
Post Meta (a.k.a. Custom Fields). Appropriate for data associated with individual posts, pages, or
attachments. See post_meta Function Examples, add_post_meta(), and related functions.
3.
Custom Taxonomy. For classifying posts or other objects like users and comments and/or for a
user-editable name/value list of data consider using a Custom Taxonomy, especially when you want to
access all posts/objects associated with a given taxonomy term. See Custom Taxonomies.
4.
Create a new, custom database table. This method is appropriate for data not associated with
individual posts, pages, attachments, or comments -- the type of data that will grow as time goes on,
and that doesn't have individual names. SeeCreating Tables with Plugins for information on how to do
this.
$name
Required (string). Name of the option to be added.
$value
Optional (mixed), defaults to empty string. The option value to be stored.
$deprecated
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.
$autoload
Optional, defaults to 'yes' (enum: 'yes' or 'no'). If set to 'yes' the setting is automatically retrieved
by the wp_load_alloptionsfunction.
get_option($option);
$option
Required (string). Name of the option whose value you want returned. You can find a list of the
default options that are installed with WordPress at the Option Reference.
update_option($option_name, $newvalue);
Updates or creates an option value in the database (note that add_option does not have to be
called if you do not want to use the$deprecated or $autoload parameters).
$option_name
Required (string). Name of the option to update.
$newvalue
Required. (string|array|object) The new value for the option.
Administration Panels
Assuming that your Plugin has some options stored in the WordPress database (see section above), you
will probably want it to have an administration panel that will enable your Plugin users to view and edit
option values. The methods for doing this are described inAdding Administration Menus.
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.
Make sure everything is committed and the new version actually works. Pay attention to all
WordPress versions your Plugin supports and try to test it with all of them. Don't just test the new
features; also make sure you didn't accidentally break some older functionality of the Plugin.
Change the version number in the header comment of the main PHP file to the new version
number (in the trunk folder).
Change the version number in the 'Stable tag' field of the readme.txt file (in the trunk folder).
Add a new sub-section in the 'changelog' section of the readme.txt file, briefly describing what
changed compared to the last release. This will be listed on the 'Changelog' tab of the Plugin page.
The Plugin's page on wordpress.org still lists the old version. Have you updated the 'stable tag'
field in the trunk folder? Just creating a tag and updating the readme.txt in the tag folder is not enough!
The Plugin's page offers a zip file with the new version, but the button still lists the old version
number and no update notification happens in your WordPress installations. Have you remembered to
update the 'Version' comment in the main PHP file?
For other problems check Otto's good write-up of common problems: The Plugins directory and
readme.txt files
The code of a WordPress Plugin should follow the WordPress Coding Standards. Please
consider the Inline DocumentationStandards 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 database table prefix (usually "wp_") into your Plugins. Be
sure to use the $wpdb->prefixvariable instead.
Database reading is cheap, but writing is expensive. Databases are exceptionally good at
fetching data and giving it to you, and these operations are (usually) lightning quick. Making changes to
the database, though, is a more complex process, and computationally more expensive. As a result, try
to minimize the amount of writing you do to the database. Get everything prepared in your code
first, so that you can make only those write operations that you need.
Use WordPress' APIs instead of using direct SQL where possible. For example,
use get_posts() or new WP_Query() instead of SELECT * FROM {$wpdb->prefix}_posts.
Use the existing database tables instead of creating new custom tables if possible. Most
use-cases can be accomplished with custom post types and meta data, custom taxonomy and/or one
of the other standard tables and using the standard tables provides a lot of UI and other
functionality "for free." Think very carefully before adding a table because it adds complexity to your
plugin that many users and site builders prefer to avoid.
SELECT only what you need. Even though databases fetch data blindingly fast, you should still
try to reduce the load on the database by only selecting that data which you need to use. If you need to
count the number of rows in a table don't SELECT * FROM, because all the data 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 database load. Remember: hundreds of other processes
may be hitting the database at the same time. The database and server each have only so many
resources to spread around amongst all those processes. Learning how to minimize your Plugin's hit
against the database 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 wpconfig.php file, try all of your plugin functionality, and check to see if there are any errors or warnings.
Fix any that occur, and continue 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() andwp_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.