How plugins used in the Edupress project were made extensible.
EXTENSIBLE A Case Study of Edupress PLUGINS Mark Wilkinson @wpmark
View Slide
Professional, affordable websites for schools andthe education sector
31,491 PLUGINS *as of 05/06/2014
WHAT? WHY? TOOLS/FUNCTIONS EXAMPLES
PLUGIN and or THEME
One that can be modified or extendedwithout changing the plugin code itself AN EXTENSIBLE PLUGIN
WHY?
SAFE MODIFICATION FUNCTIONALITY FRONT END OUTPUT
https://www.flickr.com/photos/damndirty/10166197684
TOOLS FUNCTIONS
ACTIONS & FILTERS
do_action();
function wpmark_notice() {echo 'Site by Mark Wilkinson';}add_action( 'twentyfourteen_credits', 'wpmark_notice' );
apply_filters();
Lorem ipsum dolor sit amet,consectetur adipiscing elit. Phasellusmalesuada sem at sapien rutrum,eu… Lorem ipsum dolor sit amet,consectetur adipiscing elit. Phasellusmalesuada sem at sapien rutrum,eu…
''.apply_filters( 'latest_tweets_render_before', '' ).$list.apply_filters( 'latest_tweets_render_after', '' ).'';
function wpmark_twitter( $content ) {/* get the twitter url from site options */$url = get_option( ‘twitter_url' );$content = '@' .basename( $url ) . '';return $content;}add_filter( 'latest_tweets_render_before', ’wpmark_twitter' );
IMPEMENTATION INTO YOUR OWN PLUGINS
SETTING UP ARRAYS BEFORE/AFTER HTML OUTPUT BEFORE/AFTER SETUP
$query_args = array('post_type' => ’post','cat' => 1);
$query_args = apply_filters('wpmark_query_args',array('post_type' => ’post','cat' => 1));
$query = new WP_Query( $query_args );while( $query->have_posts() ) : $query->the_post();?>endwhile;
$query = new WP_Query( $query_args );while( $query->have_posts() ) : $query->the_post();do_action( ‘wpmark_before_post’, get_the_ID() );?>endwhile;
$query = new WP_Query( $query_args );while( $query->have_posts() ) : $query->the_post();do_action( ‘wpmark_before_post’, get_the_ID() );?>do_action( ‘wpmark_after_post’, get_the_ID() );endwhile;
EXAMPLES
$cew_feature_controls = apply_filters('cew_feature_control_output',array() // plugins will fill this array);if( ! empty( $cew_feature_controls ) ) {foreach( $cew_feature_controls as $cew_feature_control ) {/* output feature controls here */}}
function cew_usefulinfo_register_feature_control_setting() {/* register the settings */register_setting( 'cew_feature_control_settings','useful_info_control' );}add_action( 'admin_init','cew_usefulinfo_register_feature_control_setting' );
function cew_featurecontrol_output( $controls ) {/* add our control to the controls array */$controls[] = array('setting_name' => 'useful_info_control','setting_label' => 'Useful Info');return $controls;}add_filter( 'cew_feature_control_output','cew_featurecontrol_output' );
TEMPLATE OVERIDES
add_menu_page('Site Administration','Dashboard','edit_posts','cew_dashboard','cew_dashboard',‘div’,1);
function cew_dashboard() {if( file_exists( STYLESHEETPATH . 'cew/dashboard-home.php' ) ) {require_once STYLESHEETPATH . 'cew/dashboard-home.php';} else {/* plugin dashboard output here */}}
do_action( 'cew_admin_before_content_blocks' );
do_action( 'cew_admin_after_content_blocks' );
$cew_add_content_blocks = apply_filters('cew_add_content_blocks',array() // plugins filter this array);/* loop through each section outputting its content to the page */foreach( $cew_add_content_blocks as $cew_add_content_block ) {?>esc_html( strtolower( $cew_add_content_block[ 'class' ] ) ); ?>">} // end loop through each block
function cew_add_media_block( $array ) {/* add to our filtered array */$array[] = array('title' => 'Media','description' => 'Description here.','view_all_link' => admin_url( 'upload.php'),'add_new_link' => admin_url( 'media-new.php' ),'class' => 'media-block');return $array;}add_filter( 'cew_add_content_blocks', 'cew_add_media_block' );
do_action();add_action();apply_filters();add_filter();OUR FRIENDS
THANK YOU QUESTIONS? Mark Wilkinson | @wpmark