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

Vue.js Getting Started
Vue.js Getting StartedVue.js Getting Started
Vue.js Getting StartedMurat Doğan
 
[열린기술공방] Container기반의 DevOps - 클라우드 네이티브
[열린기술공방] Container기반의 DevOps - 클라우드 네이티브[열린기술공방] Container기반의 DevOps - 클라우드 네이티브
[열린기술공방] Container기반의 DevOps - 클라우드 네이티브Open Source Consulting
 
The Point of Vue - Intro to Vue.js
The Point of Vue - Intro to Vue.jsThe Point of Vue - Intro to Vue.js
The Point of Vue - Intro to Vue.jsHolly Schinsky
 
Introduction to Nexus Repository Manager.pdf
Introduction to Nexus Repository Manager.pdfIntroduction to Nexus Repository Manager.pdf
Introduction to Nexus Repository Manager.pdfKnoldus Inc.
 
Docker 101 - Getting started
Docker 101 - Getting startedDocker 101 - Getting started
Docker 101 - Getting startedMatheus Marabesi
 
Jfrog artifactory as private docker registry
Jfrog artifactory as private docker registryJfrog artifactory as private docker registry
Jfrog artifactory as private docker registryVipin Mandale
 
Introduzione a Docker (Maggio 2017) [ITA]
Introduzione a Docker (Maggio 2017) [ITA]Introduzione a Docker (Maggio 2017) [ITA]
Introduzione a Docker (Maggio 2017) [ITA]Valerio Radice
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!pyrasis
 
Installing and running Postfix within a docker container from the command line
Installing and running Postfix within a docker container from the command lineInstalling and running Postfix within a docker container from the command line
Installing and running Postfix within a docker container from the command linedotCloud
 
An Introduction to Vuejs
An Introduction to VuejsAn Introduction to Vuejs
An Introduction to VuejsPaddy Lock
 
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...Edureka!
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker IntroductionRobert Reiz
 
Introduction To WordPress
Introduction To WordPressIntroduction To WordPress
Introduction To WordPressCraig Bailey
 
Secondary Screen Support Using DisplayManager
Secondary Screen Support Using DisplayManagerSecondary Screen Support Using DisplayManager
Secondary Screen Support Using DisplayManagerCommonsWare
 

What's hot (20)

An introduction to Vue.js
An introduction to Vue.jsAn introduction to Vue.js
An introduction to Vue.js
 
Vue.js Getting Started
Vue.js Getting StartedVue.js Getting Started
Vue.js Getting Started
 
Why Vue.js?
Why Vue.js?Why Vue.js?
Why Vue.js?
 
[열린기술공방] Container기반의 DevOps - 클라우드 네이티브
[열린기술공방] Container기반의 DevOps - 클라우드 네이티브[열린기술공방] Container기반의 DevOps - 클라우드 네이티브
[열린기술공방] Container기반의 DevOps - 클라우드 네이티브
 
Docker
DockerDocker
Docker
 
The Point of Vue - Intro to Vue.js
The Point of Vue - Intro to Vue.jsThe Point of Vue - Intro to Vue.js
The Point of Vue - Intro to Vue.js
 
Introduction to Nexus Repository Manager.pdf
Introduction to Nexus Repository Manager.pdfIntroduction to Nexus Repository Manager.pdf
Introduction to Nexus Repository Manager.pdf
 
Vue 2 vs Vue 3.pptx
Vue 2 vs Vue 3.pptxVue 2 vs Vue 3.pptx
Vue 2 vs Vue 3.pptx
 
Docker 101 - Getting started
Docker 101 - Getting startedDocker 101 - Getting started
Docker 101 - Getting started
 
Jfrog artifactory as private docker registry
Jfrog artifactory as private docker registryJfrog artifactory as private docker registry
Jfrog artifactory as private docker registry
 
Introduzione a Docker (Maggio 2017) [ITA]
Introduzione a Docker (Maggio 2017) [ITA]Introduzione a Docker (Maggio 2017) [ITA]
Introduzione a Docker (Maggio 2017) [ITA]
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
 
Installing and running Postfix within a docker container from the command line
Installing and running Postfix within a docker container from the command lineInstalling and running Postfix within a docker container from the command line
Installing and running Postfix within a docker container from the command line
 
An Introduction to Vuejs
An Introduction to VuejsAn Introduction to Vuejs
An Introduction to Vuejs
 
SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python
 
Jenkins
JenkinsJenkins
Jenkins
 
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker Introduction
 
Introduction To WordPress
Introduction To WordPressIntroduction To WordPress
Introduction To WordPress
 
Secondary Screen Support Using DisplayManager
Secondary Screen Support Using DisplayManagerSecondary Screen Support Using DisplayManager
Secondary Screen Support Using DisplayManager
 

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

Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data SciencePaolo Missier
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
UiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overviewUiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overviewDianaGray10
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....rightmanforbloodline
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringWSO2
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingWSO2
 
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxRemote DBA Services
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAnitaRaj43
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxMarkSteadman7
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 

Recently uploaded (20)

Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data Science
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
UiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overviewUiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overview
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software Engineering
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation Computing
 
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptx
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 

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