WordPress.org

Plugin Directory

Changeset 1762280


Ignore:
Timestamp:
11/09/17 20:58:19 (2 months ago)
Author:
deweydb
Message:

Version 1.08

Location:
bid13-auction-feed/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • bid13-auction-feed/trunk/bid13-auction-feed.php

    r1761404 r1762280  
    22/* 
    33 * Plugin Name: Bid13 Auction Feed 
    4  * Version: 1.07 
     4 * Version: 1.08 
    55 * Plugin URI: http://bid13plugin.waspdigital.com 
    66 * Description: Uses the bid13 API to generate a feed of auctions. 
  • bid13-auction-feed/trunk/includes/class-bid13-auction-feed-settings.php

    r1761404 r1762280  
    33if ( ! defined( 'ABSPATH' ) ) exit; 
    44 
    5 class Bid13_Auction_Feed_Settings { 
    6  
    7     /** 
    8      * The single instance of Bid13_Auction_Feed_Settings. 
    9      * @var     object 
    10      * @access  private 
    11      * @since   1.0.0 
    12      */ 
    13     private static $_instance = null; 
    14  
    15     /** 
    16      * The main plugin object. 
    17      * @var     object 
    18      * @access  public 
    19      * @since   1.0.0 
    20      */ 
    21     public $parent = null; 
    22  
    23     /** 
    24      * Prefix for plugin settings. 
    25      * @var     string 
    26      * @access  public 
    27      * @since   1.0.0 
    28      */ 
    29     public $base = ''; 
    30  
    31     /** 
    32      * Available settings for plugin. 
    33      * @var     array 
    34      * @access  public 
    35      * @since   1.0.0 
    36      */ 
    37     public $settings = array(); 
    38  
    39     public function __construct ( $parent ) { 
    40         $this->parent = $parent; 
    41  
    42         $this->base = 'wpt_'; 
    43  
    44         // Initialise settings 
    45         add_action( 'init', array( $this, 'init_settings' ), 11 ); 
    46  
    47         // Register plugin settings 
    48         add_action( 'admin_init' , array( $this, 'register_settings' ) ); 
    49  
    50         // Add settings page to menu 
    51         add_action( 'admin_menu' , array( $this, 'add_menu_item' ) ); 
    52  
    53         // Add settings link to plugins page 
    54         add_filter( 'plugin_action_links_' . plugin_basename( $this->parent->file ) , array( $this, 'add_settings_link' ) ); 
    55     } 
    56  
    57     /** 
    58      * Initialise settings 
    59      * @return void 
    60      */ 
    61     public function init_settings () { 
    62         $this->settings = $this->settings_fields(); 
    63     } 
    64  
    65     /** 
    66      * Add settings page to admin menu 
    67      * @return void 
    68      */ 
    69     public function add_menu_item () { 
    70         $page = add_options_page( __( 'Plugin Settings', 'bid13-auction-feed' ) , __( 'Bid13 Settings', 'bid13-auction-feed' ) , 'manage_options' , $this->parent->_token . '_settings' ,  array( $this, 'settings_page' ) ); 
    71         add_action( 'admin_print_styles-' . $page, array( $this, 'settings_assets' ) ); 
    72     } 
    73  
    74     /** 
    75      * Load settings JS & CSS 
    76      * @return void 
    77      */ 
    78     public function settings_assets () { 
    79  
    80         // We're including the farbtastic script & styles here because they're needed for the colour picker 
    81         // If you're not including a colour picker field then you can leave these calls out as well as the farbtastic dependency for the wpt-admin-js script below 
    82         wp_enqueue_style( 'farbtastic' ); 
    83         wp_enqueue_script( 'farbtastic' ); 
    84  
    85         // We're including the WP media scripts here because they're needed for the image upload field 
    86         // If you're not including an image upload then you can leave this function call out 
    87         wp_enqueue_media(); 
    88  
    89         wp_register_script( $this->parent->_token . '-settings-js', $this->parent->assets_url . 'js/settings' . $this->parent->script_suffix . '.js', array( 'farbtastic', 'jquery' ), '1.0.0' ); 
    90         wp_enqueue_script( $this->parent->_token . '-settings-js' ); 
    91     } 
    92  
    93     /** 
    94      * Add settings link to plugin list table 
    95      * @param  array $links Existing links 
    96      * @return array        Modified links 
    97      */ 
    98     public function add_settings_link ( $links ) { 
    99         $settings_link = '<a href="options-general.php?page=' . $this->parent->_token . '_settings">' . __( 'Settings', 'bid13-auction-feed' ) . '</a>'; 
    100         array_push( $links, $settings_link ); 
    101         return $links; 
    102     } 
    103      
    104     /** 
    105      * Build settings fields 
    106      * @return array Fields to be displayed on settings page 
    107      */ 
    108     private function settings_fields () { 
    109         if(get_option('wpt_api_key')){ 
    110             $url = 'https://bid13.com/api/v0/facility_lookup'; 
    111             // extra entropy so we don't have leakyness in the hashes 
    112             $rand = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 32); 
    113             $data_string = json_encode(array("rand" => $rand, "time"=>time())); 
    114             $ch = curl_init(); 
    115             $signature = hash_hmac("sha256", $data_string, get_option('wpt_api_key')); 
    116             curl_setopt($ch, CURLOPT_URL,$url); 
    117             curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                      
    118             curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);     
    119             curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    120             curl_setopt($ch, CURLOPT_HTTPHEADER, array( 
    121                     'X-Bid13-Signature: '.$signature,                                                                   
    122                 'Content-Type: application/json',                                                                                 
    123                 'Content-Length: ' . strlen($data_string)) 
    124             );      
    125          
    126             $curloutput = curl_exec($ch); 
    127             $results = json_decode($curloutput); 
    128             $facility_checkboxes = array(); 
    129             $default_facility = array(); 
    130             foreach($results as $result){ 
    131                 $facility_checkboxes[$result->nid] = $result->street; 
    132                 $default_facility[] = $result->nid; 
    133             } 
    134         } 
    135          
    136  
    137  
    138         $settings['standard'] = array( 
    139             'title'                 => __( 'API Settings', 'bid13-auction-feed' ), 
    140             'description'           => __( 'Please enter your API key here.  If you do not have an API key and wish to place a request for one, please email <a href="mailto:auctions@bid13.com">auctions@bid13.com</a>.', 'bid13-auction-feed' ), 
    141             'fields'                => array( 
    142                 array( 
    143                     'id'            => 'API_Key', 
    144                     'label'         => __( 'API Key' , 'bid13-auction-feed' ), 
    145                     'description'   => __( 'Please enter your api key.', 'bid13-auction-feed' ), 
    146                     'type'          => 'text', 
    147                     'default'       => '', 
    148                     'placeholder'   => __( 'API key', 'bid13-auction-feed' ) 
    149                 ) 
    150             ) 
    151         ); 
    152         if(get_option('wpt_api_key')){ 
    153             $settings['standard']['fields'][] = array( 
    154                     'id'            => 'facilityNIDs', 
    155                     'label'         => __( 'Facilities To Display', 'bid13-auction-feed' ), 
    156                     'description'   => __( 'Please check all facilities you wish to display auctions for.', 'bid13-auction-feed' ), 
    157                     'type'          => 'checkbox_multi', 
    158                     'options'       => $facility_checkboxes, 
    159                     'default'       => $default_facility 
    160                 ); 
    161         } 
    162  
    163         $settings['extra'] = array( 
    164             'title'                 => __( 'Customization', 'bid13-auction-feed' ), 
    165             'description'           => __( 'Here you can modify the look and feel of how the auction feed itegrates into your website.  <br/> 
    166             If you find that there is some settings missing here, or a feature you would like, please email  <a href="mailto:auctions@bid13.com">auctions@bid13.com</a>.', 'bid13-auction-feed' ), 
    167             'fields'                => array( 
    168                 array( 
    169                     'id'            => 'link_color', 
    170                     'label'         => __( 'Link Color', 'bid13-auction-feed' ), 
    171                     'description'   => __( 'If you would like the links to appear as a different color, select it here.', 'bid13-auction-feed' ), 
    172                     'type'          => 'color', 
    173                     'default'       => '#3bb44b' 
    174                 ), 
    175                 array( 
    176                     'id'            => 'text_color', 
    177                     'label'         => __( 'Text Color', 'bid13-auction-feed' ), 
    178                     'description'   => __( 'If you would like the text to appear as a different color, select it here.' ), 
    179                     'type'          => 'color', 
    180                     'default'       => '#000000' 
    181                 ), 
    182                 array( 
    183                     'id'            => 'hide_expired', 
    184                     'label'         => __( 'Hide Past Auctions?', 'bid13-auction-feed' ), 
    185                     'description'   => __( 'Check this if you would like to hide past auctions, so that they do not appear in the feed.', 'bid13-auction-feed' ), 
    186                     'type'          => 'checkbox', 
    187                     'default'       => '' 
    188                 ), 
    189                 array( 
    190                     'id'            => 'open_links_in_new_tab', 
    191                     'label'         => __( 'Open Links in New Tab?', 'bid13-auction-feed' ), 
    192                     'description'   => __( 'When checked, all links will open in a new tab (target=_blank).', 'bid13-auction-feed' ), 
    193                     'type'          => 'checkbox', 
    194                     'default'       => '' 
    195                 ), 
    196                 array( 
    197                     'id'            => 'show_unit_descriptions', 
    198                     'label'         => __( 'Display the unit description?', 'bid13-auction-feed' ), 
    199                     'description'   => __( 'When checked, the unit contents description will next to each auction.  This description is controllable via your bid13 account.  In the future this will be replaced by tags.', 'bid13-auction-feed' ), 
    200                     'type'          => 'checkbox', 
    201                     'default'       => '' 
    202                 ), 
    203                 array( 
    204                     'id'            => 'show_locations', 
    205                     'label'         => __( 'Display the unit location?', 'bid13-auction-feed' ), 
    206                     'description'   => __( 'When checked, the facility address is printed below each auction.', 'bid13-auction-feed' ), 
    207                     'type'          => 'checkbox', 
    208                     'default'       => true 
    209                 ), 
    210                 array( 
    211                     'id'            => 'use_video', 
    212                     'label'         => __( 'Display Video Instead of Photos?', 'bid13-auction-feed' ), 
    213                     'description'   => __( 'If checked the photo container will be replaced with the unit video.', 'bid13-auction-feed' ), 
    214                     'type'          => 'checkbox', 
    215                     'default'       => '' 
    216                 ), 
    217                 array( 
    218                     'id'            => 'sort_descending', 
    219                     'label'         => __( 'Most Recent Auctions First?', 'bid13-auction-feed' ), 
    220                     'description'   => __( 'If checked the most recent auctions will display at the top of the page, and the older auctions below.', 'bid13-auction-feed' ), 
    221                     'type'          => 'checkbox', 
    222                     'default'       => true 
    223                 ), 
    224                 array( 
    225                     'id'            => 'video_max_width', 
    226                     'label'         => __( 'Video Max Width' , 'bid13-auction-feed' ), 
    227                     'description'   => __( 'The video container is responsive, but you may want to limit how big it gets. Numbers only please (pixels)', 'bid13-auction-feed' ), 
    228                     'type'          => 'text', 
    229                     'default'       => '853', 
    230                     'placeholder'   => __( 'API key', 'bid13-auction-feed' ) 
    231                 )                
    232             ) 
    233         ); 
    234  
    235         $results = bid13_auction_feed_get_auctions(); 
    236         if($results && !(is_object($results) && property_exists($results, 'error')) && !(is_array($results) && array_key_exists('error', $results))){ 
    237             $links = array(); 
    238             foreach($results as $key => $result){ 
    239                 $auction_settings_fields = array(); 
    240  
    241                 $auction_settings_fields[] = array( 
    242                     'id'            => 'unit_description-'.$result->unit_id, 
    243                     'label'         => __( 'Unit Description' , 'bid13-auction-feed' ), 
    244                     'description'   => __( 'Please enter a description of the unit contents.', 'bid13-auction-feed' ), 
    245                     'type'          => 'textarea', 
    246                     'default'       => $result->description, 
    247                     'placeholder'   => __( 'Please enter a description of the unit contents', 'bid13-auction-feed' ) 
    248                 ); 
    249                 array_walk($result->thumbnails, 'bid13_auction_feed_url_to_img'); 
    250                 $auction_settings_images = array_merge($result->thumbnails, array('custom' => 'Upload a different image')); 
    251                 $auction_settings_fields[] =    array( 
    252                     'id'            => 'preferred_image-'.$result->unit_id, 
    253                     'label'         => __( 'Preferred Image', 'bid13-auction-feed' ), 
    254                     'description'   => __( 'Please select which image you would like to appear in the feed.  NOTE: This has no impact if you have selected display videos instead of images in the general settings section.', 'bid13-auction-feed' ), 
    255                     'type'          => 'radio', 
    256                     'options'       => $auction_settings_images, 
    257                     'default'       => 0 
    258                 ); 
    259                 $auction_settings_fields[] = array( 
    260                     'id'            => 'alternate_image-'.$result->unit_id, 
    261                     'label'         => __( ' Alternate Image' , 'bid13-auction-feed' ), 
    262                     'description'   => __(  "If you selected 'Upload a different image' above please do so here.  We recomend discussing the use of this feature with your web development team, depending on how they implement the feed on your website, they might give you a minimum image size suggestion.", 'bid13-auction-feed' ), 
    263                     'type'          => 'image', 
    264                     'default'       => '', 
    265                     'placeholder'   => '' 
    266                 );           
    267                 $settings['auction_'.$result->unit_id] = array( 
    268                     'title'                 => __( $result->title.' Settings', 'bid13-auction-feed' ), 
    269                     'description'           => __( 'You can use this screen to customize how '.$result->title.' will display on your website.', 'bid13-auction-feed' ), 
    270                     'fields'                => $auction_settings_fields, 
    271                 ); 
    272  
    273                 $links[] = '<a href="'.add_query_arg( array( 'tab' => 'auction_'.$result->unit_id )).'">'.$result->title.'</a>'; 
    274             } 
    275         } 
    276  
    277         $html = 'Below is a list of all your auctions, sorted by date posted, click on any of the links if you wish to customize the display settings for that particular auction.<br/>'; 
    278         foreach($links as $link){ 
    279             $html .= $link . '<br />'; 
    280         } 
    281          
    282         $settings['auction_settings'] = array( 
    283             'title'                 => __( 'Auction Settings', 'bid13-auction-feed' ), 
    284             'description'       => __( $html, 'bid13-auction-feed' ), 
    285         ); 
    286  
    287         $settings = apply_filters( $this->parent->_token . '_settings_fields', $settings ); 
    288  
    289         return $settings; 
    290     } 
    291  
    292     /** 
    293      * Register plugin settings 
    294      * @return void 
    295      */ 
    296     public function register_settings () { 
    297         if ( is_array( $this->settings ) ) { 
    298  
    299             // Check posted/selected tab 
    300             $current_section = ''; 
    301             if ( isset( $_POST['tab'] ) && $_POST['tab'] ) { 
    302                 $current_section = $_POST['tab']; 
     5class Bid13_Auction_Feed_Admin_API { 
     6 
     7    /** 
     8     * Constructor function 
     9     */ 
     10    public function __construct () { 
     11        add_action( 'save_post', array( $this, 'save_meta_boxes' ), 10, 1 ); 
     12    } 
     13 
     14    /** 
     15     * Generate HTML for displaying fields 
     16     * @param  array   $field Field data 
     17     * @param  boolean $echo  Whether to echo the field HTML or return it 
     18     * @return void 
     19     */ 
     20    public function display_field ( $data = array(), $post = false, $echo = true ) { 
     21 
     22        // Get field info 
     23        if ( isset( $data['field'] ) ) { 
     24            $field = $data['field']; 
     25        } else { 
     26            $field = $data; 
     27        } 
     28 
     29        // Check for prefix on option name 
     30        $option_name = ''; 
     31        if ( isset( $data['prefix'] ) ) { 
     32            $option_name = $data['prefix']; 
     33        } 
     34 
     35        // Get saved data 
     36        $data = ''; 
     37        if ( $post ) { 
     38 
     39            // Get saved field data 
     40            $option_name .= $field['id']; 
     41            $option = get_post_meta( $post->ID, $field['id'], true ); 
     42 
     43            // Get data to display in field 
     44            if ( isset( $option ) ) { 
     45                $data = $option; 
     46            } 
     47 
     48        } else { 
     49 
     50            // Get saved option 
     51            $option_name .= $field['id']; 
     52            $option = get_option( $option_name ); 
     53 
     54            // Get data to display in field 
     55            if ( isset( $option ) ) { 
     56                $data = $option; 
     57            } 
     58 
     59        } 
     60 
     61        // Show default data if no option saved and default is supplied 
     62        if ( $data === false && isset( $field['default'] ) ) { 
     63            $data = $field['default']; 
     64        } elseif ( $data === false ) { 
     65            $data = ''; 
     66        } 
     67 
     68        $html = ''; 
     69 
     70        switch( $field['type'] ) { 
     71 
     72            case 'text': 
     73            case 'url': 
     74            case 'email': 
     75                $html .= '<input id="' . esc_attr( $field['id'] ) . '" type="text" name="' . esc_attr( $option_name ) . '" placeholder="' . esc_attr( $field['placeholder'] ) . '" value="' . esc_attr( $data ) . '" />' . "\n"; 
     76            break; 
     77 
     78            case 'password': 
     79            case 'number': 
     80            case 'hidden': 
     81                $min = ''; 
     82                if ( isset( $field['min'] ) ) { 
     83                    $min = ' min="' . esc_attr( $field['min'] ) . '"'; 
     84                } 
     85 
     86                $max = ''; 
     87                if ( isset( $field['max'] ) ) { 
     88                    $max = ' max="' . esc_attr( $field['max'] ) . '"'; 
     89                } 
     90                $html .= '<input id="' . esc_attr( $field['id'] ) . '" type="' . esc_attr( $field['type'] ) . '" name="' . esc_attr( $option_name ) . '" placeholder="' . esc_attr( $field['placeholder'] ) . '" value="' . esc_attr( $data ) . '"' . $min . '' . $max . '/>' . "\n"; 
     91            break; 
     92 
     93            case 'text_secret': 
     94                $html .= '<input id="' . esc_attr( $field['id'] ) . '" type="text" name="' . esc_attr( $option_name ) . '" placeholder="' . esc_attr( $field['placeholder'] ) . '" value="" />' . "\n"; 
     95            break; 
     96 
     97            case 'textarea': 
     98                $html .= '<textarea id="' . esc_attr( $field['id'] ) . '" rows="5" cols="50" name="' . esc_attr( $option_name ) . '" placeholder="' . esc_attr( $field['placeholder'] ) . '">' . $data . '</textarea><br/>'. "\n"; 
     99            break; 
     100 
     101            case 'checkbox': 
     102                $checked = ''; 
     103                if ( $data && 'on' == $data ) { 
     104                    $checked = 'checked="checked"'; 
     105                } 
     106                $html .= '<input id="' . esc_attr( $field['id'] ) . '" type="' . esc_attr( $field['type'] ) . '" name="' . esc_attr( $option_name ) . '" ' . $checked . '/>' . "\n"; 
     107            break; 
     108 
     109            case 'checkbox_multi': 
     110                foreach ( $field['options'] as $k => $v ) { 
     111                    $checked = false; 
     112                    if ( in_array( $k, $data ) ) { 
     113                        $checked = true; 
     114                    } 
     115                    $html .= '<label for="' . esc_attr( $field['id'] . '_' . $k ) . '" class="checkbox_multi"><input type="checkbox" ' . checked( $checked, true, false ) . ' name="' . esc_attr( $option_name ) . '[]" value="' . esc_attr( $k ) . '" id="' . esc_attr( $field['id'] . '_' . $k ) . '" /> ' . $v . '</label> <br/>'; 
     116                } 
     117            break; 
     118 
     119            case 'radio': 
     120                foreach ( $field['options'] as $k => $v ) { 
     121                    $checked = false; 
     122                    if ( $k == $data ) { 
     123                        $checked = true; 
     124                    } 
     125                    $html .= '<label for="' . esc_attr( $field['id'] . '_' . $k ) . '"><input type="radio" ' . checked( $checked, true, false ) . ' name="' . esc_attr( $option_name ) . '" value="' . esc_attr( $k ) . '" id="' . esc_attr( $field['id'] . '_' . $k ) . '" /> ' . $v . '</label> '; 
     126                } 
     127            break; 
     128 
     129            case 'select': 
     130                $html .= '<select name="' . esc_attr( $option_name ) . '" id="' . esc_attr( $field['id'] ) . '">'; 
     131                foreach ( $field['options'] as $k => $v ) { 
     132                    $selected = false; 
     133                    if ( $k == $data ) { 
     134                        $selected = true; 
     135                    } 
     136                    $html .= '<option ' . selected( $selected, true, false ) . ' value="' . esc_attr( $k ) . '">' . $v . '</option>'; 
     137                } 
     138                $html .= '</select> '; 
     139            break; 
     140 
     141            case 'select_multi': 
     142                $html .= '<select name="' . esc_attr( $option_name ) . '[]" id="' . esc_attr( $field['id'] ) . '" multiple="multiple">'; 
     143                foreach ( $field['options'] as $k => $v ) { 
     144                    $selected = false; 
     145                    if ( in_array( $k, $data ) ) { 
     146                        $selected = true; 
     147                    } 
     148                    $html .= '<option ' . selected( $selected, true, false ) . ' value="' . esc_attr( $k ) . '">' . $v . '</option>'; 
     149                } 
     150                $html .= '</select> '; 
     151            break; 
     152 
     153            case 'image': 
     154                $image_thumb = ''; 
     155                if ( $data ) { 
     156                    $image_thumb = wp_get_attachment_thumb_url( $data ); 
     157                } 
     158                $html .= '<img id="' . $option_name . '_preview" class="image_preview" src="' . $image_thumb . '" /><br/>' . "\n"; 
     159                $html .= '<input id="' . $option_name . '_button" type="button" data-uploader_title="' . __( 'Upload an image' , 'bid13-auction-feed' ) . '" data-uploader_button_text="' . __( 'Use image' , 'bid13-auction-feed' ) . '" class="image_upload_button button" value="'. __( 'Upload new image' , 'bid13-auction-feed' ) . '" />' . "\n"; 
     160                $html .= '<input id="' . $option_name . '_delete" type="button" class="image_delete_button button" value="'. __( 'Remove image' , 'bid13-auction-feed' ) . '" />' . "\n"; 
     161                $html .= '<input id="' . $option_name . '" class="image_data_field" type="hidden" name="' . $option_name . '" value="' . $data . '"/><br/>' . "\n"; 
     162            break; 
     163 
     164            case 'color': 
     165                ?><div class="color-picker" style="position:relative;"> 
     166                    <input type="text" name="<?php esc_attr_e( $option_name ); ?>" class="color" value="<?php esc_attr_e( $data ); ?>" /> 
     167                    <div style="position:absolute;background:#FFF;z-index:99;border-radius:100%;" class="colorpicker"></div> 
     168                </div> 
     169                <?php 
     170            break; 
     171 
     172        } 
     173 
     174        switch( $field['type'] ) { 
     175 
     176            case 'checkbox_multi': 
     177            case 'radio': 
     178            case 'select_multi': 
     179                $html .= '<br/><span class="description">' . $field['description'] . '</span>'; 
     180            break; 
     181 
     182            default: 
     183                if ( ! $post ) { 
     184                    $html .= '<label for="' . esc_attr( $field['id'] ) . '">' . "\n"; 
     185                } 
     186 
     187                $html .= '<span class="description">' . $field['description'] . '</span>' . "\n"; 
     188 
     189                if ( ! $post ) { 
     190                    $html .= '</label>' . "\n"; 
     191                } 
     192            break; 
     193        } 
     194 
     195        if ( ! $echo ) { 
     196            return $html; 
     197        } 
     198 
     199        echo $html; 
     200 
     201    } 
     202 
     203    /** 
     204     * Validate form field 
     205     * @param  string $data Submitted value 
     206     * @param  string $type Type of field to validate 
     207     * @return string       Validated value 
     208     */ 
     209    public function validate_field ( $data = '', $type = 'text' ) { 
     210 
     211        switch( $type ) { 
     212            case 'text': $data = esc_attr( $data ); break; 
     213            case 'url': $data = esc_url( $data ); break; 
     214            case 'email': $data = is_email( $data ); break; 
     215        } 
     216 
     217        return $data; 
     218    } 
     219 
     220    /** 
     221     * Add meta box to the dashboard 
     222     * @param string $id            Unique ID for metabox 
     223     * @param string $title         Display title of metabox 
     224     * @param array  $post_types    Post types to which this metabox applies 
     225     * @param string $context       Context in which to display this metabox ('advanced' or 'side') 
     226     * @param string $priority      Priority of this metabox ('default', 'low' or 'high') 
     227     * @param array  $callback_args Any axtra arguments that will be passed to the display function for this metabox 
     228     * @return void 
     229     */ 
     230    public function add_meta_box ( $id = '', $title = '', $post_types = array(), $context = 'advanced', $priority = 'default', $callback_args = null ) { 
     231 
     232        // Get post type(s) 
     233        if ( ! is_array( $post_types ) ) { 
     234            $post_types = array( $post_types ); 
     235        } 
     236 
     237        // Generate each metabox 
     238        foreach ( $post_types as $post_type ) { 
     239            add_meta_box( $id, $title, array( $this, 'meta_box_content' ), $post_type, $context, $priority, $callback_args ); 
     240        } 
     241    } 
     242 
     243    /** 
     244     * Display metabox content 
     245     * @param  object $post Post object 
     246     * @param  array  $args Arguments unique to this metabox 
     247     * @return void 
     248     */ 
     249    public function meta_box_content ( $post, $args ) { 
     250 
     251        $fields = apply_filters( $post->post_type . '_custom_fields', array(), $post->post_type ); 
     252 
     253        if ( ! is_array( $fields ) || 0 == count( $fields ) ) return; 
     254 
     255        echo '<div class="custom-field-panel">' . "\n"; 
     256 
     257        foreach ( $fields as $field ) { 
     258 
     259            if ( ! isset( $field['metabox'] ) ) continue; 
     260 
     261            if ( ! is_array( $field['metabox'] ) ) { 
     262                $field['metabox'] = array( $field['metabox'] ); 
     263            } 
     264 
     265            if ( in_array( $args['id'], $field['metabox'] ) ) { 
     266                $this->display_meta_box_field( $field, $post ); 
     267            } 
     268 
     269        } 
     270 
     271        echo '</div>' . "\n"; 
     272 
     273    } 
     274 
     275    /** 
     276     * Dispay field in metabox 
     277     * @param  array  $field Field data 
     278     * @param  object $post  Post object 
     279     * @return void 
     280     */ 
     281    public function display_meta_box_field ( $field = array(), $post ) { 
     282 
     283        if ( ! is_array( $field ) || 0 == count( $field ) ) return; 
     284 
     285        $field = '<p class="form-field"><label for="' . $field['id'] . '">' . $field['label'] . '</label>' . $this->display_field( $field, $post, false ) . '</p>' . "\n"; 
     286 
     287        echo $field; 
     288    } 
     289 
     290    /** 
     291     * Save metabox fields 
     292     * @param  integer $post_id Post ID 
     293     * @return void 
     294     */ 
     295    public function save_meta_boxes ( $post_id = 0 ) { 
     296 
     297        if ( ! $post_id ) return; 
     298 
     299        $post_type = get_post_type( $post_id ); 
     300 
     301        $fields = apply_filters( $post_type . '_custom_fields', array(), $post_type ); 
     302 
     303        if ( ! is_array( $fields ) || 0 == count( $fields ) ) return; 
     304 
     305        foreach ( $fields as $field ) { 
     306            if ( isset( $_REQUEST[ $field['id'] ] ) ) { 
     307                update_post_meta( $post_id, $field['id'], $this->validate_field( $_REQUEST[ $field['id'] ], $field['type'] ) ); 
    303308            } else { 
    304                 if ( isset( $_GET['tab'] ) && $_GET['tab'] ) { 
    305                     $current_section = $_GET['tab']; 
    306                 } 
    307             } 
    308  
    309             foreach ( $this->settings as $section => $data ) { 
    310  
    311                 if ( $current_section && $current_section != $section ) continue; 
    312  
    313                 // Add section to page 
    314                 add_settings_section( $section, $data['title'], array( $this, 'settings_section' ), $this->parent->_token . '_settings' ); 
    315  
    316                 foreach ( $data['fields'] as $field ) { 
    317  
    318                     // Validation callback for field 
    319                     $validation = ''; 
    320                     if ( isset( $field['callback'] ) ) { 
    321                         $validation = $field['callback']; 
    322                     } 
    323  
    324                     // Register field 
    325                     $option_name = $this->base . $field['id']; 
    326                     register_setting( $this->parent->_token . '_settings', $option_name, $validation ); 
    327  
    328                     // Add field to page 
    329                     add_settings_field( $field['id'], $field['label'], array( $this->parent->admin, 'display_field' ), $this->parent->_token . '_settings', $section, array( 'field' => $field, 'prefix' => $this->base ) ); 
    330                 } 
    331  
    332                 if ( ! $current_section ) break; 
    333             } 
    334         } 
    335     } 
    336  
    337     public function settings_section ( $section ) { 
    338         $html = '<p> ' . $this->settings[ $section['id'] ]['description'] . '</p>' . "\n"; 
    339         echo $html; 
    340     } 
    341  
    342     /** 
    343      * Load settings page content 
    344      * @return void 
    345      */ 
    346     public function settings_page () { 
    347  
    348         // Build page HTML 
    349         $html = '<div class="wrap" id="' . $this->parent->_token . '_settings">' . "\n"; 
    350             $html .= '<h2>' . __( 'Bid13 Settings' , 'bid13-auction-feed' ) . '</h2>' . "\n"; 
    351  
    352             $tab = ''; 
    353             if ( isset( $_GET['tab'] ) && $_GET['tab'] ) { 
    354                 $tab .= $_GET['tab']; 
    355             } 
    356  
    357             // Show page tabs 
    358             if ( is_array( $this->settings ) && 1 < count( $this->settings ) ) { 
    359  
    360                 $html .= '<h2 class="nav-tab-wrapper">' . "\n"; 
    361  
    362                 $c = 0; 
    363                 foreach ( $this->settings as $section => $data ) { 
    364  
    365                     // Set tab class 
    366                     $class = 'nav-tab'; 
    367                     if ( ! isset( $_GET['tab'] ) ) { 
    368                         if ( 0 == $c ) { 
    369                             $class .= ' nav-tab-active'; 
    370                         } 
    371                     } else { 
    372                         if ( isset( $_GET['tab'] ) && $section == $_GET['tab'] ) { 
    373                             $class .= ' nav-tab-active'; 
    374                         } 
    375                     } 
    376  
    377                     // Set tab link 
    378                     $tab_link = add_query_arg( array( 'tab' => $section ) ); 
    379                     if ( isset( $_GET['settings-updated'] ) ) { 
    380                         $tab_link = remove_query_arg( 'settings-updated', $tab_link ); 
    381                     } 
    382  
    383                     // Output tab    
    384                     if(!preg_match("(auction_[0-9]+)", $section)){ 
    385                         $html .= '<a href="' . $tab_link . '" class="' . esc_attr( $class ) . '">' . esc_html( $data['title'] ) . '</a>' . "\n"; 
    386                     } 
    387  
    388                     ++$c; 
    389                 } 
    390  
    391                 $html .= '</h2>' . "\n"; 
    392             } 
    393  
    394             $html .= '<form method="post" action="options.php" enctype="multipart/form-data" class="settings-tab-'.$tab.'">' . "\n"; 
    395  
    396                 // Get settings fields 
    397                 ob_start(); 
    398                 settings_fields( $this->parent->_token . '_settings' ); 
    399                 do_settings_sections( $this->parent->_token . '_settings' ); 
    400                 $html .= ob_get_clean(); 
    401  
    402                 $html .= '<p class="submit">' . "\n"; 
    403                     $html .= '<input type="hidden" name="tab" value="' . esc_attr( $tab ) . '" />' . "\n"; 
    404                     if($tab != 'auction_settings'){ 
    405                         $html .= '<input name="Submit" type="submit" class="button-primary" value="' . esc_attr( __( 'Save Settings' , 'bid13-auction-feed' ) ) . '" />' . "\n";                         
    406                     } 
    407                 $html .= '</p>' . "\n"; 
    408             $html .= '</form>' . "\n"; 
    409         $html .= '</div>' . "\n"; 
    410  
    411         echo $html; 
    412     } 
    413  
    414     /** 
    415      * Main Bid13_Auction_Feed_Settings Instance 
    416      * 
    417      * Ensures only one instance of Bid13_Auction_Feed_Settings is loaded or can be loaded. 
    418      * 
    419      * @since 1.0.0 
    420      * @static 
    421      * @see Bid13_Auction_Feed() 
    422      * @return Main Bid13_Auction_Feed_Settings instance 
    423      */ 
    424     public static function instance ( $parent ) { 
    425         if ( is_null( self::$_instance ) ) { 
    426             self::$_instance = new self( $parent ); 
    427         } 
    428         return self::$_instance; 
    429     } // End instance() 
    430  
    431     /** 
    432      * Cloning is forbidden. 
    433      * 
    434      * @since 1.0.0 
    435      */ 
    436     public function __clone () { 
    437         _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?' ), $this->parent->_version ); 
    438     } // End __clone() 
    439  
    440     /** 
    441      * Unserializing instances of this class is forbidden. 
    442      * 
    443      * @since 1.0.0 
    444      */ 
    445     public function __wakeup () { 
    446         _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?' ), $this->parent->_version ); 
    447     } // End __wakeup() 
     309                update_post_meta( $post_id, $field['id'], '' ); 
     310            } 
     311        } 
     312    } 
    448313 
    449314} 
Note: See TracChangeset for help on using the changeset viewer.