Skip to content

Instantly share code, notes, and snippets.

@keithmorris
Forked from eddiemoya/boilerplate-widget.php
Created December 4, 2012 23:51

Revisions

  1. @eddiemoya eddiemoya revised this gist Sep 10, 2012. 1 changed file with 34 additions and 12 deletions.
    46 changes: 34 additions & 12 deletions boilerplate-widget.php
    Original file line number Diff line number Diff line change
    @@ -213,11 +213,22 @@ public function form($instance){
    * @param array $instance [Required] Current instance of widget option values.
    * @return void
    */
    private function form_fields($fields, $instance){
    foreach($fields as &$field){
    extract($field);
    private function form_fields($fields, $instance, $group = false){

    if($group) {
    echo "<p>";
    }

    foreach($fields as $field){

    $this->form_field($field_id, $type, $label, $instance, $options);
    extract($field);
    $label = (!isset($label)) ? null : $label;
    $options = (!isset($options)) ? null : $options;
    $this->form_field($field_id, $type, $label, $instance, $options, $group);
    }

    if($group){
    echo "</p>";
    }
    }

    @@ -238,25 +249,27 @@ private function form_fields($fields, $instance){
    *
    * @return void
    */
    private function form_field($field_id, $type, $label, $instance, $options = array()){
    private function form_field($field_id, $type, $label, $instance, $options = array(), $group = false){

    ?><p><?php

    if(!$group)
    echo "<p>";

    $input_value = (isset($instance[$field_id])) ? $instance[$field_id] : '';
    switch ($type){

    case 'text': ?>

    <label for="<?php echo $this->get_field_id( $field_id ); ?>"><?php echo $label; ?>: </label>
    <input id="<?php echo $this->get_field_id( $field_id ); ?>" style="<?php echo $style; ?>" class="widefat" name="<?php echo $this->get_field_name( $field_id ); ?>" value="<?php echo $instance[$field_id]; ?>" />
    <input type="text" id="<?php echo $this->get_field_id( $field_id ); ?>" class="widefat" style="<?php echo (isset($style)) ? $style : ''; ?>" class="" name="<?php echo $this->get_field_name( $field_id ); ?>" value="<?php echo $input_value; ?>" />
    <?php break;

    case 'select': ?>

    <label for="<?php echo $this->get_field_id( $field_id ); ?>"><?php echo $label; ?>: </label>
    <select id="<?php echo $this->get_field_id( $field_id ); ?>" class="widefat" name="<?php echo $this->get_field_name($field_id); ?>">
    <?php
    foreach ( $options as $value => $label ) : ?>

    <option value="<?php echo $value; ?>" <?php selected($value, $instance[$field_id]) ?>>
    <option value="<?php echo $value; ?>" <?php selected($value, $input_value) ?>>
    <?php echo $label ?>
    </option><?php

    @@ -273,7 +286,7 @@ private function form_field($field_id, $type, $label, $instance, $options = arra

    ?>
    <label for="<?php echo $this->get_field_id( $field_id ); ?>"><?php echo $label; ?>: </label>
    <textarea class="widefat" rows="<?php echo $rows; ?>" cols="<?php echo $cols; ?>" id="<?php echo $this->get_field_id($field_id); ?>" name="<?php echo $this->get_field_name($field_id); ?>"><?php echo $instance[$field_id]; ?></textarea>
    <textarea class="widefat" rows="<?php echo $rows; ?>" cols="<?php echo $cols; ?>" id="<?php echo $this->get_field_id($field_id); ?>" name="<?php echo $this->get_field_name($field_id); ?>"><?php echo $input_value; ?></textarea>
    <?php break;

    case 'radio' :
    @@ -284,13 +297,22 @@ private function form_field($field_id, $type, $label, $instance, $options = arra

    <?php break;


    case 'hidden': ?>
    <input id="<?php echo $this->get_field_id( $field_id ); ?>" type="hidden" style="<?php echo (isset($style)) ? $style : ''; ?>" class="widefat" name="<?php echo $this->get_field_name( $field_id ); ?>" value="<?php echo $input_value; ?>" />
    <?php break;


    case 'checkbox' : ?>
    <input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id($field_id); ?>" name="<?php echo $this->get_field_name($field_id); ?>"<?php checked( (!empty($instance[$field_id]))); ?> />
    <label for="<?php echo $this->get_field_id( $field_id ); ?>"><?php echo $label; ?></label>
    <?php
    }

    ?></p><?php
    if(!$group)
    echo "</p>";


    }
    }

  2. @eddiemoya eddiemoya revised this gist Sep 10, 2012. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions boilerplate-widget.php
    Original file line number Diff line number Diff line change
    @@ -43,13 +43,13 @@ class Boilerplate_Widget extends WP_Widget {
    * @author Eddie Moya
    * @return void
    */
    public function Boilerplate_Widget(){
    public function __construct(){
    $widget_ops = array(
    'description' => $this->description,
    'classname' => $this->classname
    );

    parent::WP_Widget($this->id_base, $this->widget_name, $this->widget_ops);
    parent::WP_Widget($this->id_base, $this->widget_name, $widget_ops);
    }

    /**
  3. @eddiemoya eddiemoya created this gist Jul 26, 2012.
    297 changes: 297 additions & 0 deletions boilerplate-widget.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,297 @@
    <?php /*
    Plugin Name: Boilerplate Widget
    Description: Starting point for building widgets quickly and easier
    Version: 1.0
    Author: Eddie Moya
    /**
    * IMPORTANT: Change the class name for each widget
    */
    class Boilerplate_Widget extends WP_Widget {

    /**
    * Name for this widget type, should be human-readable - the actual title it will go by.
    *
    * @var string [REQUIRED]
    */
    var $widget_name = 'Boilerplate Widget';

    /**
    * Root id for all widgets of this type. Will be automatically generate if not set.
    *
    * @var string [OPTIONAL]. FALSE by default.
    */
    var $id_base = 'boilerplate_widget';

    /**
    * Shows up under the widget in the admin interface
    *
    * @var string [OPTIONAL]
    */
    private $description = 'Boilerplate Widget Example';

    /**
    * CSS class used in the wrapping container for each instance of the widget on the front end.
    *
    * @var string [OPTIONAL]
    */
    private $classname = 'boilerplate-widget';

    /**
    * Be careful to consider PHP versions. If running PHP4 class name as the contructor instead.
    *
    * @author Eddie Moya
    * @return void
    */
    public function Boilerplate_Widget(){
    $widget_ops = array(
    'description' => $this->description,
    'classname' => $this->classname
    );

    parent::WP_Widget($this->id_base, $this->widget_name, $this->widget_ops);
    }

    /**
    * Self-registering widget method.
    *
    * This can be called statically.
    *
    * @author Eddie Moya
    * @return void
    */
    public function register_widget() {
    add_action('widgets_init', create_function( '', 'register_widget("' . __CLASS__ . '");' ));
    }

    /**
    * The front end of the widget.
    *
    * Do not call directly, this is called internally to render the widget.
    *
    * @author [Widget Author Name]
    *
    * @param array $args [Required] Automatically passed by WordPress - Settings defined when registering the sidebar of a theme
    * @param array $instance [Required] Automatically passed by WordPress - Current saved data for the widget options.
    * @return void
    */
    public function widget( $args, $instance ){
    extract($args);
    extract($instance);

    echo $before_title . $bp_title . $after_title;

    ?>
    <h3><?php echo $bp_string; ?></h3>

    <?php if($bp_checkbox) { ?>
    <p>Check box '<?php echo $bp_checkbox; ?>' was checked</p>
    <?php } ?>

    <?php if($bp_checkbox_2) { ?>
    <p>Check box '<?php echo $bp_checkbox_2; ?>' was checked</p>
    <?php } ?>

    <p>The chosen select option is:<?php echo $bp_select; ?></p>
    <p><?php echo $bp_textarea; ?></p>
    <?

    }

    /**
    * Data validation.
    *
    * Do not call directly, this is called internally to render the widget
    *
    * @author [Widget Author Name]
    *
    * @uses esc_attr() http://codex.wordpress.org/Function_Reference/esc_attr
    *
    * @param array $new_instance [Required] Automatically passed by WordPress
    * @param array $old_instance [Required] Automatically passed by WordPress
    * @return array|bool Final result of newly input data. False if update is rejected.
    */
    public function update($new_instance, $old_instance){

    /* Lets inherit the existing settings */
    $instance = $old_instance;



    /**
    * Sanitize each option - be careful, if not all simple text fields,
    * then make use of other WordPress sanitization functions, but also
    * make use of PHP functions, and use logic to return false to reject
    * the entire update.
    *
    * @see http://codex.wordpress.org/Function_Reference/esc_attr
    */
    foreach($new_instance as $key => $value){
    $instance[$key] = esc_attr($value);

    }


    foreach($instance as $key => $value){
    if($value == 'on' && !isset($new_instance[$key])){
    unset($instance[$key]);
    }

    }

    return $instance;
    }

    /**
    * Generates the form for this widget, in the WordPress admin area.
    *
    * The use of the helper functions form_field() and form_fields() is not
    * neccessary, and may sometimes be inhibitive or restrictive.
    *
    * @author Eddie Moya
    *
    * @uses wp_parse_args() http://codex.wordpress.org/Function_Reference/wp_parse_args
    * @uses self::form_field()
    * @uses self::form_fields()
    *
    * @param array $instance [Required] Automatically passed by WordPress
    * @return void
    */
    public function form($instance){

    /* Setup default values for form fields - associtive array, keys are the field_id's */
    $defaults = array('bp_title' => 'Default Value of Text Field', 'bp_select' => 'option1');

    /* Merge saved input values with default values */
    $instance = wp_parse_args((array) $instance, $defaults);

    /* Example of multiple inputs at once. */
    $fields = array(
    array(
    'field_id' => 'bp_title',
    'type' => 'text',
    'label' => 'Enter Title'
    ),
    array(
    'field_id' => 'bp_select',
    'type' => 'select',
    'label' => 'Select an Option',
    'options' => array(

    /* These option associative keys can be whatever you want,
    * no spaces or funny characters though.
    */
    'option1' => 'Option 1',
    'option2' => 'Option 2'
    )
    )
    );

    /* Builds a series of inputs based on the $fields array created above. */
    $this->form_fields($fields, $instance);

    /* Examples of input fields one at a time. */
    $this->form_field('bp_string', 'text', 'Enter String', $instance);
    $this->form_field('bp_checkbox', 'checkbox', 'Choice 1', $instance);
    $this->form_field('bp_checkbox_2', 'checkbox', 'Choice 2', $instance);
    $this->form_field('bp_textarea', 'textarea', 'Enter Lots of Text', $instance);
    $this->form_field('bp_checkbox_3', 'checkbox', 'Choice 3', $instance);
    }


    /**
    * Helper function - does not need to be part of widgets, this is custom, but
    * is helpful in generating multiple input fields for the admin form at once.
    *
    * This is a wrapper for the singular form_field() function.
    *
    * @author Eddie Moya
    *
    * @uses self::form_fields()
    *
    * @param array $fields [Required] Nested array of field settings
    * @param array $instance [Required] Current instance of widget option values.
    * @return void
    */
    private function form_fields($fields, $instance){
    foreach($fields as &$field){
    extract($field);

    $this->form_field($field_id, $type, $label, $instance, $options);
    }
    }

    /**
    * Helper function - does not need to be part of widgets, this is custom, but
    * is helpful in generating single input fields for the admin form at once.
    *
    * @author Eddie Moya
    *
    * @uses get_field_id() (No Codex Documentation)
    * @uses get_field_name() http://codex.wordpress.org/Function_Reference/get_field_name
    *
    * @param string $field_id [Required] This will be the CSS id for the input, but also will be used internally by wordpress to identify it. Use these in the form() function to set detaults.
    * @param string $type [Required] The type of input to generate (text, textarea, select, checkbox]
    * @param string $label [Required] Text to show next to input as its label.
    * @param array $instance [Required] Current instance of widget option values.
    * @param array $options [Optional] Associative array of values and labels for html Option elements.
    *
    * @return void
    */
    private function form_field($field_id, $type, $label, $instance, $options = array()){

    ?><p><?php

    switch ($type){

    case 'text': ?>

    <label for="<?php echo $this->get_field_id( $field_id ); ?>"><?php echo $label; ?>: </label>
    <input id="<?php echo $this->get_field_id( $field_id ); ?>" style="<?php echo $style; ?>" class="widefat" name="<?php echo $this->get_field_name( $field_id ); ?>" value="<?php echo $instance[$field_id]; ?>" />
    <?php break;

    case 'select': ?>

    <select id="<?php echo $this->get_field_id( $field_id ); ?>" class="widefat" name="<?php echo $this->get_field_name($field_id); ?>">
    <?php
    foreach ( $options as $value => $label ) : ?>

    <option value="<?php echo $value; ?>" <?php selected($value, $instance[$field_id]) ?>>
    <?php echo $label ?>
    </option><?php

    endforeach;
    ?>
    </select>

    <?php break;

    case 'textarea':

    $rows = (isset($options['rows'])) ? $options['rows'] : '16';
    $cols = (isset($options['cols'])) ? $options['cols'] : '20';

    ?>
    <label for="<?php echo $this->get_field_id( $field_id ); ?>"><?php echo $label; ?>: </label>
    <textarea class="widefat" rows="<?php echo $rows; ?>" cols="<?php echo $cols; ?>" id="<?php echo $this->get_field_id($field_id); ?>" name="<?php echo $this->get_field_name($field_id); ?>"><?php echo $instance[$field_id]; ?></textarea>
    <?php break;

    case 'radio' :
    /**
    * Need to figure out how to automatically group radio button settings with this structure.
    */
    ?>

    <?php break;

    case 'checkbox' : ?>
    <input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id($field_id); ?>" name="<?php echo $this->get_field_name($field_id); ?>"<?php checked( (!empty($instance[$field_id]))); ?> />
    <label for="<?php echo $this->get_field_id( $field_id ); ?>"><?php echo $label; ?></label>
    <?php
    }

    ?></p><?php
    }
    }

    Boilerplate_Widget::register_widget();