KEMBAR78
Creating Your First WordPress Plugin | PDF
Creating Your First
WordPress Plugin




                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: WordCamp Philly 2011
 Plugin URI: http://webdevstudios.com/support/wordpress-plugins/
 Description: Plugin for WordCamp Philly
 Version: 1.0
 Author: Brad Williams
 Author URI: http://webdevstudios.com
 */
 ?>




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

bw_wcphilly_update_option() //GOOD FUNCTION NAME! 

$settings //BAD VARIABLE NAME 

$bw_wcphilly_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
        • /js                             can make it much easier to
        • /css                            track the flow of your plugin over
        • /includes                       time.
        • /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
Important Techniques
Plugin Activation Function
<?php
register_activation_hook( __FILE__, 'bw_wcphilly_install' );

function bw_wcphilly_install() {
  if ( version_compare( get_bloginfo( 'version' ), „4.0', '<' ) ) {
      deactivate_plugins( plugin_basename( __FILE__ ) ); // Deactivate our plugin
      wp_die( 'This plugin requires WordPress version 4.0 or higher.' );
  }
}
?>



 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_wcphilly_deactivate' );

function bw_wcphilly_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_wcphilly_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_wcphilly_welcome_email' );

function bw_wcphilly_welcome_email( $user_id ) {

  $user_info = get_userdata( $user_id );

  //populate email values
  $email_to = is_email( $user_info->user_email );
  $email_subject = 'Welcome!';
  $email_msg = 'Thank you for registering on my website!';

  //send welcome email
  wp_mail( $email_to, $email_subject, $email_msg );

}
?>



                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_wcphilly_filter_content' );

function bw_wcphilly_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', „bw_wcphilly_insertFootNote' );

function bw_wcphilly_insertFootNote( $content ) {

    if( !is_feed() && !is_home() ) {
           $content .= "<div class='subscribe'>";
           $content .= "<h4>Enjoyed this article?</h4>";
           $content .= "<p>Subscribe to my <a href='http://feeds2.feedburner.com/strangework'>RSS
feed</a>!</p>";
           $content .= "</div>";
    }

     return $content;
}
?>




                 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: WordCamp Philly
Plugin URI: http://webdevstudios.com/support/wordpress-plugins/
Description: Plugin for WordCamp Philly
Version: 1.0
Author: Brad Williams
Author URI: http://webdevstudios.com
License: GPLv2
*/

