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:
[pastacode lang=”php” manual=”%3C%3Fphp%0A%2F*%0APlugin%20Name%3A%20Intro%20to%20Wordpres%20Plugin%20Development%0ADescription%3A%20Generic%20example%20plugin%0APlugin%20URI%3A%20%20http%3A%2F%2Fwww.daggerhartlab.com%2Fblog%2Fintroduction-wordpress-plugin-development%2F%0AAuthor%3A%20%20%20%20%20%20Jonathan%20Daggerhart%0AAuthor%20URI%3A%20%20http%3A%2F%2Fwww.daggerhartlab.com%0AVersion%3A%20%20%20%20%201.0%0AText%20Domain%3A%20intro-to-plugin-dev%0ADomain%3A%20%20%20%20%20%20%2Flang%0ALicense%3A%20%20%20%20%20GPL2%0A*%2F%0Adefine(%20’ITPD_PLUGIN_FILE’%2C%20__FILE__)%3B%0Adefine(%20’ITPD_PLUGIN_DIR’%2C%20dirname(%20__FILE__%20)%20)%3B%0Adefine(%20’ITPD_PLUGIN_URL’%2C%20plugin_dir_url(%20__FILE__%20)%20)%3B%0A%2F*%0A%20*%20init%20action%0A%20*%20http%3A%2F%2Fcodex.wordpress.org%2FFunction_Reference%2Fadd_action%0A%20*%2F%0Afunction%20itpd_init()%7B%0A%20%20%2F%2Fprint%20’this%20happened’%3B%20exit%3B%20%2F%2F%20proof%0A%20%20wp_register_style(%20’itpd_css’%2C%20ITPD_PLUGIN_URL.%20’%2Fitpd.css’%20)%3B%0A%20%20wp_enqueue_style(%20’itpd_css’%20)%3B%0A%7D%0Aadd_action(%20’init’%2C%20’itpd_init’%20)%3B%0A%2F*%0A%20*%20the_content%20filter%0A%20*%20http%3A%2F%2Fcodex.wordpress.org%2FFunction_Reference%2Fadd_filter%0A%20*%2F%0A%2F%2F%20Simple%20find%20and%20replace%0Afunction%20itpd_the_content_simple(%24content)%7B%0A%20%20return%20str_ireplace(%22FINDME%22%2C%20%22REPLACE%20WITH%20ME%22%2C%20%24content)%3B%0A%7D%0Aadd_filter(%20’the_content’%2C%20’itpd_the_content_simple’)%3B%0A%2F*%0A%20shortcodes%20-%20%5Bitpd_hr%5D%2C%20%20%20%5Bitpd_link%20id%3D1%5D%2C%20%20%5Bitpd_color%20color%3D%22purple%22%5D%0A*%2F%0A%2F*%0A%20*%20shortcode%20hr%0A%20*%20http%3A%2F%2Fcodex.wordpress.org%2FFunction_Reference%2Fadd_shortcode%0A%20*%2F%20%0Afunction%20itpd_shortcode_hr(%24attributes)%7B%0A%20%20return%20’%3Chr%20class%3D%22itpd_hr%22%20%2F%3E’%3B%0A%7D%0Aadd_shortcode(%20’itpd_hr’%2C%20’itpd_shortcode_hr’%20)%3B%0A%2F*%20%0A%20*%20shortcode%20post%20link%0A%20*%20http%3A%2F%2Fcodex.wordpress.org%2FFunction_Reference%2Fadd_shortcode%0A%20*%2F%0Afunction%20itpd_link_to_post(%24attributes)%7B%0A%20%20%24default_attributes%20%3D%20array(%0A%20%20%20%20’id’%20%3D%3E%20”%2C%0A%20%20)%3B%0A%20%20%24merged_attributes%20%3D%20shortcode_atts(%20%24default_attributes%2C%20%24attributes%20)%3B%0A%20%20extract(%20%24merged_attributes%20)%3B%0A%20%20%0A%20%20if%20(!empty(%24id))%7B%0A%20%20%20%20%24href%20%3D%20get_permalink(%24id)%3B%0A%20%20%20%20%24title%20%3D%20get_the_title(%24id)%3B%0A%20%20%20%20return%20%22%3Ca%20class%3D’itpd_link’%20href%3D’%24href’%20title%3D’%24title’%3E%24title%3C%2Fa%3E%22%3B%0A%20%20%7D%0A%7D%0Aadd_shortcode(%20’itpd_link’%2C%20’itpd_link_to_post’%20)%3B%0A%2F*%0A%20*%20shortcode%20color%0A%20*%20http%3A%2F%2Fcodex.wordpress.org%2FFunction_Reference%2Fadd_shortcode%0A%20*%2F%0Afunction%20itpd_shortcode_color_wrap(%24attributes%2C%20%24content%20%3D%20”)%20%7B%0A%20%20%24default_attributes%20%3D%20array(%0A%20%20%20%20’color’%20%3D%3E%20’black’%2C%0A%20%20)%3B%0A%20%20%0A%20%20%24merged_attributes%20%3D%20shortcode_atts(%20%24default_attributes%2C%20%24attributes%20)%3B%0A%20%20extract(%20%24merged_attributes%20)%3B%0A%20%20%0A%20%20return%20’%3Cspan%20style%3D%22color%3A%20′.%24color.’%3B%22%3E’%20.%20%24content.%20’%3C%2Fspan%3E’%3B%0A%7D%0Aadd_shortcode(%20’itpd_color’%2C%20’itpd_shortcode_color_wrap’%20)%3B%0A%2F*%0A%20*%20Add%20add_menu%20page%0A%20*%20http%3A%2F%2Fcodex.wordpress.org%2FFunction_Reference%2Fadd_menu_page%0A%20*%2F%0Afunction%20itpd_admin_menu()%7B%0A%20%20add_menu_page(%20%22Intro%20To%20Plugin%20Dev%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Intro%20to%20Plugin%20Dev%20Settings%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’manage_options’%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’intro_to_plugin_dev’%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’intro_to_plugin_dev_settings’)%3B%20%20%0A%7D%0Aadd_action(%20’admin_menu’%2C%20’itpd_admin_menu’%20)%3B%0A%2F*%20%0A%20*%20add_menu_page%20callback%20%0A%20*%2F%0Afunction%20intro_to_plugin_dev_settings()%7B%0A%20%20%2F%2F%20print%20’Here%20is%20the%20custom%20admin%20page’%3B%20return%3B%20%2F%2F%20proof%0A%20%20%0A%20%20%2F%2F%20save%20the%20submission%0A%20%20if%20(isset(%24_GET%5B’itpd_save’%5D))%7B%0A%20%20%20%20%2F%2F%20TODO%20–%20%0A%20%20%20%20%2F%2F%20each%20of%20these%20update_option%20functions%20should%20sanitize%20data%20first%20(not%20shown%20in%20this%20example)%0A%20%20%20%20if%20(isset(%24_POST%5B’itpd_find’%5D))%7B%0A%20%20%20%20%20%20update_option(‘itpd_find’%2C%20%24_POST%5B’itpd_find’%5D)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20if%20(isset(%24_POST%5B’itpd_replace’%5D))%7B%0A%20%20%20%20%20%20update_option(‘itpd_replace’%2C%20%24_POST%5B’itpd_replace’%5D)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20redirect%20back%20to%20form%0A%20%20%20%20wp_redirect(%24_SERVER%5B’HTTP_REFERER’%5D)%3B%0A%20%20%20%20exit()%3B%0A%20%20%7D%0A%20%20%0A%20%20%2F%2F%20show%20the%20form%0A%20%20intro_to_plugin_dev_settings_form()%3B%0A%7D%0A%2F*%20%0A%20*%20Settings%20page%20form%20%0A%20*%2F%0Afunction%20intro_to_plugin_dev_settings_form()%7B%0A%20%20%24itpd_find%20%3D%20get_option(%20’itpd_find’%2C%20”%20)%3B%0A%20%20%24itpd_replace%20%3D%20get_option(%20’itpd_replace’%2C%20”%20)%3B%0A%20%20%3F%3E%0A%20%20%3Cdiv%20class%3D%22wrap%22%3E%0A%20%20%20%20%3Ch1%3EIntro%20to%20Plugin%20Dev%20Settings%3C%2Fh1%3E%0A%20%20%20%20%3Cform%20action%3D%22%3C%3Fphp%20print%20%24_SERVER%5B’PHP_SELF’%5D%3B%20%3F%3E%3Fpage%3Dintro_to_plugin_dev%26noheader%3Dtrue%26itpd_save%3Dtrue%22%0A%20%20%20%20%20%20%20%20%20%20method%3D%22post%22%3E%0A%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20%3Clabel%3EFind%3A%20%3C%2Flabel%3E%3Cinput%20type%3D%22text%22%20name%3D%22itpd_find%22%20value%3D%22%3C%3Fphp%20print%20%24itpd_find%3B%20%3F%3E%22%20%2F%3E%0A%20%20%20%20%20%20%20%20%3Cp%20class%3D%22description%22%3EThe%20string%20to%20find%20in%20posts%20and%20pages.%3C%2Fp%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20%3Clabel%3EReplace%3A%20%3C%2Flabel%3E%3Cinput%20type%3D%22text%22%20name%3D%22itpd_replace%22%20value%3D%22%3C%3Fphp%20print%20%24itpd_replace%3B%20%3F%3E%22%20%2F%3E%0A%20%20%20%20%20%20%20%20%3Cp%20class%3D%22description%22%3EThe%20replacement%20string.%3C%2Fp%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%3C%3Fphp%20submit_button()%3B%20%3F%3E%0A%20%20%20%20%3C%2Fform%3E%0A%20%20%3C%2Fdiv%3E%0A%20%20%3C%3Fphp%0A%7D%0A%2F*%0A%20*%20Complex%20find%20and%20replace%20based%20on%20DB%20setting%0A%20*%2F%20%0Afunction%20itpd_the_content_with_setting(%24content)%7B%0A%20%20%24itpd_find%20%3D%20get_option(‘itpd_find’%2C%20”)%3B%0A%20%20%0A%20%20if%20(!empty(%24itpd_find))%7B%0A%20%20%20%20%2F%2F%20allow%20for%20comma%20separated%20value%0A%20%20%20%20%24itpd_find%20%3D%20explode(%20%22%2C%22%2C%20%24itpf_find)%3B%0A%20%20%20%20%24itpd_find%20%3D%20array_map(%20%22trim%22%2C%20%24itpd_find)%20%3B%0A%20%20%20%20%24itpd_replace%20%3D%20get_option(%20’itpd_replace’%2C%20”%20)%3B%0A%20%20%20%20return%20str_ireplace(%20%24itpd_find%2C%20%24itpd_replace%2C%20%24content%20)%3B%0A%20%20%7D%0A%20%20else%20%7B%0A%20%20%20%20return%20%24content%3B%0A%20%20%7D%0A%7D%0Aadd_filter(%20’the_content’%2C%20’itpd_the_content_with_setting’%20)%3B%0A%2F%2F%20*%2F%0A%2F%2F%20shortcodes%20in%20sidebars%0Aadd_filter(%20’widget_text’%2C%20’shortcode_unautop’)%3B%0Aadd_filter(%20’widget_text’%2C%20’do_shortcode’)%3B” message=”” highlight=”” provider=”manual”/]
Discussion