SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

introduction to Vue.js 3
introduction to Vue.js 3 introduction to Vue.js 3
introduction to Vue.js 3 ArezooKmn
 
ASP.NET Web API and HTTP Fundamentals
ASP.NET Web API and HTTP FundamentalsASP.NET Web API and HTTP Fundamentals
ASP.NET Web API and HTTP FundamentalsIdo Flatow
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring DataAnton Sulzhenko
 
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...Edureka!
 
Nest.js Introduction
Nest.js IntroductionNest.js Introduction
Nest.js IntroductionTakuya Tejima
 
OAuth2 and Spring Security
OAuth2 and Spring SecurityOAuth2 and Spring Security
OAuth2 and Spring SecurityOrest Ivasiv
 
An introduction to Vue.js
An introduction to Vue.jsAn introduction to Vue.js
An introduction to Vue.jsJavier Lafora Rey
 
A la dĂŠcouverte de vue.js
A la dĂŠcouverte de vue.jsA la dĂŠcouverte de vue.js
A la dĂŠcouverte de vue.jsBruno Bonnin
 
Intro to vue.js
Intro to vue.jsIntro to vue.js
Intro to vue.jsTechMagic
 
Node.js Express
Node.js  ExpressNode.js  Express
Node.js ExpressEyal Vardi
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOPDzmitry Naskou
 
Stateless authentication with OAuth 2 and JWT - JavaZone 2015
Stateless authentication with OAuth 2 and JWT - JavaZone 2015Stateless authentication with OAuth 2 and JWT - JavaZone 2015
Stateless authentication with OAuth 2 and JWT - JavaZone 2015Alvaro Sanchez-Mariscal
 
Nginx Essential
Nginx EssentialNginx Essential
Nginx EssentialGong Haibing
 
Systemes authentification
Systemes authentificationSystemes authentification
Systemes authentificationLhouceine OUHAMZA
 

Was ist angesagt? (20)

introduction to Vue.js 3
introduction to Vue.js 3 introduction to Vue.js 3
introduction to Vue.js 3
 
ASP.NET Web API and HTTP Fundamentals
ASP.NET Web API and HTTP FundamentalsASP.NET Web API and HTTP Fundamentals
ASP.NET Web API and HTTP Fundamentals
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring Data
 
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
 
What is Docker?
What is Docker?What is Docker?
What is Docker?
 
Angular
AngularAngular
Angular
 
Nest.js Introduction
Nest.js IntroductionNest.js Introduction
Nest.js Introduction
 
OAuth2 and Spring Security
OAuth2 and Spring SecurityOAuth2 and Spring Security
OAuth2 and Spring Security
 
An introduction to Vue.js
An introduction to Vue.jsAn introduction to Vue.js
An introduction to Vue.js
 
A la dĂŠcouverte de vue.js
A la dĂŠcouverte de vue.jsA la dĂŠcouverte de vue.js
A la dĂŠcouverte de vue.js
 
Intro to vue.js
Intro to vue.jsIntro to vue.js
Intro to vue.js
 
Node.js Express
Node.js  ExpressNode.js  Express
Node.js Express
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 
Stateless authentication with OAuth 2 and JWT - JavaZone 2015
Stateless authentication with OAuth 2 and JWT - JavaZone 2015Stateless authentication with OAuth 2 and JWT - JavaZone 2015
Stateless authentication with OAuth 2 and JWT - JavaZone 2015
 
Node js
Node jsNode js
Node js
 
Nginx Essential
Nginx EssentialNginx Essential
Nginx Essential
 
AngularJS
AngularJS AngularJS
AngularJS
 
Vuex
VuexVuex
Vuex
 
Spring Security 5
Spring Security 5Spring Security 5
Spring Security 5
 
Systemes authentification
Systemes authentificationSystemes authentification
Systemes authentification
 

Ähnlich wie 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
 
WordPress Security
WordPress SecurityWordPress Security
WordPress SecurityBrad Williams
 
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
 

Ähnlich wie 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
 

Mehr von 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 Multisite
WordPress MultisiteWordPress Multisite
WordPress MultisiteBrad 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
 

Mehr von 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
 

KĂźrzlich hochgeladen

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
"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
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
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
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
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
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Zilliz
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
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
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 

KĂźrzlich hochgeladen (20)

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
"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 ...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
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
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
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
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
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...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 

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