(isset($settings['id'])) ? $settings['id'] : $settings['name'], 'title' => (isset($settings['label'])) ? $settings['label'] : '', 'args' => (isset($settings['args'])) ? $settings['args'] : array('label_for'=>$settings['name']), 'reset_value' => (isset($settings['value'])) ? $settings['value'] : $this->get_default_reset_value() ); $settings = array_merge($default_settings, $settings); // Assign to properties foreach($settings as $key => $value) { if(property_exists($this, $key)) { $this->$key = $value; } } // Get option saved value $value = get_option($this->name); if( $value === false ) { // Set to reset value $this->value = $this->reset_value; } else { // Set to saved value $this->value = $value; } // Set markup property $this->set_markup(); } public function __get($key) { if(property_exists($this, $key)) { return $this->$key; } } public function set_value( $value ) { $this->value = $value; } public function set_name( $value ) { $this->name = $value; } public function set_id( $value ) { $this->id = $value; } public function set_markup( $markup = '' ) { $this->markup = $markup; } public function get_default_reset_value() { return ''; } public function render( $args ) { echo $this->markup; } public function sanitize( $dirty ) { // Sanitizes during save if(is_array($dirty)) { $clean = array(); foreach($dirty as $key=>$value) { if(!empty($dirty[$key])) { $clean[$key] = sanitize_text_field($dirty[$key]); } } } else { $clean = sanitize_text_field($dirty); } return $clean; } } /** * Field with input type of text. */ class TextField extends Field { public function set_markup( $markup = '' ) { if($markup == '') { $this->markup = 'markup .= 'id="' . $this->id . '" '; $this->markup .= 'data-reset="' . $this->reset_value . '" '; $this->markup .= 'value="' . $this->value . '" class="regular-text" />'; } else { $this->markup = $markup; } } } /** * Field with input type of text. */ class ColorField extends Field { public function __construct ( $settings = array() ) { parent::__construct($settings); add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts')); } public function set_markup( $markup = '' ) { if($markup == '') { $this->markup = 'markup .= 'id="' . $this->id . '" '; $this->markup .= 'data-reset="' . $this->reset_value . '" '; $this->markup .= 'value="' . $this->value . '" class="color-picker" />'; } else { $this->markup = $markup; } } public function admin_enqueue_scripts( $hook_suffix ) { global $pcs_settings_config; if(!wp_script_is('pcs-color-picker', 'enqueued')) { wp_enqueue_style('wp-color-picker'); wp_enqueue_script('wp-color-picker'); wp_register_script('pcs-color-picker', $pcs_settings_config['base_uri'] . 'scripts/color-picker.js', array('wp-color-picker')); wp_enqueue_script('pcs-color-picker'); } } } /** * Field with input type of textarea. */ class TextArea extends Field { public function set_markup( $markup = '' ) { if($markup == '') { $this->markup = ''; } else { $this->markup = $markup; } } public function sanitize( $dirty ) { // Sanitizes during save if(is_array($dirty)) { $clean = array(); foreach($dirty as $key=>$value) { if(!empty($dirty[$key])) { $clean[$key] = wp_kses_post($dirty[$key]); } } } else { $clean = wp_kses_post($dirty); } return $clean; } } /** * Field with input type of checkbox. */ class Checkbox extends Field { public function set_markup( $markup = '' ) { if( $markup == '' ) { // Display setting checked when 1 if($this->value == 1) { $checked = 'checked=checked'; } else { $checked = ''; } $this->markup = 'markup .= 'id="' . $this->id . '" '; $this->markup .= 'data-reset="' . $this->reset_value . '" '; $this->markup .= 'value="1" ' . $checked . ' />'; } else { $this->markup = $markup; } } public function get_default_reset_value() { return 0; } public function sanitize( $dirty ) { // Sanitizes during save if(is_array($dirty)) { $clean = array(); foreach($dirty as $key=>$value) { if(!empty($dirty[$key])) { $clean[$key] = 1; } else { $clean[$key] = 0; } } } else { if(!empty($dirty)) { $clean = 1; } else { $clean = 0; } } return $clean; } } /** * Field that provides media upload. */ class UploadField extends Field { public function __construct ( $settings = array() ) { parent::__construct($settings); add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts')); } public function set_markup( $markup = '' ) { if($markup == '') { $this->markup = 'markup .= 'id="' . $this->id . '" '; $this->markup .= 'data-reset="' . $this->reset_value . '" '; $this->markup .= 'value="' . $this->value . '" class="regular-text" />'; $this->markup .= ''; } else { $this->markup = $markup; } } public function admin_enqueue_scripts() { global $pcs_settings_config; if(!wp_script_is('pcs-upload', 'enqueued')) { wp_enqueue_media(); wp_register_script('pcs-upload', $pcs_settings_config['base_uri'] . 'scripts/upload.js', array('jquery')); wp_enqueue_script('pcs-upload'); } } } /** * Field that utilizes the wp_editor. */ class EditorField extends Field { protected $editor_settings; public function __construct ( $settings = array() ) { parent::__construct($settings); $this->editor_settings = (isset($settings['editor_settings'])) ? $settings['editor_settings'] : array(); } public function render( $args ) { wp_editor( $this->value, $this->name, $this->editor_settings ); } public function sanitize( $dirty ) { // Sanitizes during save if(is_array($dirty)) { $clean = array(); foreach($dirty as $key=>$value) { if(!empty($dirty[$key])) { $clean[$key] = wp_kses_post($dirty[$key]); } } } else { $clean = wp_kses_post($dirty); } return $clean; } } /** * Field that utilizes a select drop down. */ class SelectField extends Field { protected $select_options; public function __construct ( $settings = array() ) { $this->select_options = (isset($settings['select_options'])) ? $settings['select_options'] : array(); parent::__construct($settings); } public function set_markup( $markup = '' ) { if($markup == '') { $this->markup = ''; } else { $this->markup = $markup; } } } /** * Field with input type of radio. */ class RadioField extends Field { protected $radio_options; public function __construct ( $settings = array() ) { $this->radio_options = (isset($settings['radio_options'])) ? $settings['radio_options'] : array(); parent::__construct($settings); if(isset($this->args['label_for'])) unset($this->args['label_for']); } public function set_markup( $markup = '' ) { if($markup == '') { $counter = 1; $this->markup = '
'; } else { $this->markup = $markup; } } } class MultiField extends Field { protected $fields; protected $limit; public function __construct ($settings = array(), $field_objs = array() ) { parent::__construct($settings); // 0 is unlimited $this->limit = (isset($settings['limit'])) ? (int) $settings['limit'] : 0; $this->fields = $field_objs; add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts')); } public function __get($key) { if(property_exists($this, $key)) { return $this->$key; } } public function admin_enqueue_scripts () { global $pcs_settings_config; if(!wp_script_is('pcs-multi-field', 'enqueued')) { wp_enqueue_media(); wp_register_script('pcs-multi-field', $pcs_settings_config['base_uri'] . 'scripts/multi-field.js', array('jquery-ui-sortable')); wp_enqueue_script('pcs-multi-field'); } } public function render( $args ) { $list_length = count($this->value); // Render dynamic multi fields. if($this->limit != 1) { if($list_length >= 1) { $this->renderMultipleFieldGroups($list_length); } else { // Could be rendering the firstgroup $this->renderSingleFieldGroup(); } } else { $this->renderSingleFieldGroup(); } } public function renderSingleFieldGroup() { if($this->limit != 1) { echo '