creating your first wordpress plugin

30
Creating Your First WordPress Plugin Brad Williams @williamsba

Upload: brad-williams

Post on 08-May-2015

6.861 views

Category:

Technology


1 download

DESCRIPTION

My presentation at WordCamp Philly 2011 called Creating Your First WordPress Plugin

TRANSCRIPT

Creating Your First

WordPress Plugin

Brad Williams @williamsba

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.

What is a Plugin?

http://wordpress.org/extend/plugins/

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

Hooks

Number of Hooks in WordPress by Version

http://adambrown.info/p/wp_hooks

Plugin Foundation

It‟s important to start with a solid foundation

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