1. What a plugin is and examples of common plugin types.
2. Best practices for plugin structure and organization.
3. How to determine file paths and URLs within a plugin.
4. Important plugin activation, deactivation, and uninstall techniques.
5. An overview of hooks, shortcodes, menus, and settings that plugins can utilize.
6. Resources for further plugin development learning and support.
2. Who Am I?
Brad Williams
Co-Founder of WebDevStudios.com
Organizer Philly WordPress Meetup
& WordCamp Philly
Co-Author of Professional WordPress
(http://bit.ly/pro-wp)
& Professional WordPress Plugin Development
(http://amzn.to/plugindevbook)
Slides available at: http://www.slideshare.net/williamsba
3. Topics
What is a Plugin?
Types of Plugins
Sanity Practices and Plugin Foundation
Determining Paths in a Plugin
Activation, Deactivation, and Uninstall Methods
Shortcodes, Menus, and Settings Overview
Hooks: Actions and Filters Explained
Resources for Plugin Developers
4. What is a Plugin?
A plugin in WordPress is a PHP script
that extends, or alters, the core
functionality of WordPress.
Quite simply plugins are files installed in
WordPress to add a feature, or set of
features, to WordPress.
5. What is a Plugin?
http://wordpress.org/extend/plugins/
6. Types and Statuses of Plugins
Active – Plugin is active and running in WordPress
Inactive – Plugin is installed but not active. No code from the plugin is
executed
Must-Use – All plugins installed in wp-content/mu-plugins. All plugins
are loaded automatically. Only way to deactivate is to remove.
Drop-ins – Core functionality of WordPress can be replaced by Drop-in
plugins.
advanced-cache-php – Advanced caching plugin
db.php – Custom database class
maintenance.php – Custom maintenance message
sunrise.php – Domain mapping
And more…
7. Plugin Header Requirements
<?php
/*
Plugin Name: WordCamp Philly 2011
Plugin URI: http://webdevstudios.com/support/wordpress-plugins/
Description: Plugin for WordCamp Philly
Version: 1.0
Author: Brad Williams
Author URI: http://webdevstudios.com
*/
?>
Plugin is now available to be
activated in WordPress!
8. Sanity Practices
Prefix Everything!
update_option() //BAD FUNCTION NAME
bw_wcphilly_update_option() //GOOD FUNCTION NAME!
$settings //BAD VARIABLE NAME
$bw_wcphilly_settings //GOOD VARIABLE NAME!
Organized Folder Structure
• /unique-plugin-name
• unique-plugin-name.php Keeping your files organized
• uninstall.php using a clean folder structure
• /js can make it much easier to
• /css track the flow of your plugin over
• /includes time.
• /images
9. Determining Paths
Local Paths
<?php
//display local path to my plugin directory
echo plugin_dir_path( __FILE__ );
?>
Would display: /public_html/wp-content/plugins/my-new-plugin/
<?php
//display local path to my includes/functions.php file
echo plugin_dir_path( __FILE__ ) .‟includes/functions.php‟;
?>
Would display: /public_html/wp-content/plugins/my-new-plugin/includes/functions.php
__FILE__ is a “magical” PHP
constant containing the full
path and filename of the file
10. Determining Paths
URL Paths
<?php
//display the URL to images/icon.png
echo plugins_url( 'images/icon.png', __FILE__ );
?>
Would display: http://example.com/wp-content/plugins/my-new-plugin/images/icon.png
Advantages of plugins_url()
• Supports the mu-plugins directory
• Auto detects SSL, so if enabled the URL would return https
• Uses the WP_PLUGIN_URL constant, meaning it can detect the correct path even if
/wp-content has been moved
• Supports Multisite using the WPMU_PLUGIN_URL constant
11. Important Techniques
Plugin Activation Function
<?php
register_activation_hook( __FILE__, 'bw_wcphilly_install' );
function bw_wcphilly_install() {
if ( version_compare( get_bloginfo( 'version' ), „4.0', '<' ) ) {
deactivate_plugins( plugin_basename( __FILE__ ) ); // Deactivate our plugin
wp_die( 'This plugin requires WordPress version 4.0 or higher.' );
}
}
?>
register_activation_hook( $file, $function )
Parameters:
• $file (string) (required) – Path to the primary plugin file
• $function (string) (required) – Function to be executed when plugin is
activated
http://codex.wordpress.org/Function_Reference/register_activation_hook
12. Important Techniques
Plugin Deactivation Function
<?php
register_deactivation_hook( __FILE__, 'bw_wcphilly_deactivate' );
function bw_wcphilly_deactivate() {
//do stuff
}?>
register_deactivation_hook( $file, $function )
Parameters:
• $file (string) (required) – Path to the primary plugin file
• $function (string) (required) – Function to be executed when plugin is
deactivated
REMEMBER: Deactivating is NOT uninstalling. Always
assume your users will reactivate at a later date.
http://codex.wordpress.org/Function_Reference/register_deactivation_hook
13. Important Techniques
Plugin Uninstall
1. Create a uninstall.php file in the root directory of your plugin
2. Add all uninstall code to this file
<?php
if( !defined( 'WP_UNINSTALL_PLUGIN' ) )
exit ();
// Delete option from options table
delete_option( „bw_wcphilly_options' );
?>
If the WP_UNINSTALL_PLUGIN constant is not
defined we know WordPress did not call this
file. This is a security measure in WordPress
Uninstall.php is the recommended uninstall method, but
there is another method called register_uninstall_hook()
http://jacobsantos.com/2008/general/wordpress-27-plugin-uninstall-methods/
14. What is a Hook?
Hooks enable plugin developers to “hook”
into WordPress and change how it works
without modifying the core code
There are two kinds of hooks: Actions and Filters
http://jacobsantos.com/2008/general/wordpress-27-plugin-uninstall-methods/
15. Hooks
Action Hooks
Enables you to execute a function at specific points in the WordPress loading process
<?php
add_action( 'user_register', 'bw_wcphilly_welcome_email' );
function bw_wcphilly_welcome_email( $user_id ) {
$user_info = get_userdata( $user_id );
//populate email values
$email_to = is_email( $user_info->user_email );
$email_subject = 'Welcome!';
$email_msg = 'Thank you for registering on my website!';
//send welcome email
wp_mail( $email_to, $email_subject, $email_msg );
}
?>
http://codex.wordpress.org/Plugin_API/Action_Reference
16. Hooks
Common Action Hooks
• plugins_loaded – Earliest hook in the WP loading process, after all plugins have
been loaded
• init – Fire after most of WP is set up so all information is available
admin_menu – Runs when the basic admin menu structure is in place
• template_redirect – Executed just before the theme template is chosen
• wp_head – Executed on the front end of WordPress between the <head> tags
• wp_footer – Runs in the footer of your theme
• admin_head – Executed on the admin side of WordPress between the <head>
tags
• admin_footer – Runs in the footer of the admin side of WordPress
• user_register – Executes when a new user account is created
• save_post – Runs when a post or page is created or updated
http://codex.wordpress.org/Plugin_API/Action_Reference
17. Hooks
Filter Hooks
Enables you to manipulate the output of code and content in WordPress
<?php
add_filter( 'the_content', 'bw_wcphilly_filter_content' );
function bw_wcphilly_filter_content( $text ) {
$text = str_replace( 'Drupal', 'WordPress', $text );
return $text;
}
?>
Change every instance of Drupal to WordPress in your content >:)
REMEMBER: Using a filter does NOT change the
content in the database, it simply alters it prior
to displaying
http://codex.wordpress.org/Plugin_API/Filter_Reference
19. Hooks
Common Filter Hooks
• the_content – Filter applied to the content of the post or page
• the_title – Applied to the post title
• body_class – Applied to the <body> tag class parameter
• default_content – Applied to the content on a new post or page
• comment_text – Applied to the comment text of a comment
http://codex.wordpress.org/Plugin_API/Filter_Reference
23. Shortcode Example
Example
<?php
// Register a new shortcode: [book]
add_shortcode( 'book', 'bw_wcphilly_book' );
// The callback function that will replace [book]
function bw_wcphilly_book() {
return '<a href="http://amzn.to/plugindevbook">Professional WordPress Plugin
Development</a>';
}
?>
24. Menu Example
Example Custom Menu
<?php
add_action( 'admin_menu', 'bw_wcphilly_create_menu' );
function bw_wcphilly_create_menu() {
//create custom top-level menu
add_menu_page('WC Philly Settings Page', 'WC Philly',
'manage_options', 'wcphilly-plugin', 'bw_wcphilly_settings_page' );
//create submenu items
add_submenu_page( 'wcphilly-plugin', 'About My Plugin', 'About',
'manage_options', 'wcphilly-plugin_about', 'bw_wcphilly_about_page' );
add_submenu_page( 'wcphilly-plugin', 'Help with My Plugin', 'Help',
'manage_options', 'wcphilly-plugin_help', 'bw_wcphilly_help_page' );
add_submenu_page( 'wcphilly-plugin', 'Uinstall My Plugin', 'Uninstall',
'manage_options', 'nyc-meetup-plugin_uninstall', 'bw_wcphilly_uninstall_page' );
}
?>
25. Menu Example
add_menu_page()
Parameters:
$page_title – The title tag text
$menu_title – The menu name
$capability - Capability required to view menu
$menu_slug – Unique slug to reference menu by
$function – Function that displays the pages content
$icon_url – URL for a custom menu icon
$position – Position the menu should appear
add_submenu_page()
Parameters:
$parent_slug – Slug name for the parent menu
$page_title – The title tag text
$menu_title – The submenu name
$capability – Capability required to view submenu
$menu_slug – Unique slug to reference menu by
$function – Function that displays the pages content
26. Menu Example
Add Submenu to Custom Post Type
<?php
add_action( 'admin_menu', 'bw_wcphilly_create_menu' );
function bw_wcphilly_create_menu() {
//create submenu items
add_submenu_page( 'edit.php?post_type=movies', 'About My Plugin', 'About',
'manage_options', „wcphilly-plugin_about', 'bw_wcphilly_about_page' );
}
?>
You can easily add a submenu to any Custom
Post Type menu by setting the $parent_slug to
edit.php?post_type=POSTTYPENAME
27. Menu Example
Add Submenu to Existing Menu
<?php
add_action( 'admin_menu', 'bw_wcphilly_create_menu' );
function bw_wcphilly_create_menu() {
//create Settings submenu page
add_options_page('WC Philly Settings Page', 'WC Philly', 'manage_options',
'wcphilly-plugin', 'bw_wcphilly_settings_page' );
}
function bw_wcphilly_settings_page() {
//settings page
}?>
28. Menu Example
add_options_page()
Parameters:
$page_title – The title tag text
$menu_title – The menu name
$capability - Capability required to view menu
$menu_slug – Unique slug to reference menu by
$function – Function that displays the pages content
add_dashboard_page()
add_posts_page()
add_media_page()
add_links_page()
add_pages_page()
add_comments_page()
add_theme_page()
add_plugins_page()
add_users_page()
add_management_page()
add_options_page()