Introduction to WordPress Plugin Development

Provides examples of common WordPress development functions.  Includes hooks (add_action, add_filter), custom admin menu pages (admin_menu, add_menu_page), and shortcodes (add_shortcode).

Slides:

Video:

Jonathan Daggerhart from Digital Fridge on Vimeo.

Source:

<?php
/*
Plugin Name: Intro to Wordpres Plugin Development
Description: Generic example plugin
Plugin URI:  http://www.daggerhartlab.com/blog/introduction-wordpress-plugin-development/
Author:      Jonathan Daggerhart
Author URI:  http://www.daggerhartlab.com
Version:     1.0
Text Domain: intro-to-plugin-dev
Domain:      /lang
License:     GPL2
*/
define( 'ITPD_PLUGIN_FILE', __FILE__);
define( 'ITPD_PLUGIN_DIR', dirname( __FILE__ ) );
define( 'ITPD_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
/*
 * init action
 * http://codex.wordpress.org/Function_Reference/add_action
 */
function itpd_init(){
  //print 'this happened'; exit; // proof
  wp_register_style( 'itpd_css', ITPD_PLUGIN_URL. '/itpd.css' );
  wp_enqueue_style( 'itpd_css' );
}
add_action( 'init', 'itpd_init' );
/*
 * the_content filter
 * http://codex.wordpress.org/Function_Reference/add_filter
 */
// Simple find and replace
function itpd_the_content_simple($content){
  return str_ireplace("FINDME", "REPLACE WITH ME", $content);
}
add_filter( 'the_content', 'itpd_the_content_simple');
/*
 shortcodes - [itpd_hr],   [itpd_link id=1],  [itpd_color color="purple"]
*/
/*
 * shortcode hr
 * http://codex.wordpress.org/Function_Reference/add_shortcode
 */ 
function itpd_shortcode_hr($attributes){
  return '<hr class="itpd_hr" />';
}
add_shortcode( 'itpd_hr', 'itpd_shortcode_hr' );
/* 
 * shortcode post link
 * http://codex.wordpress.org/Function_Reference/add_shortcode
 */
function itpd_link_to_post($attributes){
  $default_attributes = array(
    'id' => '',
  );
  $merged_attributes = shortcode_atts( $default_attributes, $attributes );
  extract( $merged_attributes );
  
  if (!empty($id)){
    $href = get_permalink($id);
    $title = get_the_title($id);
    return "<a class='itpd_link' href='$href' title='$title'>$title</a>";
  }
}
add_shortcode( 'itpd_link', 'itpd_link_to_post' );
/*
 * shortcode color
 * http://codex.wordpress.org/Function_Reference/add_shortcode
 */
function itpd_shortcode_color_wrap($attributes, $content = '') {
  $default_attributes = array(
    'color' => 'black',
  );
  
  $merged_attributes = shortcode_atts( $default_attributes, $attributes );
  extract( $merged_attributes );
  
  return '<span style="color: '.$color.';">' . $content. '</span>';
}
add_shortcode( 'itpd_color', 'itpd_shortcode_color_wrap' );
/*
 * Add add_menu page
 * http://codex.wordpress.org/Function_Reference/add_menu_page
 */
function itpd_admin_menu(){
  add_menu_page( "Intro To Plugin Dev",
                 "Intro to Plugin Dev Settings",
                 'manage_options',
                 'intro_to_plugin_dev',
                 'intro_to_plugin_dev_settings');  
}
add_action( 'admin_menu', 'itpd_admin_menu' );
/* 
 * add_menu_page callback 
 */
function intro_to_plugin_dev_settings(){
  // print 'Here is the custom admin page'; return; // proof
  
  // save the submission
  if (isset($_GET['itpd_save'])){
    // TODO -- 
    // each of these update_option functions should sanitize data first (not shown in this example)
    if (isset($_POST['itpd_find'])){
      update_option('itpd_find', $_POST['itpd_find']);
    }
    
    if (isset($_POST['itpd_replace'])){
      update_option('itpd_replace', $_POST['itpd_replace']);
    }
    // redirect back to form
    wp_redirect($_SERVER['HTTP_REFERER']);
    exit();
  }
  
  // show the form
  intro_to_plugin_dev_settings_form();
}
/* 
 * Settings page form 
 */
function intro_to_plugin_dev_settings_form(){
  $itpd_find = get_option( 'itpd_find', '' );
  $itpd_replace = get_option( 'itpd_replace', '' );
  ?>
  <div class="wrap">
    <h1>Intro to Plugin Dev Settings</h1>
    <form action="<?php print $_SERVER['PHP_SELF']; ?>?page=intro_to_plugin_dev&noheader=true&itpd_save=true"
          method="post">
      <div>
        <label>Find: </label><input type="text" name="itpd_find" value="<?php print $itpd_find; ?>" />
        <p class="description">The string to find in posts and pages.</p>
      </div>
      
      <div>
        <label>Replace: </label><input type="text" name="itpd_replace" value="<?php print $itpd_replace; ?>" />
        <p class="description">The replacement string.</p>
      </div>
      
      <?php submit_button(); ?>
    </form>
  </div>
  <?php
}
/*
 * Complex find and replace based on DB setting
 */ 
function itpd_the_content_with_setting($content){
  $itpd_find = get_option('itpd_find', '');
  
  if (!empty($itpd_find)){
    // allow for comma separated value
    $itpd_find = explode( ",", $itpf_find);
    $itpd_find = array_map( "trim", $itpd_find) ;
    $itpd_replace = get_option( 'itpd_replace', '' );
    return str_ireplace( $itpd_find, $itpd_replace, $content );
  }
  else {
    return $content;
  }
}
add_filter( 'the_content', 'itpd_the_content_with_setting' );
// */
// shortcodes in sidebars
add_filter( 'widget_text', 'shortcode_unautop');
add_filter( 'widget_text', 'do_shortcode');
0 Thoughts

Discussion

Leave a Reply

Your email address will not be published. Required fields are marked *