<?php
defined('ABSPATH') || exit;
abstract class WC_Settings_API
{
public $plugin_id = 'woocommerce_';
public $id = '';
public $errors = array();
public $settings = array();
public $form_fields = array();
protected $data = array();
public function get_form_fields()
{
return apply_filters('woocommerce_settings_api_form_fields_' . $this->id, array_map(array($this, 'set_defaults'), $this->form_fields));
}
protected function set_defaults($field)
{
if (!isset($field['default'])) {
$field['default'] = '';
}
return $field;
}
public function admin_options()
{
echo '<table class="form-table">' . $this->generate_settings_html($this->get_form_fields(), false) . '</table>';
}
public function init_form_fields()
{
}
public function get_option_key()
{
return $this->plugin_id . $this->id . '_settings';
}
public function get_field_type($field)
{
return empty($field['type']) ? 'text' : $field['type'];
}
public function get_field_default($field)
{
return empty($field['default']) ? '' : $field['default'];
}
public function get_field_value($key, $field, $post_data = array())
{
$type = $this->get_field_type($field);
$field_key = $this->get_field_key($key);
$post_data = empty($post_data) ? $_POST : $post_data;
$value = isset($post_data[$field_key]) ? $post_data[$field_key] : null;
if (isset($field['sanitize_callback']) && is_callable($field['sanitize_callback'])) {
return call_user_func($field['sanitize_callback'], $value);
}
if (is_callable(array($this, 'validate_' . $key . '_field'))) {
return $this->{'validate_' . $key . '_field'}($key, $value);
}
if (is_callable(array($this, 'validate_' . $type . '_field'))) {
return $this->{'validate_' . $type . '_field'}($key, $value);
}
return $this->validate_text_field($key, $value);
}
public function set_post_data($data = array())
{
$this->data = $data;
}
public function get_post_data()
{
if (!empty($this->data) && is_array($this->data)) {
return $this->data;
}
return $_POST;
}
public function update_option($key, $value = '')
{
if (empty($this->settings)) {
$this->init_settings();
}
$this->settings[$key] = $value;
return update_option($this->get_option_key(), apply_filters('woocommerce_settings_api_sanitized_fields_' . $this->id, $this->settings), 'yes');
}
public function process_admin_options()
{
$this->init_settings();
$post_data = $this->get_post_data();
foreach ($this->get_form_fields() as $key => $field) {
if ('title' !== $this->get_field_type($field)) {
try {
$this->settings[$key] = $this->get_field_value($key, $field, $post_data);
} catch (Exception $e) {
$this->add_error($e->getMessage());
}
}
}
return update_option($this->get_option_key(), apply_filters('woocommerce_settings_api_sanitized_fields_' . $this->id, $this->settings), 'yes');
}
public function add_error($error)
{
$this->errors[] = $error;
}
public function get_errors()
{
return $this->errors;
}
public function display_errors()
{
if ($this->get_errors()) {
echo '<div id="woocommerce_errors" class="error notice is-dismissible">';
foreach ($this->get_errors() as $error) {
echo '<p>' . wp_kses_post($error) . '</p>';
}
echo '</div>';
}
}
public function init_settings()
{
$this->settings = get_option($this->get_option_key(), null);
if (!is_array($this->settings)) {
$form_fields = $this->get_form_fields();
$this->settings = array_merge(array_fill_keys(array_keys($form_fields), ''), wp_list_pluck($form_fields, 'default'));
}
}
public function get_option($key, $empty_value = null)
{
if (empty($this->settings)) {
$this->init_settings();
}
if (!isset($this->settings[$key])) {
$form_fields = $this->get_form_fields();
$this->settings[$key] = isset($form_fields[$key]) ? $this->get_field_default($form_fields[$key]) : '';
}
if (!is_null($empty_value) && '' === $this->settings[$key]) {
$this->settings[$key] = $empty_value;
}
return $this->settings[$key];
}
public function get_field_key($key)
{
return $this->plugin_id . $this->id . '_' . $key;
}
public function generate_settings_html($form_fields = array(), $echo = true)
{
if (empty($form_fields)) {
$form_fields = $this->get_form_fields();
}
$html = '';
foreach ($form_fields as $k => $v) {
$type = $this->get_field_type($v);
if (method_exists($this, 'generate_' . $type . '_html')) {
$html .= $this->{'generate_' . $type . '_html'}($k, $v);
} else {
$html .= $this->generate_text_html($k, $v);
}
}
if ($echo) {
echo $html;
} else {
return $html;
}
}
public function get_tooltip_html($data)
{
if (true === $data['desc_tip']) {
$tip = $data['description'];
} elseif (!empty($data['desc_tip'])) {
$tip = $data['desc_tip'];
} else {
$tip = '';
}
return $tip ? wc_help_tip($tip, true) : '';
}
public function get_description_html($data)
{
if (true === $data['desc_tip']) {
$description = '';
} elseif (!empty($data['desc_tip'])) {
$description = $data['description'];
} elseif (!empty($data['description'])) {
$description = $data['description'];
} else {
$description = '';
}
return $description ? '<p class="description">' . wp_kses_post($description) . '</p>' . "\n" : '';
}
public function get_custom_attribute_html($data)
{
$custom_attributes = array();
if (!empty($data['custom_attributes']) && is_array($data['custom_attributes'])) {
foreach ($data['custom_attributes'] as $attribute => $attribute_value) {
$custom_attributes[] = esc_attr($attribute) . '="' . esc_attr($attribute_value) . '"';
}
}
return implode(' ', $custom_attributes);
}
public function generate_text_html($key, $data)
{
$field_key = $this->get_field_key($key);
$defaults = array('title' => '', 'disabled' => false, 'class' => '', 'css' => '', 'placeholder' => '', 'type' => 'text', 'desc_tip' => false, 'description' => '', 'custom_attributes' => array());
$data = wp_parse_args($data, $defaults);
ob_start();
?>
<tr valign="top">
<th scope="row" class="titledesc">
<label for="<?php
echo esc_attr($field_key);
?>"><?php
echo wp_kses_post($data['title']);
?> <?php
echo $this->get_tooltip_html($data);
?></label>
</th>
<td class="forminp">
<fieldset>
<legend class="screen-reader-text"><span><?php
echo wp_kses_post($data['title']);
?></span></legend>
<input class="input-text regular-input <?php
echo esc_attr($data['class']);
?>" type="<?php
echo esc_attr($data['type']);
?>" name="<?php
echo esc_attr($field_key);
?>" id="<?php
echo esc_attr($field_key);
?>" style="<?php
echo esc_attr($data['css']);
?>" value="<?php
echo esc_attr($this->get_option($key));
?>" placeholder="<?php
echo esc_attr($data['placeholder']);
?>" <?php
disabled($data['disabled'], true);
?> <?php
echo $this->get_custom_attribute_html($data);
?> />
<?php
echo $this->get_description_html($data);
?>
</fieldset>
</td>
</tr>
<?php
return ob_get_clean();
}
public function generate_price_html($key, $data)
{
$field_key = $this->get_field_key($key);
$defaults = array('title' => '', 'disabled' => false, 'class' => '', 'css' => '', 'placeholder' => '', 'type' => 'text', 'desc_tip' => false, 'description' => '', 'custom_attributes' => array());
$data = wp_parse_args($data, $defaults);
ob_start();
?>
<tr valign="top">
<th scope="row" class="titledesc">
<label for="<?php
echo esc_attr($field_key);
?>"><?php
echo wp_kses_post($data['title']);
?> <?php
echo $this->get_tooltip_html($data);
?></label>
</th>
<td class="forminp">
<fieldset>
<legend class="screen-reader-text"><span><?php
echo wp_kses_post($data['title']);
?></span></legend>
<input class="wc_input_price input-text regular-input <?php
echo esc_attr($data['class']);
?>" type="text" name="<?php
echo esc_attr($field_key);
?>" id="<?php
echo esc_attr($field_key);
?>" style="<?php
echo esc_attr($data['css']);
?>" value="<?php
echo esc_attr(wc_format_localized_price($this->get_option($key)));
?>" placeholder="<?php
echo esc_attr($data['placeholder']);
?>" <?php
disabled($data['disabled'], true);
?> <?php
echo $this->get_custom_attribute_html($data);
?> />
<?php
echo $this->get_description_html($data);
?>
</fieldset>
</td>
</tr>
<?php
return ob_get_clean();
}
public function generate_decimal_html($key, $data)
{
$field_key = $this->get_field_key($key);
$defaults = array('title' => '', 'disabled' => false, 'class' => '', 'css' => '', 'placeholder' => '', 'type' => 'text', 'desc_tip' => false, 'description' => '', 'custom_attributes' => array());
$data = wp_parse_args($data, $defaults);
ob_start();
?>
<tr valign="top">
<th scope="row" class="titledesc">
<label for="<?php
echo esc_attr($field_key);
?>"><?php
echo wp_kses_post($data['title']);
?> <?php
echo $this->get_tooltip_html($data);
?></label>
</th>
<td class="forminp">
<fieldset>
<legend class="screen-reader-text"><span><?php
echo wp_kses_post($data['title']);
?></span></legend>
<input class="wc_input_decimal input-text regular-input <?php
echo esc_attr($data['class']);
?>" type="text" name="<?php
echo esc_attr($field_key);
?>" id="<?php
echo esc_attr($field_key);
?>" style="<?php
echo esc_attr($data['css']);
?>" value="<?php
echo esc_attr(wc_format_localized_decimal($this->get_option($key)));
?>" placeholder="<?php
echo esc_attr($data['placeholder']);
?>" <?php
disabled($data['disabled'], true);
?> <?php
echo $this->get_custom_attribute_html($data);
?> />
<?php
echo $this->get_description_html($data);
?>
</fieldset>
</td>
</tr>
<?php
return ob_get_clean();
}
public function generate_password_html($key, $data)
{
$data['type'] = 'password';
return $this->generate_text_html($key, $data);
}
public function generate_color_html($key, $data)
{
$field_key = $this->get_field_key($key);
$defaults = array('title' => '', 'disabled' => false, 'class' => '', 'css' => '', 'placeholder' => '', 'desc_tip' => false, 'description' => '', 'custom_attributes' => array());
$data = wp_parse_args($data, $defaults);
ob_start();
?>
<tr valign="top">
<th scope="row" class="titledesc">
<label for="<?php
echo esc_attr($field_key);
?>"><?php
echo wp_kses_post($data['title']);
?> <?php
echo $this->get_tooltip_html($data);
?></label>
</th>
<td class="forminp">
<fieldset>
<legend class="screen-reader-text"><span><?php
echo wp_kses_post($data['title']);
?></span></legend>
<span class="colorpickpreview" style="background:<?php
echo esc_attr($this->get_option($key));
?>;"> </span>
<input class="colorpick <?php
echo esc_attr($data['class']);
?>" type="text" name="<?php
echo esc_attr($field_key);
?>" id="<?php
echo esc_attr($field_key);
?>" style="<?php
echo esc_attr($data['css']);
?>" value="<?php
echo esc_attr($this->get_option($key));
?>" placeholder="<?php
echo esc_attr($data['placeholder']);
?>" <?php
disabled($data['disabled'], true);
?> <?php
echo $this->get_custom_attribute_html($data);
?> />
<div id="colorPickerDiv_<?php
echo esc_attr($field_key);
?>" class="colorpickdiv" style="z-index: 100; background: #eee; border: 1px solid #ccc; position: absolute; display: none;"></div>
<?php
echo $this->get_description_html($data);
?>
</fieldset>
</td>
</tr>
<?php
return ob_get_clean();
}
public function generate_textarea_html($key, $data)
{
$field_key = $this->get_field_key($key);
$defaults = array('title' => '', 'disabled' => false, 'class' => '', 'css' => '', 'placeholder' => '', 'type' => 'text', 'desc_tip' => false, 'description' => '', 'custom_attributes' => array());
$data = wp_parse_args($data, $defaults);
ob_start();
?>
<tr valign="top">
<th scope="row" class="titledesc">
<label for="<?php
echo esc_attr($field_key);
?>"><?php
echo wp_kses_post($data['title']);
?> <?php
echo $this->get_tooltip_html($data);
?></label>
</th>
<td class="forminp">
<fieldset>
<legend class="screen-reader-text"><span><?php
echo wp_kses_post($data['title']);
?></span></legend>
<textarea rows="3" cols="20" class="input-text wide-input <?php
echo esc_attr($data['class']);
?>" type="<?php
echo esc_attr($data['type']);
?>" name="<?php
echo esc_attr($field_key);
?>" id="<?php
echo esc_attr($field_key);
?>" style="<?php
echo esc_attr($data['css']);
?>" placeholder="<?php
echo esc_attr($data['placeholder']);
?>" <?php
disabled($data['disabled'], true);
?> <?php
echo $this->get_custom_attribute_html($data);
?>><?php
echo esc_textarea($this->get_option($key));
?></textarea>
<?php
echo $this->get_description_html($data);
?>
</fieldset>
</td>
</tr>
<?php
return ob_get_clean();
}
public function generate_checkbox_html($key, $data)
{
$field_key = $this->get_field_key($key);
$defaults = array('title' => '', 'label' => '', 'disabled' => false, 'class' => '', 'css' => '', 'type' => 'text', 'desc_tip' => false, 'description' => '', 'custom_attributes' => array());
$data = wp_parse_args($data, $defaults);
if (!$data['label']) {
$data['label'] = $data['title'];
}
ob_start();
?>
<tr valign="top">
<th scope="row" class="titledesc">
<label for="<?php
echo esc_attr($field_key);
?>"><?php
echo wp_kses_post($data['title']);
?> <?php
echo $this->get_tooltip_html($data);
?></label>
</th>
<td class="forminp">
<fieldset>
<legend class="screen-reader-text"><span><?php
echo wp_kses_post($data['title']);
?></span></legend>
<label for="<?php
echo esc_attr($field_key);
?>">
<input <?php
disabled($data['disabled'], true);
?> class="<?php
echo esc_attr($data['class']);
?>" type="checkbox" name="<?php
echo esc_attr($field_key);
?>" id="<?php
echo esc_attr($field_key);
?>" style="<?php
echo esc_attr($data['css']);
?>" value="1" <?php
checked($this->get_option($key), 'yes');
?> <?php
echo $this->get_custom_attribute_html($data);
?> /> <?php
echo wp_kses_post($data['label']);
?></label><br/>
<?php
echo $this->get_description_html($data);
?>
</fieldset>
</td>
</tr>
<?php
return ob_get_clean();
}
public function generate_select_html($key, $data)
{
$field_key = $this->get_field_key($key);
$defaults = array('title' => '', 'disabled' => false, 'class' => '', 'css' => '', 'placeholder' => '', 'type' => 'text', 'desc_tip' => false, 'description' => '', 'custom_attributes' => array(), 'options' => array());
$data = wp_parse_args($data, $defaults);
$value = $this->get_option($key);
ob_start();
?>
<tr valign="top">
<th scope="row" class="titledesc">
<label for="<?php
echo esc_attr($field_key);
?>"><?php
echo wp_kses_post($data['title']);
?> <?php
echo $this->get_tooltip_html($data);
?></label>
</th>
<td class="forminp">
<fieldset>
<legend class="screen-reader-text"><span><?php
echo wp_kses_post($data['title']);
?></span></legend>
<select class="select <?php
echo esc_attr($data['class']);
?>" name="<?php
echo esc_attr($field_key);
?>" id="<?php
echo esc_attr($field_key);
?>" style="<?php
echo esc_attr($data['css']);
?>" <?php
disabled($data['disabled'], true);
?> <?php
echo $this->get_custom_attribute_html($data);
?>>
<?php
foreach ((array) $data['options'] as $option_key => $option_value) {
?>
<?php
if (is_array($option_value)) {
?>
<optgroup label="<?php
echo esc_attr($option_key);
?>">
<?php
foreach ($option_value as $option_key_inner => $option_value_inner) {
?>
<option value="<?php
echo esc_attr($option_key_inner);
?>" <?php
selected((string) $option_key_inner, esc_attr($value));
?>><?php
echo esc_html($option_value_inner);
?></option>
<?php
}
?>
</optgroup>
<?php
} else {
?>
<option value="<?php
echo esc_attr($option_key);
?>" <?php
selected((string) $option_key, esc_attr($value));
?>><?php
echo esc_html($option_value);
?></option>
<?php
}
?>
<?php
}
?>
</select>
<?php
echo $this->get_description_html($data);
?>
</fieldset>
</td>
</tr>
<?php
return ob_get_clean();
}
public function generate_multiselect_html($key, $data)
{
$field_key = $this->get_field_key($key);
$defaults = array('title' => '', 'disabled' => false, 'class' => '', 'css' => '', 'placeholder' => '', 'type' => 'text', 'desc_tip' => false, 'description' => '', 'custom_attributes' => array(), 'select_buttons' => false, 'options' => array());
$data = wp_parse_args($data, $defaults);
$value = (array) $this->get_option($key, array());
ob_start();
?>
<tr valign="top">
<th scope="row" class="titledesc">
<label for="<?php
echo esc_attr($field_key);
?>"><?php
echo wp_kses_post($data['title']);
?> <?php
echo $this->get_tooltip_html($data);
?></label>
</th>
<td class="forminp">
<fieldset>
<legend class="screen-reader-text"><span><?php
echo wp_kses_post($data['title']);
?></span></legend>
<select multiple="multiple" class="multiselect <?php
echo esc_attr($data['class']);
?>" name="<?php
echo esc_attr($field_key);
?>[]" id="<?php
echo esc_attr($field_key);
?>" style="<?php
echo esc_attr($data['css']);
?>" <?php
disabled($data['disabled'], true);
?> <?php
echo $this->get_custom_attribute_html($data);
?>>
<?php
foreach ((array) $data['options'] as $option_key => $option_value) {
?>
<?php
if (is_array($option_value)) {
?>
<optgroup label="<?php
echo esc_attr($option_key);
?>">
<?php
foreach ($option_value as $option_key_inner => $option_value_inner) {
?>
<option value="<?php
echo esc_attr($option_key_inner);
?>" <?php
selected(in_array((string) $option_key_inner, $value, true), true);
?>><?php
echo esc_html($option_value_inner);
?></option>
<?php
}
?>
</optgroup>
<?php
} else {
?>
<option value="<?php
echo esc_attr($option_key);
?>" <?php
selected(in_array((string) $option_key, $value, true), true);
?>><?php
echo esc_html($option_value);
?></option>
<?php
}
?>
<?php
}
?>
</select>
<?php
echo $this->get_description_html($data);
?>
<?php
if ($data['select_buttons']) {
?>
<br/><a class="select_all button" href="#"><?php
esc_html_e('Select all', 'woocommerce');
?></a> <a class="select_none button" href="#"><?php
esc_html_e('Select none', 'woocommerce');
?></a>
<?php
}
?>
</fieldset>
</td>
</tr>
<?php
return ob_get_clean();
}
public function generate_title_html($key, $data)
{
$field_key = $this->get_field_key($key);
$defaults = array('title' => '', 'class' => '');
$data = wp_parse_args($data, $defaults);
ob_start();
?>
</table>
<h3 class="wc-settings-sub-title <?php
echo esc_attr($data['class']);
?>" id="<?php
echo esc_attr($field_key);
?>"><?php
echo wp_kses_post($data['title']);
?></h3>
<?php
if (!empty($data['description'])) {
?>
<p><?php
echo wp_kses_post($data['description']);
?></p>
<?php
}
?>
<table class="form-table">
<?php
return ob_get_clean();
}
public function validate_text_field($key, $value)
{
$value = is_null($value) ? '' : $value;
return wp_kses_post(trim(stripslashes($value)));
}
public function validate_price_field($key, $value)
{
$value = is_null($value) ? '' : $value;
return '' === $value ? '' : wc_format_decimal(trim(stripslashes($value)));
}
public function validate_decimal_field($key, $value)
{
$value = is_null($value) ? '' : $value;
return '' === $value ? '' : wc_format_decimal(trim(stripslashes($value)));
}
public function validate_password_field($key, $value)
{
$value = is_null($value) ? '' : $value;
return trim(stripslashes($value));
}
public function validate_textarea_field($key, $value)
{
$value = is_null($value) ? '' : $value;
return wp_kses(trim(stripslashes($value)), array_merge(array('iframe' => array('src' => true, 'style' => true, 'id' => true, 'class' => true)), wp_kses_allowed_html('post')));
}
public function validate_checkbox_field($key, $value)
{
return !is_null($value) ? 'yes' : 'no';
}
public function validate_select_field($key, $value)
{
$value = is_null($value) ? '' : $value;
return wc_clean(stripslashes($value));
}
public function validate_multiselect_field($key, $value)
{
return is_array($value) ? array_map('wc_clean', array_map('stripslashes', $value)) : '';
}
public function validate_settings_fields($form_fields = array())
{
wc_deprecated_function('validate_settings_fields', '2.6');
}
public function format_settings($value)
{
wc_deprecated_function('format_settings', '2.6');
return $value;
}
}