Creating Your First WordPress Plugin
-
Upload
brad-williams -
Category
Technology
-
view
6.861 -
download
1
description
Transcript of Creating Your First WordPress Plugin
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)
Who Am I?
Slides available at: http://www.slideshare.net/williamsba
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
Topics
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.
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…
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!
Sanity Practices
update_option() //BAD FUNCTION NAME
bw_wcphilly_update_option() //GOOD FUNCTION NAME!
$settings //BAD VARIABLE NAME
$bw_wcphilly_settings //GOOD VARIABLE NAME!
Prefix Everything!
Organized Folder Structure
• /unique-plugin-name
• unique-plugin-name.php
• uninstall.php
• /js
• /css
• /includes
• /images
Keeping your files organized
using a clean folder structure
can make it much easier to
track the flow of your plugin over
time.
Determining Paths
<?php
//display local path to my plugin directory
echo plugin_dir_path( __FILE__ );
?>
__FILE__ is a “magical” PHP
constant containing the full
path and filename of the file
Local Paths
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
Determining Paths
<?php
//display the URL to images/icon.png
echo plugins_url( 'images/icon.png', __FILE__ );
?>
URL Paths
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
Important Techniques
<?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.' );
}
}
?>
Plugin Activation Function
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
Important Techniques
<?php
register_deactivation_hook( __FILE__, 'bw_wcphilly_deactivate' );
function bw_wcphilly_deactivate() {
//do stuff
}?>
Plugin Deactivation Function
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
http://codex.wordpress.org/Function_Reference/register_deactivation_hook
REMEMBER: Deactivating is NOT uninstalling. Always
assume your users will reactivate at a later date.
Important Techniques
<?php
if( !defined( 'WP_UNINSTALL_PLUGIN' ) )
exit ();
// Delete option from options table
delete_option( „bw_wcphilly_options' );
?>
Plugin Uninstall
http://jacobsantos.com/2008/general/wordpress-27-plugin-uninstall-methods/
If the WP_UNINSTALL_PLUGIN constant is not
defined we know WordPress did not call this
file. This is a security measure in WordPress
1. Create a uninstall.php file in the root directory of your plugin
2. Add all uninstall code to this file
Uninstall.php is the recommended uninstall method, but
there is another method called register_uninstall_hook()
What is a Hook?
Hooks enable plugin developers to “hook”
into WordPress and change how it works
without modifying the core code
http://jacobsantos.com/2008/general/wordpress-27-plugin-uninstall-methods/
There are two kinds of hooks: Actions and Filters
Hooks
<?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 );
}
?>
Action Hooks
http://codex.wordpress.org/Plugin_API/Action_Reference
Enables you to execute a function at specific points in the WordPress loading process
Hooks
Common Action Hooks
http://codex.wordpress.org/Plugin_API/Action_Reference
• 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
Hooks
<?php
add_filter( 'the_content', 'bw_wcphilly_filter_content' );
function bw_wcphilly_filter_content( $text ) {
$text = str_replace( 'Drupal', 'WordPress', $text );
return $text;
}
?>
Filter Hooks
http://codex.wordpress.org/Plugin_API/Filter_Reference
Enables you to manipulate the output of code and content in WordPress
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
Hooks
<?php
add_filter ( 'the_content', „bw_wcphilly_insertFootNote' );
function bw_wcphilly_insertFootNote( $content ) {
if( !is_feed() && !is_home() ) {
$content .= "<div class='subscribe'>";
$content .= "<h4>Enjoyed this article?</h4>";
$content .= "<p>Subscribe to my <a href='http://feeds2.feedburner.com/strangework'>RSS
feed</a>!</p>";
$content .= "</div>";
}
return $content;
}
?>
Filter Hooks
http://codex.wordpress.org/Plugin_API/Filter_Reference
Hooks
Common Filter Hooks
http://codex.wordpress.org/Plugin_API/Filter_Reference
• 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
Plugin Foundation
<?php
/*
Plugin Name: WordCamp Philly
Plugin URI: http://webdevstudios.com/support/wordpress-plugins/
Description: Plugin for WordCamp Philly
Version: 1.0
Author: Brad Williams
Author URI: http://webdevstudios.com
License: GPLv2
*/
// DEFINE CONSTANTS
define( „WCPHILLY_VERSION', '1.0' );
define( 'WCPHILLY_TEXTDOMAIN', „wcphilly_plugin' );
define( 'WCPHILLY_BASENAME', plugin_basename(__FILE__) );
define( 'WCPHILLY_DIR', plugin_dir_path( __FILE__ ) );
define( 'WCPHILLY_URL', plugins_url( 'my-new-plugin/' ) );
require_once( WCPHILLY_DIR . 'includes/core.php' );
?>
Example Plugin Foundation
Shortcode 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>';
}
?>
Example
Menu Example
<?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' );
}
?>
Example Custom Menu
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
Menu Example
<?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' );
}
?>
Add Submenu to Custom Post Type
You can easily add a submenu to any Custom
Post Type menu by setting the $parent_slug to
edit.php?post_type=POSTTYPENAME
Menu Example
<?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
}?>
Add Submenu to Existing Menu
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()
Official Resources
› WordPress Core!
› http://wordpress.org/extend/plugins/
› http://codex.wordpress.org/Writing_a_Plugin
› http://codex.wordpress.org/Data_Validation
› http://wordpress.org/support/forum/hacks
› http://lists.automattic.com/mailman/listinfo/wp-hackers
› http://codex.wordpress.org/IRC ( #wordpress channel )
› http://wpdevel.wordpress.com/
› http://wordpress.org/extend/ideas/
Developer Websites
› http://wpengineer.com
› http://phpxref.ftwr.co.uk/wordpress/
› http://adambrown.info/p/wp_hooks
Plugin Developer Resources
Brad Williams [email protected]
Blog: strangework.com
Twitter: @williamsba
IRC: WDS-Brad
http://www.slideshare.net/williamsba
Contact