// DEFINE CONSTANTS
define( „WCPHILLY_VERSION', '1.0' );
define( 'WCPHILLY_TEXTDOMAIN', „wcphilly_plugin' );
define( 'WCPHILLY_BASENAME', plugin_basename(__FILE__) );
define( 'WCPHILLY_DIR', plugin_dir_path( __FILE__ ) );
define( 'WCPHILLY_URL', plugins_url( 'my-new-plugin/' ) );

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

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

function bw_wcphilly_create_menu() {

         //create custom top-level menu
         add_menu_page('WC Philly Settings Page', 'WC Philly',
                    'manage_options', 'wcphilly-plugin', 'bw_wcphilly_settings_page' );

         //create submenu items
         add_submenu_page( 'wcphilly-plugin', 'About My Plugin', 'About',
                    'manage_options', 'wcphilly-plugin_about', 'bw_wcphilly_about_page' );
         add_submenu_page( 'wcphilly-plugin', 'Help with My Plugin', 'Help',
                    'manage_options', 'wcphilly-plugin_help', 'bw_wcphilly_help_page' );
         add_submenu_page( 'wcphilly-plugin', 'Uinstall My Plugin', 'Uninstall',
                    'manage_options', 'nyc-meetup-plugin_uninstall', 'bw_wcphilly_uninstall_page' );

}
?>
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_wcphilly_create_menu' );

function bw_wcphilly_create_menu() {

//create submenu items
add_submenu_page( 'edit.php?post_type=movies', 'About My Plugin', 'About',
            'manage_options', „wcphilly-plugin_about', 'bw_wcphilly_about_page' );

}
?>




                        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_wcphilly_create_menu' );

function bw_wcphilly_create_menu() {

//create Settings submenu page
   add_options_page('WC Philly Settings Page', 'WC Philly', 'manage_options',
'wcphilly-plugin', 'bw_wcphilly_settings_page' );

}

function bw_wcphilly_settings_page() {
  //settings page
}?>
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()
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

Creating Your First WordPress Plugin

  • 1.
    Creating Your First WordPressPlugin Brad Williams @williamsba
  • 2.
    Who Am I? BradWilliams 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 aPlugin? 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 aPlugin? http://wordpress.org/extend/plugins/
  • 6.
    Types and Statusesof 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: WordCamp Philly 2011 Plugin URI: http://webdevstudios.com/support/wordpress-plugins/ Description: Plugin for WordCamp Philly Version: 1.0 Author: Brad Williams Author URI: http://webdevstudios.com */ ?> Plugin is now available to be activated in WordPress!
  • 8.
    Sanity Practices Prefix Everything! update_option()//BAD FUNCTION NAME  bw_wcphilly_update_option() //GOOD FUNCTION NAME!  $settings //BAD VARIABLE NAME  $bw_wcphilly_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 • /js can make it much easier to • /css track the flow of your plugin over • /includes time. • /images
  • 9.
    Determining Paths Local Paths <?php //displaylocal 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 //displaythe 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
  • 11.
    Important Techniques Plugin ActivationFunction <?php register_activation_hook( __FILE__, 'bw_wcphilly_install' ); function bw_wcphilly_install() { if ( version_compare( get_bloginfo( 'version' ), „4.0', '<' ) ) { deactivate_plugins( plugin_basename( __FILE__ ) ); // Deactivate our plugin wp_die( 'This plugin requires WordPress version 4.0 or higher.' ); } } ?> 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 DeactivationFunction <?php register_deactivation_hook( __FILE__, 'bw_wcphilly_deactivate' ); function bw_wcphilly_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_wcphilly_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 aHook? 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 Enablesyou to execute a function at specific points in the WordPress loading process <?php add_action( 'user_register', 'bw_wcphilly_welcome_email' ); function bw_wcphilly_welcome_email( $user_id ) { $user_info = get_userdata( $user_id ); //populate email values $email_to = is_email( $user_info->user_email ); $email_subject = 'Welcome!'; $email_msg = 'Thank you for registering on my website!'; //send welcome email wp_mail( $email_to, $email_subject, $email_msg ); } ?> 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_wcphilly_filter_content' ); function bw_wcphilly_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', „bw_wcphilly_insertFootNote' ); function bw_wcphilly_insertFootNote( $content ) { if( !is_feed() && !is_home() ) { $content .= "<div class='subscribe'>"; $content .= "<h4>Enjoyed this article?</h4>"; $content .= "<p>Subscribe to my <a href='http://feeds2.feedburner.com/strangework'>RSS feed</a>!</p>"; $content .= "</div>"; } return $content; } ?> 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 Hooksin WordPress by Version http://adambrown.info/p/wp_hooks
  • 21.
    Plugin Foundation It‟s importantto start with a solid foundation
  • 22.
    Plugin Foundation Example PluginFoundation <?php /* Plugin Name: WordCamp Philly Plugin URI: http://webdevstudios.com/support/wordpress-plugins/ Description: Plugin for WordCamp Philly Version: 1.0 Author: Brad Williams Author URI: http://webdevstudios.com License: GPLv2 */ // DEFINE CONSTANTS define( „WCPHILLY_VERSION', '1.0' ); define( 'WCPHILLY_TEXTDOMAIN', „wcphilly_plugin' ); define( 'WCPHILLY_BASENAME', plugin_basename(__FILE__) ); define( 'WCPHILLY_DIR', plugin_dir_path( __FILE__ ) ); define( 'WCPHILLY_URL', plugins_url( 'my-new-plugin/' ) ); require_once( WCPHILLY_DIR . 'includes/core.php' ); ?>
  • 23.
    Shortcode Example Example <?php // Registera new shortcode: [book] add_shortcode( 'book', 'bw_wcphilly_book' ); // The callback function that will replace [book] function bw_wcphilly_book() { return '<a href="http://amzn.to/plugindevbook">Professional WordPress Plugin Development</a>'; } ?>
  • 24.
    Menu Example Example Custom Menu <?php add_action( 'admin_menu', 'bw_wcphilly_create_menu' ); function bw_wcphilly_create_menu() { //create custom top-level menu add_menu_page('WC Philly Settings Page', 'WC Philly', 'manage_options', 'wcphilly-plugin', 'bw_wcphilly_settings_page' ); //create submenu items add_submenu_page( 'wcphilly-plugin', 'About My Plugin', 'About', 'manage_options', 'wcphilly-plugin_about', 'bw_wcphilly_about_page' ); add_submenu_page( 'wcphilly-plugin', 'Help with My Plugin', 'Help', 'manage_options', 'wcphilly-plugin_help', 'bw_wcphilly_help_page' ); add_submenu_page( 'wcphilly-plugin', 'Uinstall My Plugin', 'Uninstall', 'manage_options', 'nyc-meetup-plugin_uninstall', 'bw_wcphilly_uninstall_page' ); } ?>
  • 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 Submenuto Custom Post Type <?php add_action( 'admin_menu', 'bw_wcphilly_create_menu' ); function bw_wcphilly_create_menu() { //create submenu items add_submenu_page( 'edit.php?post_type=movies', 'About My Plugin', 'About', 'manage_options', „wcphilly-plugin_about', 'bw_wcphilly_about_page' ); } ?> 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 Submenuto Existing Menu <?php add_action( 'admin_menu', 'bw_wcphilly_create_menu' ); function bw_wcphilly_create_menu() { //create Settings submenu page add_options_page('WC Philly Settings Page', 'WC Philly', 'manage_options', 'wcphilly-plugin', 'bw_wcphilly_settings_page' ); } function bw_wcphilly_settings_page() { //settings page }?>
  • 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.
    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
  • 30.
    Contact Brad Williams brad@webdevstudios.com Blog: strangework.com Twitter:@williamsba IRC: WDS-Brad http://www.slideshare.net/williamsba