building pluggable plugins
@brandondove                 #plugplug #wcla
pluggable plugins are...

• also known as core plugins


• built by a team of developers rather than a single developer


...
their importance...

• plugin repository is a mess


• instill confidence in users


• developers can’t know
OOP concept: inheritance
• allows developers to reuse common pieces of code.


• class structures help you play nice


• h...
sub




              base   sub




                     sub




OOP diagram
cars share basic functionality: driving, steering, lights on/off
class subClass extends baseClass {

                                                      protected function publish( $obj...
WordPress concepts: actions & filters
• actions allow themes and plugins to execute code


• filters allow themes and plugin...
WordPress actions
do_action( 'non_clashing_action_name', $args );

add_action( 'non_clashing_action_name', 'my_hooking_fun...
class subClass extends baseClass {
                                                       function __construct() {
       ...
WordPress filters
echo apply_filters( 'non_clashing_filter_name', $args );

add_filter( 'non_clashing_filter_name', 'my_fil...
class subClass extends baseClass {
                                                       function __construct() {
       ...
real-world example   nextgen gallery
Problem:                              Solution:
We needed an additional               function another_image_size( $image ...
real-world example   shopp plugin
Problem:                           Solution:
We wanted to use a real-           function check_stock( $external, $product ...
real-world example   social me
real-world example: social me

• custom post types for storing social media content


• opt-in extension manager


• exten...
real-world example: social me twitter

• authenticates with oauth


• imports tweets as custom post type


• custom taxono...
questions?
Brandon Dove
@brandondove
brandon@pixeljar.net
(714) 932-5787
http://pixeljar.net
Upcoming SlideShare
Loading in...5
×

Building a Pluggable Plugin

3,304

Published on

Published in: Self Improvement
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,304
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
24
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide





















  • Building a Pluggable Plugin

    1. 1. building pluggable plugins @brandondove #plugplug #wcla
    2. 2. pluggable plugins are... • also known as core plugins • built by a team of developers rather than a single developer • more secure • less buggy • easier to customize than a traditional plugin • supported by original developers • ever changing
    3. 3. their importance... • plugin repository is a mess • instill confidence in users • developers can’t know
    4. 4. OOP concept: inheritance • allows developers to reuse common pieces of code. • class structures help you play nice • helps keep code maintainable
    5. 5. sub base sub sub OOP diagram
    6. 6. cars share basic functionality: driving, steering, lights on/off
    7. 7. class subClass extends baseClass { protected function publish( $obj ) { // method must be defined wp_insert_post( $obj ); } abstract class baseClass { protected function update( $obj ) { // method must be defined abstract protected function publish( $obj ); wp_update_post( $obj ); abstract protected function update( $obj ); } abstract protected function delete( $obj ); protected function delete( $obj ) { public function get_post( $id ) { // method must be defined $post = get_posts( 'p='.$id ); wp_delete_post( $obj ); return $post; } } } } $sub = new subClass; $my_post = $sub->get_post( 1 ); $my_post[0]->post_content = 'Some new content'; $sub->update( $my_post[0] ); $sub->delete( 1 ); PHP5 OOP implementation
    8. 8. WordPress concepts: actions & filters • actions allow themes and plugins to execute code • filters allow themes and plugins to modify output • these are what make WordPress REALLY awesome
    9. 9. WordPress actions do_action( 'non_clashing_action_name', $args ); add_action( 'non_clashing_action_name', 'my_hooking_function', (int) priority, (int) arguments ); function my_hooking_function( $args ) { // execute some code here }
    10. 10. class subClass extends baseClass { function __construct() { add_action( 'base_class_publish', array( &$this, 'notify_me' ), 1, 1 ); } protected function publish( $obj ) { do_action( 'base_class_publish', $obj ); wp_insert_post( $obj ); } abstract class baseClass { protected function notify_me( $obj ) { wp_mail( abstract protected function publish( $obj ); 'brandon@pixeljar.net', abstract protected function update( $obj ); 'post published', abstract protected function delete( $obj ); print_r( $obj, true ) ); public function get_post( $id ) { } $post = get_posts( 'p='.$id ); return $post; protected function update( $obj ) {} } protected function delete( $obj ) {} } } $sub = new subClass; $my_post = array( 'post_title' => 'My post', 'post_content' => 'This is my post', 'post_status' => 'publish', 'post_author' => 1, 'post_category' => array( 8, 39 ) ); $sub->publish( $my_post ); PHP5 OOP + WordPress actions implementation
    11. 11. WordPress filters echo apply_filters( 'non_clashing_filter_name', $args ); add_filter( 'non_clashing_filter_name', 'my_filtering_function', (int) priority, (int) arguments ); function my_filtering_function( $args ) { return htmlentities( $args ); }
    12. 12. class subClass extends baseClass { function __construct() { add_filter( 'base_class_publish', array( &$this, 'i_wrote_this' ), 1, 1 ); } protected function publish( $obj ) { $obj = apply_filters( 'base_class_publish', $obj ); abstract class baseClass { wp_insert_post( $obj ); } abstract protected function publish( $obj ); abstract protected function update( $obj ); protected function i_wrote_this( $obj ) { abstract protected function delete( $obj ); $obj['post_author'] = 2; return $obj; public function get_post( $id ) { } $post = get_posts( 'p='.$id ); return apply_filters protected function update( $obj ) {} ( 'base_class_get_post', $post ); protected function delete( $obj ) {} } } } $sub = new subClass; $my_post = array( 'post_title' => 'My post', 'post_content' => 'This is my post', 'post_status' => 'publish', 'post_author' => 1, 'post_category' => array( 8, 39 ) ); $sub->publish( $my_post ); PHP5 OOP + WordPress filters implementation
    13. 13. real-world example nextgen gallery
    14. 14. Problem: Solution: We needed an additional function another_image_size( $image ) { image size created to global $ngg; if( !class_exists( 'ngg_Thumbnail' ) ) display in a lightbox within require_once( nggGallery::graphic_library() ); our theme. $image = nggdb::find_image( $image['id'] ); $width = '920'; $height = '560'; if ( !is_writable( $image->imagePath ) ) return ' <strong>'.$image->filename. __( ' is not writeable','nggallery' ).'</strong>'; $file = new ngg_Thumbnail( $image->imagePath, TRUE ); if ( !$file->error ) { $file->resize( $width, $height, 4 ); $image->imagePath = preg_replace( '/(gif|jpg|jpeg|png)/i', 'lightbox.$1', $image->imagePath ); $file->save( $image->imagePath, $ngg->options['imgQuality']); $size = @getimagesize ( $image->imagePath ); $file->destruct(); } else { $file->destruct(); return ' <strong>'.$image->filename. ' (Error: '.$file->errmsg . ')</strong>'; } } add_action( 'ngg_added_new_image', 'another_image_size', 10, 1 ); real-world example: nextgen gallery
    15. 15. real-world example shopp plugin
    16. 16. Problem: Solution: We wanted to use a real- function check_stock( $external, $product ) { time external inventory if( !$stock = ExtInventory::checkStock( $product->ID ) ) return false; tracking system. return $stock; } add_filter( 'shopp_cartitem_stock', 'check_stock', 1, 2 ); real-world example: shopp plugin
    17. 17. real-world example social me
    18. 18. real-world example: social me • custom post types for storing social media content • opt-in extension manager • extensions handle social networks
    19. 19. real-world example: social me twitter • authenticates with oauth • imports tweets as custom post type • custom taxonomies for hash tags and @mentions • post to twitter via actions • changed defaults via filters
    20. 20. questions?
    21. 21. Brandon Dove @brandondove brandon@pixeljar.net (714) 932-5787 http://pixeljar.net
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×