Developing WordPress Plugins Markku Seguerra http://rebelpixel.com
What is a WordPress plugin? Little applications used to enhance functionality or add specific functions tailored to a site's specific needs.
Some plugins: - Akismet - WordPress Database Backup - WordPress.com Stats - wp-recent-links - Comment Hilite
What do you need to make a plugin? - a problem to solve - some PHP knowledge - some spare time - a test server with your test WordPress (XAMPP is good.)
Structure: Things to remember - A unique descriptive name - Naming: myplugin.php or /myplugin/ folder - Readme.txt format for wordpress.org/extend/plugins - Plugin home page - File headers (very important!)
Headers <?php /* Plugin Name: Name Of The Plugin Plugin URI: http://mypage.com/myplugin/ Description: What does it do? Version: 1.0 Author: Name Of The Plugin Author Author URI: http://mypage.com/ */ ?>
Include your license details! The GPL (and compatible licenses) is commonly used for plugins.
Plugin Programming Before WP 1.2, customizations required altering the core files, causing conflicts among hacks (remember my-hacks.php?) and making upgrades very tedious. The solution?
Plugin API - Enabled "hooks" - Extend functionality without editing the core code - Two categories: Actions and Filters
Actions Specific points in the WordPress code that can be used to trigger plugin-specified events and functions. add_action( 'hook_name', 'your_function_name', [priority], [accepted_args] );
Sample action: “wp_login” function notify_on_login() { // your code here // email to admin, etc... } add_action('wp_login', 'notify_on_login');
Filters Functions that modify text, lists and various types of information that are used and produced by WordPress. add_filter('hook_name', 'your_filter_function', [priority], [accepted_args]);
Sample filter: “the_content” function add_rss_invite() { // output to screen the link to RSS feed // if 1st time visitor } add_filter('the_content', 'add_rss_invite');
Template Tags Plugins can also be used to generate special template tags that display custom content. - Recent comments - Top posts - Ad display
Storing Plugin Data - For large amount of data, create your own database table. - For fairly small and/or static data, use built-in WP "Options" capability. add_option($name, $value, $deprecated, $autoload); get_option($option); update_option($option_name, $newvalue);
Administration Menus & Pages - There are specific functions to add pages and menu items. add_menu_page(page_title, menu_title, access_level/capability, file, [function]); add_submenu_page(); add_options_page(); add_management_page(); add_theme_page();
Other things to consider - Internationalization - WordPress Coding Standards & inline documentation - Function prefixes to avoid name collision - When creating tables, use $wpdb->prefix - Minimize database writes. - Write secure code! (Use nonces, sanitize, etc.) - Be aware of user roles and capabilities. - Stick to the WordPress API to avoid problems!
Sample plugin: Strip! <?php /* Plugin Name: Strip! Plugin URI: http://rebelpixel.com/ Description: Removes hyperlink tags from a given comment. Version: 0.1 Author: Markku Seguerra Author URI: http://rebelpixel.com/projects/strip/ */
/* Copyright 2008 Markku Seguerra (email : markku@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
add_filter('comment_text', 'strip_comments_add_admin'); function strip_comments_add_admin($text) { // add the strip button to the comment } add_filter('comment_text', 'strip_comments_add'); add_filter('get_comment_author_link', 'strip_comments_add'); function strip_comments_add($text) // mark the comment as stripped and displays // it without links
add_action('wp_ajax_strip', 'do_strip'); function do_strip() { // function to mark comment as stripped // triggered via ajax } add_action('wp_ajax_unstrip', 'do_unstrip'); function do_unstrip() function strip_selected_tags($text, $tags = array()) // our filter function that removes links
add_action('admin_head', 'strip_comments_head'); function strip_comments_head() { // show the necessary css and ajax // functions used in the admin interface }
<script type="text/javascript"> //<![CDATA[ function strip_now(cid) { jQuery.post("<?php echo get_option('siteurl'); ?>/wp-admin/admin-ajax.php", {action:"strip", "c":cid, "cookie": encodeURIComponent(document.cookie)}, function(str) { pn = '#p-' + cid; jQuery(pn).html(str); }); } function unstrip_now(cid) { {action:"unstrip", "c":cid, "cookie": encodeURIComponent(document.cookie)}, //]]> </script>
Thank you! Markku Seguerra http://rebelpixel.com