SlideShare a Scribd company logo
1 of 35
Download to read offline
Intro to WordPress
Plugin Development




               Brad Williams
                  @williamsba
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
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
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: WordPress NYC Meetup
Plugin URI: http://webdevstudios.com/support/wordpress-plugins/
Description: Plugin for the WordPress NYC Meetup
Version: 1.0
Author: Brad Williams
Author URI: http://webdevstudios.com
License: GPLv2
*/
?>




Plugin is now available to be
activated in WordPress!
Sanity Practices
Prefix Everything!
update_option() //BAD FUNCTION NAME 

bw_nycmeetup_update_option() //GOOD FUNCTION NAME! 

$settings //BAD VARIABLE NAME 

$bw_nycmeetup_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 can
        • /js                              make it much easier to track the
        • /css                             flow of your plugin over time.
        • /includes
        • /images
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
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



                                                      Plugin is now available to be
                                                      activated in WordPress!
Important Techniques
Plugin Activation Function
<?php
register_activation_hook( __FILE__, 'bw_nycmeetup_install' );

function bw_nycmeetup_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
Important Techniques
Plugin Deactivation Function
<?php
register_deactivation_hook( __FILE__, 'bw_nycmeetup_deactivate' );

function bw_nycmeetup_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
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_nycmeetup_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/
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/
Hooks
 Action Hooks
Enables you to execute a function at specific points in the WordPress loading process

<?php
add_action( 'user_register', 'bw_nycmeetup_welcome_email' );

function bw_nycmeetup_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
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
Hooks
Filter Hooks
     Enables you to manipulate the output of code and content in WordPress

<?php
add_filter( 'the_content', 'bw_nycmeetup_filter_content' );

function bw_nycmeetup_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
Hooks
Filter Hooks
<?php
add_filter ( 'the_content', 'insertFootNote' );

function 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;
}
?>




                  http://codex.wordpress.org/Plugin_API/Filter_Reference
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
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
Example Plugin Foundation
<?php
/*
Plugin Name: WordPress NYC Meetup
Plugin URI: http://webdevstudios.com/support/wordpress-plugins/
Description: Plugin for the WordPress NYC Meetup
Version: 1.0
Author: Brad Williams
Author URI: http://webdevstudios.com
License: GPLv2
*/

// DEFINE CONSTANTS
define( 'BWNYCMEETUP_VERSION', '1.0' );
define( 'BWNYCMEETUP_TEXTDOMAIN', 'bwnycmeetup_plugin' );
define( 'BWNYCMEETUP_BASENAME', plugin_basename(__FILE__) );
define( 'BWNYCMEETUP_DIR', plugin_dir_path( __FILE__ ) );
define( 'BWNYCMEETUP_URL', plugins_url( 'my-new-plugin/' ) );

require_once( BWNYCMEETUP_DIR . 'includes/core.php' );
?>
Shortcode Example
Example
<?php
// Register a new shortcode: [book]
add_shortcode( 'book', 'bw_nycmeetup_book' );

// The callback function that will replace [book]
function bw_nycmeetup_book() {
            return '<a href="http://amzn.to/plugindevbook">Professional WordPress Plugin
Development</a>';
}
?>
Menu Example
       Example Custom Menu
<?php
add_action( 'admin_menu', 'bw_nycmeetup_create_menu' );

function bw_nycmeetup_create_menu() {

     //create custom top-level menu
     add_menu_page( 'NYC Meetup Settings Page', 'NYC Meetup',
            'manage_options', 'nyc-meetup-plugin', 'bw_nycmeetup_settings_page' );

     //create submenu items
     add_submenu_page( 'nyc-meetup-plugin', 'About My Plugin', 'About',
            'manage_options', 'nyc-meetup-plugin_about', 'bw_nycmeetup_about_page' );
     add_submenu_page( 'nyc-meetup-plugin', 'Help with My Plugin', 'Help',
            'manage_options', 'nyc-meetup-plugin_help', 'bw_nycmeetup_help_page' );
     add_submenu_page( 'nyc-meetup-plugin', 'Uinstall My Plugin', 'Uninstall',
            'manage_options', 'nyc-meetup-plugin_uninstall', 'bw_nycmeetup_uninstall_page' );

}
?>
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
Add Submenu to Custom Post Type
<?php
add_action( 'admin_menu', 'bw_nycmeetup_create_menu' );

function bw_nycmeetup_create_menu() {

          //create submenu items
          add_submenu_page( 'edit.php?post_type=movies', 'About My Plugin', 'About',
                      'manage_options', 'nyc-meetup-plugin_about', 'bw_nycmeetup_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
Menu Example
Add Submenu to Existing Menu
<?php
add_action( 'admin_menu', 'bw_nycmeetup_create_menu' );

function bw_nycmeetup_create_menu() {

            //create Settings submenu page
    add_options_page('NYC Meetup Settings Page', 'NYC Meetup',
            'manage_options', 'nyc-meetup-plugin', 'bw_nycmeetup_settings_page' );

}

function bw_nycmeetup_settings_page() {
   //settings page
}
?>
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()
Basic Settings Page Example
     Register your settings
add_action('admin_init', 'bw_nycmeetup_register_settings');

// WordPress Settings API
function bw_nycmeetup_register_settings(){
     register_setting( 'bw_nycmeetup_settings_group', 'bw_nycmeetup_settings',
'bw_nycmeetup_settings_validate' );
}


 register_setting()

 Parameters:
  $option_group – A unique settings group name
  $option_name – A unique option name for the group
  $sanitize_callback – Callback function to sanitize the option's
 values
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
Basic Settings Page Example
// Plugin settings page
function bw_nycmeetup_settings_page() { ?>
   <div class="wrap">
      <div class="icon32" id="icon-options-general"><br /></div>
      <h2>My Plugin Settings</h2>
      <form method="post" action="options.php">
         <?php settings_fields( 'bw_nycmeetup_settings_group' ); ?>
         <?php $options = get_option( 'bw_nycmeetup_settings' ); ?>
         <table class="form-table">
            <tr valign="top"><th scope="row">Name:</th>
               <td><input name="bw_nycmeetup_settings[name]" type="text" value="<?php echo esc_attr( $options['name'] ); ?>"
/></td>
            </tr>
            <tr valign="top"><th scope="row">Favorite Color:</th>
               <td>
                  <select name="bw_nycmeetup_settings[color]">
                     <option value="orange" <?php selected( $options['color'], 'orange' ); ?>>Orange</option>
                     <option value="black" <?php selected( $options['color'], 'black' ); ?>>Black</option>
                  </select>
               </td>
            </tr>
            <tr valign="top"><th scope="row">Enable Rage Mode?</th>
               <td><input type="checkbox" name="bw_nycmeetup_settings[rage]" <?php if ( isset( $options['rage'] ) )
checked( $options['rage'], 'on' ); ?>/>
               </td>
            </tr>
         </table>
         <p class="submit">
         <input type="submit" class="button-primary" value="Save Settings" />
         </p>
      </form>
   </div>
<?php }
Basic Settings Page Example
      Register your settings
// Validation
function bw_nycmeetup_settings_validate($input) {

    $input['name'] = strip_tags( $input['name'] );
    $input['color'] = strip_tags( $input['color'] );
    $input['rage'] = ( isset( $input['rage'] ) ) ? strip_tags( $input['rage'] ) : null;

    return $input;
}
Basic Settings Page Example
   Now you have a settings page!
Plugin Developer Resources
   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
Contact

Brad Williams
brad@webdevstudios.com

Blog: strangework.com
Twitter: @williamsba
IRC: WDS-Brad

       http://www.slideshare.net/williamsba

More Related Content

What's hot

Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web ComponentsFu Cheng
 
Difference BW Frontend and Backend Development
Difference BW Frontend and Backend DevelopmentDifference BW Frontend and Backend Development
Difference BW Frontend and Backend DevelopmentFunctionUp
 
Basics of Web Development.pptx
Basics of Web Development.pptxBasics of Web Development.pptx
Basics of Web Development.pptxPalash Sukla Das
 
Introduction to React Native
Introduction to React NativeIntroduction to React Native
Introduction to React NativeSambhu Lakshmanan
 
フラットなPHPからフレームワークへ
フラットなPHPからフレームワークへフラットなPHPからフレームワークへ
フラットなPHPからフレームワークへMasao Maeda
 
Introduction to SASS
Introduction to SASSIntroduction to SASS
Introduction to SASSJon Dean
 
VueJS Introduction
VueJS IntroductionVueJS Introduction
VueJS IntroductionDavid Ličen
 
Introduction to laravel framework
Introduction to laravel frameworkIntroduction to laravel framework
Introduction to laravel frameworkAhmad Fatoni
 
Java Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Java Spring framework, Dependency Injection, DI, IoC, Inversion of ControlJava Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Java Spring framework, Dependency Injection, DI, IoC, Inversion of ControlArjun Thakur
 
React Architecture & Best Practices.pptx
React Architecture & Best Practices.pptxReact Architecture & Best Practices.pptx
React Architecture & Best Practices.pptxAleksandarKondov
 
ASP.NET Core MVC + Web API with Overview
ASP.NET Core MVC + Web API with OverviewASP.NET Core MVC + Web API with Overview
ASP.NET Core MVC + Web API with OverviewShahed Chowdhuri
 
Basic Wordpress PPT
Basic Wordpress PPT Basic Wordpress PPT
Basic Wordpress PPT mayur akabari
 
Introduction to Wordpress Hooks
Introduction to Wordpress HooksIntroduction to Wordpress Hooks
Introduction to Wordpress HooksAnthony Hartnell
 

What's hot (20)

Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web Components
 
Vue JS Intro
Vue JS IntroVue JS Intro
Vue JS Intro
 
Blazor
BlazorBlazor
Blazor
 
Wordpress
WordpressWordpress
Wordpress
 
Ionic in 30
Ionic in 30Ionic in 30
Ionic in 30
 
Difference BW Frontend and Backend Development
Difference BW Frontend and Backend DevelopmentDifference BW Frontend and Backend Development
Difference BW Frontend and Backend Development
 
Basics of Web Development.pptx
Basics of Web Development.pptxBasics of Web Development.pptx
Basics of Web Development.pptx
 
Introduction to React Native
Introduction to React NativeIntroduction to React Native
Introduction to React Native
 
laravel.pptx
laravel.pptxlaravel.pptx
laravel.pptx
 
フラットなPHPからフレームワークへ
フラットなPHPからフレームワークへフラットなPHPからフレームワークへ
フラットなPHPからフレームワークへ
 
Introduction to SASS
Introduction to SASSIntroduction to SASS
Introduction to SASS
 
VueJS Introduction
VueJS IntroductionVueJS Introduction
VueJS Introduction
 
Introduction to laravel framework
Introduction to laravel frameworkIntroduction to laravel framework
Introduction to laravel framework
 
Php technical presentation
Php technical presentationPhp technical presentation
Php technical presentation
 
Java Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Java Spring framework, Dependency Injection, DI, IoC, Inversion of ControlJava Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Java Spring framework, Dependency Injection, DI, IoC, Inversion of Control
 
React Architecture & Best Practices.pptx
React Architecture & Best Practices.pptxReact Architecture & Best Practices.pptx
React Architecture & Best Practices.pptx
 
Curso gratuito de Docker
Curso gratuito de DockerCurso gratuito de Docker
Curso gratuito de Docker
 
ASP.NET Core MVC + Web API with Overview
ASP.NET Core MVC + Web API with OverviewASP.NET Core MVC + Web API with Overview
ASP.NET Core MVC + Web API with Overview
 
Basic Wordpress PPT
Basic Wordpress PPT Basic Wordpress PPT
Basic Wordpress PPT
 
Introduction to Wordpress Hooks
Introduction to Wordpress HooksIntroduction to Wordpress Hooks
Introduction to Wordpress Hooks
 

Similar to Intro to WordPress Plugin Development

Creating Your First WordPress Plugin
Creating Your First WordPress PluginCreating Your First WordPress Plugin
Creating Your First WordPress PluginBrad Williams
 
Getting started with WordPress development
Getting started with WordPress developmentGetting started with WordPress development
Getting started with WordPress developmentSteve Mortiboy
 
Write your first WordPress plugin
Write your first WordPress pluginWrite your first WordPress plugin
Write your first WordPress pluginAnthony Montalbano
 
WordPress Plugin development
WordPress Plugin developmentWordPress Plugin development
WordPress Plugin developmentMostafa Soufi
 
Beginning WordPress Plugin Development
Beginning WordPress Plugin DevelopmentBeginning WordPress Plugin Development
Beginning WordPress Plugin DevelopmentAizat Faiz
 
Step by step guide for creating wordpress plugin
Step by step guide for creating wordpress pluginStep by step guide for creating wordpress plugin
Step by step guide for creating wordpress pluginMainak Goswami
 
Plug in development
Plug in developmentPlug in development
Plug in developmentLucky Ali
 
Plugin Development Practices
Plugin Development PracticesPlugin Development Practices
Plugin Development Practicesdanpastori
 
Hooking with WordPress
Hooking with WordPressHooking with WordPress
Hooking with WordPressEdward Caissie
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkBo-Yi Wu
 
WordPress Plugins
WordPress PluginsWordPress Plugins
WordPress Pluginsrandyhoyt
 
Plugin development demystified 2017
Plugin development demystified 2017Plugin development demystified 2017
Plugin development demystified 2017ylefebvre
 
Word press Plugins by WordPress Experts
Word press Plugins by WordPress ExpertsWord press Plugins by WordPress Experts
Word press Plugins by WordPress ExpertsYameen Khan
 
Developers, Be a Bada$$ with WP-CLI
Developers, Be a Bada$$ with WP-CLIDevelopers, Be a Bada$$ with WP-CLI
Developers, Be a Bada$$ with WP-CLIWP Engine
 
How To Write a WordPress Plugin
How To Write a WordPress PluginHow To Write a WordPress Plugin
How To Write a WordPress PluginAndy Stratton
 
Intro to Plugin Development, Miami WordCamp, 2015
Intro to Plugin Development, Miami WordCamp, 2015Intro to Plugin Development, Miami WordCamp, 2015
Intro to Plugin Development, Miami WordCamp, 2015topher1kenobe
 
WordPress Structure and Best Practices
WordPress Structure and Best PracticesWordPress Structure and Best Practices
WordPress Structure and Best Practicesmarkparolisi
 

Similar to Intro to WordPress Plugin Development (20)

Creating Your First WordPress Plugin
Creating Your First WordPress PluginCreating Your First WordPress Plugin
Creating Your First WordPress Plugin
 
Getting started with WordPress development
Getting started with WordPress developmentGetting started with WordPress development
Getting started with WordPress development
 
Write your first WordPress plugin
Write your first WordPress pluginWrite your first WordPress plugin
Write your first WordPress plugin
 
WordPress Plugin development
WordPress Plugin developmentWordPress Plugin development
WordPress Plugin development
 
Beginning WordPress Plugin Development
Beginning WordPress Plugin DevelopmentBeginning WordPress Plugin Development
Beginning WordPress Plugin Development
 
Step by step guide for creating wordpress plugin
Step by step guide for creating wordpress pluginStep by step guide for creating wordpress plugin
Step by step guide for creating wordpress plugin
 
Extending WordPress
Extending WordPressExtending WordPress
Extending WordPress
 
Plug in development
Plug in developmentPlug in development
Plug in development
 
Plugin Development Practices
Plugin Development PracticesPlugin Development Practices
Plugin Development Practices
 
Hooking with WordPress
Hooking with WordPressHooking with WordPress
Hooking with WordPress
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC Framework
 
WordPress Plugins
WordPress PluginsWordPress Plugins
WordPress Plugins
 
Plugin development demystified 2017
Plugin development demystified 2017Plugin development demystified 2017
Plugin development demystified 2017
 
Word press Plugins by WordPress Experts
Word press Plugins by WordPress ExpertsWord press Plugins by WordPress Experts
Word press Plugins by WordPress Experts
 
WordPress Security
WordPress SecurityWordPress Security
WordPress Security
 
Developers, Be a Bada$$ with WP-CLI
Developers, Be a Bada$$ with WP-CLIDevelopers, Be a Bada$$ with WP-CLI
Developers, Be a Bada$$ with WP-CLI
 
How To Write a WordPress Plugin
How To Write a WordPress PluginHow To Write a WordPress Plugin
How To Write a WordPress Plugin
 
WordPress Plugins
WordPress PluginsWordPress Plugins
WordPress Plugins
 
Intro to Plugin Development, Miami WordCamp, 2015
Intro to Plugin Development, Miami WordCamp, 2015Intro to Plugin Development, Miami WordCamp, 2015
Intro to Plugin Development, Miami WordCamp, 2015
 
WordPress Structure and Best Practices
WordPress Structure and Best PracticesWordPress Structure and Best Practices
WordPress Structure and Best Practices
 

More from Brad Williams

From Freelance to Agency: Hiring Employee Number One - WordCamp London 2015
From Freelance to Agency: Hiring Employee Number One - WordCamp London 2015From Freelance to Agency: Hiring Employee Number One - WordCamp London 2015
From Freelance to Agency: Hiring Employee Number One - WordCamp London 2015Brad Williams
 
Hiring Employee Number One: From Freelancer to Agency
Hiring Employee Number One: From Freelancer to AgencyHiring Employee Number One: From Freelancer to Agency
Hiring Employee Number One: From Freelancer to AgencyBrad Williams
 
Writing Secure WordPress Code WordCamp NYC 2014
Writing Secure WordPress Code WordCamp NYC 2014Writing Secure WordPress Code WordCamp NYC 2014
Writing Secure WordPress Code WordCamp NYC 2014Brad Williams
 
How to Make a Native Mobile App with WordPress
How to Make a Native Mobile App with WordPressHow to Make a Native Mobile App with WordPress
How to Make a Native Mobile App with WordPressBrad Williams
 
Writing Secure WordPress Code
Writing Secure WordPress CodeWriting Secure WordPress Code
Writing Secure WordPress CodeBrad Williams
 
WordPress Security WordCamp OC 2013
WordPress Security WordCamp OC 2013WordPress Security WordCamp OC 2013
WordPress Security WordCamp OC 2013Brad Williams
 
Using WordPress as an Application Framework
Using WordPress as an Application FrameworkUsing WordPress as an Application Framework
Using WordPress as an Application FrameworkBrad Williams
 
Top Ten WordPress Security Tips for 2012
Top Ten WordPress Security Tips for 2012Top Ten WordPress Security Tips for 2012
Top Ten WordPress Security Tips for 2012Brad Williams
 
WordPress Security from WordCamp NYC 2012
WordPress Security from WordCamp NYC 2012WordPress Security from WordCamp NYC 2012
WordPress Security from WordCamp NYC 2012Brad Williams
 
WordPress for Beginners
WordPress for BeginnersWordPress for Beginners
WordPress for BeginnersBrad Williams
 
Surviving the Zombie Apocalypse using Custom Post Types and Taxonomies
Surviving the Zombie Apocalypse using Custom Post Types and TaxonomiesSurviving the Zombie Apocalypse using Custom Post Types and Taxonomies
Surviving the Zombie Apocalypse using Custom Post Types and TaxonomiesBrad Williams
 
Spooky WordPress: Disturbingly Brilliant Uses of WP
Spooky WordPress: Disturbingly Brilliant Uses of WPSpooky WordPress: Disturbingly Brilliant Uses of WP
Spooky WordPress: Disturbingly Brilliant Uses of WPBrad Williams
 
WordCamp Mid-Atlantic WordPress Security
WordCamp Mid-Atlantic WordPress SecurityWordCamp Mid-Atlantic WordPress Security
WordCamp Mid-Atlantic WordPress SecurityBrad Williams
 
Now That's What I Call WordPress Security 2010
Now That's What I Call WordPress Security 2010Now That's What I Call WordPress Security 2010
Now That's What I Call WordPress Security 2010Brad Williams
 
Custom Post Types and Taxonomies in WordPress
Custom Post Types and Taxonomies in WordPressCustom Post Types and Taxonomies in WordPress
Custom Post Types and Taxonomies in WordPressBrad Williams
 
Top 20 WordPress Plugins You've Never Heard Of
Top 20 WordPress Plugins You've Never Heard OfTop 20 WordPress Plugins You've Never Heard Of
Top 20 WordPress Plugins You've Never Heard OfBrad Williams
 
WordPress Security - WordCamp Boston 2010
WordPress Security - WordCamp Boston 2010WordPress Security - WordCamp Boston 2010
WordPress Security - WordCamp Boston 2010Brad Williams
 
WordPress Security - WordCamp NYC 2009
WordPress Security - WordCamp NYC 2009WordPress Security - WordCamp NYC 2009
WordPress Security - WordCamp NYC 2009Brad Williams
 
Website Design Dos and Don’ts for a Successful Online Presence
Website Design Dos and Don’ts  for a Successful Online PresenceWebsite Design Dos and Don’ts  for a Successful Online Presence
Website Design Dos and Don’ts for a Successful Online PresenceBrad Williams
 

More from Brad Williams (20)

From Freelance to Agency: Hiring Employee Number One - WordCamp London 2015
From Freelance to Agency: Hiring Employee Number One - WordCamp London 2015From Freelance to Agency: Hiring Employee Number One - WordCamp London 2015
From Freelance to Agency: Hiring Employee Number One - WordCamp London 2015
 
Hiring Employee Number One: From Freelancer to Agency
Hiring Employee Number One: From Freelancer to AgencyHiring Employee Number One: From Freelancer to Agency
Hiring Employee Number One: From Freelancer to Agency
 
Writing Secure WordPress Code WordCamp NYC 2014
Writing Secure WordPress Code WordCamp NYC 2014Writing Secure WordPress Code WordCamp NYC 2014
Writing Secure WordPress Code WordCamp NYC 2014
 
How to Make a Native Mobile App with WordPress
How to Make a Native Mobile App with WordPressHow to Make a Native Mobile App with WordPress
How to Make a Native Mobile App with WordPress
 
Writing Secure WordPress Code
Writing Secure WordPress CodeWriting Secure WordPress Code
Writing Secure WordPress Code
 
WordPress Security WordCamp OC 2013
WordPress Security WordCamp OC 2013WordPress Security WordCamp OC 2013
WordPress Security WordCamp OC 2013
 
Using WordPress as an Application Framework
Using WordPress as an Application FrameworkUsing WordPress as an Application Framework
Using WordPress as an Application Framework
 
Top Ten WordPress Security Tips for 2012
Top Ten WordPress Security Tips for 2012Top Ten WordPress Security Tips for 2012
Top Ten WordPress Security Tips for 2012
 
WordPress Security from WordCamp NYC 2012
WordPress Security from WordCamp NYC 2012WordPress Security from WordCamp NYC 2012
WordPress Security from WordCamp NYC 2012
 
WordPress Multisite
WordPress MultisiteWordPress Multisite
WordPress Multisite
 
WordPress for Beginners
WordPress for BeginnersWordPress for Beginners
WordPress for Beginners
 
Surviving the Zombie Apocalypse using Custom Post Types and Taxonomies
Surviving the Zombie Apocalypse using Custom Post Types and TaxonomiesSurviving the Zombie Apocalypse using Custom Post Types and Taxonomies
Surviving the Zombie Apocalypse using Custom Post Types and Taxonomies
 
Spooky WordPress: Disturbingly Brilliant Uses of WP
Spooky WordPress: Disturbingly Brilliant Uses of WPSpooky WordPress: Disturbingly Brilliant Uses of WP
Spooky WordPress: Disturbingly Brilliant Uses of WP
 
WordCamp Mid-Atlantic WordPress Security
WordCamp Mid-Atlantic WordPress SecurityWordCamp Mid-Atlantic WordPress Security
WordCamp Mid-Atlantic WordPress Security
 
Now That's What I Call WordPress Security 2010
Now That's What I Call WordPress Security 2010Now That's What I Call WordPress Security 2010
Now That's What I Call WordPress Security 2010
 
Custom Post Types and Taxonomies in WordPress
Custom Post Types and Taxonomies in WordPressCustom Post Types and Taxonomies in WordPress
Custom Post Types and Taxonomies in WordPress
 
Top 20 WordPress Plugins You've Never Heard Of
Top 20 WordPress Plugins You've Never Heard OfTop 20 WordPress Plugins You've Never Heard Of
Top 20 WordPress Plugins You've Never Heard Of
 
WordPress Security - WordCamp Boston 2010
WordPress Security - WordCamp Boston 2010WordPress Security - WordCamp Boston 2010
WordPress Security - WordCamp Boston 2010
 
WordPress Security - WordCamp NYC 2009
WordPress Security - WordCamp NYC 2009WordPress Security - WordCamp NYC 2009
WordPress Security - WordCamp NYC 2009
 
Website Design Dos and Don’ts for a Successful Online Presence
Website Design Dos and Don’ts  for a Successful Online PresenceWebsite Design Dos and Don’ts  for a Successful Online Presence
Website Design Dos and Don’ts for a Successful Online Presence
 

Recently uploaded

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 

Recently uploaded (20)

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 

Intro to WordPress Plugin Development

  • 1. Intro to WordPress Plugin Development Brad Williams @williamsba
  • 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: WordPress NYC Meetup Plugin URI: http://webdevstudios.com/support/wordpress-plugins/ Description: Plugin for the WordPress NYC Meetup Version: 1.0 Author: Brad Williams Author URI: http://webdevstudios.com License: GPLv2 */ ?> Plugin is now available to be activated in WordPress!
  • 8. Sanity Practices Prefix Everything! update_option() //BAD FUNCTION NAME  bw_nycmeetup_update_option() //GOOD FUNCTION NAME!  $settings //BAD VARIABLE NAME  $bw_nycmeetup_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 can • /js make it much easier to track the • /css flow of your plugin over time. • /includes • /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 Plugin is now available to be activated in WordPress!
  • 11. Important Techniques Plugin Activation Function <?php register_activation_hook( __FILE__, 'bw_nycmeetup_install' ); function bw_nycmeetup_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_nycmeetup_deactivate' ); function bw_nycmeetup_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_nycmeetup_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_nycmeetup_welcome_email' ); function bw_nycmeetup_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_nycmeetup_filter_content' ); function bw_nycmeetup_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
  • 18. Hooks Filter Hooks <?php add_filter ( 'the_content', 'insertFootNote' ); function 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; } ?> 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
  • 20. Hooks Number of Hooks in WordPress by Version http://adambrown.info/p/wp_hooks
  • 21. Plugin Foundation It’s important to start with a solid foundation
  • 22. Plugin Foundation Example Plugin Foundation <?php /* Plugin Name: WordPress NYC Meetup Plugin URI: http://webdevstudios.com/support/wordpress-plugins/ Description: Plugin for the WordPress NYC Meetup Version: 1.0 Author: Brad Williams Author URI: http://webdevstudios.com License: GPLv2 */ // DEFINE CONSTANTS define( 'BWNYCMEETUP_VERSION', '1.0' ); define( 'BWNYCMEETUP_TEXTDOMAIN', 'bwnycmeetup_plugin' ); define( 'BWNYCMEETUP_BASENAME', plugin_basename(__FILE__) ); define( 'BWNYCMEETUP_DIR', plugin_dir_path( __FILE__ ) ); define( 'BWNYCMEETUP_URL', plugins_url( 'my-new-plugin/' ) ); require_once( BWNYCMEETUP_DIR . 'includes/core.php' ); ?>
  • 23. Shortcode Example Example <?php // Register a new shortcode: [book] add_shortcode( 'book', 'bw_nycmeetup_book' ); // The callback function that will replace [book] function bw_nycmeetup_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_nycmeetup_create_menu' ); function bw_nycmeetup_create_menu() { //create custom top-level menu add_menu_page( 'NYC Meetup Settings Page', 'NYC Meetup', 'manage_options', 'nyc-meetup-plugin', 'bw_nycmeetup_settings_page' ); //create submenu items add_submenu_page( 'nyc-meetup-plugin', 'About My Plugin', 'About', 'manage_options', 'nyc-meetup-plugin_about', 'bw_nycmeetup_about_page' ); add_submenu_page( 'nyc-meetup-plugin', 'Help with My Plugin', 'Help', 'manage_options', 'nyc-meetup-plugin_help', 'bw_nycmeetup_help_page' ); add_submenu_page( 'nyc-meetup-plugin', 'Uinstall My Plugin', 'Uninstall', 'manage_options', 'nyc-meetup-plugin_uninstall', 'bw_nycmeetup_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_nycmeetup_create_menu' ); function bw_nycmeetup_create_menu() { //create submenu items add_submenu_page( 'edit.php?post_type=movies', 'About My Plugin', 'About', 'manage_options', 'nyc-meetup-plugin_about', 'bw_nycmeetup_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_nycmeetup_create_menu' ); function bw_nycmeetup_create_menu() { //create Settings submenu page add_options_page('NYC Meetup Settings Page', 'NYC Meetup', 'manage_options', 'nyc-meetup-plugin', 'bw_nycmeetup_settings_page' ); } function bw_nycmeetup_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()
  • 29. Basic Settings Page Example Register your settings add_action('admin_init', 'bw_nycmeetup_register_settings'); // WordPress Settings API function bw_nycmeetup_register_settings(){ register_setting( 'bw_nycmeetup_settings_group', 'bw_nycmeetup_settings', 'bw_nycmeetup_settings_validate' ); } register_setting() Parameters: $option_group – A unique settings group name $option_name – A unique option name for the group $sanitize_callback – Callback function to sanitize the option's values
  • 30. 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
  • 31. Basic Settings Page Example // Plugin settings page function bw_nycmeetup_settings_page() { ?> <div class="wrap"> <div class="icon32" id="icon-options-general"><br /></div> <h2>My Plugin Settings</h2> <form method="post" action="options.php"> <?php settings_fields( 'bw_nycmeetup_settings_group' ); ?> <?php $options = get_option( 'bw_nycmeetup_settings' ); ?> <table class="form-table"> <tr valign="top"><th scope="row">Name:</th> <td><input name="bw_nycmeetup_settings[name]" type="text" value="<?php echo esc_attr( $options['name'] ); ?>" /></td> </tr> <tr valign="top"><th scope="row">Favorite Color:</th> <td> <select name="bw_nycmeetup_settings[color]"> <option value="orange" <?php selected( $options['color'], 'orange' ); ?>>Orange</option> <option value="black" <?php selected( $options['color'], 'black' ); ?>>Black</option> </select> </td> </tr> <tr valign="top"><th scope="row">Enable Rage Mode?</th> <td><input type="checkbox" name="bw_nycmeetup_settings[rage]" <?php if ( isset( $options['rage'] ) ) checked( $options['rage'], 'on' ); ?>/> </td> </tr> </table> <p class="submit"> <input type="submit" class="button-primary" value="Save Settings" /> </p> </form> </div> <?php }
  • 32. Basic Settings Page Example Register your settings // Validation function bw_nycmeetup_settings_validate($input) { $input['name'] = strip_tags( $input['name'] ); $input['color'] = strip_tags( $input['color'] ); $input['rage'] = ( isset( $input['rage'] ) ) ? strip_tags( $input['rage'] ) : null; return $input; }
  • 33. Basic Settings Page Example Now you have a settings page!
  • 34. Plugin Developer Resources  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
  • 35. Contact Brad Williams brad@webdevstudios.com Blog: strangework.com Twitter: @williamsba IRC: WDS-Brad http://www.slideshare.net/williamsba