Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Write Your First WordPress Plugin

Avatar for Anthony Anthony
September 08, 2012

Write Your First WordPress Plugin

Presented at WordPress meetup groups in Ann Arbor and Detroit

Avatar for Anthony

Anthony

September 08, 2012
Tweet

More Decks by Anthony

Other Decks in Technology

Transcript

  1. Who is Anthony Montalbano? Passionate for code Bachelor's in Computer

    Science Passionate for WordPress WordCamp Detroit Organizer Passionate for open source WordPress plugin developer Passionate for words Serial blogger Passionate for possibilities Co-founder of flipfrog and AMBR Detroit
  2. What is a WordPress plugin? "Plugins are tools to extend

    the functionality of WordPress." ~ http://codex.wordpress.org/Plugins MEGA IMPORTANT! The Codex The online manual for WordPress and a living repository for WordPress information and documentation.
  3. WordPress Plugins by the Numbers 21,214 # of plugins 345,389,937

    # of plugin downloads Sources: http://wordpress.org/extend/plugins/ http://digwp.com/2010/01/poll-results-how-many-plugins-do-you-use/ http://www.daveligthart.com/top-1000-wordpress-plugin-authors/ 63 % of users that use 10 plugins or less 12,134,168 # of downloads of the most popular plugin - All in One SEO Pack 9,783+ # of plugin developers
  4. Let's make a plugin! • Find and replace a word

    in the title. • Show what is being replaced as a sidebar widget. • Admin menu to change the find word and replace word. • Email me when a new post is published.
  5. Filter Hooks and Action Hooks WordPress plugins rely on the

    many hooks within the system to get things done. Filter Hooks Filters are the hooks that WordPress launches to modify text of various types before adding it to the database or sending it to the browser screen. Action Hooks Actions are the hooks that the WordPress core launches at specific points during execution, or when specific events occur. Source: http://codex.wordpress.org/Plugin_API
  6. How Hooks Work WordPress Plugin API provides you with a

    set of PHP functions that allow you to signal your own functions to be called when that hook is called. Filter Example: Action Example: add_filter('the_title', function($title) { return '<b>'. $title. '</b>';}) add_action( 'save_post', 'my_save_post', 10, 2 ); Actions: http://codex.wordpress.org/Plugin_API/Action_Reference Filters: http://codex.wordpress.org/Plugin_API/Filter_Reference
  7. How Hooks Work (continued) Hooks have 4 parameters • Tag

    (required) ◦ This is the WordPress named location where the hook takes place. • Function (required) ◦ This is the function to be called when the hook is executed. • Priority (optional) ◦ This determines the order your function is run, the lower, the earlier. • Parameters (optional) ◦ This is the number of parameters your function takes
  8. Set the Foundation • Create a new folder in wp-content/plugins

    • Create a php file with a plugin header comment box /* Plugin Name: My First Plugin Plugin URI: http://wordpress.org/extend/plugins/ Description: This is a description of a plugin Author: Anthony Montalbano Version: alpha Author URI: http://www.ambrdetroit.com */ http://codex.wordpress.org/Writing_a_Plugin#File_Headers
  9. Activation and Uninstall What will your plugin do when it

    is first activated? • Create database tables, data, and files • Update database tables, data, and files What will your plugin do when it is uninstalled? • Delete databases tables, data, files
  10. On Activation Add the following hook: Create a new function

    called 'demo_activate' Source: http://codex.wordpress.org/Function_Reference/register_activation_hook register_activation_hook( __FILE__, 'demo_activate' ); function demo_activate() { //do something when the plugin first initializes };
  11. On Uninstall Create a file called uninstall.php in the root

    directory. Add the following code: Source: http://codex.wordpress.org/Function_Reference/register_deactivation_hook <?php if(!defined('WP_UNINSTALL_PLUGIN')) exit(); delete_option('demo_myValue');
  12. Adding a Filter Add the following filter hook: Create a

    new function called 'demo_title_change' Source: http://codex.wordpress.org/Function_Reference/add_filter add_filter( 'the_title, 'demo_title_change' ); function demo_title_change($title) { //do something with the title str_replace( 'world', 'something', $title); return $title; };
  13. Adding an Action Add the following filter hook: Create a

    new function called 'demo_title_change' Source: http://codex.wordpress.org/Function_Reference/add_filter add_action( 'publish_post, 'demo_email_me' ); function demo_email_me($post_id) { wp_mail('[email protected]', 'New post!', 'New post on my demo blog, go check it out:' . get_bloginfo ('url')); return $post_id; };
  14. Adding a Settings Page First we need add a hook

    to where the settings page will show in the admin: Next we need to add a function to define the menu: add_action('admin_menu', 'my_plugin_menu'); Source: http://codex.wordpress.org/Function_Reference/add_options_page function my_plugin_menu() { add_options_page('Demo Plugin Options', 'Demo Plugin', 'manage_options', 'demo-plugin', 'demo_plugin_options'); }
  15. Adding a Settings Page (continued) Finally we need to generate

    the HTML and functionality of the admin menu: function demo_plugin_options() { //get the option $replaceWord = get_option('demo_myValue'); //save functionality if(isset($_REQUEST['demo_update_admin']) && $_REQUEST ['demo_update_admin']) { update_option('demo_myValue', $_POST['myValue']); $replaceWord = $_POST['myValue']; echo "<div id='message' class='updated fade'><p>Demo Plugin Settings Saved!</p></div>"; } //display the page include_once(dirname(__FILE__) . '/demo_admin.php'); }
  16. Adding a Widget First we need to add a hook

    to load the widget on widget initialization: Next, we need to create a function to register the widget: add_action( 'widgets_init', 'demo_load_widgets' ); Source: http://codex.wordpress.org/Widgets_API function demo_load_widgets() { register_widget( "demo_widget" ); }
  17. Adding a Widget (continued) Finally we create the widget by

    extending the WordPress Widget class: class Demo_Widget extends WP_Widget { public function __construct() { // widget actual processes parent::__construct( 'demo_widget', // Base ID 'Demo Widget', // Name array( 'description' => __( 'My Little Demo Widget', 'text_domain' ), ) // Arrgy ); } public function widget( $args, $instance ) { // outputs the content of the widget extract( $args ); $replaceWord = get_option('demo_myValue'); echo $before_widget; if ( ! empty( $replaceWord ) ) echo $before_title . 'My value' . $after_title . $replaceWord; echo $after_widget; } }
  18. Tip 1: Use a plugin prefix When creating a plugin,

    create a unique plugin prefix that can be used for all functions and variables. Since there are many plugins, it's important that your functions and variables don't conflict with other plugins.
  19. Tip 2: Never use PHP MySQL calls WordPress has a

    great database class called WPDB and makes it very each to plugin to the WordPress database. http://codex.wordpress.org/Class_Reference/wpdb For simple name/value pairs you can use WordPress options http://codex.wordpress.org/Function_Reference/add_option
  20. Tip 3: Queuing Scripts and Styles There are many cases

    where you may want to include a javascript or style sheet with your plugin. WordPress has this functionality built in. By default WordPress has many scripts included, such as jQuery. http://codex.wordpress.org/Function_Reference/wp_enqueue_script
  21. Tip 4: Use WordPress Admin Styles The WordPress admin has

    a style sheet that should be used when creating admin menus. The goal is to make your plugin fit seamless with WordPress. http://codex.wordpress.org/User:TECannon/UI_Pattern_and_Style_Guide
  22. Tip 5: Prepare your SQL Statements WordPress Database class has

    a function called prepare(). Use this function to properly prepare your SQL statements. http://codex.wordpress. org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks